Preprocess bug fix
[satune.git] / src / Tuner / multituner.cc
index 0850f66ede42289b2623187d5407fc04e372ba18..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);
@@ -77,28 +85,28 @@ void MultiTuner::printData() {
 }
 
 void MultiTuner::findBestThreeTuners() {
-       if(allTuners.getSize() < 3){
+       if (allTuners.getSize() < 3) {
                printData();
                return;
        }
-       TunerRecord * bestTuners[3];
+       TunerRecord *bestTuners[3];
        double score = DBL_MAX;
-       for (uint i = 0; i < allTuners.getSize()-2; i++) {
-               for(uint j=i+1; j< allTuners.getSize()-1; j++){
-                       for(uint k=j+1; k<allTuners.getSize(); k++){
+       for (uint i = 0; i < allTuners.getSize() - 2; i++) {
+               for (uint j = i + 1; j < allTuners.getSize() - 1; j++) {
+                       for (uint k = j + 1; k < allTuners.getSize(); k++) {
                                TunerRecord *tuner1 = allTuners.get(i);
                                TunerRecord *tuner2 = allTuners.get(j);
                                TunerRecord *tuner3 = allTuners.get(k);
                                double mintimes[problems.getSize()];
-                               for(uint l=0; l < problems.getSize(); l++){
+                               for (uint l = 0; l < problems.getSize(); l++) {
                                        Problem *problem = problems.get(l);
                                        mintimes[l] = pow(min(tuner1->getTime(problem), tuner2->getTime(problem), tuner3->getTime(problem)), (double)1 / problems.getSize());
                                }
-                               double result=1;
-                               for(uint l=0; l< problems.getSize(); l++){
+                               double result = 1;
+                               for (uint l = 0; l < problems.getSize(); l++) {
                                        result *= mintimes[l];
                                }
-                               if(result < score){
+                               if (result < score) {
                                        score = result;
                                        bestTuners[0] = tuner1;
                                        bestTuners[1] = tuner2;
@@ -108,9 +116,12 @@ void MultiTuner::findBestThreeTuners() {
                }
        }
        model_print("Best 3 tuners:\n");
-       for(uint i=0; i<3; i++){
-               TunerRecord * tuner = bestTuners[i];
+       for (uint i = 0; i < 3; i++) {
+               TunerRecord *tuner = bestTuners[i];
                SearchTuner *stun = tuner->getTuner();
+               char buffer[512];
+               snprintf(buffer, sizeof(buffer), "best%u.tuner", i);
+               stun->serialize(buffer);
                model_print("Tuner %u\n", tuner->tunernumber);
                stun->print();
                for (uint j = 0; j < tuner->problems.getSize(); j++) {
@@ -122,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);
@@ -143,7 +163,7 @@ void MultiTuner::readData(uint numRuns) {
                        allTuners.setSize(tunernumber + 1);
                if (allTuners.get(tunernumber) == NULL) {
                        snprintf(buffer, sizeof(buffer), "tuner%u", i);
-                       allTuners.set(tunernumber, new TunerRecord(new SearchTuner(buffer)));
+                       allTuners.set(tunernumber, new TunerRecord(new SearchTuner(buffer), tunernumber));
                }
                //Add any new used records
                snprintf(buffer, sizeof(buffer), "tuner%uused", i);
@@ -252,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++;
@@ -299,18 +322,20 @@ void MultiTuner::tuneComp() {
                                        if (tuner->getTime(problem) == -1) {
                                                tuner->problems.push(problem);
                                        }
-                                       LOG("%u.Problem<%s>\tTuner<%p, %d>\tMetric<%lld>\n", i, problem->problem,tuner, tuner->tunernumber, metric);
-                                       LOG("*****************************\n");
+                                       model_print("%u.Problem<%s>\tTuner<%p, %d>\tMetric<%lld>\n", i, problem->problem,tuner, tuner->tunernumber, metric);
+                                       model_print("*****************************\n");
                                        if (metric != -1)
                                                tuner->setTime(problem, metric);
+                                       else
+                                               tuner->setTime(problem, -2);
                                }
-                               if (metric != -1) {
+                               if (metric >= 0) {
                                        uint k = 0;
                                        for (; k < places.getSize(); k++) {
                                                if (metric < places.get(k)->getTime(problem))
                                                        break;
                                        }
-                                       LOG("place[%u]=Tuner<%p,%d>\n", k, tuner, tuner->tunernumber);
+                                       model_print("place[%u]=Tuner<%p,%d>\n", k, tuner, tuner->tunernumber);
                                        places.insertAt(k, tuner);
                                }
                        }
@@ -321,8 +346,8 @@ void MultiTuner::tuneComp() {
                                if (scores.contains(tuner))
                                        currScore = scores.get(tuner);
                                currScore += points;
-                               LOG("Problem<%s>\tTuner<%p,%d>\tmetric<%d>\n", problem->problem, tuner, tuner->tunernumber,  currScore);
-                               LOG("**************************\n");
+                               model_print("Problem<%s>\tTuner<%p,%d>\tmetric<%d>\n", problem->problem, tuner, tuner->tunernumber,  currScore);
+                               model_print("**************************\n");
                                scores.put(tuner, currScore);
                                points = points / 3;
                        }
@@ -342,14 +367,14 @@ void MultiTuner::tuneComp() {
                                if (score > tscore)
                                        break;
                        }
-                       LOG("ranking[%u]=tuner<%p,%u>(Score=%d)\n", j, tuner, tuner->tunernumber, score);
-                       LOG("************************\n");
+                       model_print("ranking[%u]=tuner<%p,%u>(Score=%d)\n", j, tuner, tuner->tunernumber, score);
+                       model_print("************************\n");
                        ranking.insertAt(j, tuner);
                }
-               LOG("tunerSize=%u\trankingSize=%u\ttunerVSize=%u\n", tuners.getSize(), ranking.getSize(), tunerV->getSize());
+               model_print("tunerSize=%u\trankingSize=%u\ttunerVSize=%u\n", tuners.getSize(), ranking.getSize(), tunerV->getSize());
                for (uint i = tuners.getSize(); i < ranking.getSize(); i++) {
                        TunerRecord *tuner = ranking.get(i);
-                       LOG("Removing tuner %u\n", tuner->tunernumber);
+                       model_print("Removing tuner %u\n", tuner->tunernumber);
                        for (uint j = 0; j < tunerV->getSize(); j++) {
                                if (tunerV->get(j) == tuner)
                                        tunerV->removeAt(j);
@@ -371,9 +396,11 @@ void MultiTuner::mapProblemsToTuners(Vector<TunerRecord *> *tunerV) {
                                metric = evaluate(problem, tuner);
                                if (metric != -1)
                                        tuner->setTime(problem, metric);
+                               else
+                                       tuner->setTime(problem, -2);
                        }
-                       if ((bestTuner == NULL && metric != -1) ||
-                                       (metric < bestscore && metric != -1)) {
+                       if ((bestTuner == NULL && metric >= 0) ||
+                                       (metric < bestscore && metric >= 0)) {
                                bestTuner = tuner;
                                bestscore = metric;
                        }
@@ -425,9 +452,13 @@ double MultiTuner::evaluateAll(TunerRecord *tuner) {
                        metric = evaluate(problem, tuner);
                        if (metric != -1)
                                tuner->setTime(problem, metric);
+                       else
+                               tuner->setTime(problem, -2);
                }
 
                double score = metric;
+               if (metric < 0)
+                       score = timeout;
                product *= score;
        }
        return pow(product, 1 / ((double)tuner->problems.getSize()));
@@ -442,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;