Changing the design by adding basic tuner
[satune.git] / src / Tuner / randomtuner.cc
1 #include "randomtuner.h"
2 #include "csolver.h"
3 #include "searchtuner.h"
4 #include "multituner.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 void RandomTuner::tune() {
16         for (uint r = 0; r < budget; r++) {
17                 model_print("Round %u of %u\n", r, budget);
18                 for (uint i = 0; i < tuners.getSize(); i++){
19                         TunerRecord *tuner = tuners.get(i);
20                         bool isNew = true;
21                         for (uint j = 0; j < problems.getSize(); j++){
22                                 Problem *problem = problems.get(j);
23                                 long long metric = tuner->getTime(problem);
24                                 if(metric == -1){
25                                         metric = evaluate(problem, tuner);
26                                         ASSERT(tuner->getTime(problem) == -1);
27                                         tuner->addProblem(problem);
28                                         model_print("%u.Problem<%s>\tTuner<%p, %d>\tMetric<%lld>\n", i, problem->getProblem(),tuner, tuner->getTunerNumber(), metric);
29                                         if (metric != -1)
30                                                 tuner->setTime(problem, metric);
31                                         else
32                                                 tuner->setTime(problem, -2);
33                                         if(tunerExists(tuner->getTuner())){
34                                                 //Solving the problem and noticing the tuner
35                                                 //already exists
36                                                 isNew = false;
37                                                 break;
38                                         }
39                                 }
40                         }
41                         if(isNew){
42                                 explored.push(tuner);
43                         }
44                         
45                 }
46                 uint tSize = tuners.getSize();
47                 for (uint i = 0; i < tSize; i++) {
48                         SearchTuner *tmpTuner = mutateTuner(tuners.get(i)->getTuner(), budget);
49                         while(subTunerExist(tmpTuner)){
50                                 tmpTuner->randomMutate();
51                         }
52                         TunerRecord *tmp = new TunerRecord(tmpTuner);
53                         tmp->setTunerNumber(allTuners.getSize());
54                         model_print("Mutated tuner %u to generate tuner %u\n", tuners.get(i)->getTunerNumber(), tmp->getTunerNumber());
55                         allTuners.push(tmp);
56                         tuners.set(i, tmp);
57                 }
58         }
59         printData();
60         
61 }