1 #include "multituner.h"
3 #include "searchtuner.h"
13 #define TIMEOUTSEC 5000
15 Problem::Problem(const char *_problem) : result(UNSETVALUE) {
16 uint len = strlen(_problem);
17 problem = (char *) ourmalloc(len + 1);
18 memcpy(problem, _problem, len + 1);
25 MultiTuner::MultiTuner(uint _budget, uint _timeout) :
26 budget(_budget), timeout(_timeout), execnum(0) {
29 MultiTuner::~MultiTuner() {
30 for (uint i = 0; i < problems.getSize(); i++)
31 ourfree(problems.get(i));
34 void MultiTuner::addProblem(const char *filename) {
35 problems.push(new Problem(filename));
38 void MultiTuner::addTuner(SearchTuner *tuner) {
39 tuners.push(new TunerRecord(tuner));
42 long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) {
45 snprintf(buffer, sizeof(buffer), "tuner%u", execnum);
46 tuner->serialize(buffer);
49 snprintf(buffer, sizeof(buffer), "deserializerun %s %u tuner%u result%s%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum);
50 int status = system(buffer);
52 long long metric = -1;
55 //Read data in from results file
56 snprintf(buffer, sizeof(buffer), "result%s%u", problem->getProblem(), execnum);
59 myfile.open (buffer, ios::in);
62 if (myfile.is_open()) {
68 //Increment execution count
71 if (problem->result == UNSETVALUE && sat != IS_INDETER) {
72 problem->result = sat;
73 } else if (problem->result != sat && sat != IS_INDETER) {
74 model_print("******** Result has changed ********\n");
79 double MultiTuner::evaluateAll(SearchTuner *tuner) {
81 for (uint i = 0; i < problems.getSize(); i++) {
82 Problem *problem = problems.get(i);
83 double score = evaluate(problem, tuner);
86 return pow(product, 1 / ((double)problems.getSize()));
89 SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
90 SearchTuner *newTuner = oldTuner->copyUsed();
91 uint numSettings = oldTuner->getSize();
92 uint settingsToMutate = (uint)(AUTOTUNERFACTOR * (((double)numSettings) * (budget - k)) / (budget));
93 if (settingsToMutate < 1)
95 model_print("Mutating %u settings\n", settingsToMutate);
96 while (settingsToMutate-- != 0) {
97 newTuner->randomMutate();
102 void MultiTuner::tune() {
103 SearchTuner *bestTuner = NULL;
104 double bestScore = DBL_MAX;
106 SearchTuner *oldTuner = new SearchTuner();
107 double base_temperature = evaluateAll(oldTuner);
108 double oldScore = base_temperature;
110 for (uint i = 0; i < budget; i++) {
111 SearchTuner *newTuner = mutateTuner(oldTuner, i);
112 double newScore = evaluateAll(newTuner);
113 newTuner->printUsed();
114 model_print("Received score %f\n", newScore);
115 double scoreDiff = newScore - oldScore; //smaller is better
116 if (newScore < bestScore) {
117 if (bestTuner != NULL)
119 bestScore = newScore;
120 bestTuner = newTuner->copyUsed();
127 double currTemp = base_temperature * (((double)budget - i) / budget);
128 acceptanceP = exp(-scoreDiff / currTemp);
130 double ran = ((double)random()) / RAND_MAX;
131 if (ran <= acceptanceP) {
139 model_print("Best tuner:\n");
141 model_print("Received score %f\n", bestScore);
142 if (bestTuner != NULL)