Ignore:
Timestamp:
03/01/06 18:30:23 (19 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/shared/EvalStats/EvalStats.cpp

    r667 r668  
    1515        difference in percent of the weighted render cost. 
    1616*/ 
    17 bool extractRenderCost(ifstream &file, vector<float> &renderCosts) 
     17 
     18 
     19struct RenderStats  
     20{ 
     21        float mRenderCost; 
     22        float mAvgRenderCost; 
     23}; 
     24 
     25 
     26typedef vector<RenderStats> StatsContainer; 
     27 
     28 
     29enum {NO_TAG, RENDER_COST, AVG_RENDER_COST}; 
     30 
     31 
     32bool extractRenderStats(ifstream &file, StatsContainer &renderStats) 
    1833{ 
    1934        if (!file.is_open()) 
     
    2136                 
    2237        string buf; 
    23         bool isRenderCost = false; 
    2438 
     39        int currentTag = NO_TAG; 
     40         
    2541        while (!(getline(file, buf)).eof()) 
    2642        { 
     43                //cout << "buf: " << buf << endl; 
     44 
    2745                if (buf[0] == '#') 
    2846                { 
     
    3149                        sscanf(buf.c_str(), "#%s", entry); 
    3250                         
    33                         if (strcmp(entry, "TotalRenderCost") == 0) 
    34                                 isRenderCost = true; 
     51                        // new entry 
     52                        if (strcmp(entry, "Pass") == 0) 
     53                        { 
     54                                //cout << "\nnew render stat " << endl; 
     55                                renderStats.push_back(RenderStats()); 
     56                        } 
     57                        else if (strcmp(entry, "TotalRenderCost") == 0) 
     58                        { 
     59                                currentTag = RENDER_COST; 
     60                        } 
     61                        else if (strcmp(entry, "AvgRenderCost") == 0) 
     62                        { 
     63                                currentTag = AVG_RENDER_COST; 
     64                        } 
    3565                } 
    36                 else if (isRenderCost) 
     66                else 
    3767                { 
    38                         float rc; 
    39                         sscanf(buf.c_str(), "%f", &rc); 
     68                        float val; 
     69                        sscanf(buf.c_str(), "%f", &val); 
    4070                         
    41                         renderCosts.push_back(rc); 
    42                         isRenderCost = false; 
     71                        switch (currentTag) 
     72                        { 
     73                        case RENDER_COST: 
     74                                //cout << "render cost: " << val << endl; 
     75                renderStats.back().mRenderCost = val; 
     76                                break; 
     77                        case AVG_RENDER_COST: 
     78                                //cout << "avg render cost: " << val << endl; 
     79                                renderStats.back().mAvgRenderCost = val; 
     80                                break; 
     81                        default: 
     82                                break; 
     83                        } 
     84                         
     85                        currentTag = NO_TAG; 
    4386                } 
    4487        } 
     
    4790} 
    4891 
     92 
     93 
     94void ComputeStats(ofstream &statsOut,  
     95                                  const RenderStats &firstStats,  
     96                                  const RenderStats &currentStats,  
     97                                  const int index) 
     98{ 
     99        float denom = currentStats.mRenderCost ? currentStats.mRenderCost : 0.000001f; 
     100        float costRatio = firstStats.mRenderCost / denom; 
     101                         
     102        denom = firstStats.mAvgRenderCost ? firstStats.mAvgRenderCost : 0.000001f; 
     103        float avgCostRatio = firstStats.mAvgRenderCost / denom; 
     104 
     105        statsOut << "#ViewCells\n" << index + 1 << endl 
     106                         << "#TotalRenderCostGain\n" << 100.0f - costRatio * 100.0f << endl 
     107                         << "#AvgRenderCostGain\n" << 100.0f - avgCostRatio * 100.0f << endl << endl; 
     108} 
     109 
     110 
     111 
    49112int _tmain(int argc, _TCHAR* argv[]) 
    50113{ 
    51         vector<float> renderCosts1; 
    52         vector<float> renderCosts2; 
     114        vector<StatsContainer> renderStats; 
    53115         
    54         if (argc < 4) 
     116        if (argc < 3) 
    55117        { 
    56                 cerr << "arguments missing" << endl; 
     118                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl; 
    57119                exit(1); 
    58120        } 
    59121 
     122        vector<string> outFilenames; 
    60123 
    61         // read two files and the output file 
     124        // read input files from command line 
     125        for (int i = 1; i < argc; ++ i) 
     126        { 
     127                StatsContainer currentStats; 
     128       
     129                ifstream file(argv[i]); 
    62130 
    63         // read file 1 
    64         ifstream file1(argv[1]); 
     131                // extract the render cost 
     132                cout << "extracting render cost of file " << argv[i] << endl; 
     133                cout.flush(); 
    65134 
    66         // extract the render cost 
    67         cout << "extracting render cost of file " << argv[1] << endl; 
    68         cout.flush(); 
    69         extractRenderCost(file1, renderCosts1); 
     135                extractRenderStats(file, currentStats); 
     136                renderStats.push_back(currentStats); 
    70137 
    71         // read file 2 
    72     ifstream file2(argv[2]); 
    73         cout << "extracting render cost of file " << argv[2] << endl; 
    74         cout.flush(); 
    75         extractRenderCost(file2, renderCosts2); 
     138                // create output file name 
     139                string fn = argv[i]; 
     140                 
     141                string::size_type pos = fn.find(".log", 0); 
     142                fn.erase(pos, 4); 
     143                //sscanf(argv[i], "%s.log", fn); 
     144                string outFilename = string(fn) + string("-ratio.log"); 
    76145 
    77  
    78         cout << "writing output to file " << argv[3] << endl; 
    79  
    80         ofstream statsOut(argv[3]); 
     146                outFilenames.push_back(outFilename); 
     147        } 
    81148 
    82149        //statsOut << "rc1 size: " << (int)renderCosts1.size() << " " << (int)renderCosts2.size() << endl << endl; 
    83         int n = min((int)renderCosts1.size(), (int)renderCosts2.size()); 
     150        vector<StatsContainer>::const_iterator it = renderStats.begin(), it_end = renderStats.end(); 
     151        vector<string>::const_iterator sit, sit_end = outFilenames.end(); 
     152 
     153        sit = outFilenames.begin(); 
    84154         
    85         if (argc > 4) 
     155        // compare all values with this vector 
     156        StatsContainer &firstStats = renderStats[0]; 
     157 
     158        // don't compare with itself 
     159        ++ it; 
     160        ++ sit; 
     161 
     162        for (it; it != it_end; ++ it) 
    86163        { 
    87                 char *endptr = NULL; 
    88                          
    89                 int limit = strtol(argv[4], &endptr, 10); 
    90                  
    91                 n = min(n, limit); 
    92         } 
     164                cout << "writing output to file " << *sit << endl; 
    93165 
    94         for (int i = 0; i < n; ++ i) 
    95         { 
    96                 float costRatio = renderCosts2[i] != 0 ?  
    97                         renderCosts1[i] / renderCosts2[i] : renderCosts1[i] / 0.0000001f; 
     166                ofstream statsOut((*sit).c_str()); 
     167                ++ sit; 
    98168 
    99                 statsOut << "#ViewCells\n" << i + 1 << endl 
    100                                  << "#RenderCostRatio\n" << costRatio * 100.0f << endl; 
     169                cout << "size here" << (*it).size() << endl; 
     170                // compute size of output vector 
     171                const int n = min((int)firstStats.size(), (int)(*it).size()); 
     172         
     173                for (int i = 0; i < n; ++ i) 
     174                { 
     175                        ComputeStats(statsOut, firstStats[i], (*it)[i], i); 
     176                } 
     177                cout << "here2 " << n << endl; 
     178                statsOut.close(); 
    101179        } 
    102180 
Note: See TracChangeset for help on using the changeset viewer.