void Protocol::readAck() {
	vector<string> v = readArr();
	if (v.at(0) != "ack") {
		cout << "Didn't receive ack! Exit!" << endl;
		exit(1);
	}
}
bool Protocol::readBool() {
	vector <string> v = readArr();
	if (v.at(0)=="ok")
		return true;
	else if (v.at(0) == "fail"){
		if (DEBUG) cout << "Received fail. Exiting!" << endl;
	}
	else if (DEBUG)
		cout << "Something went wrong. Exiting!" << endl;
	return false;
}
Beispiel #3
0
int main(int argc, char** argv)
{
    loadConfig(CONFIG_FILE);

    indexMovie();

    if (!hasSimMatrix)
    {
	readData(&A, nMovies, nUsers, trainSet);
    
#ifdef DEBUG
	readArr(A, nMovies, nUsers);
#endif



    
	/*        CHUAN HOA       */
	printf("\n\nChuan hoa: ");
	for (int i=0; i<nMovies; i++)
	{
	    float sum = 0; //Tong cac rating
	    int t = 0;     //So rating
	    
	    for (int j=0; j<nUsers; j++)
	    {
		if (A[i][j] != 0)
		{
		    sum += A[i][j];
		    t++;
		}
	    }

	    float rowMean = 0;
	    if (t!=0)
		rowMean = sum/t;
	    
	    for (int j=0; j<nUsers; j++)
	    {
		if (A[i][j] != 0)
		    A[i][j] -= rowMean;
	    }

	    printf("\r\%-10d/%10d", i, nMovies);
	}


#ifdef DEBUG
	puts("");
	printf("\nSTANDARDIZED MARTRIX: \n");
	readArr(A, nMovies, nUsers);
	puts("");
#endif



	/*         TINH SIMILARY MATRIX           */
	printf("\n\nTinh sim: ");    sim = calloc(nMovies, sizeof(float*));
	for (int i=0; i<nMovies; i++)
	    sim[i] = calloc(nMovies, sizeof(float*));

	for (int i=0; i<nMovies; i++)
	{
	    for (int j=i+1; j<nMovies; j++)
	    {
		sim[i][j] = cosine(A[i], A[j], nUsers);
	    }
	    printf("\r%-10d/%10d", i, nMovies);
	}

	for (int i=0; i<nMovies; i++)
	    for (int j=0; j<=i; j++)
	    {
		if (i == j)
		    sim[i][j] = 1;
		else
		    sim[i][j] = sim[j][i];
	    }

	writeDataToFile(sim, nMovies, nMovies, pathToSimMatrix);
	freeArr(A, nMovies);
    }
bool Protocol::updateGrid(Board &board){
	//Update not needed
	if (board.gc.usegrid && !board.grid->isStable())
		return true;
	
	vector<string> v;	
	for (int i=0; i < board.tanks.size(); i++){
		//Would it be worth it to get a grid value here?
		if (board.tanks[i]->mode == DEAD)
			continue;
		int posx = board.tanks[i]->pos[0];
		int posy = board.tanks[i]->pos[1];
		if (board.grid->isStable(posx, posy))
			continue;
		//Get grid for a single tank
		char char_buff[13];
		sprintf(char_buff, "occgrid %d", i);
		sendLine(char_buff);
		readAck();
		v = readArr();
		if (v.at(0) != "begin")
			return false;
		//Get occgrid dimensions
		v = readArr();
		int rx, ry, rw, rh;
		if (sscanf(v.at(1).c_str(), "%d,%d", &rx, &ry) != 2)
			return false;
		v = readArr();
		if (sscanf(v.at(1).c_str(), "%dx%d", &rw, &rh) != 2)
			return false;
		int half = (int) (board.gc.worldsize/2.0);
		ry += half;
		rx += half;
		//Read raw values into buffer
		for (int x=0; x<rw; x++){
			v = readArr();
			string& occ = v.at(0);
			if (occ.size() != rh)
				return false;
			for (int y=0; y<rh; y++)
				board.grid->buffer[x*rh+y] = occ[y] == '1';
		}
		//Blur the buffer
		int radius = OCC_BLUR;
		int diam = radius*2+1;
		int half_cells = diam*diam/2;
		diam--;
		//Sum vertically
		for (int x=0; x<rw; x++){
			int v=0, y=0;
			//We only use border cells for averaging
			for (; y<diam; y++)
				v += board.grid->buffer[x*rh+y];
			//Swap out old value with the sum
			for (; y<rh; y++){
				v += board.grid->buffer[x*rh+y];
				int t = board.grid->buffer[x*rh+y-radius];
				board.grid->buffer[x*rh+y-radius] = v;
				v -= t;
			}
		}
		//Sum horizontally
		for (int y=radius; y<rh-radius; y++){
			int v=0, x=0;
			//Skip border cells, like before
			for (; x<diam; x++)
				v += board.grid->buffer[x*rh+y];
			for (; x<rw; x++){
				v += board.grid->buffer[x*rh+y];
				//Update cell with blurred value
				board.grid->updateCell(ry+y, rx+x, v > half_cells);
				v -= board.grid->buffer[(x-radius)*rh+y];
			}
		}
		//End occgrid command
		v = readArr();
		if (v.at(0) != "end")
			return false;
	}
	return true;
}
//Fetch information
bool Protocol::updateBoard(double delta_t, Board &board){
	//Update tank positions
	sendLine("mytanks");
	readAck();
	vector<string> v = readArr();
	if (v.at(0) != "begin")
		return false;
	v.clear();
	v = readArr();
	vector<AbstractTank*>::iterator tank_iter = board.tanks.begin();
	while(v.at(0) == "mytank"){
		//Update alive/dead status
		bool alive = v.at(3) == board.gc.tankalive;
		if (alive){
			//Used to be dead; needs to be assigned a goal
			if ((*tank_iter)->mode == DEAD)
				(*tank_iter)->mode = IDLE;
			//Update dynamics
			(*tank_iter)->updateDynamics(
				delta_t,
				atof(v.at(7).c_str()),
				atof(v.at(8).c_str()),
				atof(v.at(9).c_str())
			);
			/* REPLACED BY KALMAN FILTER
			//Update velocities
			(*tank_iter)->vel_linear = Vector2d(
				atof(v.at(10).c_str()),
				atof(v.at(11).c_str())
			);
			(*tank_iter)->vel_angular = atof(v.at(12).c_str());
			*/
			//MyTank.shots_avail=atoi(v.at(4).c_str());
			//MyTank.time_to_reload=atof(v.at(5).c_str());
			//MyTank.flag=v.at(6);
		}
		else (*tank_iter)->mode = DEAD;
		tank_iter++;
		v.clear();
		v=readArr();
	}
	if (v.at(0) != "end")
		return false;
	
	//Update enemy tanks
	sendLine("othertanks");
	readAck();
	v = readArr();
	if (v.at(0) != "begin")
		return false;
	v.clear();
	v = readArr();
	tank_iter = board.enemy_tanks.begin();
	while (v.at(0) == "othertank"){
		//Update alive/dead status
		bool alive = v.at(3) == board.gc.tankalive;
		(*tank_iter)->mode = alive ? IDLE : DEAD;
		if (alive){
			//Update dynamics
			(*tank_iter)->updateDynamics(
				delta_t,
				atof(v.at(5).c_str()),
				atof(v.at(6).c_str()),
				atof(v.at(7).c_str())
			);
		}
		//OtherTank.flag=v.at(4);
		tank_iter++;
		v.clear();
		v = readArr();
	}
	if (v.at(0) != "end")
		return false;
	
	//Update flag positions and possession
	sendLine("flags");
	readAck();
	v = readArr();
	if (v.at(0) != "begin")
		return false;
	v.clear();
	v = readArr();
	vector<Flag*>::iterator flags_iter = board.flags.begin();
	vector<Flag*>::iterator enemy_flags_iter = board.enemy_flags.begin();
	while (v.at(0) == "flag"){
		Vector2d pos = Vector2d(
			atof(v.at(3).c_str()),
			atof(v.at(4).c_str())
		);
		bool isPossessed = v.at(2) != "none";
		bool havePosession = v.at(2) == board.gc.mycolor;
		//vector<Flag*>::iterator &ref = v.at(1) == gc.mycolor ? flags_iter : enemy_flags_iter;
		if (v.at(1) == board.gc.mycolor){
			(*flags_iter)->loc = pos;
			(*flags_iter)->isPossessed = isPossessed;
			(*flags_iter)->havePosession = havePosession;
			flags_iter++;
		}
		else{
			(*enemy_flags_iter)->loc = pos;
			(*enemy_flags_iter)->isPossessed = isPossessed;
			(*enemy_flags_iter)->havePosession = havePosession;
			enemy_flags_iter++;
		}
		v.clear();
		v = readArr();
	}
	if (v.at(0) != "end")
		return false;

	//Hooray, there were no errors!
	return true;
}
Beispiel #6
0
int main(int argc, char** argv)
{
    loadConfig(CONFIG_FILE);

    if (!hasSimMatrix)
    {
	readData(&A, nMovies, nUsers, trainSet);
    
#ifdef DEBUG
	readArr(A, nMovies, nUsers);
#endif

	omp_set_num_threads(MAX_THREAD);


    
	/*        CHUAN HOA       */
	printf("\n\nChuan hoa: ");
#pragma omp parallel for
	for (int i=0; i<nMovies; i++)
	{
	    float sum = 0; //Tong cac rating
	    int t = 0;     //So rating
	    
#pragma omp parallel for schedule(static, 3) reduction(+:sum)
	    for (int j=0; j<nUsers; j++)
	    {
		if (A[i][j] != 0)
		{
		    sum += A[i][j];
		    t++;
		}
	    }

	    float rowMean = sum/t;
	    
#pragma omp parallel for schedule(static, 3)
	    for (int j=0; j<nUsers; j++)
	    {
		if (A[i][j] != 0)
		    A[i][j] -= rowMean;
	    }

	    printf("\n%d/%d", i, nMovies);
	}


#ifdef DEBUG
	puts("");
	printf("\nSTANDARDIZED MARTRIX: \n");
	readArr(A, nMovies, nUsers);
	puts("");
#endif



	/*         TINH SIMILARY MATRIX           */
	printf("\n\nTinh sim: ");    sim = calloc(nMovies, sizeof(float*));
	for (int i=0; i<nMovies; i++)
	    sim[i] = calloc(nMovies, sizeof(float*));

#pragma omp parallel for schedule(static, 3)
	for (int i=0; i<nMovies; i++)
	{
#pragma omp parallel for schedule(static, 3)
	    for (int j=i+1; j<nMovies; j++)
	    {
		sim[i][j] = cosine(A[i], A[j], nUsers);
	    }
	    printf("\n%d/%d: ", i, nMovies);
	}

	for (int i=0; i<nMovies; i++)
	    for (int j=0; j<=i; j++)
	    {
		if (i == j)
		    sim[i][j] = 1;
		else
		    sim[i][j] = sim[j][i];
	    }

	writeDataToFile(sim, nMovies, nMovies, pathToSimMatrix);
	freeArr(A, nMovies);
    }
    else
    {
	int tmp;
	loadArrFromFile(&sim, &tmp, &tmp, pathToSimMatrix);
    }
    
#ifdef DEBUG
    puts("");
    printf("\nSIMILARY MATRIX: \n");
    readArr(sim, nMovies, nMovies);
    puts("");
#endif


    
    /*          TINH RATING            */
    Rating *B;
    int len;
    readTestData(&B, &len, testSet);
    readData(&A, nMovies, nUsers, trainSet);
    float *AVG;
    computeAvgRating(&AVG, A, nMovies, nUsers);

    
#pragma omp parallel for schedule(static, 3)
    for (int i=0; i<len; i++)
    {
	ratePredict(&B[i], A, sim);
	//Neu khong the du doan thi dua ve gia tri trung binh
	if (B[i].P == 0)
	    B[i].P = AVG[B[i].uID];
    }

    writeResultToFile(B, len, "data/result.txt");

    float T = 0;
    float temp;
#pragma omp parallel for schedule(static, 3) reduction(+:T) private(temp)
    for (int i=0; i<len; i++)
    {
	temp = B[i].R - B[i].P;
	T += temp * temp;
    }

    printf("\n %f", sqrt(T/len));
    
#ifdef DEBUG
    puts("");
    printf("RESULT: ");
    for (int i=0; i<len; i++)
    {
	printf("\nmID: %5d    uID: %5d     Real: %6.2fd      Predict: %6.2f", B[i].mID, B[i].uID, B[i].R, B[i].P);
	usleep(1000000);
    }
    puts("");
#endif

    


    free(AVG);
    freeArr(sim, nMovies);
    free(B);
    freeArr(A, nMovies);
    puts("");
    return 0;
}