edits
[satune.git] / src / Tuner / multituner.cc
index f6940849262ce184878cdeaa68486de933a30990..e99082345971521885fcf9ac437346594f7e47d1 100644 (file)
@@ -22,8 +22,8 @@ Problem::~Problem() {
        ourfree(problem);
 }
 
-MultiTuner::MultiTuner(uint _budget, uint _timeout) :
-       budget(_budget), timeout(_timeout), execnum(0) {
+MultiTuner::MultiTuner(uint _budget, uint _rounds, uint _timeout) :
+       budget(_budget), rounds(_rounds), timeout(_timeout), execnum(0) {
 }
 
 MultiTuner::~MultiTuner() {
@@ -46,7 +46,7 @@ long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) {
        tuner->serialize(buffer);
 
        //Do run
-       snprintf(buffer, sizeof(buffer), "deserializerun %s %u tuner%u result%s%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum);
+       snprintf(buffer, sizeof(buffer), "deserializerun %s %u tuner%u result%s%u > log%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum, execnum);
        int status = system(buffer);
 
        long long metric = -1;
@@ -76,14 +76,65 @@ long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) {
        return metric;
 }
 
-double MultiTuner::evaluateAll(SearchTuner *tuner) {
-       double product = 1;
+void MultiTuner::mapProblemsToTuners(Vector<TunerRecord *> *tunerV) {
        for (uint i = 0; i < problems.getSize(); i++) {
                Problem *problem = problems.get(i);
+               TunerRecord *bestTuner = NULL;
+               long long bestscore = 0;
+               for (uint j = 0; j < tunerV->getSize(); j++) {
+                       TunerRecord *tuner = tunerV->get(j);
+                       long long metric = evaluate(problem, tuner->getTuner());
+                       if ((bestTuner == NULL && metric != -1) ||
+                                       (metric < bestscore && metric != -1)) {
+                               bestTuner = tuner;
+                               bestscore = metric;
+                       }
+               }
+               if (bestTuner != NULL)
+                       bestTuner->problems.push(problem);
+       }
+}
+
+void clearVector(Vector<TunerRecord *> *tunerV) {
+       for (uint j = 0; j < tunerV->getSize(); j++) {
+               TunerRecord *tuner = tunerV->get(j);
+               tuner->problems.clear();
+       }
+}
+
+void MultiTuner::tuneK() {
+       Vector<TunerRecord *> *tunerV = new Vector<TunerRecord *>(&tuners);
+       for (uint i = 0; i < rounds; i++) {
+               clearVector(tunerV);
+               mapProblemsToTuners(tunerV);
+               improveTuners(tunerV);
+       }
+       model_print("Best tuners\n");
+       for (uint j = 0; j < tunerV->getSize(); j++) {
+               TunerRecord *tuner = tunerV->get(j);
+               char buffer[256];
+               sprintf(buffer, "tuner%u.conf", j);
+               tuner->getTuner()->serialize(buffer);
+               tuner->getTuner()->print();
+       }
+       delete tunerV;
+}
+
+void MultiTuner::improveTuners(Vector<TunerRecord *> *tunerV) {
+       for (uint j = 0; j < tunerV->getSize(); j++) {
+               TunerRecord *tuner = tunerV->get(j);
+               SearchTuner *newtuner = tune(tuner->getTuner(), &tuner->problems);
+       }
+}
+
+double MultiTuner::evaluateAll(SearchTuner *tuner, Vector<Problem *> *tProblems) {
+       double product = 1;
+       for (uint i = 0; i < tProblems->getSize(); i++) {
+               Problem *problem = tProblems->get(i);
                double score = evaluate(problem, tuner);
                product *= score;
        }
-       return pow(product, 1 / ((double)problems.getSize()));
+       return pow(product, 1 / ((double)tProblems->getSize()));
 }
 
 SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
@@ -99,17 +150,17 @@ SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
        return newTuner;
 }
 
-void MultiTuner::tune() {
+SearchTuner *MultiTuner::tune(SearchTuner *tuner, Vector<Problem *> *tProblems) {
        SearchTuner *bestTuner = NULL;
        double bestScore = DBL_MAX;
 
-       SearchTuner *oldTuner = new SearchTuner();
-       double base_temperature = evaluateAll(oldTuner);
+       SearchTuner *oldTuner = tuner->copyUsed();
+       double base_temperature = evaluateAll(oldTuner, tProblems);
        double oldScore = base_temperature;
 
        for (uint i = 0; i < budget; i++) {
                SearchTuner *newTuner = mutateTuner(oldTuner, i);
-               double newScore = evaluateAll(newTuner);
+               double newScore = evaluateAll(newTuner, tProblems);
                newTuner->printUsed();
                model_print("Received score %f\n", newScore);
                double scoreDiff = newScore - oldScore; //smaller is better
@@ -136,10 +187,7 @@ void MultiTuner::tune() {
                        delete newTuner;
                }
        }
-       model_print("Best tuner:\n");
-       bestTuner->print();
-       model_print("Received score %f\n", bestScore);
-       if (bestTuner != NULL)
-               delete bestTuner;
-       delete oldTuner;
+
+       return bestTuner;
 }
+