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 > log%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum, 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 void MultiTuner::mapProblemsToTuners(Vector<TunerRecord *> *tunerV) {
80 for (uint i = 0; i < problems.getSize(); i++) {
81 Problem *problem = problems.get(i);
82 TunerRecord *bestTuner = NULL;
83 long long bestscore = 0;
84 for (uint j = 0; j < tunerV->getSize(); j++) {
85 TunerRecord *tuner = tunerV->get(j);
86 long long metric = evaluate(problem, tuner->getTuner());
87 if ((bestTuner == NULL && metric != -1) ||
88 (metric < bestscore && metric != -1)) {
93 if (bestTuner != NULL)
94 bestTuner->problems.push(problem);
99 void MultiTuner::tuneK() {
100 Vector<TunerRecord *> *tunerV = new Vector<TunerRecord *>(&tuners);
106 double MultiTuner::evaluateAll(SearchTuner *tuner) {
108 for (uint i = 0; i < problems.getSize(); i++) {
109 Problem *problem = problems.get(i);
110 double score = evaluate(problem, tuner);
113 return pow(product, 1 / ((double)problems.getSize()));
116 SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
117 SearchTuner *newTuner = oldTuner->copyUsed();
118 uint numSettings = oldTuner->getSize();
119 uint settingsToMutate = (uint)(AUTOTUNERFACTOR * (((double)numSettings) * (budget - k)) / (budget));
120 if (settingsToMutate < 1)
121 settingsToMutate = 1;
122 model_print("Mutating %u settings\n", settingsToMutate);
123 while (settingsToMutate-- != 0) {
124 newTuner->randomMutate();
129 void MultiTuner::tune() {
130 SearchTuner *bestTuner = NULL;
131 double bestScore = DBL_MAX;
133 SearchTuner *oldTuner = new SearchTuner();
134 double base_temperature = evaluateAll(oldTuner);
135 double oldScore = base_temperature;
137 for (uint i = 0; i < budget; i++) {
138 SearchTuner *newTuner = mutateTuner(oldTuner, i);
139 double newScore = evaluateAll(newTuner);
140 newTuner->printUsed();
141 model_print("Received score %f\n", newScore);
142 double scoreDiff = newScore - oldScore; //smaller is better
143 if (newScore < bestScore) {
144 if (bestTuner != NULL)
146 bestScore = newScore;
147 bestTuner = newTuner->copyUsed();
154 double currTemp = base_temperature * (((double)budget - i) / budget);
155 acceptanceP = exp(-scoreDiff / currTemp);
157 double ran = ((double)random()) / RAND_MAX;
158 if (ran <= acceptanceP) {
166 model_print("Best tuner:\n");
168 model_print("Received score %f\n", bestScore);
169 if (bestTuner != NULL)