X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FTuner%2Fmultituner.cc;h=03bfeec88b363fc68294453b7c05660ceb680fc4;hp=68b896eaa84826ae33998a6b12b8752aba3a3398;hb=298685f6683d3a323968cb22810b134472dacdfa;hpb=64e16ee8bdb6887cd8ffa7da100042c975d1c21c diff --git a/src/Tuner/multituner.cc b/src/Tuner/multituner.cc index 68b896e..03bfeec 100644 --- a/src/Tuner/multituner.cc +++ b/src/Tuner/multituner.cc @@ -8,9 +8,7 @@ #include #include - #define UNSETVALUE -1 -#define TIMEOUTSEC 5000 Problem::Problem(const char *_problem) : result(UNSETVALUE) { uint len = strlen(_problem); @@ -22,13 +20,33 @@ Problem::~Problem() { ourfree(problem); } -MultiTuner::MultiTuner(uint _budget, uint _timeout) : - budget(_budget), timeout(_timeout), execnum(0) { +void TunerRecord::setTime(Problem *problem, long long time) { + timetaken.put(problem, time); +} + +long long TunerRecord::getTime(Problem *problem) { + if (timetaken.contains(problem)) + return timetaken.get(problem); + else return -1; +} + +TunerRecord *TunerRecord::changeTuner(SearchTuner *_newtuner) { + TunerRecord *tr = new TunerRecord(_newtuner); + for (uint i = 0; i < problems.getSize(); i++) { + tr->problems.push(problems.get(i)); + } + return tr; +} + +MultiTuner::MultiTuner(uint _budget, uint _rounds, uint _timeout) : + budget(_budget), rounds(_rounds), timeout(_timeout), execnum(0) { } MultiTuner::~MultiTuner() { for (uint i = 0; i < problems.getSize(); i++) ourfree(problems.get(i)); + for (uint i = 0; i < allTuners.getSize(); i++) + delete allTuners.get(i); } void MultiTuner::addProblem(const char *filename) { @@ -36,21 +54,24 @@ void MultiTuner::addProblem(const char *filename) { } void MultiTuner::addTuner(SearchTuner *tuner) { - tuners.push(new TunerRecord(tuner)); + TunerRecord *t = new TunerRecord(tuner); + tuners.push(t); + allTuners.push(t); } -long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) { +long long MultiTuner::evaluate(Problem *problem, TunerRecord *tuner) { char buffer[512]; //Write out the tuner snprintf(buffer, sizeof(buffer), "tuner%u", execnum); - tuner->serialize(buffer); + tuner->getTuner()->serialize(buffer); //Do run - snprintf(buffer, sizeof(buffer), "deserializerun %s %u tuner%u result%s%u > log%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum, execnum); + snprintf(buffer, sizeof(buffer), "./run.sh 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; int sat = IS_INDETER; + if (status == 0) { //Read data in from results file snprintf(buffer, sizeof(buffer), "result%s%u", problem->getProblem(), execnum); @@ -64,6 +85,12 @@ long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) { myfile >> sat; myfile.close(); } + + snprintf(buffer, sizeof(buffer), "tuner%uused", execnum); + SearchTuner *usedtuner = new SearchTuner(buffer); + delete tuner->getTuner(); + tuner->updateTuner(usedtuner); + } //Increment execution count execnum++; @@ -76,6 +103,74 @@ long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) { return metric; } +void MultiTuner::tuneComp() { + Vector *tunerV = new Vector(&tuners); + for (uint b = 0; b < budget; b++) { + uint tSize = tunerV->getSize(); + for (uint i = 0; i < tSize; i++) { + SearchTuner *tmpTuner = mutateTuner(tunerV->get(i)->getTuner(), b); + tunerV->push(new TunerRecord(tmpTuner)); + } + + Hashtable scores; + for (uint i = 0; i < problems.getSize(); i++) { + Problem *problem = problems.get(i); + Vector places; + for (uint j = 0; j < tunerV->getSize(); j++) { + TunerRecord *tuner = tunerV->get(j); + long long metric = tuner->getTime(problem); + if (metric == -1) { + metric = evaluate(problem, tuner); + if (metric != -1) + tuner->setTime(problem, metric); + } + if (metric != -1) { + uint k = 0; + for (; k < places.getSize(); k++) { + if (metric < places.get(k)->getTime(problem)) + break; + } + places.insertAt(k, tuner); + } + } + int points = 9; + for (uint k = 0; k < places.getSize() && points; k++) { + TunerRecord *tuner = places.get(k); + points = points / 3; + int currScore = 0; + if (scores.contains(tuner)) + currScore = scores.get(tuner); + currScore += points; + scores.put(tuner, currScore); + } + } + Vector ranking; + for (uint i = 0; i < tunerV->getSize(); i++) { + TunerRecord *tuner = tunerV->get(i); + int score = 0; + if (scores.contains(tuner)) + score = scores.get(tuner); + uint j = 0; + for (; j < ranking.getSize(); j++) { + TunerRecord *t = ranking.get(j); + int tscore = 0; + if (scores.contains(t)) + tscore = scores.get(t); + if (score > tscore) + break; + } + ranking.insertAt(j, tuner); + } + for (uint i = tuners.getSize(); i < ranking.getSize(); i++) { + TunerRecord *tuner = ranking.get(i); + for (uint j = 0; j < tunerV->getSize(); j++) { + if (tunerV->get(j) == tuner) + tunerV->removeAt(j); + } + } + } +} + void MultiTuner::mapProblemsToTuners(Vector *tunerV) { for (uint i = 0; i < problems.getSize(); i++) { Problem *problem = problems.get(i); @@ -83,7 +178,12 @@ void MultiTuner::mapProblemsToTuners(Vector *tunerV) { long long bestscore = 0; for (uint j = 0; j < tunerV->getSize(); j++) { TunerRecord *tuner = tunerV->get(j); - long long metric = evaluate(problem, tuner->getTuner()); + long long metric = tuner->getTime(problem); + if (metric == -1) { + metric = evaluate(problem, tuner); + if (metric != -1) + tuner->setTime(problem, metric); + } if ((bestTuner == NULL && metric != -1) || (metric < bestscore && metric != -1)) { bestTuner = tuner; @@ -95,22 +195,54 @@ void MultiTuner::mapProblemsToTuners(Vector *tunerV) { } } +void clearVector(Vector *tunerV) { + for (uint j = 0; j < tunerV->getSize(); j++) { + TunerRecord *tuner = tunerV->get(j); + tuner->problems.clear(); + } +} void MultiTuner::tuneK() { Vector *tunerV = new Vector(&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; } -double MultiTuner::evaluateAll(SearchTuner *tuner) { +void MultiTuner::improveTuners(Vector *tunerV) { + for (uint j = 0; j < tunerV->getSize(); j++) { + TunerRecord *tuner = tunerV->get(j); + TunerRecord *newtuner = tune(tuner); + tunerV->set(j, newtuner); + } +} + +double MultiTuner::evaluateAll(TunerRecord *tuner) { double product = 1; - for (uint i = 0; i < problems.getSize(); i++) { - Problem *problem = problems.get(i); - double score = evaluate(problem, tuner); + for (uint i = 0; i < tuner->problems.getSize(); i++) { + Problem *problem = tuner->problems.get(i); + long long metric = tuner->getTime(problem); + if (metric == -1) { + metric = evaluate(problem, tuner); + if (metric != -1) + tuner->setTime(problem, metric); + } + + double score = metric; product *= score; } - return pow(product, 1 / ((double)problems.getSize())); + return pow(product, 1 / ((double)tuner->problems.getSize())); } SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) { @@ -126,25 +258,25 @@ SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) { return newTuner; } -void MultiTuner::tune() { - SearchTuner *bestTuner = NULL; +TunerRecord *MultiTuner::tune(TunerRecord *tuner) { + TunerRecord *bestTuner = NULL; double bestScore = DBL_MAX; - SearchTuner *oldTuner = new SearchTuner(); + TunerRecord *oldTuner = tuner; double base_temperature = evaluateAll(oldTuner); double oldScore = base_temperature; for (uint i = 0; i < budget; i++) { - SearchTuner *newTuner = mutateTuner(oldTuner, i); + SearchTuner *tmpTuner = mutateTuner(oldTuner->getTuner(), i); + TunerRecord *newTuner = oldTuner->changeTuner(tmpTuner); + allTuners.push(newTuner); double newScore = evaluateAll(newTuner); - newTuner->printUsed(); + newTuner->tuner->printUsed(); model_print("Received score %f\n", newScore); double scoreDiff = newScore - oldScore; //smaller is better if (newScore < bestScore) { - if (bestTuner != NULL) - delete bestTuner; bestScore = newScore; - bestTuner = newTuner->copyUsed(); + bestTuner = newTuner; } double acceptanceP; @@ -156,17 +288,11 @@ void MultiTuner::tune() { } double ran = ((double)random()) / RAND_MAX; if (ran <= acceptanceP) { - delete oldTuner; oldScore = newScore; oldTuner = newTuner; - } else { - 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; } +