1 #include "searchtuner.h"
3 TunableSetting::TunableSetting(VarType _type, TunableParam _param) :
9 TunableSetting::TunableSetting(TunableParam _param) :
15 TunableSetting::TunableSetting(TunableSetting *ts) :
19 lowValue(ts->lowValue),
20 highValue(ts->highValue),
21 defaultValue(ts->defaultValue),
22 selectedValue(ts->selectedValue)
26 void TunableSetting::setDecision(int _low, int _high, int _default, int _selection) {
29 defaultValue = _default;
30 selectedValue = _selection;
33 void TunableSetting::print() {
35 model_print("Type %" PRIu64 ", ", type);
37 model_print("Param %u = %u\n", param, selectedValue);
40 unsigned int tunableSettingHash(TunableSetting *setting) {
41 return setting->hasVar ^ setting->type ^ setting->param;
44 bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2) {
45 return setting1->hasVar == setting2->hasVar &&
46 setting1->type == setting2->type &&
47 setting1->param == setting2->param;
50 SearchTuner::SearchTuner() {
53 SearchTuner *SearchTuner::copyUsed() {
54 SearchTuner *tuner = new SearchTuner();
55 SetIteratorTunableSetting *iterator = usedSettings.iterator();
56 while (iterator->hasNext()) {
57 TunableSetting *setting = iterator->next();
58 TunableSetting *copy = new TunableSetting(setting);
59 tuner->settings.add(copy);
65 SearchTuner::~SearchTuner() {
66 SetIteratorTunableSetting *iterator = settings.iterator();
67 while (iterator->hasNext()) {
68 TunableSetting *setting = iterator->next();
74 int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
75 TunableSetting setting(param);
76 TunableSetting *result = usedSettings.get(&setting);
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);
85 usedSettings.add(result);
87 return result->selectedValue;
90 int SearchTuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
91 TunableSetting setting(vartype, param);
92 TunableSetting *result = usedSettings.get(&setting);
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);
101 usedSettings.add(result);
103 return result->selectedValue;
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;
113 randomSetting->selectedValue = randomchoice + 1;
116 void SearchTuner::print() {
117 SetIteratorTunableSetting *iterator = settings.iterator();
118 while (iterator->hasNext()) {
119 TunableSetting *setting = iterator->next();
126 void SearchTuner::printUsed() {
127 SetIteratorTunableSetting *iterator = usedSettings.iterator();
128 while (iterator->hasNext()) {
129 TunableSetting *setting = iterator->next();