Bug fix: besttime for each problem
[satune.git] / src / Tuner / searchtuner.cc
index 1aef3fcd566a4adf28e201aac1fe1ec91d19e7af..f4f4cfcd00c2912179958c4827fab126e8cf8be3 100644 (file)
@@ -72,12 +72,11 @@ ostream &operator<<(ostream &os, const TunableSetting &ts)
 
 
 SearchTuner::SearchTuner() {
-#ifdef STATICENCGEN
-        graphEncoding =false;
-        naiveEncoding = ELEM_UNASSIGNED;
-#endif
+}
+
+SearchTuner::SearchTuner(const char *filename) {
        ifstream myfile;
-       myfile.open (TUNEFILE, ios::in);
+       myfile.open (filename, ios::in);
        if (myfile.is_open()) {
                bool hasVar;
                VarType type1;
@@ -96,12 +95,50 @@ SearchTuner::SearchTuner() {
                                setting = new TunableSetting(param);
                        }
                        setting->setDecision(lowValue, highValue, defaultValue, selectedValue);
+                       settings.add(setting);
                        usedSettings.add(setting);
                }
                myfile.close();
        }
 }
 
+void SearchTuner::addUsed(const char *filename) {
+       ifstream myfile;
+       myfile.open (filename, ios::in);
+       if (myfile.is_open()) {
+               bool hasVar;
+               VarType type1;
+               VarType type2;
+               TunableParam param;
+               int lowValue;
+               int highValue;
+               int defaultValue;
+               int selectedValue;
+               while (myfile >> hasVar >> type1 >> type2 >> param >> lowValue >> highValue >> defaultValue >> selectedValue) {
+                       TunableSetting *setting;
+
+                       if (hasVar) {
+                               setting = new TunableSetting(type1, type2, param);
+                       } else {
+                               setting = new TunableSetting(param);
+                       }
+                       setting->setDecision(lowValue, highValue, defaultValue, selectedValue);
+                       if (!settings.contains(setting)) {
+                               settings.add(setting);
+                               usedSettings.add(setting);
+                       } else {
+                               TunableSetting *tmp = settings.get(setting);
+                               settings.remove(tmp);
+                               usedSettings.remove(tmp);
+                               delete tmp;
+                               settings.add(setting);
+                               usedSettings.add(setting);
+                       }
+               }
+               myfile.close();
+       }
+}
+
 SearchTuner *SearchTuner::copyUsed() {
        SearchTuner *tuner = new SearchTuner();
        SetIteratorTunableSetting *iterator = usedSettings.iterator();
@@ -110,12 +147,6 @@ SearchTuner *SearchTuner::copyUsed() {
                TunableSetting *copy = new TunableSetting(setting);
                tuner->settings.add(copy);
        }
-#ifdef STATICENCGEN
-       if(naiveEncoding != ELEM_UNASSIGNED){
-               tuner->graphEncoding = graphEncoding;
-               tuner->naiveEncoding = naiveEncoding;
-       }
-#endif
        delete iterator;
        return tuner;
 }
@@ -129,6 +160,24 @@ SearchTuner::~SearchTuner() {
        delete iterator;
 }
 
+void SearchTuner::setTunable(TunableParam param, TunableDesc *descriptor, uint value) {
+       TunableSetting *result = new TunableSetting(param);
+       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
+       settings.add(result);
+       usedSettings.add(result);
+}
+
+void SearchTuner::setVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor, uint value) {
+       setVarTunable(vartype, 0, param, descriptor, value);
+}
+
+void SearchTuner::setVarTunable(VarType vartype1, VarType vartype2, TunableParam param, TunableDesc *descriptor, uint value) {
+       TunableSetting *result = new TunableSetting(vartype1, vartype2, param);
+       result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
+       settings.add(result);
+       usedSettings.add(result);
+}
+
 int SearchTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
        TunableSetting setting(param);
        TunableSetting *result = usedSettings.get(&setting);
@@ -179,50 +228,6 @@ void SearchTuner::randomMutate() {
        model_print("&&&&&&&&&&&&&&&&&&&&&&&\n");
 }
 
-#ifdef STATICENCGEN
-int SearchTuner::nextStaticTuner() {
-       if(naiveEncoding == ELEM_UNASSIGNED){
-               naiveEncoding = ONEHOT;
-               SetIteratorTunableSetting *iter = settings.iterator();
-               while(iter->hasNext()){
-                       TunableSetting *setting = iter->next();
-                       if (setting->param == NAIVEENCODER){
-                               setting->selectedValue = ONEHOT;
-                       } else if(setting->param == ENCODINGGRAPHOPT){
-                               setting->selectedValue = false;
-                       }
-               }
-               delete iter;
-               return EXIT_FAILURE;
-       }
-       int result=EXIT_FAILURE;
-       if(naiveEncoding == BINARYINDEX && graphEncoding){
-               model_print("Best tuner\n");
-               return EXIT_SUCCESS;
-       }else if (naiveEncoding == BINARYINDEX && !graphEncoding){
-               naiveEncoding = ONEHOT;
-               graphEncoding = true;
-       }else {
-               naiveEncoding = (ElementEncodingType)((int)naiveEncoding + 1);
-       }
-       SetIteratorTunableSetting *iter = settings.iterator();
-       uint count = 0;
-       while(iter->hasNext()){
-               TunableSetting * setting = iter->next();
-               if (setting->param == NAIVEENCODER){
-                       setting->selectedValue = naiveEncoding;
-                       count++;
-               } else if(setting->param == ENCODINGGRAPHOPT){
-                       setting->selectedValue = graphEncoding;
-                       count++;
-               }
-       }
-       model_print("Mutating %u settings\n", count);
-       delete iter;
-       return result;
-}
-#endif
-
 void SearchTuner::print() {
        SetIteratorTunableSetting *iterator = settings.iterator();
        while (iterator->hasNext()) {
@@ -233,9 +238,9 @@ void SearchTuner::print() {
 
 }
 
-void SearchTuner::serialize() {
+void SearchTuner::serialize(const char *filename) {
        ofstream myfile;
-       myfile.open (TUNEFILE, ios::out | ios::trunc);
+       myfile.open (filename, ios::out | ios::trunc);
        SetIteratorTunableSetting *iterator = settings.iterator();
        while (iterator->hasNext()) {
                TunableSetting *setting = iterator->next();
@@ -245,6 +250,18 @@ void SearchTuner::serialize() {
        delete iterator;
 }
 
+void SearchTuner::serializeUsed(const char *filename) {
+       ofstream myfile;
+       myfile.open (filename, ios::out | ios::trunc);
+       SetIteratorTunableSetting *iterator = usedSettings.iterator();
+       while (iterator->hasNext()) {
+               TunableSetting *setting = iterator->next();
+               myfile << *setting << endl;
+       }
+       myfile.close();
+       delete iterator;
+}
+
 void SearchTuner::printUsed() {
        SetIteratorTunableSetting *iterator = usedSettings.iterator();
        while (iterator->hasNext()) {