195a5e4ed2d07973e02c7bcebae509487cc5381e
[charm.git] / examples / bigsim / tools / rewritelog / EventInterpolator.h
1
2 #include <gsl/gsl_multifit.h>
3 #include <iostream>
4 #include <fstream>
5 #include <string>
6 #include <sstream>
7 #include <cassert>
8 #include <stdexcept>
9
10 #include <map>
11 #include <string>
12 #include <utility> // for std::pair
13 #include <vector>
14
15
16 using namespace std;
17
18
19
20 /**
21  @class A class for wrapping the least-square fitting portions of gsl.
22
23   Construct one of these with a filename and it will read in the file
24   containing a table of parameters and associated timings(as produced by somthing like a cycle accurate simulator).
25
26   Pass in a desired set of parameters to predictTime() to get a predicted time by evaluating the interpolating function at the given parameter vector.
27
28 */
29
30 typedef pair<string,int> funcIdentifier;
31 typedef pair<int,vector<double> > fullParams;
32
33 class EventInterpolator{
34 private:
35   ofstream log1;
36
37     // For each interpolatable function we record things in these maps:
38
39     map<funcIdentifier, unsigned long> sample_count;
40     map<funcIdentifier, gsl_multifit_linear_workspace *> work;
41     map<funcIdentifier, gsl_vector *> c; // coefficients which are produced by least square fit
42     map<funcIdentifier, gsl_matrix *> cov;
43     map<funcIdentifier, double> chisqr;
44
45     map<funcIdentifier, gsl_matrix *> X;  // Each row of matrix is a set of parameters  [1, a, a^2, b, b^2, a*b] for each input parameter set
46     map<funcIdentifier, unsigned> Xcount;  // Number of entries in X so far
47     map<funcIdentifier, gsl_vector *>y;  // vector of cycle accurate times for each input parameter set
48
49     map<pair<unsigned,unsigned>,pair<funcIdentifier,vector<double> > > eventparams;
50     map< pair<funcIdentifier,vector<double> >, double > accurateTimings;
51
52
53     bool canInterpolateFunc(const funcIdentifier& name);
54
55     map<funcIdentifier,double> min_interpolated_time;
56     map<funcIdentifier,double> max_interpolated_time;
57
58     unsigned exact_matches;
59     unsigned exact_positive_matches;
60     unsigned approx_matches;
61     unsigned approx_positive_matches;
62
63 public:
64
65     double haveNewTiming(const unsigned pe, const unsigned eventid);
66
67     double predictTime(const unsigned pe, const unsigned eventid);
68     double predictTime(const pair<funcIdentifier,vector<double> > &p);
69     double predictTime(const funcIdentifier &name, const vector<double> &params);
70
71     bool haveExactTime(const unsigned pe, const unsigned eventid);
72     bool haveExactTime(const pair<funcIdentifier,vector<double> > &p);
73     bool haveExactTime(const funcIdentifier& name, const vector<double> &p);
74
75     double lookupExactTime(const unsigned pe, const unsigned eventid);
76     double lookupExactTime(const pair<funcIdentifier,vector<double> > &p);
77     double lookupExactTime(const funcIdentifier& name, const vector<double> &p);
78
79         /** Get the new timing exactly if possible otherwise predict it */
80         double getNewTiming(const unsigned pe, const unsigned eventid);
81
82     double get_chisqr(funcIdentifier funcname){if(work[funcname]!=NULL) return chisqr[funcname]; else return -1.0;}
83
84     int numCoefficients(const string &funcname);
85     fullParams parseParameters(const string &funcname, istringstream &param_stream, double &time, const bool log);
86     fullParams parseParameters(const string &funcname, istringstream &param_stream, const bool log);
87
88     void printMinInterpolatedTimes();
89
90     void printCoefficients();
91
92     void printMatches();
93
94
95     EventInterpolator(char *table_filename);
96     ~EventInterpolator();
97
98 };
99
100