Fixed some problems. Now a default set of parameters is assumed if no specialized...
authorIsaac Dooley <idooley2@illinois.edu>
Mon, 21 May 2007 21:46:20 +0000 (21:46 +0000)
committerIsaac Dooley <idooley2@illinois.edu>
Mon, 21 May 2007 21:46:20 +0000 (21:46 +0000)
examples/bigsim/tools/rewritelog/EventInterpolator.C
examples/bigsim/tools/rewritelog/EventInterpolator.h
examples/bigsim/tools/rewritelog/Makefile

index c96760bd336137d17b61120dc271ef30aaab1901..b1316a6a3320be61d1d5ce6e15b2002572cd753f 100644 (file)
@@ -42,15 +42,6 @@ multimap<T,T2> random_select_multimap(multimap<T,T2> input_map , int count){
     return output_map;
 }
 
-int EventInterpolator::numCoefficients(const string &funcname){
-// We create a dummy input stringstream and pass it to parseParameters.
-// Then we count how many parameters that function creates
-    string temp("0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0");
-    istringstream temp2(temp);
-    return parseParameters(funcname,temp2).second.size();
-}
-
-
 int distance(int i1, int i2, int i3, int i4, int i5, int i6){
     int x1 =(abs(13+i1-i4)%13)*4;
     int x2 =(abs(13+i4-i1)%13)*4;
@@ -83,8 +74,35 @@ string parseStreamUntilSquiggle(istream &in){
 }
 
 
+/** Record the number of parameters for the given type of event. Subsequent invocation for the same function identifier will fail if num_params doesn't match the recorded value from the first invocation  */
+void EventInterpolator::recordNumCoefficients(const string &f, int c){
+    // find existing entry and verify it matches
+    if(number_of_coefficients.find(f) != number_of_coefficients.end()){
+        if(number_of_coefficients[f] != c){
+            cerr << "Number of coefficients for function " << f << " is not consistent" << endl;
+            exit(-5);
+        }
+    } else {
+        // create if no entry was found
+        number_of_coefficients[f] = c;
+    }
+}
+
+
+int EventInterpolator::numCoefficients(const string &funcname){
+     if(number_of_coefficients.find(funcname) == number_of_coefficients.end()){
+            cerr << "Number of coefficients looked up before it was set." << endl;
+            exit(-5);
+    }
+    int num = number_of_coefficients[funcname];
+    return num;
+}
+
+/** First parameter is a category or subclass for a particular timed region. For example, we wish to consider computation for adjacent patches differently than patches that are neighbors of adjacent patches. This allows a single timed region to be broken out and treated as a number of different cases.
+
+@note The use should modify this function to incorporate better models of the interpolation function basis
 
-/** First parameter is a category or subclass for a particular timed region. For example, we wish to consider computation for adjacent patches differently than patches that are neighbors of adjacent patches. This allows a single timed region to be broken out and treated as a number of different cases. */
+*/
 pair<int,vector<double> > EventInterpolator::parseParameters(const string &funcname, istringstream &line){
     vector<double> params;
     int category=0;
@@ -113,29 +131,23 @@ pair<int,vector<double> > EventInterpolator::parseParameters(const string &funcn
         params.push_back( min(d1,d2)*d1*d2 );
         params.push_back( d1*d2 );
 
-        category = distance(d9,d10,d11,d12,d13,d14);
+        category = distance((int)d9,(int)d10,(int)d11,(int)d12,(int)d13,(int)d14);
 
     }
-    else if(funcname == string("angles") || funcname == string("dihedrals")){
-        double d1, d2;
-        line >> d1 >> d2;
-        params.push_back( 1.0);
-        params.push_back( d2 );
-        params.push_back( d2*d2 );
-    }
-    else if(funcname == string("integrate")){
-        double d1, d2, d3, d4, d5, d6, d7, d8;
-        line >> d1 >> d2 >> d3 >> d4 >> d5 >> d6 >> d7 >> d8;
-
+    else { /** @note default model is quadratic in each variable */
+        double d;
+        int count=0;
         params.push_back( 1.0);
-        params.push_back( d2 );
-        params.push_back( d2*d2 );
-    }
-    else {
-        cerr << "FATAL ERROR: Don't know how to read parameters for function " << funcname << endl;
-        throw new runtime_error("unknown function");
+        while(line.good()){
+            line >> d;
+            if(line.good()){
+                params.push_back(d);
+                params.push_back(d*d);
+                count++;
+            }
+        }
     }
-
+    recordNumCoefficients(funcname,params.size());
     return make_pair(category,params);
 }
 
index 4b170f5deac104a1c6ef430c8daff4efdde20a69..207ba34b9502afc382da805326c1446fa8c6ccb1 100644 (file)
@@ -50,9 +50,11 @@ private:
     map<funcIdentifier, gsl_vector *>y;  // vector of cycle accurate times for each input parameter set
 
     map<pair<unsigned,unsigned>,pair<funcIdentifier,vector<double> > > eventparams;
+    map<string, int> number_of_coefficients; // records the number of coefficients
     timings_type accurateTimings;
 
 
+
     bool canInterpolateFunc(const funcIdentifier& name);
 
     map<funcIdentifier,double> min_interpolated_time;
@@ -105,6 +107,7 @@ public:
     double get_chisqr(funcIdentifier funcname){if(work[funcname]!=NULL) return chisqr[funcname]; else return -1.0;}
 
     int numCoefficients(const string &funcname);
+    void recordNumCoefficients(const string &f, int num_params);
     fullParams parseParameters(const string &funcname, istringstream &param_stream);
 
     void printMinInterpolatedTimes();
index 2c7d793e8486dd9fb48a345aa764259174222012..95f37d11548c2e56498e8801aeb09460fbbcce64 100644 (file)
@@ -18,9 +18,12 @@ rewritelog: rewritelog.o
 rewritelog.o: rewritelog.C
        $(CHARMC) -seq -c rewritelog.C
 
+docs: 
+       doxygen Doxyfile
+
 clean:
        rm -f *.o *~ moduleinit.C charmrun conv-host rewritelog
-       rm -rf *.decl.h *.def.h core *.log newtraces interpolatelog
+       rm -rf *.decl.h *.def.h core *.log newtraces interpolatelog html latex xml
 
 test: rewritelog
        ./rewritelog < sample-input