source: GTP/trunk/Lib/Vis/shared/EvalStats/EvalStats.cpp @ 670

Revision 670, 4.1 KB checked in by mattausch, 19 years ago (diff)
RevLine 
[656]1// EvalStats.cpp : Defines the entry point for the console application.
2//
3#include "stdafx.h"
4
5#include <string>
6#include <vector>
7#include <istream>
8#include <iostream>
9#include <fstream>
10
11
12using namespace std;
13
[667]14/** This is a small function which takes two log files and computes the
15        difference in percent of the weighted render cost.
16*/
[668]17
18
19struct RenderStats
[656]20{
[668]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)
33{
[656]34        if (!file.is_open())
35                return false;
36               
37        string buf;
38
[668]39        int currentTag = NO_TAG;
40       
[656]41        while (!(getline(file, buf)).eof())
42        {
[668]43                //cout << "buf: " << buf << endl;
44
[656]45                if (buf[0] == '#')
46                {
47                        char entry[50];
48
49                        sscanf(buf.c_str(), "#%s", entry);
50                       
[668]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                        }
[656]65                }
[668]66                else
[656]67                {
[668]68                        float val;
69                        sscanf(buf.c_str(), "%f", &val);
[656]70                       
[668]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;
[656]86                }
87        }
88
89        return true;
90}
91
[668]92
93
94void ComputeStats(ofstream &statsOut,
95                                  const RenderStats &firstStats,
96                                  const RenderStats &currentStats,
97                                  const int index)
98{
[670]99        float denom = firstStats.mRenderCost ? firstStats.mRenderCost : 0.000001f;
100        float costRatio = currentStats.mRenderCost / denom;
[668]101                       
102        denom = firstStats.mAvgRenderCost ? firstStats.mAvgRenderCost : 0.000001f;
[670]103        float avgCostRatio = currentStats.mAvgRenderCost / denom;
[668]104
105        statsOut << "#ViewCells\n" << index + 1 << endl
[670]106                         //<< "#TotalRenderCostGain\n" << 100.0f - costRatio * 100.0f << endl
107                         //<< "#AvgRenderCostGain\n" << 100.0f - avgCostRatio * 100.0f << endl << endl;
108                         << "#TotalRenderCostGain\n" << 100.0f * costRatio - 100.0f<< endl
109                         << "#AvgRenderCostGain\n" << 100.0f * avgCostRatio -100.0f << endl << endl;
[668]110}
111
112
113
[656]114int _tmain(int argc, _TCHAR* argv[])
115{
[668]116        vector<StatsContainer> renderStats;
[656]117       
[668]118        if (argc < 3)
[667]119        {
[668]120                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl;
[667]121                exit(1);
122        }
123
[668]124        vector<string> outFilenames;
[667]125
[668]126        // read input files from command line
127        for (int i = 1; i < argc; ++ i)
128        {
129                StatsContainer currentStats;
130     
131                ifstream file(argv[i]);
[667]132
[668]133                // extract the render cost
134                cout << "extracting render cost of file " << argv[i] << endl;
135                cout.flush();
[656]136
[668]137                extractRenderStats(file, currentStats);
138                renderStats.push_back(currentStats);
[656]139
[668]140                // create output file name
141                string fn = argv[i];
142               
143                string::size_type pos = fn.find(".log", 0);
144                fn.erase(pos, 4);
145                //sscanf(argv[i], "%s.log", fn);
146                string outFilename = string(fn) + string("-ratio.log");
[656]147
[668]148                outFilenames.push_back(outFilename);
149        }
[667]150
[668]151        //statsOut << "rc1 size: " << (int)renderCosts1.size() << " " << (int)renderCosts2.size() << endl << endl;
152        vector<StatsContainer>::const_iterator it = renderStats.begin(), it_end = renderStats.end();
153        vector<string>::const_iterator sit, sit_end = outFilenames.end();
[667]154
[668]155        sit = outFilenames.begin();
[656]156       
[668]157        // compare all values with this vector
158        StatsContainer &firstStats = renderStats[0];
[656]159
[668]160        // don't compare with itself
161        ++ it;
162        ++ sit;
163
164        for (it; it != it_end; ++ it)
[656]165        {
[668]166                cout << "writing output to file " << *sit << endl;
167                ofstream statsOut((*sit).c_str());
168                ++ sit;
169
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                }
[670]177               
[668]178                statsOut.close();
[656]179        }
180
181        return 0;
182}
183
Note: See TracBrowser for help on using the repository browser.