void GenerateThread::run() { const int INF=2000000000; bool impossible, timeExceeded; gen.generate(INF, impossible, timeExceeded, true); //true means threaded }
void TimetableGenerateForm::start(){ if(!gt.rules.internalStructureComputed){ if(!gt.rules.computeInternalStructure(this)){ QMessageBox::warning(this, TimetableGenerateForm::tr("FET warning"), TimetableGenerateForm::tr("Data is wrong. Please correct and try again")); return; } } if(!gt.rules.initialized || gt.rules.activitiesList.isEmpty()){ QMessageBox::critical(this, TimetableGenerateForm::tr("FET information"), TimetableGenerateForm::tr("You have entered simulation with uninitialized rules or 0 activities...aborting")); assert(0); exit(1); return; } currentResultsTextEdit->setPlainText(TimetableGenerateForm::tr("Entering simulation....precomputing, please be patient")); gen.abortOptimization=false; bool ok=gen.precompute(this); if(!ok){ currentResultsTextEdit->setPlainText(TimetableGenerateForm::tr("Cannot generate - please modify your data")); currentResultsTextEdit->update(); QMessageBox::information(this, TimetableGenerateForm::tr("FET information"), TimetableGenerateForm::tr("Your data cannot be processed - please modify it as instructed")); return; } startPushButton->setDisabled(true); stopPushButton->setEnabled(true); stopHighestPushButton->setEnabled(true); closePushButton->setDisabled(true); writeResultsPushButton->setEnabled(true); writeHighestStagePushButton->setEnabled(true); seeImpossiblePushButton->setEnabled(true); seeInitialOrderPushButton->setEnabled(true); simulation_running=true; gen.c.makeUnallocated(gt.rules); TimetableExport::writeRandomSeed(this, true); //true represents 'before' state generateThread.start(); }
void GenerateMultipleThread::run() { genMulti.abortOptimization=false; time(&initial_time); for(int i=0; i<nTimetables; i++){ time(&start_time); bool impossible; bool timeExceeded; for(int qq=0; qq<gt.rules.nInternalActivities; qq++) permutation[qq]=savedPermutation[qq]; emit(timetableStarted(i+1)); semaphoreTimetableStarted.acquire(); genMulti.generate(timeLimit, impossible, timeExceeded, true); //true means threaded QString s; bool ok; myMutex.lock(); if(genMulti.abortOptimization){ myMutex.unlock(); return; } else if(impossible){ s=tr("Timetable impossible to generate"); s+=QString("."); ok=false; } else if(timeExceeded){ s=tr("Time exceeded for current timetable"); ////////2011-05-26 int mact=maxActivitiesPlaced; int mseconds=genMulti.timeToHighestStage; bool zero=false; if(mseconds==0) zero=true; int hh=mseconds/3600; mseconds%=3600; int mm=mseconds/60; mseconds%=60; int ss=mseconds; QString tim; if(hh>0){ tim+=" "; tim+=tr("%1 h", "hours").arg(hh); } if(mm>0){ tim+=" "; tim+=tr("%1 m", "minutes").arg(mm); } if(ss>0 || zero){ tim+=" "; tim+=tr("%1 s", "seconds").arg(ss); } tim.remove(0, 1); s+=QString(". "); s+=tr("Max placed activities: %1 (at %2)", "%1 represents the maximum number of activities placed, %2 is a time interval").arg(mact).arg(tim); /////// s+=QString("."); ok=false; } else{ ok=true; time_t finish_time; time(&finish_time); int seconds=int(finish_time-start_time); int hours=seconds/3600; seconds%=3600; int minutes=seconds/60; seconds%=60; QString tmp; genMulti.c.fitness(gt.rules, &tmp); s=tr("Timetable has %1 soft conflicts factor and was generated in %2 hours, %3 minutes and %4 seconds") .arg(CustomFETString::number(genMulti.c.conflictsTotal)) .arg(hours) .arg(minutes) .arg(seconds); s+=QString("."); } myMutex.unlock(); emit(timetableGenerated(i+1, s, ok)); semaphoreTimetableFinished.acquire(); } emit(finished()); }
void TimetableGenerateMultipleForm::start(){ nTimetables=timetablesSpinBox->value(); assert(nTimetables>0); timeLimit=60*minutesSpinBox->value(); //seconds assert(timeLimit>0); QDir dir; QString s2=INPUT_FILENAME_XML.right(INPUT_FILENAME_XML.length()-INPUT_FILENAME_XML.lastIndexOf(FILE_SEP)-1); if(s2.right(4)==".fet") s2=s2.left(s2.length()-4); QString destDir=OUTPUT_DIR+FILE_SEP+"timetables"+FILE_SEP+s2+"-multi"; if(dir.exists(destDir)){ QMessageBox::warning(this, tr("FET information"), tr("Directory %1 exists and might not be empty," " (it might contain old files). You need to manually remove all contents of this directory AND the directory itself (or rename it)" " and then you can generate multiple timetables") .arg(QDir::toNativeSeparators(destDir))); return; } if(!gt.rules.internalStructureComputed){ if(!gt.rules.computeInternalStructure(this)){ QMessageBox::warning(this, TimetableGenerateMultipleForm::tr("FET warning"), TimetableGenerateMultipleForm::tr("Data is wrong. Please correct and try again")); return; } } if(!gt.rules.initialized || gt.rules.activitiesList.isEmpty()){ QMessageBox::critical(this, TimetableGenerateMultipleForm::tr("FET information"), TimetableGenerateMultipleForm::tr("You have entered simulation with uninitialized rules or 0 activities...aborting")); assert(0); exit(1); return; } currentResultsTextEdit->setPlainText(""); bool ok=genMulti.precompute(this); if(!ok){ currentResultsTextEdit->setPlainText(TimetableGenerateMultipleForm::tr("Cannot optimize - please modify your data")); currentResultsTextEdit->update(); QMessageBox::information(this, TimetableGenerateMultipleForm::tr("FET information"), TimetableGenerateMultipleForm::tr("Your data cannot be processed - please modify it as instructed.")); return; } startPushButton->setDisabled(true); stopPushButton->setEnabled(true); minutesGroupBox->setDisabled(true); timetablesGroupBox->setDisabled(true); closePushButton->setDisabled(true); simulation_running_multi=true; for(int qq=0; qq<gt.rules.nInternalActivities; qq++) savedPermutation[qq]=permutation[qq]; genMulti.c.makeUnallocated(gt.rules); generateMultipleThread.start(); }