373fc4c4980b575e03ca4f81a5e3cd235e95a452
[satune.git] / src / Tuner / searchtuner.cc
1 #include "searchtuner.h"
2 #include <iostream>
3 #include <fstream>
4 using namespace std;
5
6 TunableSetting::TunableSetting(VarType _type, TunableParam _param) :
7         hasVar(true),
8         type1(_type),
9         type2(0),
10         param(_param) {
11 }
12
13 TunableSetting::TunableSetting(VarType _type1, VarType _type2, TunableParam _param) :
14         hasVar(true),
15         type1(_type1),
16         type2(_type2),
17         param(_param) {
18 }
19
20 TunableSetting::TunableSetting(TunableParam _param) :
21         hasVar(false),
22         type1(0),
23         type2(0),
24         param(_param) {
25 }
26
27 TunableSetting::TunableSetting(TunableSetting *ts) :
28         hasVar(ts->hasVar),
29         type1(ts->type1),
30         type2(ts->type2),
31         param(ts->param),
32         lowValue(ts->lowValue),
33         highValue(ts->highValue),
34         defaultValue(ts->defaultValue),
35         selectedValue(ts->selectedValue)
36 {
37 }
38
39 void TunableSetting::setDecision(int _low, int _high, int _default, int _selection) {
40         lowValue = _low;
41         highValue = _high;
42         defaultValue = _default;
43         selectedValue = _selection;
44 }
45
46 void TunableSetting::print() {
47         model_print("Param %s = %u \t range=[%u,%u]", tunableParameterToString( (Tunables)param), selectedValue, lowValue, highValue);
48         if (hasVar) {
49                 model_print("\tVarType1 %" PRIu64 ", ", type1);
50                 model_print("VarType2 %" PRIu64 ", ", type2);
51         }
52         model_print("\n");
53 }
54
55
56 ostream &operator<<(ostream &os, const TunableSetting &ts)
57 {
58         os << ts.hasVar << " " << ts.type1 << " " << ts.type2 << " " << ts.param << " " << ts.lowValue << " "
59                  << ts.highValue << " " << ts.defaultValue << " " << ts.selectedValue;
60         return os;
61 }
62
63
64 SearchTuner::SearchTuner() {
65 }
66
67 SearchTuner::SearchTuner(const char *filename) {
68         ifstream myfile;
69         myfile.open (filename, ios::in);
70         if (myfile.is_open()) {
71                 bool hasVar;
72                 VarType type1;
73                 VarType type2;
74                 TunableParam param;
75                 int lowValue;
76                 int highValue;
77                 int defaultValue;
78                 int selectedValue;
79                 while (myfile >> hasVar >> type1 >> type2 >> param >> lowValue >> highValue >> defaultValue >> selectedValue) {
80                         TunableSetting *setting;
81
82                         if (hasVar) {
83                                 setting = new TunableSetting(type1, type2, param);
84                         } else {
85                                 setting = new TunableSetting(param);
86                         }
87                         setting->setDecision(lowValue, highValue, defaultValue, selectedValue);
88                         settings.add(setting);
89                 }
90                 myfile.close();
91         } else {
92                 model_print("Warning: Tuner %s couldn't be loaded ... Using default tuner instead ....\n", filename);
93         }
94 }
95
96 bool SearchTuner::equalUsed(SearchTuner* tuner){
97         if(tuner->usedSettings.getSize() != usedSettings.getSize()){
98                 return false;
99         }
100         bool result = true;
101         SetIteratorTunableSetting *iterator = usedSettings.iterator();
102         while(iterator->hasNext()){
103                 TunableSetting *setting = iterator->next();
104                 if(!tuner->usedSettings.contains(setting)){
105                         result = false;
106                         break;
107                 }else{
108                         TunableSetting *tunerSetting = tuner->usedSettings.get(setting);
109                         if(tunerSetting->selectedValue != setting->selectedValue){
110                                 result = false;
111                                 break;
112                         }
113                 }
114         }
115         delete iterator;
116         return result;
117 }
118
119 void SearchTuner::addUsed(const char *filename) {
120         ifstream myfile;
121         myfile.open (filename, ios::in);
122         if (myfile.is_open()) {
123                 bool hasVar;
124                 VarType type1;
125                 VarType type2;
126                 TunableParam param;
127                 int lowValue;
128                 int highValue;
129                 int defaultValue;
130                 int selectedValue;
131                 while (myfile >> hasVar >> type1 >> type2 >> param >> lowValue >> highValue >> defaultValue >> selectedValue) {
132                         TunableSetting *setting;
133
134                         if (hasVar) {
135                                 setting = new TunableSetting(type1, type2, param);
136                         } else {
137                                 setting = new TunableSetting(param);
138                         }
139                         setting->setDecision(lowValue, highValue, defaultValue, selectedValue);
140                         if (!settings.contains(setting)) {
141                                 settings.add(setting);
142                                 usedSettings.add(setting);
143                         } else {
144                                 TunableSetting *tmp = settings.get(setting);
145                                 settings.remove(tmp);
146                                 usedSettings.remove(tmp);
147                                 delete tmp;
148                                 settings.add(setting);
149                                 usedSettings.add(setting);
150                         }
151                 }
152                 myfile.close();
153         }
154 }
155
156 bool SearchTuner::isSubTunerof(SearchTuner *newTuner){
157         SetIteratorTunableSetting *iterator = usedSettings.iterator();
158         while (iterator->hasNext()) {
159                 TunableSetting *setting = iterator->next();
160                 if(!newTuner->settings.contains(setting)){
161                         return false;
162                 } else{
163                         TunableSetting *newSetting = newTuner->settings.get(setting);
164                         if(newSetting->selectedValue != setting->selectedValue){
165                                 return false;
166                         }
167                 }
168         }
169         delete iterator;
170         return true;
171 }
172
173 SearchTuner *SearchTuner::copyUsed() {
174         SearchTuner *tuner = new SearchTuner();
175         SetIteratorTunableSetting *iterator = usedSettings.iterator();
176         while (iterator->hasNext()) {
177                 TunableSetting *setting = iterator->next();
178                 TunableSetting *copy = new TunableSetting(setting);
179                 tuner->settings.add(copy);
180         }
181         delete iterator;
182         return tuner;
183 }
184
185 SearchTuner::~SearchTuner() {
186         SetIteratorTunableSetting *iterator = settings.iterator();
187         while (iterator->hasNext()) {
188                 TunableSetting *setting = iterator->next();
189                 delete setting;
190         }
191         delete iterator;
192 }
193
194 void SearchTuner::setTunable(TunableParam param, TunableDesc *descriptor, uint value) {
195         TunableSetting *result = new TunableSetting(param);
196         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
197         settings.add(result);
198         usedSettings.add(result);
199 }
200
201 void SearchTuner::setVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor, uint value) {
202         setVarTunable(vartype, 0, param, descriptor, value);
203 }
204
205 void SearchTuner::setVarTunable(VarType vartype1, VarType vartype2, TunableParam param, TunableDesc *descriptor, uint value) {
206         TunableSetting *result = new TunableSetting(vartype1, vartype2, param);
207         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
208         settings.add(result);
209         usedSettings.add(result);
210 }
211
212 int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
213         TunableSetting setting(param);
214         TunableSetting *result = usedSettings.get(&setting);
215         if (result == NULL) {
216                 result = settings.get(&setting);
217                 if ( result == NULL) {
218                         result = new TunableSetting(param);
219                         uint value = descriptor->lowValue + (random() % (1 + descriptor->highValue - descriptor->lowValue));
220                         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
221                         settings.add(result);
222                 }
223                 usedSettings.add(result);
224         }
225         return result->selectedValue;
226 }
227
228 int SearchTuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
229         return getVarTunable(vartype, 0, param, descriptor);
230 }
231
232 int SearchTuner::getVarTunable(VarType vartype1, VarType vartype2, TunableParam param, TunableDesc *descriptor) {
233         TunableSetting setting(vartype1, vartype2, param);
234         TunableSetting *result = usedSettings.get(&setting);
235         if (result == NULL) {
236                 result = settings.get(&setting);
237                 if ( result == NULL) {
238                         result = new
239                                                          TunableSetting(vartype1, vartype2, param);
240                         uint value = descriptor->lowValue + (random() % (1 + descriptor->highValue - descriptor->lowValue));
241                         result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
242                         settings.add(result);
243                 }
244                 usedSettings.add(result);
245         }
246         return result->selectedValue;
247 }
248
249 void SearchTuner::randomMutate() {
250         TunableSetting *randomSetting = settings.getRandomElement();
251         int range = randomSetting->highValue - randomSetting->lowValue;
252         int randomchoice = (random() % range) + randomSetting->lowValue;
253         if (randomchoice < randomSetting->selectedValue)
254                 randomSetting->selectedValue = randomchoice;
255         else
256                 randomSetting->selectedValue = randomchoice + 1;
257         model_print("&&&&&&&&Mutating&&&&&&&\n");
258         randomSetting->print();
259         model_print("&&&&&&&&&&&&&&&&&&&&&&&\n");
260 }
261
262 void SearchTuner::print() {
263         SetIteratorTunableSetting *iterator = settings.iterator();
264         while (iterator->hasNext()) {
265                 TunableSetting *setting = iterator->next();
266                 setting->print();
267         }
268         delete iterator;
269
270 }
271
272 void SearchTuner::serialize(const char *filename) {
273         ofstream myfile;
274         myfile.open (filename, ios::out | ios::trunc);
275         SetIteratorTunableSetting *iterator = settings.iterator();
276         while (iterator->hasNext()) {
277                 TunableSetting *setting = iterator->next();
278                 myfile << *setting << endl;
279         }
280         myfile.close();
281         delete iterator;
282 }
283
284 void SearchTuner::serializeUsed(const char *filename) {
285         ofstream myfile;
286         myfile.open (filename, ios::out | ios::trunc);
287         SetIteratorTunableSetting *iterator = usedSettings.iterator();
288         while (iterator->hasNext()) {
289                 TunableSetting *setting = iterator->next();
290                 myfile << *setting << endl;
291         }
292         myfile.close();
293         delete iterator;
294 }
295
296 void SearchTuner::printUsed() {
297         SetIteratorTunableSetting *iterator = usedSettings.iterator();
298         while (iterator->hasNext()) {
299                 TunableSetting *setting = iterator->next();
300                 setting->print();
301         }
302         delete iterator;
303 }