From e331c9425d7b54d686ef7ff2af413683515991b1 Mon Sep 17 00:00:00 2001 From: Hamed Gorjiara Date: Fri, 5 Oct 2018 17:51:11 -0700 Subject: [PATCH] Considering dependency among Tunable Settings in the search tuner --- src/Collections/structs.cc | 9 +++++++ src/Collections/structs.h | 4 +++ src/Tuner/searchtuner.cc | 47 ++++++++++++++++++++++++++++++++++- src/Tuner/searchtuner.h | 2 ++ src/Tuner/tunabledependent.cc | 30 ++++++++++++++++++++++ src/Tuner/tunabledependent.h | 29 +++++++++++++++++++++ src/classlist.h | 1 + 7 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/Tuner/tunabledependent.cc create mode 100644 src/Tuner/tunabledependent.h diff --git a/src/Collections/structs.cc b/src/Collections/structs.cc index 7673474..7bff7eb 100644 --- a/src/Collections/structs.cc +++ b/src/Collections/structs.cc @@ -7,6 +7,7 @@ #include "orderelement.h" #include "structs.h" #include "decomposeorderresolver.h" +#include "tunabledependent.h" #define HASHNEXT(hash, newval) {hash += newval; hash += hash << 10; hash ^= hash >> 6;} #define HASHFINAL(hash) {hash += hash << 3; hash ^= hash >> 11; hash += hash << 15;} @@ -29,6 +30,14 @@ bool table_entry_equals(TableEntry *key1, TableEntry *key2) { return true; } +unsigned int tunable_dependent_hash_function(TunableDependent *This){ + return (uint)This->dependent; +} + +bool tunable_dependent_equals(TunableDependent *key1, TunableDependent *key2){ + return key1->dependent == key2->dependent; +} + unsigned int order_node_hash_function(OrderNodeKey *This) { return (uint) This->id; } diff --git a/src/Collections/structs.h b/src/Collections/structs.h index 9fa23bc..747d82c 100644 --- a/src/Collections/structs.h +++ b/src/Collections/structs.h @@ -12,6 +12,8 @@ unsigned int table_entry_hash_function(TableEntry *This); bool table_entry_equals(TableEntry *key1, TableEntry *key2); unsigned int order_node_hash_function(OrderNodeKey *This); bool order_node_equals(OrderNodeKey *key1, OrderNodeKey *key2); +unsigned int tunable_dependent_hash_function(TunableDependent *This); +bool tunable_dependent_equals(TunableDependent *key1, TunableDependent *key2); unsigned int order_edge_hash_function(OrderEdge *This); bool order_edge_equals(OrderEdge *key1, OrderEdge *key2); unsigned int order_element_hash_function(OrderElement *This); @@ -25,6 +27,7 @@ bool doredge_equals(DOREdge *key1, DOREdge *key2); typedef Hashset HashsetTableEntry; typedef Hashset HashsetOrderNode; +typedef Hashset HashsetTunableDep; typedef Hashset HashsetOrderEdge; typedef Hashset HashsetOrderElement; typedef Hashset HashsetDOREdge; @@ -46,6 +49,7 @@ typedef Hashtable HashtableEncoding; typedef SetIterator SetIteratorTableEntry; typedef SetIterator SetIteratorOrderEdge; typedef SetIterator SetIteratorOrderNode; +typedef SetIterator SetIteratorTunableDep; typedef SetIterator SetIteratorOrderElement; typedef SetIterator SetIteratorDOREdge; #endif diff --git a/src/Tuner/searchtuner.cc b/src/Tuner/searchtuner.cc index 1aef3fc..4e96355 100644 --- a/src/Tuner/searchtuner.cc +++ b/src/Tuner/searchtuner.cc @@ -1,8 +1,26 @@ #include "searchtuner.h" +#include "tunabledependent.h" #include #include +#include using namespace std; +HashsetTunableDep initializeTunableDependencies() +{ + HashsetTunableDep dep; + dep.add(new TunableDependent(MUSTREACHGLOBAL, DECOMPOSEORDER)); + dep.add(new TunableDependent(MUSTREACHLOCAL, DECOMPOSEORDER)); + dep.add(new TunableDependent(MUSTREACHPRUNE, DECOMPOSEORDER)); + dep.add(new TunableDependent(MUSTEDGEPRUNE, DECOMPOSEORDER)); + dep.add(new TunableDependent(NODEENCODING, ENCODINGGRAPHOPT)); + dep.add(new TunableDependent(EDGEENCODING, ENCODINGGRAPHOPT)); + dep.add(new TunableDependent(ELEMENTOPTSETS, ELEMENTOPT)); + return dep; +} + + +HashsetTunableDep SearchTuner::tunableDependency = initializeTunableDependencies(); + TunableSetting::TunableSetting(VarType _type, TunableParam _param) : hasVar(true), type1(_type), @@ -166,8 +184,35 @@ int SearchTuner::getVarTunable(VarType vartype1, VarType vartype2, TunableParam return result->selectedValue; } +bool SearchTuner::validTunableSetting(TunableSetting* setting){ + TunableDependent tuneDep((Tunables)setting->param); + bool result = true; + while(tunableDependency.contains(&tuneDep)){ + TunableDependent *dependent = tunableDependency.get(&tuneDep); + TunableSetting p(dependent->parent); + if(!settings.contains(&p)){ + SetIteratorTunableSetting *iter = settings.iterator(); + while(iter->hasNext()){ + model_print("*******************\n"); + iter->next()->print(); + } + delete iter; + } + ASSERT(settings.contains(&p)); + TunableSetting *parent = settings.get(&p); + if(!(bool)parent->selectedValue){ //Check parent config is already off + return false; + } + tuneDep.dependent = dependent->parent; + } + return result; +} + void SearchTuner::randomMutate() { - TunableSetting *randomSetting = settings.getRandomElement(); + TunableSetting *randomSetting; + do{ + randomSetting= settings.getRandomElement(); + }while(!validTunableSetting(randomSetting)); int range = randomSetting->highValue - randomSetting->lowValue; int randomchoice = (random() % range) + randomSetting->lowValue; if (randomchoice < randomSetting->selectedValue) diff --git a/src/Tuner/searchtuner.h b/src/Tuner/searchtuner.h index 612f60e..190bc5e 100644 --- a/src/Tuner/searchtuner.h +++ b/src/Tuner/searchtuner.h @@ -53,6 +53,8 @@ public: CMEMALLOC; private: + bool validTunableSetting(TunableSetting* setting); + static HashsetTunableDep tunableDependency; /** 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.*/ diff --git a/src/Tuner/tunabledependent.cc b/src/Tuner/tunabledependent.cc new file mode 100644 index 0000000..e1b0dba --- /dev/null +++ b/src/Tuner/tunabledependent.cc @@ -0,0 +1,30 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TunableDependent.cc + * Author: hamed + * + * Created on October 5, 2018, 11:26 AM + */ + +#include "tunabledependent.h" + +TunableDependent::TunableDependent(Tunables dependent, Tunables parent): + dependent(dependent), + parent(parent) +{ +} + +TunableDependent::TunableDependent(TunableDependent &setting) +{ + dependent = setting.dependent; + parent = setting.parent; +} + +TunableDependent::~TunableDependent() { +} + diff --git a/src/Tuner/tunabledependent.h b/src/Tuner/tunabledependent.h new file mode 100644 index 0000000..241b9eb --- /dev/null +++ b/src/Tuner/tunabledependent.h @@ -0,0 +1,29 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TunableDependent.h + * Author: hamed + * + * Created on October 5, 2018, 11:26 AM + */ + +#ifndef TUNABLEDEPENDENT_H +#define TUNABLEDEPENDENT_H + +#include "tunable.h" + +class TunableDependent { +public: + TunableDependent(Tunables dependent, Tunables parent = (Tunables) -1); + TunableDependent(TunableDependent &setting); + virtual ~TunableDependent(); + Tunables dependent; + Tunables parent; +}; + +#endif /* TUNABLEDEPENDENT_H */ + diff --git a/src/classlist.h b/src/classlist.h index 3269985..e17ba84 100644 --- a/src/classlist.h +++ b/src/classlist.h @@ -61,6 +61,7 @@ class SearchTuner; class TunableSetting; class TunableDesc; +class TunableDependent; class OrderResolver; class DecomposeOrderResolver; -- 2.34.1