Merging with branch master and fixing bugs
[satune.git] / src / Tuner / searchtuner.cc
1 #include "searchtuner.h"
2
3 TunableSetting::TunableSetting(VarType _type, TunableParam _param) :
4         hasVar(true),
5         type(_type),
6         param(_param) {
7 }
8
9 TunableSetting::TunableSetting(TunableParam _param) :
10         hasVar(false),
11         type(0),
12         param(_param) {
13 }
14
15 TunableSetting::TunableSetting(TunableSetting * ts) :
16         hasVar(ts->hasVar),
17         type(ts->type),
18         param(ts->param),
19   lowValue(ts->lowValue),
20         highValue(ts->highValue),
21         defaultValue(ts->defaultValue),
22         selectedValue(ts->selectedValue)
23 {
24 }
25
26 void TunableSetting::setDecision(int _low, int _high, int _default, int _selection) {
27         lowValue = _low;
28         highValue = _high;
29         defaultValue = _default;
30         selectedValue = _selection;
31 }
32
33 void TunableSetting::print() {
34         if (hasVar) {
35                 model_print("Type %" PRIu64 ", ", type);
36         }
37         model_print("Param %u = %u\n", param, selectedValue);
38 }
39
40 unsigned int tunableSettingHash(TunableSetting *setting) {
41         return setting->hasVar ^ setting->type ^ setting->param;
42 }
43
44 bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2) {
45         return setting1->hasVar == setting2->hasVar &&
46                 setting1->type == setting2->type &&
47                 setting1->param == setting2->param;
48 }
49
50 SearchTuner::SearchTuner() {
51 }
52
53 SearchTuner * SearchTuner::copyUsed() {
54         SearchTuner * tuner = new SearchTuner();
55         HSIteratorTunableSetting *iterator=usedSettings.iterator();
56         while(iterator->hasNext()) {
57                 TunableSetting *setting=iterator->next();
58                 TunableSetting *copy=new TunableSetting(setting);
59                 tuner->settings.add(copy);
60         }
61         delete iterator;
62         return tuner;
63 }
64
65 SearchTuner::~SearchTuner() {
66         HSIteratorTunableSetting *iterator=settings.iterator();
67         while(iterator->hasNext()) {
68                 TunableSetting *setting=iterator->next();
69                 delete setting;
70         }
71         delete iterator;
72 }
73
74 int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
75         TunableSetting setting(param);
76         TunableSetting * result = usedSettings.get(&setting);
77         if (result == NULL) {
78                 result = settings.get(&setting);
79                 if ( result == NULL) {
80                         result=new TunableSetting(param);
81                         uint value = descriptor->lowValue + (random() % (1+ descriptor->highValue - descriptor->lowValue));
82                         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
83                         settings.add(result);
84                 }
85                 usedSettings.add(result);
86         }
87         return result->selectedValue;
88 }
89
90 int SearchTuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
91         TunableSetting setting(vartype, param);
92         TunableSetting * result = usedSettings.get(&setting);
93         if (result == NULL) {
94                 result = settings.get(&setting);
95                 if ( result == NULL) {
96                         result=new TunableSetting(vartype, param);
97                         uint value = descriptor->lowValue + (random() % (1+ descriptor->highValue - descriptor->lowValue));
98                         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
99                         settings.add(result);
100                 }
101                 usedSettings.add(result);
102         }
103         return result->selectedValue;
104 }
105
106 void SearchTuner::randomMutate() {
107         TunableSetting * randomSetting = settings.getRandomElement();
108         int range=randomSetting->highValue-randomSetting->lowValue;
109         int randomchoice=(random() % range) + randomSetting->lowValue;
110         if (randomchoice < randomSetting->selectedValue)
111                 randomSetting->selectedValue = randomchoice;
112         else
113                 randomSetting->selectedValue = randomchoice + 1;
114 }
115
116 void SearchTuner::print() {
117         HSIteratorTunableSetting *iterator=settings.iterator();
118         while(iterator->hasNext()) {
119                 TunableSetting *setting=iterator->next();
120                 setting->print();
121         }
122         delete iterator;
123
124 }
125
126 void SearchTuner::printUsed() {
127         HSIteratorTunableSetting *iterator=usedSettings.iterator();
128         while(iterator->hasNext()) {
129                 TunableSetting *setting=iterator->next();
130                 setting->print();
131         }
132         delete iterator;
133 }