Changing the design by adding basic tuner
[satune.git] / src / Tuner / basictuner.h
1 /*
2  * To change this license header, choose License Headers in Project Properties.
3  * To change this template file, choose Tools | Templates
4  * and open the template in the editor.
5  */
6
7 /* 
8  * File:   basictuner.h
9  * Author: hamed
10  *
11  * Created on December 17, 2018, 2:02 PM
12  */
13
14 #ifndef BASICTUNER_H
15 #define BASICTUNER_H
16 #include "mymemory.h"
17 #include "classlist.h"
18 #include "cppvector.h"
19 #include "hashtable.h"
20
21 #define TUNERUNSETVALUE -1
22 #define AUTOTUNERFACTOR 0.3
23
24 class Problem {
25 public:
26         Problem(const char *problem);
27         char *getProblem() {return problem;}
28         inline int getResult(){return result;}
29         inline int getProblemNumber(){return problemnumber;}
30         inline void setResult(int res){result = res;}
31         inline void setProblemNumber(int probNum){problemnumber = probNum;}
32         inline long long getBestTime() {return besttime ;} 
33         inline void setBestTime(long long time) {besttime = time;}
34         ~Problem();
35         CMEMALLOC;
36 private:
37         int problemnumber;
38         int result;
39         char *problem;
40         long long besttime;
41 };
42
43 class TunerRecord {
44 public:
45         TunerRecord(SearchTuner *_tuner) : tuner(_tuner), tunernumber(-1) {}
46         TunerRecord(SearchTuner *_tuner, int _tunernumber) : tuner(_tuner), tunernumber(_tunernumber) {}
47         SearchTuner *getTuner() {return tuner;}
48         void inline addProblem(Problem * problem){problems.push(problem);}
49         TunerRecord *changeTuner(SearchTuner *_newtuner);
50         void updateTuner(SearchTuner *_newtuner) {tuner = _newtuner;}
51         long long getTime(Problem *problem);
52         void setTime(Problem *problem, long long time);
53         inline void setTunerNumber(int numb){tunernumber = numb;}
54         inline int getTunerNumber(){return tunernumber;}
55         inline uint problemsSize() {return problems.getSize();}
56         inline Problem *getProblem(uint index){return problems.get(index);}
57         void print();
58         void printProblemsInfo();
59         CMEMALLOC;
60 private:
61         SearchTuner *tuner;
62         Vector<Problem *> problems;
63         Hashtable<Problem *, long long, uint64_t> timetaken;
64         int tunernumber;
65         friend void clearVector(Vector<TunerRecord *> *tunerV);
66 };
67
68 class BasicTuner {
69 public:
70         BasicTuner(uint _budget, uint _timeout);
71         void addProblem(const char *filename);
72         void addTuner(SearchTuner *tuner);
73         void printData();
74         virtual ~BasicTuner();
75         virtual void tune() = 0;
76         CMEMALLOC;
77 protected:
78         long long evaluate(Problem *problem, TunerRecord *tuner);
79         /**
80          * returns the index of the tuner which is subtune of
81          * the newTuner 
82          * @param newTuner
83          * @return 
84          */
85         bool subTunerExist(SearchTuner *newTuner);
86         bool tunerExists(SearchTuner *tunerRec);
87         SearchTuner *mutateTuner(SearchTuner *oldTuner, uint k);
88         void updateTimeout(Problem *problem, long long metric);
89         Vector<TunerRecord *> allTuners;
90         Vector<TunerRecord *> explored;
91         Vector<Problem *> problems;
92         Vector<TunerRecord *> tuners;
93         uint budget;
94         uint timeout;
95         int execnum;
96 };
97
98 #endif /* BASICTUNER_H */
99