示例#1
0
void CEpisodeHistory::getStep(int index, CStep *step)
{
	assert(index < getNumSteps());

//	struct timeval t1;
//	struct timeval t2;
//	struct timeval t3;
	
	int lnum = index;
	
	int i = 0;
	
	CEpisode *episode;

//	gettimeofday(&t1, NULL);

	if (stepToEpisodeMap)
	{
		episode = (*stepToEpisodeMap)[index];
		lnum = lnum - (*episodeOffsetMap)[episode];
	}
	else
	{
		while (lnum >= (episode = getEpisode(i))->getNumSteps())
		{	
			lnum -= episode->getNumSteps();
			i ++;
		}
	}
	
//	gettimeofday(&t2, NULL);
	
	episode->getStep(lnum, step);
		
//	gettimeofday(&t3, NULL);
//	
//	static int count = 0;
//	static double dur1 = 0;
//	static double dur2 = 0;
//	
//	dur1 += (t2.tv_sec - t1.tv_sec) * 1000 + t2.tv_usec - t1.tv_usec;
//	dur2 += (t3.tv_sec - t1.tv_sec) * 1000 + t3.tv_usec - t1.tv_usec;
	
//	count ++;
//	if (count % 100 == 0)
//	{
//		printf("Time for step retrieval: %f %f\n", dur1, dur2);
//		dur1 = 0;
//		dur2 = 0;
//	}
}
示例#2
0
/*
  Moves the stepper to the specified angle relative to the origin.
  Moves at the specified motor speed.
*/
void Stepper::setAngle(float new_angle)
{
	new_angle = fmod(new_angle, 360.0); // so 0 <= new_angle <= 360
	int steps;
	float diff_angle;
	float deg;

	diff_angle = new_angle - this->angle;
	deg = abs(diff_angle);
	if(deg == 180) {
		diff_angle = 180;
	} else if(deg > 180) {
		if(diff_angle > 0) diff_angle -= 360;
		else diff_angle += 360;
	}

	steps = getNumSteps(diff_angle);

	step(steps);
}
示例#3
0
// Takes in the desired angle it wants the rotation stage set to and 
// figures out the quickest direction to go and the appropriate number of steps
void rotationStage::setPosition(float angle){
    float oldPosition = this->position;
    //this->position = angle;
    direction directionToTurn = getRotationDirection(oldPosition, angle);
    int numSteps = getNumSteps(oldPosition, angle);
    
    std::cout << "Rotating to " << angle << " degrees in the direction: " 
    << directionToTurn << "Which will take " << numSteps << " number of steps" << std::endl;
    
    if(directionToTurn==clockwise){
        this->rotationStepper->stepForward(numSteps, stepper::SLOW);
    }
    else if (directionToTurn==counterClockwise){
        this->rotationStepper->stepBackward(numSteps, stepper::SLOW);
    }
    else
        throw std::invalid_argument("I don't know what direction to turn!");
    this->rotationStepper->brake(1500000);
    std::cout << "Current position: " << std::setprecision(3)<< this->position << std::endl;
    updatePosition(numSteps, directionToTurn);
    std::cout << "New position: " << std::setprecision(3)<< this->position << std::endl;
};
int main()
{
    int i, j, k = 0;
    for (i = 0; i < 8; i++) {
        for (j = 0; j < 8; j++) {
            for (k = 0; k < 8; k++) {
                allTrans (&trans[i][j][k], i, j, k);
            }
        }
    }

    assert(trans[5][5][0].x == 6 && trans[5][5][0].y == 7);
    assert(trans[5][5][1].x == 7 && trans[5][5][1].y == 6);
    assert(trans[5][5][2].x == 7 && trans[5][5][2].y == 4);
    assert(trans[5][5][3].x == 6 && trans[5][5][3].y == 3);
    assert(trans[5][5][4].x == 4 && trans[5][5][4].y == 3);
    assert(trans[5][5][5].x == 3 && trans[5][5][5].y == 4);
    assert(trans[5][5][6].x == 3 && trans[5][5][6].y == 6);
    assert(trans[5][5][7].x == 4 && trans[5][5][7].y == 7);

    for (i = 0; i < 8; i++) {
        for (j = 0; j < 8; j++) {
            for (k = 0; k < 8; k++) {
                int x = trans[i][j][k].x;
                int y = trans[i][j][k].y;
                if(x < 0 || y < 0 || x >= 8 || y >= 8) continue;
                int nk = (k + 4) % 8;
                assert(trans[x][y][nk].x == i && trans[x][y][nk].y == j);
            }
        }
    }

    assert(getNumSteps(0,0,0,0) == 0);
    assert(getNumSteps(1,0,1,0) == 0);
    assert(getNumSteps(7,0,7,0) == 0);
    assert(getNumSteps(5,5,6,7) == 1);
    assert(getNumSteps(5,5,7,6) == 1);
    assert(getNumSteps(5,5,7,4) == 1);
    assert(getNumSteps(5,5,6,3) == 1);
    assert(getNumSteps(5,5,4,3) == 1);
    assert(getNumSteps(5,5,3,4) == 1);
    assert(getNumSteps(5,5,3,6) == 1);
    assert(getNumSteps(5,5,4,7) == 1);

    char a,b,c,d;
    while(scanf("%c%c %c%c\n", &a, &b, &c, &d) != EOF) {
        int origx = a-'a';
        int origy = b-'1';
        int finx = c-'a';
        int finy = d-'1';
        printf("To get from %c%c to %c%c " , a, b, c, d);
        printf("takes %d knight moves.\n", getNumSteps(origx, origy, finx, finy));

    }


    return 0;
}
示例#5
0
/*
  Moves the stepper to the specified angle relative to the current
  angle.  Moves at the specified motor speed.
*/
void Stepper::rotate(float relative_angle)
{
	int steps = getNumSteps(relative_angle);
	step(steps);
}
示例#6
0
void AsyncProfiler::calculateAverage()
{
    if (trials.size() == 0) return;
    //std::cout << "########################################################################" << std::endl;
    std::cout << "Calculating Average" << std::endl;
    size_t numSteps = getNumSteps();
    average.resize(numSteps);
    average.trialName = "average";
    average.aggregateStep.setName("aggregate");
    Trial total(numSteps), count(numSteps);

    // sum step attributes
    trialsAveraged = 0;
    size_t firstTrial = (trials.size()>numThrowAwayTrials) ? numThrowAwayTrials : 0;
    size_t totalTime = 0;
    size_t totalMemory = 0;
    size_t totalFlops = 0;
    for (size_t t = firstTrial; t < trials.size(); t++)
    {
        trialsAveraged++;
        for (size_t s = 0; s < trials[t].size(); s++)
        {
            // time
            size_t oTime = get(t, s, time);
            size_t uTime = total.get(s, time) + oTime;
            total.set(s, time, uTime );
            count.set(s, time, count.get(s, time)+1 );
            totalTime += oTime;

            // flops
            size_t oFlops= get(t, s, flops);
            size_t uFlops = total.get(s, flops) + oFlops;
            total.set(s, flops, uFlops );
            count.set(s, flops, count.get(s, flops)+1 );
            totalFlops += oFlops;

            // memory
            size_t oMemory = get(t, s, memory);
            size_t uMemory = total.get(s, memory) + oMemory;
            total.set(s, memory, uMemory );
            count.set(s, memory, count.get(s, memory)+1 );
            totalMemory += oMemory;
        }
    }

    // assign average trial attributes
    average.aggregateStep.set(time, totalTime / trialsAveraged);
    average.aggregateStep.set(flops, totalFlops / trialsAveraged);
    average.aggregateStep.set(memory, totalMemory / trialsAveraged);
    average.aggregateStep.set(flops_s, static_cast<size_t>(1000000000.0 * totalFlops / totalTime) );
    average.aggregateStep.set(bandwidth, static_cast<size_t>(1000000000.0 * totalMemory / totalTime) );
    //std::cout
    //    << "bandwidth:" << average.attributeValues[bandwidth] << " = "
    //    << "memory:" << totalMemory << " / "
    //    << "time:" << totalTime << " x1000000000" << std::endl;

    // assign average step attributes
    for (size_t s = 0; s < total.size(); s++)
    {
        average.setStepName( s, trials[0].getStepName( s ) );
        for (size_t a = 0; a < NUM_ATTRIBUTES; a++)
        {
            size_t n = count.get(s, a);
            if (n > 0)
            {
                size_t tot = total.get(s, a);
                average.set(s, a, tot / n);
            }
        }
    }
    //std::cout << "########################################################################" << std::endl;
    //std::cout << "Calculating Derived" << std::endl;
    average.computeStepsDerived();

    // accumulate for standard deviation
    for (size_t t = firstTrial; t < trials.size(); t++)
    {
        // accumulate for trial
        size_t dTime = trials[t].attributeValues[time] - average.aggregateStep.get(time);
        average.aggregateStep.stdDev[time] += dTime * dTime;
        size_t dBandwidth = trials[t].attributeValues[bandwidth] - average.aggregateStep.get(bandwidth);
        average.aggregateStep.stdDev[bandwidth] += dBandwidth * dBandwidth;
        size_t dFlops_s = trials[t].attributeValues[flops_s] - average.aggregateStep.get(flops_s);
        average.aggregateStep.stdDev[flops_s] += dFlops_s * dFlops_s;

        // accumulate for steps
        for (size_t s = 0; s < trials[t].size(); s++)
        {
            // time
            size_t sTime = get(t, s, time);
            size_t avgTime = average.get(s, time);
            size_t diffTime = sTime - avgTime;
            average[s].stdDev[time] += diffTime*diffTime;

            // flops_s
            size_t sFlops_s = get(t, s, flops_s);
            size_t avgFlops_s = average.get(s, flops_s);
            size_t diffFlops_s = sFlops_s - avgFlops_s;
            average[s].stdDev[flops_s] += diffFlops_s*diffFlops_s;

            // bandwidth
            size_t sBandwidth = get(t, s, bandwidth);
            size_t avgBandwidth = average.get(s, bandwidth);
            size_t diffBandwidth = sBandwidth - avgBandwidth;
            average[s].stdDev[bandwidth] += diffBandwidth*diffBandwidth;
        }
    }

    // final divide for trial stddev
    // time
    average.aggregateStep.stdDev[time] = static_cast<size_t>(sqrt(average.aggregateStep.stdDev[time]/(trialsAveraged-1.0) ));
    // flops_s
    average.aggregateStep.stdDev[flops_s] = static_cast<size_t>(sqrt(average.aggregateStep.stdDev[flops_s]/(trialsAveraged-1.0) ));
    // bandwidth
    average.aggregateStep.stdDev[bandwidth] = static_cast<size_t>(sqrt(average.aggregateStep.stdDev[bandwidth]/(trialsAveraged-1.0) ));
    //std::cout << "Size of Average Trials: " << average.size() << std::endl;
    // final divide for steps stddev
    for (size_t s = 0; s < average.size(); s++)
    {
        // time
        average[s].stdDev[time] = static_cast<size_t>(sqrt(average[s].stdDev[time]/(count.get(s,time)-1.0) ));
        // flops_s
        average[s].stdDev[flops_s] = static_cast<size_t>(sqrt(average[s].stdDev[flops_s]/(count.get(s,flops)-1.0) ));
        // bandwidth
        average[s].stdDev[bandwidth] = static_cast<size_t>(sqrt(average[s].stdDev[bandwidth]/(count.get(s,memory)-1.0) ));
    }

    // Print basic info to stdout
    printf("Avg Agg Time: %7.3f ms\n", average.aggregateStep.get( time ) /1000000.f );

}