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() {
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;
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) {
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
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;
}
+