X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FTuner%2Fmultituner.cc;h=8ad7a32058d6aacc91ddf69438073a994f7c1e2d;hp=68b896eaa84826ae33998a6b12b8752aba3a3398;hb=71f0967684121ed4007064b6538af3577551068c;hpb=1038eba14663554fb228406db8f33a8ead28b89b diff --git a/src/Tuner/multituner.cc b/src/Tuner/multituner.cc index 68b896e..8ad7a32 100644 --- a/src/Tuner/multituner.cc +++ b/src/Tuner/multituner.cc @@ -95,22 +95,39 @@ 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); - + while (true) { + clearVector(tunerV); + mapProblemsToTuners(tunerV); + improveTuners(tunerV); + } 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); + SearchTuner *newtuner = tune(tuner->getTuner(), &tuner->problems); + } +} + +double MultiTuner::evaluateAll(SearchTuner *tuner, Vector *tProblems) { double product = 1; - for (uint i = 0; i < problems.getSize(); i++) { - Problem *problem = problems.get(i); + 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) { @@ -126,17 +143,17 @@ SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) { return newTuner; } -void MultiTuner::tune() { +SearchTuner *MultiTuner::tune(SearchTuner *tuner, Vector *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 @@ -163,10 +180,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; } +