3 #include "searchtuner.h"
9 #define TIMEOUTSEC 5000
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 copy->setSatSolverTimeout(TIMEOUTSEC);
22 model_print("**********************\n");
23 int sat = copy->solve();
24 if (result == UNSETVALUE && sat != IS_INDETER)
26 else if (result != sat && sat != IS_INDETER) {
27 model_print("&&&&&&&&&&&&&&&&&& Result has changed &&&&&&&&&&&&&\n");
28 copy->printConstraints();
30 long long metric = copy->getElapsedTime();
35 double AutoTuner::evaluateAll(SearchTuner *tuner) {
37 for (uint i = 0; i < solvers.getSize(); i++) {
38 CSolver *problem = solvers.get(i);
39 double score = evaluate(problem, tuner);
42 return pow(product, 1 / ((double)solvers.getSize()));
45 SearchTuner *AutoTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
46 SearchTuner *newTuner = oldTuner->copyUsed();
47 uint numSettings = oldTuner->getSize();
48 uint settingsToMutate = (uint)(AUTOTUNERFACTOR * (((double)numSettings) * (budget - k)) / (budget));
49 if (settingsToMutate < 1)
51 model_print("Mutating %u settings\n", settingsToMutate);
52 while (settingsToMutate-- != 0) {
53 newTuner->randomMutate();
59 SearchTuner *AutoTuner::mutateTuner(SearchTuner *oldTuner) {
60 SearchTuner *newTuner = oldTuner->copyUsed();
61 result = newTuner->nextStaticTuner();
62 return result==EXIT_FAILURE? newTuner: NULL;
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;
76 SearchTuner *newTuner = mutateTuner(oldTuner);
79 double newScore = evaluateAll(newTuner);
80 newTuner->printUsed();
81 model_print("Received score %f\n", newScore);
88 for (uint i = 0; i < budget; i++) {
89 SearchTuner *newTuner = mutateTuner(oldTuner, i);
90 double newScore = evaluateAll(newTuner);
91 newTuner->printUsed();
92 model_print("Received score %f\n", newScore);
93 double scoreDiff = newScore - oldScore; //smaller is better
94 if (newScore < bestScore) {
95 if (bestTuner != NULL)
98 bestTuner = newTuner->copyUsed();
105 double currTemp = base_temperature * (((double)budget - i) / budget);
106 acceptanceP = exp(-scoreDiff / currTemp);
108 double ran = ((double)random()) / RAND_MAX;
109 if (ran <= acceptanceP) {
117 model_print("Best tuner:\n");
119 bestTuner->serialize();
120 model_print("Received score %f\n", bestScore);
121 if (bestTuner != NULL)