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

Revision 675, 4.7 KB checked in by mattausch, 18 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                         << "#TotalRenderCostRatio\n" << costRatio << endl
109                         << "#AvgRenderCostRatio\n" << avgCostRatio << endl << endl;
110}
111
112
113int ComputeNoViewCells(const StatsContainer &firstStats,
114                                           const StatsContainer &currentStats)
115{
116        const int n = min((int)firstStats.size(), (int)currentStats.size());
117
118        const float renderCost = (int)currentStats[n - 1].mRenderCost;
119
120        int i = 0;
121        while ((i ++ < (int)firstStats.size()) && (renderCost > (int)firstStats[i].mRenderCost));
122       
123        return i;
124}
125
126
127int _tmain(int argc, _TCHAR* argv[])
128{
129        vector<StatsContainer> renderStats;
130       
131        if (argc < 3)
132        {
133                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl;
134                exit(1);
135        }
136
137        vector<string> outFilenames;
138
139        // read input files from command line
140        for (int i = 1; i < argc; ++ i)
141        {
142                StatsContainer currentStats;
143     
144                ifstream file;
145                file.open(argv[i]);
146
147                // extract the render cost
148                cout << "extracting render cost of file " << argv[i] << endl;
149       
150                if (extractRenderStats(file, currentStats))
151                {
152                        renderStats.push_back(currentStats);
153
154                        // create output file name
155                        string fn = argv[i];
156               
157                        string::size_type pos = fn.find(".log", 0);
158                        fn.erase(pos, 4);
159                        //sscanf(argv[i], "%s.log", fn);
160                        string outFilename = string(fn) + string("-ratio.log");
161
162                        outFilenames.push_back(outFilename);
163                }
164                else
165                {
166                        cout << "could not open file!" << endl;
167                }
168        }
169
170        //statsOut << "rc1 size: " << (int)renderCosts1.size() << " " << (int)renderCosts2.size() << endl << endl;
171        vector<StatsContainer>::const_iterator it = renderStats.begin(), it_end = renderStats.end();
172        vector<string>::const_iterator sit, sit_end = outFilenames.end();
173
174        sit = outFilenames.begin();
175       
176        // compare all values with this vector
177        StatsContainer &firstStats = renderStats[0];
178
179        // don't compare with itself
180        //++ it;
181        //++ sit;
182
183        for (it; it != it_end; ++ it)
184        {
185                cout << "now writing output to file " << *sit << endl;
186                ofstream statsOut;
187                statsOut.open((*sit).c_str());
188
189                // compute size of output vector
190                const int n = min((int)firstStats.size(), (int)(*it).size());
191       
192                for (int i = 0; i < n; ++ i)
193                {
194                        ComputeStats(statsOut, firstStats[i], (*it)[i], i);
195                }
196               
197                int vc = ComputeNoViewCells(firstStats, *it);
198                cout << "need " << vc << " view cells to reach rendercost of method " << i << " with " << n << " view cells" << endl;
199
200                statsOut.close();
201               
202                ++ sit;
203        }
204
205        return 0;
206}
207
Note: See TracBrowser for help on using the repository browser.