Add tuner components
authorbdemsky <bdemsky@uci.edu>
Fri, 12 Oct 2018 18:06:04 +0000 (11:06 -0700)
committerbdemsky <bdemsky@uci.edu>
Fri, 12 Oct 2018 18:06:04 +0000 (11:06 -0700)
src/Tuner/autotuner.cc
src/Tuner/multituner.cc [new file with mode: 0644]
src/Tuner/multituner.h [new file with mode: 0644]
src/Tuner/searchtuner.cc
src/Tuner/searchtuner.h
src/Tuner/staticautotuner.cc
src/Tuner/staticautotuner.h
src/Tuner/staticsearchtuner.cc
src/Tuner/staticsearchtuner.h
src/Tuner/tunable.cc
src/Tuner/tunable.h

index e448834cfc7c154b2e22422efe4de6843c3bb5b5..b769993e0205af0fb33b3fedb4b30478dfc55de0 100644 (file)
@@ -94,7 +94,7 @@ void AutoTuner::tune() {
        }
        model_print("Best tuner:\n");
        bestTuner->print();
-       bestTuner->serialize();
+       bestTuner->serialize("TUNER.conf");
        model_print("Received score %f\n", bestScore);
        if (bestTuner != NULL)
                delete bestTuner;
diff --git a/src/Tuner/multituner.cc b/src/Tuner/multituner.cc
new file mode 100644 (file)
index 0000000..f694084
--- /dev/null
@@ -0,0 +1,145 @@
+#include "multituner.h"
+#include "csolver.h"
+#include "searchtuner.h"
+#include <math.h>
+#include <stdlib.h>
+#include <float.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+
+
+#define UNSETVALUE -1
+#define TIMEOUTSEC 5000
+
+Problem::Problem(const char *_problem) : result(UNSETVALUE) {
+       uint len = strlen(_problem);
+       problem = (char *) ourmalloc(len + 1);
+       memcpy(problem, _problem, len + 1);
+}
+
+Problem::~Problem() {
+       ourfree(problem);
+}
+
+MultiTuner::MultiTuner(uint _budget, uint _timeout) :
+       budget(_budget), timeout(_timeout), execnum(0) {
+}
+
+MultiTuner::~MultiTuner() {
+       for (uint i = 0; i < problems.getSize(); i++)
+               ourfree(problems.get(i));
+}
+
+void MultiTuner::addProblem(const char *filename) {
+       problems.push(new Problem(filename));
+}
+
+void MultiTuner::addTuner(SearchTuner *tuner) {
+       tuners.push(new TunerRecord(tuner));
+}
+
+long long MultiTuner::evaluate(Problem *problem, SearchTuner *tuner) {
+       char buffer[512];
+       //Write out the tuner
+       snprintf(buffer, sizeof(buffer), "tuner%u", execnum);
+       tuner->serialize(buffer);
+
+       //Do run
+       snprintf(buffer, sizeof(buffer), "deserializerun %s %u tuner%u result%s%u", problem->getProblem(), timeout, execnum, problem->getProblem(), execnum);
+       int status = system(buffer);
+
+       long long metric = -1;
+       int sat = IS_INDETER;
+       if (status == 0) {
+               //Read data in from results file
+               snprintf(buffer, sizeof(buffer), "result%s%u", problem->getProblem(), execnum);
+
+               ifstream myfile;
+               myfile.open (buffer, ios::in);
+
+
+               if (myfile.is_open()) {
+                       myfile >> metric;
+                       myfile >> sat;
+                       myfile.close();
+               }
+       }
+       //Increment execution count
+       execnum++;
+
+       if (problem->result == UNSETVALUE && sat != IS_INDETER) {
+               problem->result = sat;
+       } else if (problem->result != sat && sat != IS_INDETER) {
+               model_print("******** Result has changed ********\n");
+       }
+       return metric;
+}
+
+double MultiTuner::evaluateAll(SearchTuner *tuner) {
+       double product = 1;
+       for (uint i = 0; i < problems.getSize(); i++) {
+               Problem *problem = problems.get(i);
+               double score = evaluate(problem, tuner);
+               product *= score;
+       }
+       return pow(product, 1 / ((double)problems.getSize()));
+}
+
+SearchTuner *MultiTuner::mutateTuner(SearchTuner *oldTuner, uint k) {
+       SearchTuner *newTuner = oldTuner->copyUsed();
+       uint numSettings = oldTuner->getSize();
+       uint settingsToMutate = (uint)(AUTOTUNERFACTOR * (((double)numSettings) * (budget - k)) / (budget));
+       if (settingsToMutate < 1)
+               settingsToMutate = 1;
+       model_print("Mutating %u settings\n", settingsToMutate);
+       while (settingsToMutate-- != 0) {
+               newTuner->randomMutate();
+       }
+       return newTuner;
+}
+
+void MultiTuner::tune() {
+       SearchTuner *bestTuner = NULL;
+       double bestScore = DBL_MAX;
+
+       SearchTuner *oldTuner = new SearchTuner();
+       double base_temperature = evaluateAll(oldTuner);
+       double oldScore = base_temperature;
+
+       for (uint i = 0; i < budget; i++) {
+               SearchTuner *newTuner = mutateTuner(oldTuner, i);
+               double newScore = evaluateAll(newTuner);
+               newTuner->printUsed();
+               model_print("Received score %f\n", newScore);
+               double scoreDiff = newScore - oldScore; //smaller is better
+               if (newScore < bestScore) {
+                       if (bestTuner != NULL)
+                               delete bestTuner;
+                       bestScore = newScore;
+                       bestTuner = newTuner->copyUsed();
+               }
+
+               double acceptanceP;
+               if (scoreDiff < 0) {
+                       acceptanceP = 1;
+               } else {
+                       double currTemp = base_temperature * (((double)budget - i) / budget);
+                       acceptanceP = exp(-scoreDiff / currTemp);
+               }
+               double ran = ((double)random()) / RAND_MAX;
+               if (ran <= acceptanceP) {
+                       delete oldTuner;
+                       oldScore = newScore;
+                       oldTuner = newTuner;
+               } else {
+                       delete newTuner;
+               }
+       }
+       model_print("Best tuner:\n");
+       bestTuner->print();
+       model_print("Received score %f\n", bestScore);
+       if (bestTuner != NULL)
+               delete bestTuner;
+       delete oldTuner;
+}
diff --git a/src/Tuner/multituner.h b/src/Tuner/multituner.h
new file mode 100644 (file)
index 0000000..fffc5c2
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef MULTITUNER_H
+#define MULTITUNER_H
+#include "classlist.h"
+#include "structs.h"
+
+#define AUTOTUNERFACTOR 0.3
+
+class Problem {
+public:
+       Problem(const char *problem);
+       char *getProblem() {return problem;}
+       ~Problem();
+       CMEMALLOC;
+private:
+       int result;
+       char *problem;
+       friend class MultiTuner;
+};
+
+class TunerRecord {
+public:
+       TunerRecord(SearchTuner *_tuner) : tuner(_tuner) {}
+
+private:
+       SearchTuner *tuner;
+       friend class MultiTuner;
+};
+
+class MultiTuner {
+public:
+       MultiTuner(uint budget, uint timeout);
+       ~MultiTuner();
+       void addProblem(const char *filename);
+       void addTuner(SearchTuner *tuner);
+       virtual void tune();
+       CMEMALLOC;
+protected:
+       long long evaluate(Problem *problem, SearchTuner *tuner);
+       double evaluateAll(SearchTuner *tuner);
+       SearchTuner *mutateTuner(SearchTuner *oldTuner, uint k);
+       Vector<Problem *> problems;
+       Vector<TunerRecord *> tuners;
+       uint budget;
+       uint timeout;
+       int execnum;
+};
+#endif
index bfe66bb4dd77cdcb21e15230a09cb9e5a6da5882..674758e2580ff1ac1e454a25228dc9f1f8ceabff 100644 (file)
@@ -72,8 +72,11 @@ ostream &operator<<(ostream &os, const TunableSetting &ts)
 
 
 SearchTuner::SearchTuner() {
+}
+
+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;
@@ -179,9 +182,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();
index 107926d1c02fa2f86933aad93a0fecbfd090b9e1..e00a6dd4315bec6ed57eacbcd40af719444df545 100644 (file)
@@ -5,7 +5,6 @@
 #include "structs.h"
 #include <ostream>
 using namespace std;
