Preprocess bug fix
[satune.git] / src / Tuner / multituner.cc
index a86b90fb52c517d36c581655c439e46623947bf1..c69891f10e53da0cbf4037943d91f886ec2ff10d 100644 (file)
@@ -29,6 +29,14 @@ void TunerRecord::setTime(Problem *problem, long long time) {
        timetaken.put(problem, time);
 }
 
+void TunerRecord::print(){
+       model_print("*************TUNER NUMBER=%d***********\n", tunernumber);
+       tuner->print();
+       model_print("&&&&&&&&&&&&&USED SETTINGS &&&&&&&&&&&&\n");
+       tuner->printUsed();
+       model_print("\n");
+}
+
 long long TunerRecord::getTime(Problem *problem) {
        if (timetaken.contains(problem))
                return timetaken.get(problem);
@@ -125,6 +133,15 @@ void MultiTuner::findBestThreeTuners() {
        }
 }
 
+bool MultiTuner::finishTunerExist(TunerRecord *tunerRec){
+       SearchTuner *tuner = tunerRec->getTuner();
+       for(uint i=0; i< explored.getSize(); i++){
+               if(explored.get(i)->getTuner()->equalUsed(tuner))
+                       return true;
+       }
+       return false;
+}
+
 void MultiTuner::addTuner(SearchTuner *tuner) {
        TunerRecord *t = new TunerRecord(tuner);
        tuners.push(t);
@@ -255,6 +272,9 @@ long long MultiTuner::evaluate(Problem *problem, TunerRecord *tuner) {
                updateTimeout(problem, metric);
                snprintf(buffer, sizeof(buffer), "tuner%uused", execnum);
                tuner->getTuner()->addUsed(buffer);
+               if(!finishTunerExist(tuner)){
+                       explored.push(tuner);
+               }
        }
        //Increment execution count
        execnum++;
@@ -453,10 +473,24 @@ SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
        model_print("Mutating %u settings\n", settingsToMutate);
        while (settingsToMutate-- != 0) {
                newTuner->randomMutate();
+               if(hasExplored(newTuner)){
+                       model_print("Note:A repetitive tuner has found\n");
+                       settingsToMutate++;
+               }
        }
        return newTuner;
 }
 
+bool MultiTuner::hasExplored(SearchTuner *newTuner){
+       for (uint i=0; i< explored.getSize(); i++){
+               SearchTuner *tuner = explored.get(i)->getTuner();
+               if(tuner->isSubTunerof(newTuner)){
+                       return true;
+               }
+       }
+       return false;
+}
+
 TunerRecord *MultiTuner::tune(TunerRecord *tuner) {
        TunerRecord *bestTuner = NULL;
        double bestScore = DBL_MAX;