0c43785d3693fe9e49e425604656b33c74b5fc59
[satune.git] / src / Tuner / multituner.h
1 #ifndef MULTITUNER_H
2 #define MULTITUNER_H
3 #include "classlist.h"
4 #include "structs.h"
5
6 #define AUTOTUNERFACTOR 0.3
7
8 class Problem {
9 public:
10         Problem(const char *problem);
11         char *getProblem() {return problem;}
12         ~Problem();
13         CMEMALLOC;
14 private:
15         int problemnumber;
16         int result;
17         char *problem;
18         long long besttime;
19         friend class MultiTuner;
20 };
21
22 class TunerRecord {
23 public:
24         TunerRecord(SearchTuner *_tuner) : tuner(_tuner), tunernumber(-1) {}
25         TunerRecord(SearchTuner *_tuner, int _tunernumber) : tuner(_tuner), tunernumber(_tunernumber) {}
26         SearchTuner *getTuner() {return tuner;}
27         TunerRecord *changeTuner(SearchTuner *_newtuner);
28         void updateTuner(SearchTuner *_newtuner) {tuner = _newtuner;}
29         long long getTime(Problem *problem);
30         void setTime(Problem *problem, long long time);
31         void print();
32 private:
33         SearchTuner *tuner;
34         Vector<Problem *> problems;
35         Hashtable<Problem *, long long, uint64_t> timetaken;
36         int tunernumber;
37         friend class MultiTuner;
38         friend void clearVector(Vector<TunerRecord *> *tunerV);
39 };
40
41 class MultiTuner {
42 public:
43         MultiTuner(uint budget, uint rounds, uint timeout);
44         ~MultiTuner();
45         void addProblem(const char *filename);
46         void addTuner(SearchTuner *tuner);
47         void readData(uint numRuns);
48         void updateTimeout(Problem *problem, long long metric);
49         void tuneK();
50         void tuneComp();
51         void printData();
52         void findBestThreeTuners();
53         CMEMALLOC;
54 protected:
55         long long evaluate(Problem *problem, TunerRecord *tuner);
56         double evaluateAll(TunerRecord *tuner);
57         SearchTuner *mutateTuner(SearchTuner *oldTuner, uint k);
58         bool hasExplored(SearchTuner *newTuner);
59         void mapProblemsToTuners(Vector<TunerRecord *> *tunerV);
60         void improveTuners(Vector<TunerRecord *> *tunerV);
61         TunerRecord *tune(TunerRecord *tuner);
62         Vector<TunerRecord *> allTuners;
63         Vector<TunerRecord *> explored;
64         Vector<Problem *> problems;
65         Vector<TunerRecord *> tuners;
66         uint budget;
67         uint rounds;
68         uint timeout;
69         int execnum;
70 };
71
72 inline long long min(long long num1, long long num2, long long num3) {
73         return num1 < num2 && num1 < num3 ? num1 :
74                                  num2 < num3 ? num2 : num3;
75 }
76
77 #endif