-#define TUNEFILE "tune.conf"
 
 class TunableSetting {
 public:
@@ -29,7 +28,7 @@ private:
        friend unsigned int tunableSettingHash(TunableSetting *setting);
        friend bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2);
        friend class SearchTuner;
-       friend class StaticSearchTuner;
+       friend class StaticSearchTuner;
 };
 
 unsigned int tunableSettingHash(TunableSetting *setting);
@@ -41,6 +40,7 @@ typedef SetIterator<TunableSetting *, uintptr_t, 4, tunableSettingHash, tunableS
 class SearchTuner : public Tuner {
 public:
        SearchTuner();
+       SearchTuner(const char *filename);
        ~SearchTuner();
        int getTunable(TunableParam param, TunableDesc *descriptor);
        int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor);
@@ -50,7 +50,7 @@ public:
        uint getSize() { return usedSettings.getSize();}
        void print();
        void printUsed();
-       void serialize();
+       void serialize(const char *file);
 
        CMEMALLOC;
 protected:
index 71e8c681a323a8909a49b30e95dc7fc91f3cc486..6fa385bf720fcde631633a1ebb19694e139d9b61 100644 (file)
@@ -13,7 +13,7 @@ StaticAutoTuner::StaticAutoTuner(uint _budget) : AutoTuner(_budget) {
 StaticSearchTuner *StaticAutoTuner::mutateTuner(StaticSearchTuner *oldTuner) {
        StaticSearchTuner *newTuner = oldTuner->copyUsed();
        result = newTuner->nextStaticTuner();
-       return result==EXIT_FAILURE? newTuner: NULL;
+       return result == EXIT_FAILURE ? newTuner : NULL;
 }
 
 void StaticAutoTuner::tune() {
@@ -24,9 +24,9 @@ void StaticAutoTuner::tune() {
        double base_temperature = evaluateAll(oldTuner);
        double oldScore = base_temperature;
 
-       while(true){
+       while (true) {
                StaticSearchTuner *newTuner = mutateTuner(oldTuner);
-               if(newTuner == NULL)
+               if (newTuner == NULL)
                        return;
                double newScore = evaluateAll(newTuner);
                newTuner->printUsed();
index cc0d1e2a3c4867dddd7986649f4fcea364d0a71e..127d53fe4afdaa7b1a559c78f6dcd7f661a5afc8 100644 (file)
@@ -6,8 +6,8 @@
 class StaticAutoTuner : public AutoTuner {
 public:
        StaticAutoTuner(uint budget);
-  virtual void tune();
-       CMEMALLOC;
+       virtual void tune();
+       CMEMALLOC;
 private:
        StaticSearchTuner *mutateTuner(StaticSearchTuner *oldTuner);
 };
index e3cc3fa8838039463d5cbcbf6bdba1ee2c6ad08c..5cedc715c9f033acb8f0f52c3380d859d926084e 100644 (file)
@@ -4,8 +4,8 @@
 using namespace std;
 
 StaticSearchTuner::StaticSearchTuner() {
-        graphEncoding =false;
-        naiveEncoding = ELEM_UNASSIGNED;
+       graphEncoding = false;
+       naiveEncoding = ELEM_UNASSIGNED;
        ifstream myfile;
        myfile.open (TUNEFILE, ios::in);
        if (myfile.is_open()) {
@@ -40,7 +40,7 @@ StaticSearchTuner *StaticSearchTuner::copyUsed() {
                TunableSetting *copy = new TunableSetting(setting);
                tuner->settings.add(copy);
        }
-       if(naiveEncoding != ELEM_UNASSIGNED){
+       if (naiveEncoding != ELEM_UNASSIGNED) {
                tuner->graphEncoding = graphEncoding;
                tuner->naiveEncoding = naiveEncoding;
        }
@@ -58,38 +58,38 @@ StaticSearchTuner::~StaticSearchTuner() {
 }
 
 int StaticSearchTuner::nextStaticTuner() {
-       if(naiveEncoding == ELEM_UNASSIGNED){
+       if (naiveEncoding == ELEM_UNASSIGNED) {
                naiveEncoding = ONEHOT;
                SetIteratorTunableSetting *iter = settings.iterator();
-               while(iter->hasNext()){
+               while (iter->hasNext()) {
                        TunableSetting *setting = iter->next();
-                       if (setting->param == NAIVEENCODER){
+                       if (setting->param == NAIVEENCODER) {
                                setting->selectedValue = ONEHOT;
-                       } else if(setting->param == ENCODINGGRAPHOPT){
+                       } else if (setting->param == ENCODINGGRAPHOPT) {
                                setting->selectedValue = false;
                        }
                }
                delete iter;
                return EXIT_FAILURE;
        }
-       int result=EXIT_FAILURE;
-       if(naiveEncoding == BINARYINDEX && graphEncoding){
+       int result = EXIT_FAILURE;
+       if (naiveEncoding == BINARYINDEX && graphEncoding) {
                model_print("Best tuner\n");
                return EXIT_SUCCESS;
-       }else if (naiveEncoding == BINARYINDEX && !graphEncoding){
+       } else if (naiveEncoding == BINARYINDEX && !graphEncoding) {
                naiveEncoding = ONEHOT;
                graphEncoding = true;
-       }else {
+       } else {
                naiveEncoding = (ElementEncodingType)((int)naiveEncoding + 1);
        }
        SetIteratorTunableSetting *iter = settings.iterator();
        uint count = 0;
-       while(iter->hasNext()){
-               TunableSetting * setting = iter->next();
-               if (setting->param == NAIVEENCODER){
+       while (iter->hasNext()) {
+               TunableSetting *setting = iter->next();
+               if (setting->param == NAIVEENCODER) {
                        setting->selectedValue = naiveEncoding;
                        count++;
-               } else if(setting->param == ENCODINGGRAPHOPT){
+               } else if (setting->param == ENCODINGGRAPHOPT) {
                        setting->selectedValue = graphEncoding;
                        count++;
                }
index 407037ba30830aa2f8cf12178a2c491910fac660..7d7d78d2848356c28b8020bfe377817d26607253 100644 (file)
@@ -1,18 +1,19 @@
 #ifndef STATICSEARCHTUNER_H
 #define STATICSEARCHTUNER_H
 #include "searchtuner.h"
+#define TUNEFILE "tune.conf"
 
 class StaticSearchTuner : public SearchTuner {
 public:
        StaticSearchTuner();
        ~StaticSearchTuner();
-        int nextStaticTuner();
+       int nextStaticTuner();
        StaticSearchTuner *copyUsed();
-  
+
        CMEMALLOC;
 private:
-        bool graphEncoding;
-        ElementEncodingType naiveEncoding;
+       bool graphEncoding;
+       ElementEncodingType naiveEncoding;
 };
 
 #endif
index 115e04eb645fe1942f2c6a5b227615ccf11d23eb..899bab0e81d4fd508ba6cdfa2285cea9dfff32b7 100644 (file)
@@ -15,41 +15,41 @@ int DefaultTuner::getVarTunable(VarType vartype1, VarType vartype2, TunableParam
        return descriptor->defaultValue;
 }
 
-const char* tunableParameterToString(Tunables tunable){
-       switch(tunable){
-                case DECOMPOSEORDER:
-                        return "DECOMPOSEORDER";
-                case MUSTREACHGLOBAL:
-                        return "MUSTREACHGLOBAL";
-                case MUSTREACHLOCAL:
-                        return "MUSTREACHLOCAL";
-                case MUSTREACHPRUNE:
-                        return "MUSTREACHPRUNE";
-                case OPTIMIZEORDERSTRUCTURE:
-                        return "OPTIMIZEORDERSTRUCTURE";
-                case ORDERINTEGERENCODING:
-                        return "ORDERINTEGERENCODING";
-                case PREPROCESS:
-                        return "PREPROCESS";
-                case NODEENCODING:
-                        return "NODEENCODING";
-                case EDGEENCODING:
-                        return "EDGEENCODING";
-                case MUSTEDGEPRUNE:
-                        return "MUSTEDGEPRUNE";
-               case ELEMENTOPT: 
-                       return "ELEMENTOPT";
-               case ELEMENTOPTSETS:
-                       return "ELEMENTOPTSETS";
-               case PROXYVARIABLE:
-                       return "PROXYVARIABLE";
-               case ENCODINGGRAPHOPT:
-                       return "ENCODINGGRAPHOPT";
-               case NAIVEENCODER:
-                       return "NAIVEENCODER";
-               case MUSTVALUE:
-                       return "MUSTVALUE";
-                default:
-                        ASSERT(0);
-        }
+const char *tunableParameterToString(Tunables tunable) {
+       switch (tunable) {
+       case DECOMPOSEORDER:
+               return "DECOMPOSEORDER";
+       case MUSTREACHGLOBAL:
+               return "MUSTREACHGLOBAL";
+       case MUSTREACHLOCAL:
+               return "MUSTREACHLOCAL";
+       case MUSTREACHPRUNE:
+               return "MUSTREACHPRUNE";
+       case OPTIMIZEORDERSTRUCTURE:
+               return "OPTIMIZEORDERSTRUCTURE";
+       case ORDERINTEGERENCODING:
+               return "ORDERINTEGERENCODING";
+       case PREPROCESS:
+               return "PREPROCESS";
+       case NODEENCODING:
+               return "NODEENCODING";
+       case EDGEENCODING:
+               return "EDGEENCODING";
+       case MUSTEDGEPRUNE:
+               return "MUSTEDGEPRUNE";
+       case ELEMENTOPT:
+               return "ELEMENTOPT";
+       case ELEMENTOPTSETS:
+               return "ELEMENTOPTSETS";
+       case PROXYVARIABLE:
+               return "PROXYVARIABLE";
+       case ENCODINGGRAPHOPT:
+               return "ENCODINGGRAPHOPT";
+       case NAIVEENCODER:
+               return "NAIVEENCODER";
+       case MUSTVALUE:
+               return "MUSTVALUE";
+       default:
+               ASSERT(0);
+       }
 }
index c2a70b0ea21b8b4d900562ffbeb5b935dd379afa..da3d44a8ec3dd521e496668eec9f3a1bd489dc76 100644 (file)
@@ -43,8 +43,8 @@ static TunableDesc mustValueBinaryIndex(5, 9, 8);
 static TunableDesc NodeEncodingDesc(ELEM_UNASSIGNED, BINARYINDEX, ELEM_UNASSIGNED);
 static TunableDesc NaiveEncodingDesc(ONEHOT, BINARYINDEX, ONEHOT);
 
-enum Tunables {DECOMPOSEORDER, MUSTREACHGLOBAL, MUSTREACHLOCAL, MUSTREACHPRUNE, OPTIMIZEORDERSTRUCTURE, ORDERINTEGERENCODING, PREPROCESS, NODEENCODING, EDGEENCODING, MUSTEDGEPRUNE, ELEMENTOPT, 
-        ENCODINGGRAPHOPT, ELEMENTOPTSETS, PROXYVARIABLE, MUSTVALUE, NAIVEENCODER};
+enum Tunables {DECOMPOSEORDER, MUSTREACHGLOBAL, MUSTREACHLOCAL, MUSTREACHPRUNE, OPTIMIZEORDERSTRUCTURE, ORDERINTEGERENCODING, PREPROCESS, NODEENCODING, EDGEENCODING, MUSTEDGEPRUNE, ELEMENTOPT,
+                                                        ENCODINGGRAPHOPT, ELEMENTOPTSETS, PROXYVARIABLE, MUSTVALUE, NAIVEENCODER};
 typedef enum Tunables Tunables;
 
 const char *tunableParameterToString(Tunables tunable);