Line | Branch | Exec | Source |
---|---|---|---|
1 | // test an iguana algorithm | ||
2 | |||
3 | #include <hipo4/reader.h> | ||
4 | #include <iguana/algorithms/AlgorithmSequence.h> | ||
5 | |||
6 | 11 | inline int TestAlgorithm( | |
7 | std::string command, | ||
8 | std::string algo_name, | ||
9 | std::vector<std::string> prerequisite_algos, | ||
10 | std::vector<std::string> bank_names, | ||
11 | std::string data_file, | ||
12 | int num_events, | ||
13 | bool verbose) | ||
14 | { | ||
15 | |||
16 | // check arguments | ||
17 |
2/4✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
|
11 | if(algo_name == "" || bank_names.empty()) { |
18 | ✗ | fmt::print(stderr, "ERROR: need algorithm name and banks\n"); | |
19 | ✗ | return 1; | |
20 | } | ||
21 |
2/4✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
|
11 | if(command == "algorithm" && data_file == "") { |
22 | ✗ | fmt::print(stderr, "ERROR: need a data file for command 'algorithm'\n"); | |
23 | ✗ | return 1; | |
24 | } | ||
25 | |||
26 | // set the concurrency model to single-threaded, for optimal performance | ||
27 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
22 | iguana::GlobalConcurrencyModel = "single"; |
28 | |||
29 | // open the HIPO file; we use 2 readers, one for 'before' (i.e., not passed through iguana), and one for 'after' | ||
30 | // (passed through iguana), so we may compare them | ||
31 | 11 | hipo::reader reader_before(data_file.c_str()); // NOTE: not copy-constructable, so make two separate readers | |
32 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | hipo::reader reader_after(data_file.c_str()); |
33 |
2/4✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
|
11 | auto banks_before = reader_before.getBanks(bank_names); |
34 |
3/6✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
|
11 | auto banks_after = reader_after.getBanks(bank_names); |
35 | |||
36 | // define the algorithm | ||
37 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | iguana::AlgorithmSequence seq; |
38 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 11 times.
|
14 | for(auto const& prerequisite_algo : prerequisite_algos) |
39 |
2/4✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | seq.Add(prerequisite_algo); |
40 |
3/6✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
|
22 | seq.Add(algo_name); |
41 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | seq.SetName("TEST"); |
42 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | seq.PrintSequence(); |
43 |
2/4✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
|
22 | seq.SetOption(algo_name, "log", verbose ? "trace" : "info"); |
44 | |||
45 | // start the algorithm | ||
46 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | seq.Start(banks_after); |
47 | |||
48 | // event loop | ||
49 | int it_ev = 0; | ||
50 |
5/8✓ Branch 0 taken 11011 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11011 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11011 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 11000 times.
✓ Branch 7 taken 11 times.
|
11011 | while(reader_after.next(banks_after) && (num_events == 0 || it_ev++ < num_events)) { |
51 | // iterate the 'before' reader too | ||
52 |
1/2✓ Branch 0 taken 11000 times.
✗ Branch 1 not taken.
|
11000 | reader_before.next(banks_before); |
53 | // run the algorithm | ||
54 |
1/2✓ Branch 0 taken 11000 times.
✗ Branch 1 not taken.
|
11000 | if(command == "algorithm") |
55 |
1/2✓ Branch 0 taken 11000 times.
✗ Branch 1 not taken.
|
11000 | seq.Run(banks_after); |
56 | ✗ | else if(command == "unit") { | |
57 | ✗ | fmt::print(stderr, "ERROR: unit tests are not yet implemented (TODO)\n"); | |
58 | ✗ | return 1; | |
59 | } | ||
60 | else { | ||
61 | ✗ | fmt::print(stderr, "ERROR: unknown command '{}'\n", command); | |
62 | ✗ | return 1; | |
63 | } | ||
64 | // print the banks, before and after | ||
65 | // if(verbose) { | ||
66 | // for(decltype(bank_names)::size_type it_bank = 0; it_bank < bank_names.size(); it_bank++) { | ||
67 | // fmt::print("{:=^70}\n", fmt::format(" BEFORE: {} ", bank_names.at(it_bank))); | ||
68 | // banks_before.at(it_bank).show(); | ||
69 | // fmt::print("{:=^70}\n", fmt::format(" AFTER: {} ", bank_names.at(it_bank))); | ||
70 | // banks_after.at(it_bank).show(); | ||
71 | // fmt::print("\n"); | ||
72 | // } | ||
73 | // } | ||
74 | } | ||
75 | |||
76 | // stop the algorithm | ||
77 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
11 | seq.Stop(); |
78 | return 0; | ||
79 | 11 | } | |
80 |