ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/pmapdiag.c
Revision: 2.8
Committed: Fri Mar 26 23:47:03 2021 UTC (3 years, 2 months ago) by rschregle
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 2.7: +44 -21 lines
Log Message:
feat(mkpmap): Added ETA to progress reports

File Contents

# User Rev Content
1 greg 2.5 #ifndef lint
2 rschregle 2.8 static const char RCSid[] = "$Id: pmapdiag.c,v 2.7 2016/05/17 17:39:47 rschregle Exp $";
3 greg 2.5 #endif
4 rschregle 2.7
5 greg 2.1 /*
6     ==================================================================
7     Photon map diagnostic output and progress reports
8    
9     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
10     (c) Fraunhofer Institute for Solar Energy Systems,
11 rschregle 2.4 (c) Lucerne University of Applied Sciences and Arts,
12     supported by the Swiss National Science Foundation (SNSF, #147053)
13 greg 2.1 ==================================================================
14    
15 rschregle 2.8 $Id: pmapdiag.c,v 2.7 2016/05/17 17:39:47 rschregle Exp $
16 greg 2.1 */
17    
18    
19    
20 rschregle 2.8 #include "pmap.h"
21 greg 2.1 #include "pmapdiag.h"
22     #include "pmapdata.h"
23     #include "standard.h"
24    
25    
26    
27     time_t repStartTime, repLastTime = 0; /* Time at start & last report */
28     unsigned long repProgress, /* Report progress counter */
29 rschregle 2.7 repComplete, /* Report completion count */
30     repEmitted; /* Num emitted photons */
31 greg 2.1
32    
33     static char* biasCompStats (const PhotonMap *pmap, PhotonMapType type,
34     char *stats)
35     /* Dump bias compensation statistics */
36     {
37     unsigned avgBwidth;
38     float avgErr;
39    
40 rschregle 2.7 stats [0] = '\0';
41    
42 greg 2.1 /* Check if photon map is valid and bias compensated */
43     if (pmap && pmap -> maxGather > pmap -> minGather) {
44     avgBwidth = pmap -> numDensity
45     ? pmap -> totalGathered / pmap -> numDensity : 0,
46     avgErr = pmap -> numDensity
47     ? sqrt(pmap -> rmsError / pmap -> numDensity) : 0;
48    
49 rschregle 2.7 sprintf(stats, "%d/%d/%d %s photon bwidth (%.1f/%.1f/%.1f%% error), ",
50 greg 2.1 pmap -> minGathered, pmap -> maxGathered, avgBwidth,
51     pmapName [type],
52     100 * pmap -> minError, 100 * pmap -> maxError, 100 * avgErr);
53    
54     return stats;
55     }
56    
57     return NULL;
58     }
59    
60    
61    
62     void pmapBiasCompReport (char *stats)
63     /* Append full bias compensation statistics to stats; interface to rpict's
64     * report() */
65     {
66     char tmp [512];
67     unsigned t;
68    
69     stats [0] = '\0';
70    
71     for (t = 0; t < NUM_PMAP_TYPES; t++)
72     if (biasCompStats(photonMaps [t], t, tmp))
73     strcat(stats, tmp);
74     }
75    
76    
77    
78 rschregle 2.7 #ifdef PMAP_OOC
79     static char* oocCacheStats (const PhotonMap *pmap, PhotonMapType type,
80     char *stats)
81     /* Dump OOC I/O cache statistics */
82     {
83     const OOC_Cache *cache;
84     stats [0] = '\0';
85    
86    
87     /* Check for photon map is valid and caching enabled */
88     if (pmap && (cache = pmap -> store.cache) && cache -> numReads) {
89     sprintf(stats, "%ld %s photons cached in %d/%d pages "
90     "(%.1f%% hit, %.1f%% rept, %.1f coll), ",
91     (unsigned long)cache -> pageCnt * cache -> recPerPage,
92     pmapName [type], cache -> pageCnt, cache -> numPages,
93     100.0 * cache -> numHits / cache -> numReads,
94     100.0 * cache -> numRept / cache -> numReads,
95     (float)cache -> numColl / cache -> numReads);
96    
97     return stats;
98     }
99    
100     return NULL;
101     }
102    
103    
104    
105     void pmapOOCCacheReport (char *stats)
106     /* Append full OOC I/O cache statistics to stats; interface to rpict's
107     * report() */
108     {
109     char tmp [512];
110     unsigned t;
111    
112     stats [0] = '\0';
113    
114     for (t = 0; t < NUM_PMAP_TYPES; t++)
115     if (oocCacheStats(photonMaps [t], t, tmp))
116     strcat(stats, tmp);
117     }
118     #endif
119    
120    
121    
122 greg 2.1 #ifndef NON_POSIX
123     void pmapPreCompReport()
124     /* Report global photon precomputation progress */
125     {
126     extern char *myhostname();
127 rschregle 2.8 float u, s, rtime, eta, progress;
128 greg 2.1 char tmp [512];
129    
130     #ifdef BSD
131     struct rusage rubuf;
132     #else
133     struct tms tbuf;
134     float period;
135     #endif
136    
137     repLastTime = time(NULL);
138    
139     #ifdef BSD
140     getrusage(RUSAGE_SELF, &rubuf);
141     u = rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
142     s = rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
143     getrusage(RUSAGE_CHILDREN, &rubuf);
144     u += rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
145     s += rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
146     #else
147     times(&tbuf);
148    
149     #ifdef _SC_CLK_TCK
150     period = 1.0 / sysconf(_SC_CLK_TCK);
151     #else
152     period = 1.0 / 60;
153     #endif
154    
155     u = (tbuf.tms_utime + tbuf.tms_cutime) * period;
156     s = (tbuf.tms_stime + tbuf.tms_cstime) * period;
157     #endif
158    
159     sprintf(errmsg, "%lu precomputed, ", repProgress);
160    
161     /* Append bias compensation stats */
162     biasCompStats(preCompPmap, PMAP_TYPE_PRECOMP, tmp);
163     strcat(errmsg, tmp);
164 rschregle 2.8
165     rtime = (repLastTime - repStartTime) / 3600.0;
166     progress = (float)repProgress / repComplete;
167     eta = max(0, rtime * (progress > FTINY ? 1 / progress - 1 : 0));
168    
169     sprintf(
170     tmp, "%4.2f%% after %.3fu %.3fs %.3fr hours on %s, ETA=%.3fh\n",
171     100 * progress, u / 3600, s / 3600, rtime, myhostname(), eta
172     );
173 greg 2.1 strcat(errmsg, tmp);
174    
175     eputs(errmsg);
176     fflush(stderr);
177    
178 rschregle 2.3 #ifdef SIGCONT
179 greg 2.1 signal(SIGCONT, pmapPreCompReport);
180     #endif
181     }
182    
183    
184    
185     void pmapDistribReport()
186     /* Report photon distribution progress */
187     {
188     extern char *myhostname();
189 rschregle 2.8 float u, s, rtime, eta, progress;
190 greg 2.1 unsigned t;
191     char tmp [512];
192    
193     #ifdef BSD
194     struct rusage rubuf;
195     #else
196     struct tms tbuf;
197     float period;
198     #endif
199    
200     repLastTime = time(NULL);
201    
202     #ifdef BSD
203     getrusage(RUSAGE_SELF, &rubuf);
204     u = rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
205     s = rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
206     getrusage(RUSAGE_CHILDREN, &rubuf);
207     u += rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
208     s += rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
209     #else
210     times(&tbuf);
211    
212     #ifdef _SC_CLK_TCK
213     period = 1.0 / sysconf(_SC_CLK_TCK);
214     #else
215     period = 1.0 / 60;
216     #endif
217    
218     u = (tbuf.tms_utime + tbuf.tms_cutime) * period;
219     s = (tbuf.tms_stime + tbuf.tms_cstime) * period;
220     #endif
221    
222 rschregle 2.7 sprintf(errmsg, "%lu emitted, ", repEmitted);
223 greg 2.1
224     for (t = 0; t < NUM_PMAP_TYPES; t++)
225     if (photonMaps [t]) {
226 rschregle 2.7 sprintf(tmp, "%lu %s, ", photonMaps [t] -> numPhotons,
227     pmapName [t]);
228 greg 2.1 strcat(errmsg, tmp);
229     }
230    
231 rschregle 2.8 rtime = (repLastTime - repStartTime) / 3600.0;
232     progress = (float)repProgress / repComplete;
233     eta = max(0, rtime * (progress > FTINY ? 1 / progress - 1 : 0));
234    
235     sprintf(
236     tmp, "%4.2f%% after %.3fu %.3fs %.3fr hours on %s, ETA=%.3fh\n",
237     100 * progress, u / 3600, s / 3600, rtime, myhostname(), eta
238     );
239    
240 greg 2.1 strcat(errmsg, tmp);
241     eputs(errmsg);
242     fflush(stderr);
243    
244 rschregle 2.3 #ifndef SIGCONT
245 greg 2.1 signal(SIGCONT, pmapDistribReport);
246     #endif
247     }
248    
249     #else /* POSIX */
250    
251     void pmapPreCompReport()
252     /* Report global photon precomputation progress */
253     {
254 rschregle 2.8 char tmp [512];
255     float rtime, progress, eta;
256 greg 2.2
257 greg 2.1 repLastTime = time(NULL);
258     sprintf(errmsg, "%lu precomputed, ", repProgress);
259    
260     /* Append bias compensation stats */
261     biasCompStats(preCompPmap, PMAP_TYPE_PRECOMP, tmp);
262     strcat(errmsg, tmp);
263    
264 rschregle 2.8 rtime = (repLastTime - repStartTime) / 3600.0;
265     progress = (float)repProgress / repComplete;
266     eta = max(0, rtime * (progress > FTINY ? 1 / progress - 1 : 0));
267    
268     sprintf(
269     tmp, "%4.2f%% after %5.4f hours, ETA=%.3fh\n",
270     100 * progress, rtime, eta
271     );
272 greg 2.1 strcat(errmsg, tmp);
273    
274     eputs(errmsg);
275     fflush(stderr);
276     }
277    
278    
279    
280     void pmapDistribReport()
281     /* Report photon distribution progress */
282     {
283 rschregle 2.8 char tmp [512];
284 greg 2.1 unsigned t;
285 rschregle 2.8 float rtime, progress, eta;
286 greg 2.1
287     repLastTime = time(NULL);
288 rschregle 2.7 sprintf(errmsg, "%lu emitted, ", repEmitted);
289 greg 2.1
290     for (t = 0; t < NUM_PMAP_TYPES; t++)
291     if (photonMaps [t]) {
292 rschregle 2.7 sprintf(tmp, "%lu %s, ", photonMaps [t] -> numPhotons,
293     pmapName [t]);
294 greg 2.1 strcat(errmsg, tmp);
295     }
296 rschregle 2.8
297     rtime = (repLastTime - repStartTime) / 3600.0;
298     progress = (float)repProgress / repComplete;
299     eta = max(0, rtime * (progress > FTINY ? 1 / progress - 1 : 0));
300    
301     sprintf(
302     tmp, "%4.2f%% after %5.4f hours, ETA=%.3fh\n",
303     100 * progress, rtime, eta
304     );
305 greg 2.1 strcat(errmsg, tmp);
306    
307     eputs(errmsg);
308     fflush(stderr);
309     }
310     #endif
311    
312    
313