source: GTP/trunk/Lib/Vis/Preprocessing/EvalStats/EvalStats.cpp @ 1586

Revision 1586, 7.7 KB checked in by mattausch, 18 years ago (diff)

resolved bug for object space distribution using triangles
fixed biasing bug for mesh::GetRandomSurfacePoint? method and
GetRandomVisibleSurfacePoint?.

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#include <math.h>
11#include <algorithm>
12
13using namespace std;
14
15
16
17/** This is a small function which takes two log files and computes the
18        difference in percent of the weighted render cost.
19*/
20struct RenderStats
21{
22        float mRenderCost;
23        float mAvgRenderCost;
24};
25
26
27typedef vector<RenderStats> StatsContainer;
28
29
30enum {NO_TAG, RENDER_COST, AVG_RENDER_COST};
31
32
33bool extractRenderStats(ifstream &file, StatsContainer &renderStats)
34{
35        if (!file.is_open())
36                return false;
37               
38        string buf;
39
40        int currentTag = NO_TAG;
41
42        while (!(getline(file, buf)).eof())
43        {
44                //cout << "buf: " << buf << endl;
45
46                if (buf[0] == '#')
47                {
48                        char entry[50];
49
50                        sscanf(buf.c_str(), "#%s", entry);
51                       
52                        // new entry
53                        if (strcmp(entry, "Pass") == 0)
54                        {
55                                //cout << "\nnew render stat " << endl;
56                                renderStats.push_back(RenderStats());
57                        }
58                        else if (strcmp(entry, "TotalRenderCost") == 0)
59                        {
60                                currentTag = RENDER_COST;
61                        }
62                        else if (strcmp(entry, "AvgRenderCost") == 0)
63                        {
64                                currentTag = AVG_RENDER_COST;
65                        }
66                }
67                else
68                {
69                        float val;
70                        sscanf(buf.c_str(), "%f", &val);
71                       
72                        switch (currentTag)
73                        {
74                        case RENDER_COST:
75                                //cout << "render cost: " << val << endl;
76                renderStats.back().mRenderCost = val;
77                                break;
78                        case AVG_RENDER_COST:
79                                //cout << "avg render cost: " << val << endl;
80                                renderStats.back().mAvgRenderCost = val;
81                                break;
82                        default:
83                                break;
84                        }
85                       
86                        currentTag = NO_TAG;
87                }
88        }
89
90        return true;
91}
92
93
94
95void ComputeStats(ofstream &statsOut,
96                                  const RenderStats &firstStats,
97                                  const RenderStats &currentStats,
98                                  const int index)
99{
100        float denom = firstStats.mRenderCost ? firstStats.mRenderCost : 0.000001f;
101        float costRatio = currentStats.mRenderCost / denom;
102                       
103        denom = firstStats.mAvgRenderCost ? firstStats.mAvgRenderCost : 0.000001f;
104        float avgCostRatio = currentStats.mAvgRenderCost / denom;
105
106        statsOut << "#ViewCells\n" << index + 1 << endl
107                         << "#TotalRenderCostRatio\n" << costRatio << endl
108                         << "#AvgRenderCostRatio\n" << avgCostRatio << endl << endl;
109}
110
111
112inline bool vlt(const RenderStats &c1, const RenderStats &c2)
113{
114        return c1.mRenderCost > c2.mRenderCost;
115}
116
117
118// evaluate number of view cells needed for same rendercost
119void EvalNumViewCells(ofstream &outstream,
120                                          const StatsContainer &firstStats,
121                                          const StatsContainer &currentStats)
122{
123       
124        const int n = min((int)firstStats.size(), (int)currentStats.size());
125        //const int n = (int)firstStats.size();
126       
127        StatsContainer::const_iterator it, it_end = currentStats.end();
128
129        int i = 0;
130
131        // currentStats would be the other (necessarily worse?) method, firstStats would be our method
132        // loop through view cells of currentStats
133        // Compare render cost with render cost of other view cell
134        // compute ratio of view cells
135        for (it = currentStats.begin(); it != it_end; ++ it, ++ i)
136        {
137               
138                const float renderCost = (*it).mRenderCost;
139   
140                // find equivalent render cost in the other stats container.
141                // don't stop until cursor is placed one element behind
142                // or end of vector is reached
143                StatsContainer::const_iterator equalCostIt =
144                        std::upper_bound(firstStats.begin(), firstStats.end(), *it, vlt);
145
146                int j = (int)(equalCostIt - firstStats.begin());
147
148                float val;
149
150                // special cases
151                if (j == 0)
152                {
153                        val = (float)j;
154                }
155                else if (j >= n)
156                {
157                        val = (float)(j - 1);
158                }
159                else
160                // interpolate linearly. NOTE: probably big error because of steep curve
161                // => intepolate logarithmically
162                {
163#if 1
164                        const float rcu = log(firstStats[j - 1].mRenderCost);
165                        const float rcl = log(firstStats[j].mRenderCost);
166                        const float rc = log(renderCost);
167#else
168                        const float rcu = firstStats[j - 1].mRenderCost;
169                        const float rcl = firstStats[j].mRenderCost;
170                        const float rc = renderCost;
171#endif
172                        const float factor = (rcu - rcl != 0) ?
173                                (rcu - rc) / (rcu - rcl) : 1;
174
175                        // view cells needed for same render cost
176                        val = (float)j - 1 + factor;
177                }
178
179                float ratio = (i && val) ? (float)i / val : 1;
180
181                outstream << "#Pass\n" << i << endl;
182                outstream << "#RenderCost\n" << renderCost << endl;
183                outstream << "#ViewCellsRatio\n" << ratio << endl << endl;     
184        }
185}
186
187
188
189
190
191// evaluate number of view cells needed for same rendercost
192int EvalSingleNumViewCells(const StatsContainer &currentStats,
193                                                   const float cost)
194{
195       
196        StatsContainer::const_iterator it, it_end = currentStats.end();
197
198        RenderStats dummy; dummy.mRenderCost = cost;
199       
200        // find equivalent render cost in the other stats container.
201        // don't stop until cursor is placed one element behind
202        // or end of vector is reached
203        StatsContainer::const_iterator equalCostIt = std::upper_bound(currentStats.begin(),currentStats.end(), dummy, vlt);
204
205        int j = (int)(equalCostIt - currentStats.begin());
206
207        return j;
208}
209
210
211
212int _tmain(int argc, _TCHAR* argv[])
213{
214        vector<StatsContainer> renderStats;
215       
216        if (argc < 3)
217        {
218                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl;
219                exit(1);
220        }
221
222        vector<string> outFilenames;
223        vector<string> outFilenames2;
224        vector<string> methodnames;
225        // read input files from command line
226        for (int i = 1; i < argc; ++ i)
227        {
228                StatsContainer currentStats;
229     
230                ifstream file;
231                file.open(argv[i]);
232
233                // extract the render cost
234                cout << "extracting render cost of file " << argv[i] << endl;
235       
236                if (extractRenderStats(file, currentStats))
237                {
238                        renderStats.push_back(currentStats);
239
240                        // create output file name
241                        string fn = argv[i];
242               
243                        string::size_type pos = fn.find(".log", 0);
244                        fn.erase(pos, 4);
245                        //sscanf(argv[i], "%s.log", fn);
246                        string outFilename = string(fn) + string("-ratio.log");
247                        string outFilename2 = string(fn) + string("-reverse.log");
248                       
249                        outFilenames.push_back(outFilename);
250                        outFilenames2.push_back(outFilename2);
251                        methodnames.push_back(fn);
252
253                        cout << "new filen: " << outFilename2 << endl;
254                }
255                else
256                {
257                        cout << "could not open file!" << endl;
258                }
259        }
260
261        //statsOut << "rc1 size: " << (int)renderCosts1.size() << " " << (int)renderCosts2.size() << endl << endl;
262        vector<StatsContainer>::const_iterator it = renderStats.begin(), it_end = renderStats.end();
263
264        vector<string>::const_iterator sit, sit_end = outFilenames.end();
265        vector<string>::const_iterator sit2, sit2_end = outFilenames2.end();
266        vector<string>::const_iterator sit3, sit3_end = methodnames.end();
267
268
269        sit = outFilenames.begin();
270        sit2 = outFilenames2.begin();
271        sit3 = methodnames.begin();
272
273        // compare all values with this vector
274        StatsContainer &firstStats = renderStats[0];
275
276        // don't compare with itself
277        //++ it;
278        //++ sit;
279        ofstream statsOut3;
280        statsOut3.open("numviewcells.log");
281
282        for (it; it != it_end; ++ it, ++ sit, ++ sit2, ++sit3)
283        {
284                cout << "now writing output to file " << *sit << endl;
285
286                ofstream statsOut;
287                statsOut.open((*sit).c_str());
288       
289                ofstream statsOut2;
290                statsOut2.open((*sit2).c_str());
291
292                cout << "opening new file: " << (*sit2).c_str() << endl;
293                // compute size of output vector
294                const int n = min((int)firstStats.size(), (int)(*it).size());
295       
296                for (int i = 0; i < n; ++ i)
297                {
298                        //cout << "rc: " << (*it)[i].mRenderCost << endl;
299                        ComputeStats(statsOut, firstStats[i], (*it)[i], i);
300                }
301
302                // evaluate number of view cells needed for same rendercost
303                EvalNumViewCells(statsOut2, firstStats, (*it));
304
305                const float rendercost = 100;
306                const int j = EvalSingleNumViewCells(*it, rendercost);
307
308                statsOut3 << (*sit3).c_str() << " " << j << endl;
309
310                statsOut.close();
311                statsOut2.close();
312        }
313
314        statsOut3.close();
315
316
317
318        return 0;
319}
320
Note: See TracBrowser for help on using the repository browser.