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

Revision 670, 4.1 KB checked in by mattausch, 19 years ago (diff)
Line 
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
14/** This is a small function which takes two log files and computes the
15        difference in percent of the weighted render cost.
16*/
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)
33{
34        if (!file.is_open())
35                return false;
36               
37        string buf;
38
39        int currentTag = NO_TAG;
40       
41        while (!(getline(file, buf)).eof())
42        {
43                //cout << "buf: " << buf << endl;
44
45                if (buf[0] == '#')
46                {
47                        char entry[50];
48
49                        sscanf(buf.c_str(), "#%s", entry);
50                       
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                        }
65                }
66                else
67                {
68                        float val;
69                        sscanf(buf.c_str(), "%f", &val);
70                       
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;
86                }
87        }
88
89        return true;
90}
91
92
93
94void ComputeStats(ofstream &statsOut,
95                                  const RenderStats &firstStats,
96                                  const RenderStats &currentStats,
97                                  const int index)
98{
99        float denom = firstStats.mRenderCost ? firstStats.mRenderCost : 0.000001f;
100        float costRatio = currentStats.mRenderCost / denom;
101                       
102        denom = firstStats.mAvgRenderCost ? firstStats.mAvgRenderCost : 0.000001f;
103        float avgCostRatio = currentStats.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                         << "#TotalRenderCostGain\n" << 100.0f * costRatio - 100.0f<< endl
109                         << "#AvgRenderCostGain\n" << 100.0f * avgCostRatio -100.0f << endl << endl;
110}
111
112
113
114int _tmain(int argc, _TCHAR* argv[])
115{
116        vector<StatsContainer> renderStats;
117       
118        if (argc < 3)
119        {
120                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl;
121                exit(1);
122        }
123
124        vector<string> outFilenames;
125
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]);
132
133                // extract the render cost
134                cout << "extracting render cost of file " << argv[i] << endl;
135                cout.flush();
136
137                extractRenderStats(file, currentStats);
138                renderStats.push_back(currentStats);
139
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");
147
148                outFilenames.push_back(outFilename);
149        }
150
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();
154
155        sit = outFilenames.begin();
156       
157        // compare all values with this vector
158        StatsContainer &firstStats = renderStats[0];
159
160        // don't compare with itself
161        ++ it;
162        ++ sit;
163
164        for (it; it != it_end; ++ it)
165        {
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                }
177               
178                statsOut.close();
179        }
180
181        return 0;
182}
183
Note: See TracBrowser for help on using the repository browser.