3 #include "searchtuner.h"
8 AutoTuner::AutoTuner(uint _budget) :
12 void AutoTuner::addProblem(CSolver *solver) {
16 long long AutoTuner::evaluate(CSolver * problem, SearchTuner *tuner) {
17 CSolver * copy=problem->clone();
18 copy->setTuner(tuner);
19 int result = copy->startEncoding();
20 long long elapsedTime=copy->getElapsedTime();
21 long long encodeTime=copy->getEncodeTime();
22 long long solveTime=copy->getSolveTime();
23 long long metric=elapsedTime;
28 double AutoTuner::evaluateAll(SearchTuner *tuner) {
30 for(uint i=0;i<solvers.getSize();i++) {
31 CSolver * problem=solvers.get(i);
32 double score=evaluate(problem, tuner);
35 return pow(product, 1/((double)solvers.getSize()));
38 SearchTuner * AutoTuner::mutateTuner(SearchTuner * oldTuner, uint k) {
39 SearchTuner *newTuner=oldTuner->copyUsed();
40 uint numSettings=oldTuner->getSize();
41 double factor=0.3;//Adjust this factor...
42 uint settingsToMutate=(uint)(factor*(((double)numSettings) * k)/(budget));
43 if (settingsToMutate < 1)
45 model_print("Mutating %u settings\n", settingsToMutate);
46 while(settingsToMutate-- != 0) {
47 newTuner->randomMutate();
53 void AutoTuner::tune() {
54 SearchTuner * bestTuner = NULL;
55 double bestScore=DBL_MAX;
57 SearchTuner * oldTuner=new SearchTuner();
58 double base_temperature=evaluateAll(oldTuner);
59 double oldScore=base_temperature;
61 for (uint i=0;i<budget;i++) {
62 SearchTuner *newTuner=mutateTuner(oldTuner, i);
63 double newScore=evaluateAll(newTuner);
64 double scoreDiff=newScore - oldScore; //smaller is better
65 if (newScore < bestScore) {
67 bestTuner = newTuner->copyUsed();
74 double currTemp=base_temperature * (((double)budget - i) / budget);
75 acceptanceP = exp(-scoreDiff / currTemp);
77 double ran = ((double)random()) / RAND_MAX;
78 if (ran <= acceptanceP) {