Extend tuning framework
[satune.git] / src / Tuner / searchtuner.cc
index f9873c0b003e7084c06e6bdca0c6bfa90164ea83..3e9586096e36a1d0121db35b760556c49b6597f2 100644 (file)
@@ -2,16 +2,37 @@
 
 TunableSetting::TunableSetting(VarType _type, TunableParam _param) :
        hasVar(true),
-       type(_type),
+       type1(_type),
+       type2(0),
+       param(_param) {
+}
+
+TunableSetting::TunableSetting(VarType _type1, VarType _type2, TunableParam _param) :
+       hasVar(true),
+       type1(_type1),
+       type2(_type2),
        param(_param) {
 }
 
 TunableSetting::TunableSetting(TunableParam _param) :
        hasVar(false),
-       type(0),
+       type1(0),
+       type2(0),
        param(_param) {
 }
 
+TunableSetting::TunableSetting(TunableSetting *ts) :
+       hasVar(ts->hasVar),
+       type1(ts->type1),
+       type2(ts->type2),
+       param(ts->param),
+       lowValue(ts->lowValue),
+       highValue(ts->highValue),
+       defaultValue(ts->defaultValue),
+       selectedValue(ts->selectedValue)
+{
+}
+
 void TunableSetting::setDecision(int _low, int _high, int _default, int _selection) {
        lowValue = _low;
        highValue = _high;
@@ -19,23 +40,44 @@ void TunableSetting::setDecision(int _low, int _high, int _default, int _selecti
        selectedValue = _selection;
 }
 
+void TunableSetting::print() {
+       if (hasVar) {
+               model_print("Type1 %" PRIu64 ", ", type1);
+               model_print("Type2 %" PRIu64 ", ", type2);
+       }
+       model_print("Param %u = %u\n", param, selectedValue);
+}
+
 unsigned int tunableSettingHash(TunableSetting *setting) {
-       return setting->hasVar ^ setting->type ^ setting->param;
+       return setting->hasVar ^ setting->type1 ^ setting->type2 ^ setting->param;
 }
 
 bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2) {
        return setting1->hasVar == setting2->hasVar &&
-               setting1->type == setting2->type &&
+               setting1->type1 == setting2->type1 &&
+               setting1->type2 == setting2->type2 &&
                setting1->param == setting2->param;
 }
 
 SearchTuner::SearchTuner() {
 }
 
+SearchTuner *SearchTuner::copyUsed() {
+       SearchTuner *tuner = new SearchTuner();
+       SetIteratorTunableSetting *iterator = usedSettings.iterator();
+       while (iterator->hasNext()) {
+               TunableSetting *setting = iterator->next();
+               TunableSetting *copy = new TunableSetting(setting);
+               tuner->settings.add(copy);
+       }
+       delete iterator;
+       return tuner;
+}
+
 SearchTuner::~SearchTuner() {
-       HSIteratorTunableSetting *iterator=settings.iterator();
-       while(iterator->hasNext()) {
-               TunableSetting *setting=iterator->next();
+       SetIteratorTunableSetting *iterator = settings.iterator();
+       while (iterator->hasNext()) {
+               TunableSetting *setting = iterator->next();
                delete setting;
        }
        delete iterator;
@@ -43,12 +85,13 @@ SearchTuner::~SearchTuner() {
 
 int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
        TunableSetting setting(param);
-       TunableSetting * result = usedSettings.get(&setting);
+       TunableSetting *result = usedSettings.get(&setting);
        if (result == NULL) {
                result = settings.get(&setting);
                if ( result == NULL) {
-                       result=new TunableSetting(param);
-                       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, descriptor->defaultValue);
+                       result = new TunableSetting(param);
+                       uint value = descriptor->lowValue + (random() % (1 + descriptor->highValue - descriptor->lowValue));
+                       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
                        settings.add(result);
                }
                usedSettings.add(result);
@@ -57,16 +100,51 @@ int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
 }
 
 int SearchTuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
-       TunableSetting setting(vartype, param);
-       TunableSetting * result = usedSettings.get(&setting);
+       return getVarTunable(vartype, 0, param, descriptor);
+}
+
+int SearchTuner::getVarTunable(VarType vartype1, VarType vartype2, TunableParam param, TunableDesc *descriptor) {
+       TunableSetting setting(vartype1, vartype2, param);
+       TunableSetting *result = usedSettings.get(&setting);
        if (result == NULL) {
                result = settings.get(&setting);
                if ( result == NULL) {
-                       result=new TunableSetting(vartype, param);
-                       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, descriptor->defaultValue);
+                       result = new
+                               TunableSetting(vartype1, vartype2, param);
+                       uint value = descriptor->lowValue + (random() % (1 + descriptor->highValue - descriptor->lowValue));
+                       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
                        settings.add(result);
                }
                usedSettings.add(result);
        }
        return result->selectedValue;
 }
+
+void SearchTuner::randomMutate() {
+       TunableSetting *randomSetting = settings.getRandomElement();
+       int range = randomSetting->highValue - randomSetting->lowValue;
+       int randomchoice = (random() % range) + randomSetting->lowValue;
+       if (randomchoice < randomSetting->selectedValue)
+               randomSetting->selectedValue = randomchoice;
+       else
+               randomSetting->selectedValue = randomchoice + 1;
+}
+
+void SearchTuner::print() {
+       SetIteratorTunableSetting *iterator = settings.iterator();
+       while (iterator->hasNext()) {
+               TunableSetting *setting = iterator->next();
+               setting->print();
+       }
+       delete iterator;
+
+}
+
+void SearchTuner::printUsed() {
+       SetIteratorTunableSetting *iterator = usedSettings.iterator();
+       while (iterator->hasNext()) {
+               TunableSetting *setting = iterator->next();
+               setting->print();
+       }
+       delete iterator;
+}