Fixing silent bug for not finding the tuner
[satune.git] / src / Tuner / randomtuner.cc
1 #include "randomtuner.h"
2 #include "csolver.h"
3 #include "searchtuner.h"
4 #include "comptuner.h"
5 #include <math.h>
6 #include <stdlib.h>
7 #include <limits>
8
9 #define UNSETVALUE -1
10
11 RandomTuner::RandomTuner(uint _budget, uint _timeout) :
12         BasicTuner(_budget, _timeout) {
13 }
14
15 RandomTuner::~RandomTuner() {
16
17 }
18
19 void RandomTuner::tune() {
20         for (uint r = 0; r < budget; r++) {
21                 model_print("Round %u of %u\n", r, budget);
22                 for (uint i = 0; i < tuners.getSize(); i++) {
23                         TunerRecord *tuner = tuners.get(i);
24                         bool isNew = true;
25                         for (uint j = 0; j < problems.getSize(); j++) {
26                                 Problem *problem = problems.get(j);
27                                 long long metric = tuner->getTime(problem);
28                                 if (metric == -1) {
29                                         metric = evaluate(problem, tuner);
30                                         ASSERT(tuner->getTime(problem) == -1);
31                                         tuner->addProblem(problem);
32                                         model_print("%u.Problem<%s>\tTuner<%p, %d>\tMetric<%lld>\n", i, problem->getProblem(),tuner, tuner->getTunerNumber(), metric);
33                                         if (metric != -1)
34                                                 tuner->setTime(problem, metric);
35                                         else
36                                                 tuner->setTime(problem, -2);
37                                         if (tunerExists(tuner)) {
38                                                 //Solving the problem and noticing the tuner
39                                                 //already exists
40                                                 isNew = false;
41                                                 break;
42                                         }
43                                 }
44                         }
45                         if (isNew) {
46                                 explored.push(tuner);
47                         }
48
49                 }
50                 uint tSize = tuners.getSize();
51                 for (uint i = 0; i < tSize; i++) {
52                         SearchTuner *tmpTuner = mutateTuner(tuners.get(i)->getTuner(), budget);
53                         while (subTunerIndex(tmpTuner) != -1) {
54                                 tmpTuner->randomMutate();
55                         }
56                         TunerRecord *tmp = new TunerRecord(tmpTuner);
57                         tmp->setTunerNumber(allTuners.getSize());
58                         model_print("Mutated tuner %u to generate tuner %u\n", tuners.get(i)->getTunerNumber(), tmp->getTunerNumber());
59                         allTuners.push(tmp);
60                         tuners.set(i, tmp);
61                 }
62         }
63         printData();
64
65 }