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

Revision 668, 4.0 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 = 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
112int _tmain(int argc, _TCHAR* argv[])
113{
114        vector<StatsContainer> renderStats;
115       
116        if (argc < 3)
117        {
118                cerr << "arguments missing. Usage: input1 input2 ... intputn" << endl;
119                exit(1);
120        }
121
122        vector<string> outFilenames;
123
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]);
130
131                // extract the render cost
132                cout << "extracting render cost of file " << argv[i] << endl;
133                cout.flush();
134
135                extractRenderStats(file, currentStats);
136                renderStats.push_back(currentStats);
137
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");
145
146                outFilenames.push_back(outFilename);
147        }
148
149        //statsOut << "rc1 size: " << (int)renderCosts1.size() << " " << (int)renderCosts2.size() << endl << endl;
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();
154       
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)
163        {
164                cout << "writing output to file " << *sit << endl;
165
166                ofstream statsOut((*sit).c_str());
167                ++ sit;
168
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();
179        }
180
181        return 0;
182}
183
Note: See TracBrowser for help on using the repository browser.