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; }
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; }
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; }