int Solution::getSubgroupsMatrix(Rules& r, Matrix3D<int>& a){ assert(r.initialized); assert(r.internalStructureComputed); int conflicts=0; a.resize(r.nInternalSubgroups, r.nDaysPerWeek, r.nHoursPerDay); int i; for(i=0; i<r.nInternalSubgroups; i++) for(int j=0; j<r.nDaysPerWeek; j++) for(int k=0; k<r.nHoursPerDay; k++) a[i][j][k]=0; for(i=0; i<r.nInternalActivities; i++) if(this->times[i]!=UNALLOCATED_TIME){ int hour=this->times[i]/r.nDaysPerWeek; int day=this->times[i]%r.nDaysPerWeek; Activity* act = &r.internalActivitiesList[i]; for(int dd=0; dd < act->duration && hour+dd < r.nHoursPerDay; dd++) for(int isg=0; isg < act->iSubgroupsList.count(); isg++){ //isg => index subgroup int sg = act->iSubgroupsList.at(isg); //sg => subgroup int tmp=a[sg][day][hour+dd]; conflicts += tmp==0 ? 0 : 1; a[sg][day][hour+dd]++; } } this->changedForMatrixCalculation=false; return conflicts; }
void ASMs1D::extractBasis (double u, Vector& N, Matrix& dNdu, Matrix3D& d2Ndu2) const { int p1 = curv->order(); RealArray bas(p1*3); curv->basis().computeBasisValues(u,&bas.front(),2); N.resize(p1); dNdu.resize(p1,1); d2Ndu2.resize(p1,1,1); for (int i = 1; i <= p1; i++) { N(i) = bas[3*i-3]; dNdu(i,1) = bas[3*i-2]; d2Ndu2(i,1,1) = bas[3*i-1]; } }
void SplineUtils::extractBasis (const Go::BasisDerivsSf2& spline, Vector& N, Matrix& dNdu, Matrix3D& d2Ndu2) { N .resize(spline.basisValues.size()); dNdu .resize(N.size(),2); d2Ndu2.resize(N.size(),2,2); size_t jp, n = 1; for (jp = 0; jp < N.size(); jp++, n++) { N (n) = spline.basisValues[jp]; dNdu (n,1) = spline.basisDerivs_u[jp]; dNdu (n,2) = spline.basisDerivs_v[jp]; d2Ndu2(n,1,1) = spline.basisDerivs_uu[jp]; d2Ndu2(n,1,2) = d2Ndu2(n,2,1) = spline.basisDerivs_uv[jp]; d2Ndu2(n,2,2) = spline.basisDerivs_vv[jp]; } }
//critical function here - must be optimized for speed //int Solution::getTeachersMatrix(Rules& r, qint8 a[MAX_TEACHERS][MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY]){ int Solution::getTeachersMatrix(Rules& r, Matrix3D<qint8>& a){ assert(r.initialized); assert(r.internalStructureComputed); int conflicts=0; a.resize(r.nInternalTeachers, r.nDaysPerWeek, r.nHoursPerDay); int i; for(i=0; i<r.nInternalTeachers; i++) for(int j=0; j<r.nDaysPerWeek; j++) for(int k=0; k<r.nHoursPerDay; k++) a[i][j][k]=0; for(i=0; i<r.nInternalActivities; i++) if(this->times[i]!=UNALLOCATED_TIME) { int hour = this->times[i] / r.nDaysPerWeek; int day = this->times[i] % r.nDaysPerWeek; Activity* act=&r.internalActivitiesList[i]; for(int dd=0; dd<act->duration && hour+dd<r.nHoursPerDay; dd++) for(int it=0; it<act->iTeachersList.count(); it++){ int tch=act->iTeachersList.at(it); int tmp=a[tch][day][hour+dd]; /*if(act->parity==PARITY_WEEKLY){ conflicts += tmp<2 ? tmp : 2; a[tch][day][hour+dd]+=2; } else{ assert(act->parity==PARITY_FORTNIGHTLY); conflicts += tmp<2 ? 0 : 1; a[tch][day][hour+dd]++; }*/ conflicts += tmp==0 ? 0 : 1; a[tch][day][hour+dd]++; } } this->changedForMatrixCalculation=false; return conflicts; }
//The following 2 functions (GetTeachersTimetable & GetSubgroupsTimetable) //are very similar to the above 2 ones (GetTeachersMatrix & GetSubgroupsMatrix) //void Solution::getTeachersTimetable(Rules& r, qint16 a[MAX_TEACHERS][MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY], QList<qint16> b[TEACHERS_FREE_PERIODS_N_CATEGORIES][MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY]){ //void Solution::getTeachersTimetable(Rules& r, Matrix3D<qint16>& a, QList<qint16> b[TEACHERS_FREE_PERIODS_N_CATEGORIES][MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY]){ void Solution::getTeachersTimetable(Rules& r, Matrix3D<qint16>& a, Matrix3D<QList<qint16> >& b){ //assert(HFitness()==0); //This is only for perfect solutions, that do not have any non-satisfied hard constrains assert(r.initialized); assert(r.internalStructureComputed); a.resize(r.nInternalTeachers, r.nDaysPerWeek, r.nHoursPerDay); b.resize(TEACHERS_FREE_PERIODS_N_CATEGORIES, r.nDaysPerWeek, r.nHoursPerDay); int i, j, k; for(i=0; i<r.nInternalTeachers; i++) for(j=0; j<r.nDaysPerWeek; j++) for(k=0; k<r.nHoursPerDay; k++) //a1[i][j][k]=a2[i][j][k]=UNALLOCATED_ACTIVITY; a[i][j][k]=UNALLOCATED_ACTIVITY; Activity *act; for(i=0; i<r.nInternalActivities; i++) if(this->times[i]!=UNALLOCATED_TIME) { act=&r.internalActivitiesList[i]; int hour=this->times[i]/r.nDaysPerWeek; int day=this->times[i]%r.nDaysPerWeek; for(int dd=0; dd < act->duration; dd++){ assert(hour+dd<r.nHoursPerDay); for(int ti=0; ti<act->iTeachersList.count(); ti++){ int tch = act->iTeachersList.at(ti); //teacher index /*if(a1[tch][day][hour+dd]==UNALLOCATED_ACTIVITY) a1[tch][day][hour+dd]=i; else a2[tch][day][hour+dd]=i;*/ assert(a[tch][day][hour+dd]==UNALLOCATED_ACTIVITY); a[tch][day][hour+dd]=i; } } } //Prepare teachers free periods timetable. //Code contributed by Volker Dirr (http://timetabling.de/) BEGIN int d,h,tch; for(d=0; d<r.nDaysPerWeek; d++){ for(h=0; h<r.nHoursPerDay; h++){ for(int tfp=0; tfp<TEACHERS_FREE_PERIODS_N_CATEGORIES; tfp++){ b[tfp][d][h].clear(); } } } for(tch=0; tch<r.nInternalTeachers; tch++){ for(d=0; d<r.nDaysPerWeek; d++){ int firstPeriod=-1; int lastPeriod=-1; for(h=0; h<r.nHoursPerDay; h++){ if(a[tch][d][h]!=UNALLOCATED_ACTIVITY){ if(firstPeriod==-1) firstPeriod=h; lastPeriod=h; } } if(firstPeriod==-1){ for(h=0; h<r.nHoursPerDay; h++){ b[TEACHER_HAS_A_FREE_DAY][d][h]<<tch; } } else { for(h=0; h<firstPeriod; h++){ if(firstPeriod-h==1){ b[TEACHER_MUST_COME_EARLIER][d][h]<<tch; } else { b[TEACHER_MUST_COME_MUCH_EARLIER][d][h]<<tch; } } for(; h<lastPeriod+1; h++){ if(a[tch][d][h]==UNALLOCATED_ACTIVITY){ if(a[tch][d][h+1]==UNALLOCATED_ACTIVITY){ if(a[tch][d][h-1]==UNALLOCATED_ACTIVITY){ b[TEACHER_HAS_BIG_GAP][d][h]<<tch; } else { b[TEACHER_HAS_BORDER_GAP][d][h]<<tch; } } else { if(a[tch][d][h-1]==UNALLOCATED_ACTIVITY){ b[TEACHER_HAS_BORDER_GAP][d][h]<<tch; } else { b[TEACHER_HAS_SINGLE_GAP][d][h]<<tch; } } } } for(; h<r.nHoursPerDay; h++){ if(lastPeriod-h==-1){ b[TEACHER_MUST_STAY_LONGER][d][h]<<tch; } else { b[TEACHER_MUST_STAY_MUCH_LONGER][d][h]<<tch; } } } } } //care about not available teacher and breaks for(tch=0; tch<r.nInternalTeachers; tch++){ for(d=0; d<r.nDaysPerWeek; d++){ for(h=0; h<r.nHoursPerDay; h++){ if(teacherNotAvailableDayHour[tch][d][h]==true || breakDayHour[d][h]==true){ int removed=0; for(int tfp=0; tfp<TEACHER_IS_NOT_AVAILABLE; tfp++){ if(b[tfp][d][h].contains(tch)){ removed+=b[tfp][d][h].removeAll(tch); if(breakDayHour[d][h]==false) b[TEACHER_IS_NOT_AVAILABLE][d][h]<<tch; } } assert(removed==1); } } } } //END of Code contributed by Volker Dirr (http://timetabling.de/) END //bool visited[MAX_TEACHERS]; Matrix1D<bool> visited; visited.resize(r.nInternalTeachers); for(d=0; d<r.nDaysPerWeek; d++){ for(h=0; h<r.nHoursPerDay; h++){ for(tch=0; tch<r.nInternalTeachers; tch++) visited[tch]=false; for(int tfp=0; tfp<TEACHERS_FREE_PERIODS_N_CATEGORIES; tfp++){ foreach(int tch, b[tfp][d][h]){ assert(!visited[tch]); visited[tch]=true; } } } }
int main(int argc, char** argv) { //QApplication* app = new QApplication(argc, argv); Configurations& conf = CONF; FileManager fm; Matrix3D<float> dataPointsObj; Matrix3D<float> originalDensityVolObj; Matrix3D<float> binaryVolObj; MarchingCubes* mcs = new MarchingCubes; char* fileName = (char*)"dataFile/DFORMAT_MeristemSmooth.txt"; float start_time=0.0; float end_time=0.0; //-- Step 1: Read Data -- //Output: Matrix3D m3D_imageData holding density values if (fm.readDataFormat(fileName, conf)) { if(!fm.readVolumeData(dataPointsObj, conf, 1)) { cout<<"read data file 1 error"; return 0; } if(conf.cf_numFiles==2 && !fm.readVolumeData(originalDensityVolObj, conf, 2)) { cout<<"read data file 2 error"; return 0; } if(conf.cf_numFiles==3){ bool rf2 = fm.readVolumeData(originalDensityVolObj, conf, 2); bool rf3 = fm.readVolumeData(binaryVolObj, conf, 3); if(!rf2) { cout<<"Reading Error: data file 2"; return 0; } if(!rf3) { cout<<"Reading Error: data file 3"; return 0; } } }else { cout<<"read format file error"; return 0; } //-- Step 2: Create Active Cubes -- cout<<"Make Cubes begins... "<<endl; start_time = getTime(); mcs->set_resolution(conf.cf_xdim, conf.cf_ydim, conf.cf_zdim); mcs->init_all(); mcs->set_ext_data(dataPointsObj.getPointer()); if(conf.cf_numFiles==1) mcs->run( conf, conf.cf_isoVal ); else if(conf.cf_numFiles==2){ mcs->run( conf, conf.cf_isoVal, &originalDensityVolObj, &binaryVolObj ); //Gradients on original density volume originalDensityVolObj.resize(1,81, 1); binaryVolObj.resize(1, 1, 1); } else if(conf.cf_numFiles==3){ mcs->run( conf, conf.cf_isoVal, &originalDensityVolObj, &binaryVolObj ); //Gradients on original density volume originalDensityVolObj.resize(1, 1, 1); binaryVolObj.resize(1, 1, 1); } end_time = getTime(); cout<<"## Time for running Marching Cubes: "<<end_time-start_time<<" seconds"<<endl; cout<<"num of triangles="<<mcs->ntrigs()<<", number of vertices="<<mcs->nverts()<<endl; mcs->clean_temps(); //mcs->writePLY("test.ply"); mcs->clean_all(); //sliderWindow *sw = new sliderWindow(app); //-- Step 7: Rendering -- glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(width, height); glutInitWindowPosition(100, 50); main_window = glutCreateWindow("Volume Visualization using - Marina Doherty ( TL:MC July, 2013)"); //Register callback routines for main window glutDisplayFunc(displayFaces); glutReshapeFunc(reshape); glutIdleFunc(idle); object_window = glutCreateSubWindow(main_window, 0, 0, 700, 700); glutDisplayFunc(renderSceneow); init(); controlPanel_window = glutCreateSubWindow(main_window, 700, 0, 300, 750); glutDisplayFunc(renderScenecpw); text_window = glutCreateSubWindow(main_window, 0, 700, 700, 50); glutDisplayFunc(renderScenetw); glutMainLoop(); //app->exec(); return 0; }