From b9084c80efba325d021b14575c956d420cf1f9fc Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 11 Oct 2018 11:33:20 -0700 Subject: [PATCH] Move static tuner into its own class --- src/Tuner/autotuner.cc | 22 -------- src/Tuner/autotuner.h | 7 +-- src/Tuner/searchtuner.cc | 54 ------------------ src/Tuner/searchtuner.h | 10 +--- src/Tuner/staticautotuner.cc | 38 +++++++++++++ src/Tuner/staticautotuner.h | 14 +++++ src/Tuner/staticsearchtuner.cc | 100 +++++++++++++++++++++++++++++++++ src/Tuner/staticsearchtuner.h | 18 ++++++ src/classlist.h | 3 + src/config.h | 2 - 10 files changed, 177 insertions(+), 91 deletions(-) create mode 100644 src/Tuner/staticautotuner.cc create mode 100644 src/Tuner/staticautotuner.h create mode 100644 src/Tuner/staticsearchtuner.cc create mode 100644 src/Tuner/staticsearchtuner.h diff --git a/src/Tuner/autotuner.cc b/src/Tuner/autotuner.cc index 857b21c..e448834 100644 --- a/src/Tuner/autotuner.cc +++ b/src/Tuner/autotuner.cc @@ -55,14 +55,6 @@ SearchTuner *AutoTuner::mutateTuner(SearchTuner *oldTuner, uint k) { return newTuner; } -#ifdef STATICENCGEN -SearchTuner *AutoTuner::mutateTuner(SearchTuner *oldTuner) { - SearchTuner *newTuner = oldTuner->copyUsed(); - result = newTuner->nextStaticTuner(); - return result==EXIT_FAILURE? newTuner: NULL; -} -#endif - void AutoTuner::tune() { SearchTuner *bestTuner = NULL; double bestScore = DBL_MAX; @@ -71,20 +63,6 @@ void AutoTuner::tune() { double base_temperature = evaluateAll(oldTuner); double oldScore = base_temperature; -#ifdef STATICENCGEN - while(true){ - SearchTuner *newTuner = mutateTuner(oldTuner); - if(newTuner == NULL) - return; - double newScore = evaluateAll(newTuner); - newTuner->printUsed(); - model_print("Received score %f\n", newScore); - delete oldTuner; - oldScore = newScore; - oldTuner = newTuner; - } -#endif - for (uint i = 0; i < budget; i++) { SearchTuner *newTuner = mutateTuner(oldTuner, i); double newScore = evaluateAll(newTuner); diff --git a/src/Tuner/autotuner.h b/src/Tuner/autotuner.h index ed276ee..8271008 100644 --- a/src/Tuner/autotuner.h +++ b/src/Tuner/autotuner.h @@ -10,15 +10,12 @@ class AutoTuner { public: AutoTuner(uint budget); void addProblem(CSolver *solver); - void tune(); + virtual void tune(); CMEMALLOC; -private: +protected: long long evaluate(CSolver *problem, SearchTuner *tuner); double evaluateAll(SearchTuner *tuner); SearchTuner *mutateTuner(SearchTuner *oldTuner, uint k); -#ifdef STATICENCGEN - SearchTuner *mutateTuner(SearchTuner *oldTuner); -#endif Vector solvers; uint budget; int result; diff --git a/src/Tuner/searchtuner.cc b/src/Tuner/searchtuner.cc index 1aef3fc..bfe66bb 100644 --- a/src/Tuner/searchtuner.cc +++ b/src/Tuner/searchtuner.cc @@ -72,10 +72,6 @@ ostream &operator<<(ostream &os, const TunableSetting &ts) SearchTuner::SearchTuner() { -#ifdef STATICENCGEN - graphEncoding =false; - naiveEncoding = ELEM_UNASSIGNED; -#endif ifstream myfile; myfile.open (TUNEFILE, ios::in); if (myfile.is_open()) { @@ -110,12 +106,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; } @@ -179,50 +169,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()) { diff --git a/src/Tuner/searchtuner.h b/src/Tuner/searchtuner.h index 612f60e..107926d 100644 --- a/src/Tuner/searchtuner.h +++ b/src/Tuner/searchtuner.h @@ -29,6 +29,7 @@ private: friend unsigned int tunableSettingHash(TunableSetting *setting); friend bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2); friend class SearchTuner; + friend class StaticSearchTuner; }; unsigned int tunableSettingHash(TunableSetting *setting); @@ -52,20 +53,13 @@ public: void serialize(); CMEMALLOC; -private: +protected: /** Used Settings keeps track of settings that were actually used by the example. Mutating settings may cause the Constraint Compiler not to query other settings.*/ HashsetTunableSetting usedSettings; /** Settings contains all settings. */ HashsetTunableSetting settings; -#ifdef STATICENCGEN - bool graphEncoding; - ElementEncodingType naiveEncoding; -public: - int nextStaticTuner(); -#endif }; - #endif diff --git a/src/Tuner/staticautotuner.cc b/src/Tuner/staticautotuner.cc new file mode 100644 index 0000000..71e8c68 --- /dev/null +++ b/src/Tuner/staticautotuner.cc @@ -0,0 +1,38 @@ +#include "staticautotuner.h" +#include "csolver.h" +#include "staticsearchtuner.h" +#include +#include +#include + +#define UNSETVALUE -1 +#define TIMEOUTSEC 5000 +StaticAutoTuner::StaticAutoTuner(uint _budget) : AutoTuner(_budget) { +} + +StaticSearchTuner *StaticAutoTuner::mutateTuner(StaticSearchTuner *oldTuner) { + StaticSearchTuner *newTuner = oldTuner->copyUsed(); + result = newTuner->nextStaticTuner(); + return result==EXIT_FAILURE? newTuner: NULL; +} + +void StaticAutoTuner::tune() { + StaticSearchTuner *bestTuner = NULL; + double bestScore = DBL_MAX; + + StaticSearchTuner *oldTuner = new StaticSearchTuner(); + double base_temperature = evaluateAll(oldTuner); + double oldScore = base_temperature; + + while(true){ + StaticSearchTuner *newTuner = mutateTuner(oldTuner); + if(newTuner == NULL) + return; + double newScore = evaluateAll(newTuner); + newTuner->printUsed(); + model_print("Received score %f\n", newScore); + delete oldTuner; + oldScore = newScore; + oldTuner = newTuner; + } +} diff --git a/src/Tuner/staticautotuner.h b/src/Tuner/staticautotuner.h new file mode 100644 index 0000000..cc0d1e2 --- /dev/null +++ b/src/Tuner/staticautotuner.h @@ -0,0 +1,14 @@ +#ifndef STATICAUTOTUNER_H +#define STATICAUTOTUNER_H +#include "autotuner.h" + + +class StaticAutoTuner : public AutoTuner { +public: + StaticAutoTuner(uint budget); + virtual void tune(); + CMEMALLOC; +private: + StaticSearchTuner *mutateTuner(StaticSearchTuner *oldTuner); +}; +#endif diff --git a/src/Tuner/staticsearchtuner.cc b/src/Tuner/staticsearchtuner.cc new file mode 100644 index 0000000..e3cc3fa --- /dev/null +++ b/src/Tuner/staticsearchtuner.cc @@ -0,0 +1,100 @@ +#include "staticsearchtuner.h" +#include +#include +using namespace std; + +StaticSearchTuner::StaticSearchTuner() { + graphEncoding =false; + naiveEncoding = ELEM_UNASSIGNED; + ifstream myfile; + myfile.open (TUNEFILE, 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); + usedSettings.add(setting); + } + myfile.close(); + } +} + +StaticSearchTuner *StaticSearchTuner::copyUsed() { + StaticSearchTuner *tuner = new StaticSearchTuner(); + SetIteratorTunableSetting *iterator = usedSettings.iterator(); + while (iterator->hasNext()) { + TunableSetting *setting = iterator->next(); + TunableSetting *copy = new TunableSetting(setting); + tuner->settings.add(copy); + } + if(naiveEncoding != ELEM_UNASSIGNED){ + tuner->graphEncoding = graphEncoding; + tuner->naiveEncoding = naiveEncoding; + } + delete iterator; + return tuner; +} + +StaticSearchTuner::~StaticSearchTuner() { + SetIteratorTunableSetting *iterator = settings.iterator(); + while (iterator->hasNext()) { + TunableSetting *setting = iterator->next(); + delete setting; + } + delete iterator; +} + +int StaticSearchTuner::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; +} diff --git a/src/Tuner/staticsearchtuner.h b/src/Tuner/staticsearchtuner.h new file mode 100644 index 0000000..407037b --- /dev/null +++ b/src/Tuner/staticsearchtuner.h @@ -0,0 +1,18 @@ +#ifndef STATICSEARCHTUNER_H +#define STATICSEARCHTUNER_H +#include "searchtuner.h" + +class StaticSearchTuner : public SearchTuner { +public: + StaticSearchTuner(); + ~StaticSearchTuner(); + int nextStaticTuner(); + StaticSearchTuner *copyUsed(); + + CMEMALLOC; +private: + bool graphEncoding; + ElementEncodingType naiveEncoding; +}; + +#endif diff --git a/src/classlist.h b/src/classlist.h index 3269985..cd7757d 100644 --- a/src/classlist.h +++ b/src/classlist.h @@ -60,6 +60,9 @@ class AutoTuner; class SearchTuner; class TunableSetting; +class StaticAutoTuner; +class StaticSearchTuner; + class TunableDesc; class OrderResolver; diff --git a/src/config.h b/src/config.h index ef0b9b1..ce13d3c 100644 --- a/src/config.h +++ b/src/config.h @@ -19,8 +19,6 @@ //#define CONFIG_DEBUG #endif -//#define STATICENCGEN - #ifndef CONFIG_ASSERT #define CONFIG_ASSERT #endif -- 2.34.1