base: Make the Value stat's functor method accept lambdas.
[gem5.git] / src / unittest / stattest.cc
1 /*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "pybind11/pybind11.h"
30
31 #include <iomanip>
32 #include <iostream>
33 #include <string>
34
35 #include "base/cprintf.hh"
36 #include "base/logging.hh"
37 #include "base/statistics.hh"
38 #include "base/types.hh"
39 #include "sim/core.hh"
40 #include "sim/init.hh"
41 #include "sim/stat_control.hh"
42
43 namespace py = pybind11;
44
45 // override the default main() code for this unittest
46 const char *m5MainCommands[] = {
47 "import m5.stattestmain",
48 "m5.stattestmain.main()",
49 0 // sentinel is required
50 };
51
52 using namespace std;
53 using namespace Stats;
54
55 double testfunc();
56 struct StatTest;
57 StatTest & __stattest();
58
59
60 double
61 testfunc()
62 {
63 return 9.8;
64 }
65
66 class TestClass {
67 public:
68 double operator()() { return 9.7; }
69 };
70
71 struct StatTest
72 {
73 Scalar s1;
74 Scalar s2;
75 Average s3;
76 Scalar s4;
77 Vector s5;
78 Distribution s6;
79 Vector s7;
80 AverageVector s8;
81 StandardDeviation s9;
82 AverageDeviation s10;
83 Scalar s11;
84 Distribution s12;
85 VectorDistribution s13;
86 VectorStandardDeviation s14;
87 VectorAverageDeviation s15;
88 Vector2d s16;
89 Value s17;
90 Value s18;
91 Value s19;
92 Histogram h01;
93 Histogram h02;
94 Histogram h03;
95 Histogram h04;
96 Histogram h05;
97 Histogram h06;
98 Histogram h07;
99 Histogram h08;
100 Histogram h09;
101 Histogram h10;
102 Histogram h11;
103 Histogram h12;
104 SparseHistogram sh1;
105
106 Vector s20;
107 Vector s21;
108
109 Formula f1;
110 Formula f2;
111 Formula f3;
112 Formula f4;
113 Formula f5;
114 Formula f6;
115
116 void run();
117 void init();
118 };
119
120 StatTest &
121 __stattest()
122 {
123 static StatTest st;
124 return st;
125 }
126
127 void
128 StatTest::init()
129 {
130 EventQueue *q = getEventQueue(0);
131 curEventQueue(q);
132
133 cprintf("sizeof(Scalar) = %d\n", sizeof(Scalar));
134 cprintf("sizeof(Vector) = %d\n", sizeof(Vector));
135 cprintf("sizeof(Distribution) = %d\n", sizeof(Distribution));
136
137 s1
138 .name("Stat01")
139 .desc("this is statistic 1")
140 ;
141
142 s2
143 .name("Stat02")
144 .desc("this is statistic 2")
145 .prereq(s11)
146 ;
147
148 s3
149 .name("Stat03")
150 .desc("this is statistic 3")
151 .prereq(f5)
152 ;
153
154 s4
155 .name("Stat04")
156 .desc("this is statistic 4")
157 .prereq(s11)
158 ;
159
160 s5
161 .init(5)
162 .name("Stat05")
163 .desc("this is statistic 5")
164 .prereq(s11)
165 .subname(0, "foo1")
166 .subname(1, "foo2")
167 .subname(2, "foo3")
168 .subname(3, "foo4")
169 .subname(4, "foo5")
170 ;
171
172 s6
173 .init(1, 100, 13)
174 .name("Stat06")
175 .desc("this is statistic 6")
176 .prereq(s11)
177 ;
178
179 s7
180 .init(7)
181 .name("Stat07")
182 .desc("this is statistic 7")
183 .precision(1)
184 .flags(pdf | total)
185 .prereq(s11)
186 ;
187
188 s8
189 .init(10)
190 .name("Stat08")
191 .desc("this is statistic 8")
192 .precision(2)
193 .prereq(s11)
194 .subname(4, "blarg")
195 ;
196
197 s9
198 .name("Stat09")
199 .desc("this is statistic 9")
200 .precision(4)
201 .prereq(s11)
202 ;
203
204 s10
205 .name("Stat10")
206 .desc("this is statistic 10")
207 .prereq(s11)
208 ;
209
210 s12
211 .init(1, 100, 13)
212 .name("Stat12")
213 .desc("this is statistic 12")
214 ;
215
216 s13
217 .init(4, 0, 99, 10)
218 .name("Stat13")
219 .desc("this is statistic 13")
220 ;
221
222 s14
223 .init(9)
224 .name("Stat14")
225 .desc("this is statistic 14")
226 ;
227
228 s15
229 .init(10)
230 .name("Stat15")
231 .desc("this is statistic 15")
232 ;
233
234 s16
235 .init(2, 9)
236 .name("Stat16")
237 .desc("this is statistic 16")
238 .flags(total)
239 .subname(0, "sub0")
240 .subname(1, "sub1")
241 .ysubname(0, "y0")
242 .ysubname(1, "y1")
243 ;
244
245 s17
246 .functor(testfunc)
247 .name("Stat17")
248 .desc("this is stat 17")
249 ;
250
251 TestClass testclass;
252 s18
253 .functor(testclass)
254 .name("Stat18")
255 .desc("this is stat 18")
256 ;
257
258 s19
259 .functor([]() { return 0; })
260 .name("Stat19")
261 .desc("this is stat 19")
262 ;
263
264 h01
265 .init(11)
266 .name("Histogram01")
267 .desc("this is histogram 1")
268 ;
269
270 h02
271 .init(10)
272 .name("Histogram02")
273 .desc("this is histogram 2")
274 ;
275
276 h03
277 .init(11)
278 .name("Histogram03")
279 .desc("this is histogram 3")
280 ;
281
282 h04
283 .init(10)
284 .name("Histogram04")
285 .desc("this is histogram 4")
286 ;
287
288 h05
289 .init(11)
290 .name("Histogram05")
291 .desc("this is histogram 5")
292 ;
293
294 h06
295 .init(10)
296 .name("Histogram06")
297 .desc("this is histogram 6")
298 ;
299
300 h07
301 .init(11)
302 .name("Histogram07")
303 .desc("this is histogram 7")
304 ;
305
306 h08
307 .init(10)
308 .name("Histogram08")
309 .desc("this is histogram 8")
310 ;
311
312 h09
313 .init(11)
314 .name("Histogram09")
315 .desc("this is histogram 9")
316 ;
317
318 h10
319 .init(10)
320 .name("Histogram10")
321 .desc("this is histogram 10")
322 ;
323
324 h11
325 .init(11)
326 .name("Histogram11")
327 .desc("this is histogram 11")
328 ;
329
330 h12
331 .init(10)
332 .name("Histogram12")
333 .desc("this is histogram 12")
334 ;
335
336 sh1
337 .init(0)
338 .name("SparseHistogram1")
339 .desc("this is sparse histogram 1")
340 ;
341
342 f1
343 .name("Formula1")
344 .desc("this is formula 1")
345 .prereq(s11)
346 ;
347
348 f2
349 .name("Formula2")
350 .desc("this is formula 2")
351 .prereq(s11)
352 .precision(1)
353 ;
354
355 f3
356 .name("Formula3")
357 .desc("this is formula 3")
358 .prereq(s11)
359 .subname(0, "bar1")
360 .subname(1, "bar2")
361 .subname(2, "bar3")
362 .subname(3, "bar4")
363 .subname(4, "bar5")
364 ;
365
366 f4
367 .name("Formula4")
368 .desc("this is formula 4")
369 ;
370
371 s20
372 .init(2)
373 .name("Stat20")
374 .desc("this is statistic 20 for vector op testing")
375 .flags(total | nozero | nonan)
376 ;
377 s21
378 .init(2)
379 .name("Stat21")
380 .desc("this is statistic 21 for vector op testing")
381 .flags(total | nozero | nonan)
382 ;
383
384 f6
385 .name("vector_op_test_formula")
386 .desc("The total stat should equal 1")
387 .flags(total |nozero |nonan)
388 ;
389
390 f1 = s1 + s2;
391 f2 = (-s1) / (-s2) * (-s3 + ULL(100) + s4);
392 f3 = sum(s5) * s7;
393 f4 += constant(10.0);
394 f4 += s5[3];
395 f5 = constant(1);
396 f6 = s20/s21;
397 }
398
399 void
400 StatTest::run()
401 {
402 s16[1][0] = 1;
403 s16[0][1] = 3;
404 s16[0][0] = 2;
405 s16[1][1] = 9;
406 s16[1][1] += 9;
407 s16[1][8] += 8;
408 s16[1][7] += 7;
409 s16[1][6] += 6;
410 s16[1][5] += 5;
411 s16[1][4] += 4;
412
413 s11 = 1;
414 s3 = 9;
415 s8[3] = 9;
416 s15[0].sample(1234);
417 s15[1].sample(1234);
418 s15[2].sample(1234);
419 s15[3].sample(1234);
420 s15[4].sample(1234);
421 s15[5].sample(1234);
422 s15[6].sample(1234);
423 s15[7].sample(1234);
424 s15[8].sample(1234);
425 s15[9].sample(1234);
426
427 s10.sample(1000000000);
428 curEventQueue()->setCurTick(curTick() + ULL(1000000));
429 s10.sample(100000);
430 s10.sample(100000);
431 s10.sample(100000);
432 s10.sample(100000);
433 s10.sample(100000);
434 s10.sample(100000);
435 s10.sample(100000);
436 s10.sample(100000);
437 s10.sample(100000);
438 s10.sample(100000);
439 s10.sample(100000);
440 s10.sample(100000);
441 s10.sample(100000);
442 s13[0].sample(12);
443 s13[1].sample(29);
444 s13[2].sample(12);
445 s13[3].sample(29);
446 s13[0].sample(42);
447 s13[1].sample(29);
448 s13[2].sample(42);
449 s13[3].sample(32);
450 s13[0].sample(52);
451 s13[1].sample(49);
452 s13[2].sample(42);
453 s13[3].sample(25);
454 s13[0].sample(32);
455 s13[1].sample(49);
456 s13[2].sample(22);
457 s13[3].sample(49);
458 s13[0].sample(62);
459 s13[1].sample(99);
460 s13[2].sample(72);
461 s13[3].sample(23);
462 s13[0].sample(52);
463 s13[1].sample(78);
464 s13[2].sample(69);
465 s13[3].sample(49);
466
467 s14[0].sample(1234);
468 s14[1].sample(4134);
469 s14[4].sample(1213);
470 s14[3].sample(1124);
471 s14[2].sample(1243);
472 s14[7].sample(1244);
473 s14[4].sample(7234);
474 s14[2].sample(9234);
475 s14[3].sample(1764);
476 s14[7].sample(1564);
477 s14[3].sample(3234);
478 s14[1].sample(2234);
479 s14[5].sample(1234);
480 s14[2].sample(4334);
481 s14[2].sample(1234);
482 s14[4].sample(4334);
483 s14[6].sample(1234);
484 s14[8].sample(8734);
485 s14[1].sample(5234);
486 s14[3].sample(8234);
487 s14[7].sample(5234);
488 s14[4].sample(4434);
489 s14[3].sample(7234);
490 s14[2].sample(1934);
491 s14[1].sample(9234);
492 s14[5].sample(5634);
493 s14[3].sample(1264);
494 s14[7].sample(5223);
495 s14[0].sample(1234);
496 s14[0].sample(5434);
497 s14[3].sample(8634);
498 s14[1].sample(1234);
499
500
501 s15[0].sample(1234);
502 s15[1].sample(4134);
503 curEventQueue()->setCurTick(curTick() + ULL(1000000));
504 s15[4].sample(1213);
505 curEventQueue()->setCurTick(curTick() + ULL(1000000));
506 s15[3].sample(1124);
507 curEventQueue()->setCurTick(curTick() + ULL(1000000));
508 s15[2].sample(1243);
509 curEventQueue()->setCurTick(curTick() + ULL(1000000));
510 s15[7].sample(1244);
511 curEventQueue()->setCurTick(curTick() + ULL(1000000));
512 s15[4].sample(7234);
513 s15[2].sample(9234);
514 s15[3].sample(1764);
515 s15[7].sample(1564);
516 s15[3].sample(3234);
517 s15[1].sample(2234);
518 curEventQueue()->setCurTick(curTick() + ULL(1000000));
519 s15[5].sample(1234);
520 curEventQueue()->setCurTick(curTick() + ULL(1000000));
521 s15[9].sample(4334);
522 curEventQueue()->setCurTick(curTick() + ULL(1000000));
523 s15[2].sample(1234);
524 curEventQueue()->setCurTick(curTick() + ULL(1000000));
525 s15[4].sample(4334);
526 s15[6].sample(1234);
527 curEventQueue()->setCurTick(curTick() + ULL(1000000));
528 s15[8].sample(8734);
529 curEventQueue()->setCurTick(curTick() + ULL(1000000));
530 s15[1].sample(5234);
531 curEventQueue()->setCurTick(curTick() + ULL(1000000));
532 s15[3].sample(8234);
533 curEventQueue()->setCurTick(curTick() + ULL(1000000));
534 s15[7].sample(5234);
535 s15[4].sample(4434);
536 s15[3].sample(7234);
537 s15[2].sample(1934);
538 s15[1].sample(9234);
539 curEventQueue()->setCurTick(curTick() + ULL(1000000));
540 s15[5].sample(5634);
541 s15[3].sample(1264);
542 s15[7].sample(5223);
543 s15[0].sample(1234);
544 s15[0].sample(5434);
545 s15[3].sample(8634);
546 curEventQueue()->setCurTick(curTick() + ULL(1000000));
547 s15[1].sample(1234);
548
549 s4 = curTick();
550
551 s8[3] = 99999;
552
553 s3 = 12;
554 s3++;
555 curEventQueue()->setCurTick(curTick() + 9);
556
557 s1 = 9;
558 s1 += 9;
559 s1 -= 11;
560 s1++;
561 ++s1;
562 s1--;
563 --s1;
564
565 s2 = 9;
566
567 s5[0] += 1;
568 s5[1] += 2;
569 s5[2] += 3;
570 s5[3] += 4;
571 s5[4] += 5;
572
573 s7[0] = 10;
574 s7[1] = 20;
575 s7[2] = 30;
576 s7[3] = 40;
577 s7[4] = 50;
578 s7[5] = 60;
579 s7[6] = 70;
580
581 s6.sample(0);
582 s6.sample(1);
583 s6.sample(2);
584 s6.sample(3);
585 s6.sample(4);
586 s6.sample(5);
587 s6.sample(6);
588 s6.sample(7);
589 s6.sample(8);
590 s6.sample(9);
591
592 s6.sample(10);
593 s6.sample(10);
594 s6.sample(10);
595 s6.sample(10);
596 s6.sample(10);
597 s6.sample(10);
598 s6.sample(10);
599 s6.sample(10);
600 s6.sample(11);
601 s6.sample(19);
602 s6.sample(20);
603 s6.sample(20);
604 s6.sample(21);
605 s6.sample(21);
606 s6.sample(31);
607 s6.sample(98);
608 s6.sample(99);
609 s6.sample(99);
610 s6.sample(99);
611
612 s7[0] = 700;
613 s7[1] = 600;
614 s7[2] = 500;
615 s7[3] = 400;
616 s7[4] = 300;
617 s7[5] = 200;
618 s7[6] = 100;
619
620 s9.sample(100);
621 s9.sample(100);
622 s9.sample(100);
623 s9.sample(100);
624 s9.sample(10);
625 s9.sample(10);
626 s9.sample(10);
627 s9.sample(10);
628 s9.sample(10);
629
630 curEventQueue()->setCurTick(curTick() + 9);
631 s4 = curTick();
632 s6.sample(100);
633 s6.sample(100);
634 s6.sample(100);
635 s6.sample(101);
636 s6.sample(102);
637
638 s12.sample(100);
639 for (int i = 0; i < 100; i++) {
640 h01.sample(i);
641 h02.sample(i);
642 }
643
644 for (int i = -100; i < 100; i++) {
645 h03.sample(i);
646 h04.sample(i);
647 }
648
649 for (int i = -100; i < 1000; i++) {
650 h05.sample(i);
651 h06.sample(i);
652 }
653
654 for (int i = 100; i >= -1000; i--) {
655 h07.sample(i);
656 h08.sample(i);
657 }
658
659 for (int i = 0; i <= 1023; i++) {
660 h09.sample(i);
661 h10.sample(i);
662 }
663
664 for (int i = -1024; i <= 1023; i++) {
665 h11.sample(i);
666 h12.sample(i);
667 }
668
669 for (int i = 0; i < 1000; i++) {
670 sh1.sample(random() % 10000);
671 }
672
673 s20[0] = 1;
674 s20[1] = 100000;
675 s21[0] = 100000;
676 s21[1] = 1;
677
678 }
679
680 static void
681 stattest_init_pybind(py::module &m_internal)
682 {
683 py::module m = m_internal.def_submodule("stattest");
684
685 m
686 .def("stattest_init", []() { __stattest().init(); })
687 .def("stattest_run", []() { __stattest().run(); })
688 ;
689 }
690
691 static EmbeddedPyBind embed_("stattest", stattest_init_pybind);