3 #include "searchtuner.h"
10 AutoTuner::AutoTuner(uint _budget) :
11 budget(_budget), result(UNSETVALUE) {
14 void AutoTuner::addProblem(CSolver *solver) {
18 long long AutoTuner::evaluate(CSolver *problem, SearchTuner *tuner) {
19 CSolver *copy = problem->clone();
20 copy->setTuner(tuner);
21 model_print("**********************\n");
22 int sat = copy->solve();
23 if (result == UNSETVALUE)
25 else if (result != sat) {
26 model_print("&&&&&&&&&&&&&&&&&& Result has changed &&&&&&&&&&&&&\n");
27 copy->printConstraints();
29 //model_print("SAT %d\n", result);
30 long long elapsedTime = copy->getElapsedTime();
31 // long long encodeTime = copy->getEncodeTime();
32 // long long solveTime = copy->getSolveTime();
33 long long metric = elapsedTime;
34 // model_print("Elapsed Time: %llu\n", elapsedTime);
35 // model_print("Encode Time: %llu\n", encodeTime);
36 // model_print("Solve Time: %llu\n", solveTime);
41 double AutoTuner::evaluateAll(SearchTuner *tuner) {
43 for (uint i = 0; i < solvers.getSize(); i++) {
44 CSolver *problem = solvers.get(i);
45 double score = evaluate(problem, tuner);
48 return pow(product, 1 / ((double)solvers.getSize()));
51 SearchTuner *AutoTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
52 SearchTuner *newTuner = oldTuner->copyUsed();
53 uint numSettings = oldTuner->getSize();
54 double factor = 0.3;//Adjust this factor...
55 uint settingsToMutate = (uint)(factor * (((double)numSettings) * (budget - k)) / (budget));
56 if (settingsToMutate < 1)
58 model_print("Mutating %u settings\n", settingsToMutate);
59 while (settingsToMutate-- != 0) {
60 newTuner->randomMutate();
66 void AutoTuner::tune() {
67 SearchTuner *bestTuner = NULL;
68 double bestScore = DBL_MAX;
70 SearchTuner *oldTuner = new SearchTuner();
71 double base_temperature = evaluateAll(oldTuner);
72 double oldScore = base_temperature;
74 for (uint i = 0; i < budget; i++) {
75 SearchTuner *newTuner = mutateTuner(oldTuner, i);
76 double newScore = evaluateAll(newTuner);
77 newTuner->printUsed();
78 model_print("Received score %f\n", newScore);
79 double scoreDiff = newScore - oldScore; //smaller is better
80 if (newScore < bestScore) {
81 if (bestTuner != NULL)
84 bestTuner = newTuner->copyUsed();
91 double currTemp = base_temperature * (((double)budget - i) / budget);
92 acceptanceP = exp(-scoreDiff / currTemp);
94 double ran = ((double)random()) / RAND_MAX;
95 if (ran <= acceptanceP) {
103 model_print("Best tuner:\n");
105 bestTuner->serialize();
106 model_print("Received score %f\n", bestScore);
107 if (bestTuner != NULL)