GCC Code Coverage Report


Directory: ./
File: src/iguana/algorithms/Algorithm.cc
Date: 2025-11-25 17:57:04
Coverage Exec Excl Total
Lines: 60.3% 202 0 335
Functions: 48.8% 39 0 80
Branches: 34.3% 181 0 527

Line Branch Exec Source
1 #include "Algorithm.h"
2
3 namespace iguana {
4
5 211 hipo::banklist::size_type tools::GetBankIndex(
6 hipo::banklist& banks,
7 std::string const& bank_name,
8 unsigned int const& variant) noexcept(false)
9 {
10 unsigned int num_found = 0;
11
1/2
✓ Branch 19 → 3 taken 717 times.
✗ Branch 19 → 20 not taken.
1434 for(hipo::banklist::size_type i = 0; i < banks.size(); i++) {
12 717 auto& bank = banks.at(i);
13
4/4
✓ Branch 7 → 8 taken 488 times.
✓ Branch 7 → 10 taken 229 times.
✓ Branch 12 → 13 taken 218 times.
✓ Branch 12 → 16 taken 499 times.
1434 if(bank.getSchema().getName() == bank_name) {
14
2/2
✓ Branch 13 → 14 taken 211 times.
✓ Branch 13 → 15 taken 7 times.
218 if(num_found == variant)
15 211 return i;
16 7 num_found++;
17 }
18 }
19 throw std::runtime_error("GetBankIndex failed to find bank \"" + bank_name + "\"");
20 }
21
22 ///////////////////////////////////////////////////////////////////////////////
23
24 15 void Algorithm::Start()
25 {
26
1/2
✓ Branch 2 → 3 taken 15 times.
✗ Branch 2 → 5 not taken.
15 m_rows_only = true;
27 hipo::banklist no_banks = {};
28
1/2
✓ Branch 2 → 3 taken 15 times.
✗ Branch 2 → 5 not taken.
15 Start(no_banks);
29 15 }
30
31 ///////////////////////////////////////////////////////////////////////////////
32
33 template <typename OPTION_TYPE>
34 140 OPTION_TYPE Algorithm::GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path) const
35 {
36 140 CompleteOptionNodePath(key, node_path);
37 140 auto opt = GetCachedOption<OPTION_TYPE>(key);
38
4/6
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 87 times.
✓ Branch 4 → 11 taken 1 time.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 9 not taken.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 30 times.
✗ Branch 4 → 9 not taken.
140 if(!opt.has_value()) {
39
5/8
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 5 → 6 taken 87 times.
✗ Branch 5 → 44 not taken.
✓ Branch 6 → 7 taken 87 times.
✗ Branch 6 → 34 not taken.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 6 → 7 taken 22 times.
✗ Branch 6 → 26 not taken.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 6 → 7 taken 29 times.
✓ Branch 6 → 26 taken 1 time.
226 opt = m_yaml_config->GetScalar<OPTION_TYPE>(node_path);
40 }
41
4/6
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 25 taken 88 times.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 22 taken 22 times.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 9 → 10 taken 2 times.
✓ Branch 9 → 22 taken 27 times.
139 if(!opt.has_value()) {
42
3/18
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 36 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 20 not taken.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 39 not taken.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 28 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 17 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 31 not taken.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 28 not taken.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 17 taken 1 time.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 31 not taken.
2 m_log->Error("Failed to `GetOptionScalar` for key {:?}", key);
43
1/6
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 42 not taken.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 34 not taken.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 34 not taken.
2 throw std::runtime_error("config file parsing issue");
44 }
45
4/8
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > iguana::Algorithm::GetOptionScalar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 25 → 26 taken 88 times.
✗ Branch 25 → 44 not taken.
✓ Branch 26 → 27 taken 88 times.
✗ Branch 26 → 28 not taken.
double iguana::Algorithm::GetOptionScalar<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 23 → 24 taken 22 times.
✗ Branch 23 → 25 not taken.
int iguana::Algorithm::GetOptionScalar<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 23 → 24 taken 27 times.
✗ Branch 23 → 25 not taken.
137 PrintOptionValue(key, opt.value());
46 137 return opt.value();
47 }
48 template int Algorithm::GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path) const;
49 template double Algorithm::GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path) const;
50 template std::string Algorithm::GetOptionScalar(std::string const& key, YAMLReader::node_path_t node_path) const;
51
52 ///////////////////////////////////////////////////////////////////////////////
53
54 template <typename OPTION_TYPE>
55 55 std::vector<OPTION_TYPE> Algorithm::GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path) const
56 {
57 55 CompleteOptionNodePath(key, node_path);
58 55 auto opt = GetCachedOption<std::vector<OPTION_TYPE>>(key);
59
4/6
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 13 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 28 times.
✗ Branch 4 → 11 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 11 taken 10 times.
55 if(!opt.has_value()) {
60
6/12
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 5 → 6 taken 5 times.
✗ Branch 5 → 45 not taken.
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 35 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 5 → 6 taken 28 times.
✗ Branch 5 → 41 not taken.
✓ Branch 6 → 7 taken 28 times.
✗ Branch 6 → 31 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 41 not taken.
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 31 not taken.
90 opt = m_yaml_config->GetVector<OPTION_TYPE>(node_path);
61 }
62
4/6
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 27 taken 5 times.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 25 taken 28 times.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 11 → 12 taken 4 times.
✓ Branch 11 → 25 taken 18 times.
55 if(!opt.has_value()) {
63
3/18
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 37 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 22 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 40 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 33 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 20 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 36 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 16 → 17 taken 4 times.
✗ Branch 16 → 33 not taken.
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 20 taken 2 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 36 not taken.
4 m_log->Error("Failed to `GetOptionVector` for key {:?}", key);
64
1/6
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 43 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 39 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 23 → 24 taken 4 times.
✗ Branch 23 → 39 not taken.
4 throw std::runtime_error("config file parsing issue");
65 }
66
6/14
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 27 → 28 taken 5 times.
✗ Branch 27 → 45 not taken.
✓ Branch 28 → 29 taken 5 times.
✗ Branch 28 → 30 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 48 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 25 → 26 taken 28 times.
✗ Branch 25 → 41 not taken.
✓ Branch 26 → 27 taken 28 times.
✗ Branch 26 → 28 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 25 → 26 taken 18 times.
✗ Branch 25 → 41 not taken.
✓ Branch 26 → 27 taken 18 times.
✗ Branch 26 → 28 not taken.
55 PrintOptionValue(key, opt.value());
67
3/6
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionVector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 29 → 31 taken 5 times.
✗ Branch 29 → 45 not taken.
std::vector<double, std::allocator<double> > iguana::Algorithm::GetOptionVector<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 27 → 29 taken 28 times.
✗ Branch 27 → 41 not taken.
std::vector<int, std::allocator<int> > iguana::Algorithm::GetOptionVector<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 27 → 29 taken 18 times.
✗ Branch 27 → 41 not taken.
102 return opt.value();
68 }
69 template std::vector<int> Algorithm::GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path) const;
70 template std::vector<double> Algorithm::GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path) const;
71 template std::vector<std::string> Algorithm::GetOptionVector(std::string const& key, YAMLReader::node_path_t node_path) const;
72
73 ///////////////////////////////////////////////////////////////////////////////
74
75 template <typename OPTION_TYPE>
76 17 std::set<OPTION_TYPE> Algorithm::GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path) const
77 {
78
3/6
std::set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > iguana::Algorithm::GetOptionSet<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 11 not taken.
std::set<double, std::less<double>, std::allocator<double> > iguana::Algorithm::GetOptionSet<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 13 not taken.
std::set<int, std::less<int>, std::allocator<int> > iguana::Algorithm::GetOptionSet<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::deque<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> >, std::allocator<std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<YAML::Node (YAML::Node)> > > >) const:
✓ Branch 3 → 4 taken 14 times.
✓ Branch 3 → 13 taken 2 times.
17 auto val_vec = GetOptionVector<OPTION_TYPE>(key, node_path);
79 std::set<OPTION_TYPE> val_set;
80 std::copy(val_vec.begin(), val_vec.end(), std::inserter(val_set, val_set.end()));
81 15 return val_set;
82 1 }
83 template std::set<int> Algorithm::GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path) const;
84 template std::set<double> Algorithm::GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path) const;
85 template std::set<std::string> Algorithm::GetOptionSet(std::string const& key, YAMLReader::node_path_t node_path) const;
86
87 ///////////////////////////////////////////////////////////////////////////////
88
89 126 void Algorithm::SetName(std::string_view name)
90 {
91 126 Object::SetName(name);
92
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 14 taken 126 times.
126 if(m_yaml_config)
93 m_yaml_config->SetName("config|" + m_name);
94 126 }
95
96 ///////////////////////////////////////////////////////////////////////////////
97
98 42 std::unique_ptr<YAMLReader> const& Algorithm::GetConfig() const
99 {
100 42 return m_yaml_config;
101 }
102
103 ///////////////////////////////////////////////////////////////////////////////
104
105 void Algorithm::SetConfig(std::unique_ptr<YAMLReader>&& yaml_config)
106 {
107 m_yaml_config = std::move(yaml_config);
108 }
109
110 ///////////////////////////////////////////////////////////////////////////////
111
112
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
6 void Algorithm::SetConfigFile(std::string const& name)
113 {
114
4/8
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 30 not taken.
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 24 not taken.
✓ Branch 18 → 19 taken 3 times.
✓ Branch 18 → 21 taken 3 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 33 not taken.
12 o_user_config_file = SetOption("config_file", name);
115 6 }
116
117 ///////////////////////////////////////////////////////////////////////////////
118
119
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
6 void Algorithm::SetConfigDirectory(std::string const& name)
120 {
121
3/8
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 30 not taken.
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 24 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 21 taken 6 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 33 not taken.
12 o_user_config_dir = SetOption("config_dir", name);
122 6 }
123
124 ///////////////////////////////////////////////////////////////////////////////
125
126
1/2
✓ Branch 2 → 3 taken 47 times.
✗ Branch 2 → 48 not taken.
47 void Algorithm::ParseYAMLConfig()
127 {
128
129 // start YAMLReader instance, if not yet started
130
1/2
✓ Branch 2 → 3 taken 47 times.
✗ Branch 2 → 48 not taken.
47 if(!m_yaml_config) {
131 // set config files and directories specified by `::SetConfigFile`, `::SetConfigDirectory`, etc.
132
2/4
✓ Branch 4 → 5 taken 47 times.
✗ Branch 4 → 86 not taken.
✓ Branch 5 → 6 taken 47 times.
✗ Branch 5 → 84 not taken.
47 o_user_config_file = GetCachedOption<std::string>("config_file").value_or("");
133
2/4
✓ Branch 19 → 20 taken 47 times.
✗ Branch 19 → 94 not taken.
✓ Branch 20 → 21 taken 47 times.
✗ Branch 20 → 92 not taken.
94 o_user_config_dir = GetCachedOption<std::string>("config_dir").value_or("");
134 47 m_log->Debug("Instantiating `YAMLReader`");
135
1/2
✓ Branch 35 → 36 taken 47 times.
✗ Branch 35 → 100 not taken.
94 m_yaml_config = std::make_unique<YAMLReader>("config|" + m_name);
136 47 m_yaml_config->SetLogLevel(m_log->GetLevel()); // synchronize log levels
137 47 m_yaml_config->AddDirectory(o_user_config_dir);
138 47 m_yaml_config->AddFile(m_default_config_file);
139 47 m_yaml_config->AddFile(o_user_config_file);
140 }
141 else
142 m_log->Debug("`YAMLReader` already instantiated for this algorithm; using that");
143
144 // parse the files
145 47 m_yaml_config->LoadFiles();
146
147 // if "log" was not set by `SetOption` (i.e., not in `m_option_cache`)
148 // - NB: not using `GetCachedOption<T>` here, since `T` can be a few different types for key=='log'
149
2/2
✓ Branch 60 → 61 taken 25 times.
✓ Branch 60 → 83 taken 22 times.
94 if(m_option_cache.find("log") == m_option_cache.end()) {
150 // check if 'log' is set in the YAML node for this algorithm
151
6/10
✓ Branch 65 → 66 taken 25 times.
✗ Branch 65 → 108 not taken.
✓ Branch 66 → 67 taken 25 times.
✗ Branch 66 → 106 not taken.
✓ Branch 69 → 70 taken 50 times.
✓ Branch 69 → 72 taken 25 times.
✓ Branch 72 → 73 taken 3 times.
✓ Branch 72 → 81 taken 22 times.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 112 not taken.
75 auto log_level_from_yaml = m_yaml_config->GetScalar<std::string>({m_class_name, "log"});
152
2/2
✓ Branch 72 → 73 taken 3 times.
✓ Branch 72 → 81 taken 22 times.
25 if(log_level_from_yaml) {
153
1/2
✓ Branch 75 → 76 taken 3 times.
✗ Branch 75 → 118 not taken.
3 m_log->SetLevel(log_level_from_yaml.value());
154
2/4
✓ Branch 76 → 77 taken 3 times.
✗ Branch 76 → 78 not taken.
✓ Branch 80 → 81 taken 3 times.
✗ Branch 80 → 118 not taken.
6 m_yaml_config->SetLogLevel(log_level_from_yaml.value());
155 }
156 }
157
0/2
✗ Branch 114 → 115 not taken.
✗ Branch 114 → 117 not taken.
47 }
158
159 ///////////////////////////////////////////////////////////////////////////////
160
161 8 void Algorithm::StartRCDBReader()
162 {
163
1/2
✓ Branch 6 → 7 taken 8 times.
✗ Branch 6 → 20 not taken.
24 m_rcdb = std::make_unique<RCDBReader>("RCDB|" + GetName(), m_log->GetLevel());
164 8 }
165
166 ///////////////////////////////////////////////////////////////////////////////
167
168 206 hipo::banklist::size_type Algorithm::GetBankIndex(hipo::banklist& banks, std::string const& bank_name) const
169 {
170
2/2
✓ Branch 2 → 3 taken 175 times.
✓ Branch 2 → 21 taken 31 times.
206 if(m_rows_only)
171 return 0;
172 try {
173 // check if this bank was created by iguana
174 175 auto created_by_iguana = AlgorithmFactory::GetCreatorAlgorithms(bank_name);
175 // get the index
176 175 auto idx = tools::GetBankIndex(
177 banks,
178 bank_name,
179
4/6
✓ Branch 4 → 5 taken 35 times.
✓ Branch 4 → 6 taken 140 times.
✓ Branch 6 → 7 taken 175 times.
✗ Branch 6 → 28 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 175 times.
175 created_by_iguana ? m_created_bank_variant : 0);
180
5/10
✓ Branch 11 → 12 taken 175 times.
✗ Branch 11 → 22 not taken.
✓ Branch 12 → 13 taken 105 times.
✓ Branch 12 → 15 taken 70 times.
✓ Branch 17 → 18 taken 35 times.
✓ Branch 17 → 20 taken 140 times.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 25 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 31 not taken.
350 m_log->Debug("cached index of bank '{}' is {}", bank_name, idx);
181 return idx;
182 }
183 catch(std::runtime_error const& ex) {
184 m_log->Error("required input bank '{}' not found; cannot `Start` algorithm '{}'", bank_name, m_class_name);
185 auto creators = AlgorithmFactory::GetCreatorAlgorithms(bank_name);
186 if(creators)
187 m_log->Error(" -> this bank is created by algorithm(s) [{}]; please `Start` ONE of them BEFORE this algorithm", fmt::join(creators.value(), ", "));
188 throw std::runtime_error("cannot cache bank index");
189 }
190 }
191
192 ///////////////////////////////////////////////////////////////////////////////
193
194 3 hipo::banklist::size_type Algorithm::GetCreatedBankIndex(hipo::banklist& banks) const noexcept(false)
195 {
196
1/2
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 10 not taken.
6 return GetBankIndex(banks, GetCreatedBankName());
197 }
198
199 ///////////////////////////////////////////////////////////////////////////////
200
201
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 27 times.
27 void Algorithm::PrintOptionValue(std::string const& key, int const& val, Logger::Level const level, std::string_view prefix) const
202 {
203
4/8
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 27 times.
✓ Branch 5 → 6 taken 27 times.
✗ Branch 5 → 12 not taken.
✓ Branch 6 → 7 taken 23 times.
✓ Branch 6 → 9 taken 4 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 15 not taken.
54 m_log->Print(level, "{}: {:>20} = {} [int]", prefix, key, val);
204 27 }
205
206
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 22 times.
22 void Algorithm::PrintOptionValue(std::string const& key, double const& val, Logger::Level const level, std::string_view prefix) const
207 {
208
4/8
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 22 times.
✓ Branch 5 → 6 taken 22 times.
✗ Branch 5 → 12 not taken.
✓ Branch 6 → 7 taken 12 times.
✓ Branch 6 → 9 taken 10 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 15 not taken.
44 m_log->Print(level, "{}: {:>20} = {} [double]", prefix, key, val);
209 22 }
210
211
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 88 times.
88 void Algorithm::PrintOptionValue(std::string const& key, std::string const& val, Logger::Level const level, std::string_view prefix) const
212 {
213
5/10
✓ Branch 9 → 10 taken 88 times.
✗ Branch 9 → 21 not taken.
✓ Branch 10 → 11 taken 84 times.
✓ Branch 10 → 13 taken 4 times.
✓ Branch 15 → 16 taken 70 times.
✓ Branch 15 → 18 taken 18 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 24 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 30 not taken.
176 m_log->Print(level, "{}: {:>20} = {:?} [string]", prefix, key, val);
214 88 }
215
216
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 18 times.
18 void Algorithm::PrintOptionValue(std::string const& key, std::vector<int> const& val, Logger::Level const level, std::string_view prefix) const
217 {
218
2/6
✓ Branch 6 → 7 taken 18 times.
✗ Branch 6 → 13 not taken.
✓ Branch 7 → 8 taken 18 times.
✗ Branch 7 → 10 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 16 not taken.
18 m_log->Print(level, "{}: {:>20} = ({}) [std::vector<int>]", prefix, key, fmt::join(val, ", "));
219 18 }
220
221
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 28 times.
28 void Algorithm::PrintOptionValue(std::string const& key, std::vector<double> const& val, Logger::Level const level, std::string_view prefix) const
222 {
223
3/6
✓ Branch 6 → 7 taken 28 times.
✗ Branch 6 → 13 not taken.
✓ Branch 7 → 8 taken 16 times.
✓ Branch 7 → 10 taken 12 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 16 not taken.
28 m_log->Print(level, "{}: {:>20} = ({}) [std::vector<double>]", prefix, key, fmt::join(val, ", "));
224 28 }
225
226 5 void Algorithm::PrintOptionValue(std::string const& key, std::vector<std::string> const& val, Logger::Level const level, std::string_view prefix) const
227 {
228 std::vector<std::string> val_quoted;
229
2/2
✓ Branch 13 → 3 taken 12 times.
✓ Branch 13 → 14 taken 5 times.
17 for(auto const& s : val)
230
1/2
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 26 not taken.
24 val_quoted.push_back(fmt::format("{:?}", s));
231
2/6
✓ Branch 18 → 19 taken 5 times.
✗ Branch 18 → 32 not taken.
✓ Branch 19 → 20 taken 5 times.
✗ Branch 19 → 22 not taken.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 35 not taken.
5 m_log->Print(level, "{}: {:>20} = ({}) [std::vector<string>]", prefix, key, fmt::join(val_quoted, ", "));
232 5 }
233
234 ///////////////////////////////////////////////////////////////////////////////
235
236 124337 hipo::bank& Algorithm::GetBank(hipo::banklist& banks, hipo::banklist::size_type const idx, std::string const& expected_bank_name) const
237 {
238
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 5 taken 124337 times.
124337 if(m_rows_only) {
239 m_log->Error("algorithm is in 'rows only' mode; cannot call `Run` since banks are not cached; use action function(s) instead");
240 }
241 else {
242 try {
243
1/2
✓ Branch 5 → 6 taken 124337 times.
✗ Branch 5 → 56 not taken.
124337 auto& result = banks.at(idx);
244
4/6
✓ Branch 6 → 7 taken 123455 times.
✓ Branch 6 → 19 taken 882 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 123455 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 40 taken 124337 times.
371247 if(!expected_bank_name.empty() && result.getSchema().getName() != expected_bank_name)
245 m_log->Error("expected input bank '{}' at index={}; got bank named '{}'", expected_bank_name, idx, result.getSchema().getName());
246 else
247 124337 return result;
248 }
249 catch(std::out_of_range const& o) {
250 m_log->Error("required input bank '{}' not found; cannot `Run` algorithm '{}'", expected_bank_name, m_class_name);
251 auto creators = AlgorithmFactory::GetCreatorAlgorithms(expected_bank_name);
252 if(creators)
253 m_log->Error(" -> this bank is created by algorithm(s) [{}]; please `Run` ONE of them BEFORE this algorithm", fmt::join(creators.value(), ", "));
254 }
255 }
256 throw std::runtime_error("GetBank failed");
257 }
258
259 ///////////////////////////////////////////////////////////////////////////////
260
261 23 std::vector<std::string> Algorithm::GetCreatedBankNames() const noexcept(false)
262 {
263 23 auto created_banks = AlgorithmFactory::GetCreatedBanks(m_class_name);
264
1/2
✓ Branch 3 → 4 taken 23 times.
✗ Branch 3 → 5 not taken.
23 if(created_banks)
265
1/2
✓ Branch 4 → 8 taken 23 times.
✗ Branch 4 → 14 not taken.
46 return created_banks.value();
266 throw std::runtime_error("failed to get created bank names");
267 }
268
269 ///////////////////////////////////////////////////////////////////////////////
270
271 23 std::string Algorithm::GetCreatedBankName() const noexcept(false)
272 {
273 23 auto created_banks = GetCreatedBankNames();
274
1/3
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 17 taken 23 times.
✗ Branch 5 → 21 not taken.
23 switch(created_banks.size()) {
275 case 0:
276 m_log->Error("algorithm {:?} creates no new banks", m_class_name);
277 break;
278 23 case 1:
279
1/2
✓ Branch 17 → 18 taken 23 times.
✗ Branch 17 → 55 not taken.
46 return created_banks.at(0);
280 break;
281 default:
282 m_log->Error("algorithm {:?} creates more than one bank; they are: [{}]", m_class_name, fmt::join(created_banks, ", "));
283 m_log->Error("- if you called `GetCreatedBank` or `GetCreatedBankSchema`, please specify which bank you want");
284 m_log->Error("- if you called `GetCreatedBankName`, call `GetCreatedBankNames` instead");
285 break;
286 }
287 throw std::runtime_error("failed to get created bank names");
288 23 }
289
290 ///////////////////////////////////////////////////////////////////////////////
291
292 1 hipo::bank Algorithm::GetCreatedBank(std::string const& bank_name) const noexcept(false)
293 {
294
1/2
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 6 not taken.
1 return hipo::bank(GetCreatedBankSchema(bank_name), 0);
295 }
296
297 ///////////////////////////////////////////////////////////////////////////////
298
299
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 32 times.
32 hipo::schema Algorithm::GetCreatedBankSchema(std::string const& bank_name) const noexcept(false)
300 {
301 std::string bank_name_arg = bank_name; // copy, to permit modification
302
303 // if the user did not provide a bank name, get it from the list of banks created by the algorithm;
304 // this will fail if the algorithm creates more than one bank, in which case, the user must
305 // specify the bank name explicitly
306
2/2
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 14 taken 31 times.
32 if(bank_name.empty())
307
1/2
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 134 not taken.
2 bank_name_arg = GetCreatedBankName();
308
309 // loop over bank definitions, `BANK_DEFS`, which is generated at build-time using `src/iguana/bankdefs/iguana.json`
310
1/2
✓ Branch 78 → 15 taken 103 times.
✗ Branch 78 → 79 not taken.
103 for(auto const& bank_def : BANK_DEFS) {
311
2/2
✓ Branch 15 → 16 taken 32 times.
✓ Branch 15 → 77 taken 71 times.
103 if(bank_def.name == bank_name_arg) {
312 // make sure the new bank is in REGISTER_IGUANA_ALGORITHM
313
1/2
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 43 taken 32 times.
64 if(!AlgorithmFactory::GetCreatorAlgorithms(bank_name_arg)) {
314 m_log->Error("algorithm {:?} creates bank {:?}, which is not registered; new banks must be included in `REGISTER_IGUANA_ALGORITHM` arguments", m_class_name, bank_name_arg);
315 throw std::runtime_error("CreateBank failed");
316 }
317 // create the schema format string
318 std::vector<std::string> schema_def;
319
2/2
✓ Branch 61 → 44 taken 293 times.
✓ Branch 61 → 62 taken 32 times.
325 for(auto const& entry : bank_def.entries)
320
1/2
✓ Branch 44 → 45 taken 293 times.
✗ Branch 44 → 124 not taken.
586 schema_def.push_back(entry.name + "/" + entry.type);
321 32 auto format_string = fmt::format("{}", fmt::join(schema_def, ","));
322 // create the new bank schema
323
1/2
✓ Branch 63 → 64 taken 32 times.
✗ Branch 63 → 118 not taken.
32 hipo::schema bank_schema(bank_name_arg.c_str(), bank_def.group, bank_def.item);
324
1/2
✓ Branch 64 → 65 taken 32 times.
✗ Branch 64 → 116 not taken.
32 bank_schema.parse(format_string);
325 32 return bank_schema;
326 32 }
327 }
328
329 throw std::runtime_error(fmt::format("bank {:?} not found in 'BankDefs.h'; is this bank defined in src/iguana/bankdefs/iguana.json ?", bank_name_arg));
330 }
331 ///////////////////////////////////////////////////////////////////////////////
332
333 12 unsigned int Algorithm::GetCreatedBankVariant() const
334 {
335 12 return m_created_bank_variant;
336 }
337
338 ///////////////////////////////////////////////////////////////////////////////
339
340 std::unique_ptr<RCDBReader>& Algorithm::GetRCDBReader()
341 {
342 return m_rcdb;
343 }
344
345 ///////////////////////////////////////////////////////////////////////////////
346
347 31 hipo::schema Algorithm::CreateBank(
348 hipo::banklist& banks,
349 hipo::banklist::size_type& bank_idx,
350 std::string const& bank_name) noexcept(false)
351 {
352 // check if this bank is already present in `banks`, and set `m_created_bank_variant` accordingly
353
2/2
✓ Branch 14 → 3 taken 142 times.
✓ Branch 14 → 15 taken 31 times.
173 for(auto& bank : banks) {
354
4/4
✓ Branch 6 → 7 taken 90 times.
✓ Branch 6 → 9 taken 52 times.
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 13 taken 141 times.
284 if(bank.getSchema().getName() == bank_name)
355 1 m_created_bank_variant++;
356 }
357 // create the schema, and add the new bank to `banks`
358 31 auto bank_schema = GetCreatedBankSchema(bank_name);
359 31 bank_idx = banks.size();
360
1/2
✓ Branch 18 → 19 taken 31 times.
✗ Branch 18 → 20 not taken.
31 banks.emplace_back(bank_schema, 0);
361 31 return bank_schema;
362 }
363
364 ///////////////////////////////////////////////////////////////////////////////
365
366 void Algorithm::ShowBanks(hipo::banklist const& banks, std::string_view message, Logger::Level const level) const
367 {
368 if(m_log->GetLevel() <= level) {
369 if(!message.empty())
370 m_log->Print(level, message);
371 for(auto& bank : banks)
372 bank.show();
373 }
374 }
375
376 ///////////////////////////////////////////////////////////////////////////////
377
378 73068 void Algorithm::ShowBank(hipo::bank const& bank, std::string_view message, Logger::Level const level) const
379 {
380
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 73068 times.
73068 if(m_log->GetLevel() <= level) {
381 if(!message.empty())
382 m_log->Print(level, message);
383 bank.show();
384 }
385 73068 }
386
387 ///////////////////////////////////////////////////////////////////////////////
388
389 template <typename OPTION_TYPE>
390 289 std::optional<OPTION_TYPE> Algorithm::GetCachedOption(std::string const& key) const
391 {
392
6/12
std::optional<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > iguana::Algorithm::GetCachedOption<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 5 times.
std::optional<std::vector<double, std::allocator<double> > > iguana::Algorithm::GetCachedOption<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 28 times.
std::optional<std::vector<int, std::allocator<int> > > iguana::Algorithm::GetCachedOption<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 22 times.
std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > iguana::Algorithm::GetCachedOption<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 182 times.
std::optional<double> iguana::Algorithm::GetCachedOption<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 22 times.
std::optional<int> iguana::Algorithm::GetCachedOption<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 30 times.
289 if(key == "")
393 return {};
394
8/12
std::optional<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > iguana::Algorithm::GetCachedOption<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 12 taken 5 times.
std::optional<std::vector<double, std::allocator<double> > > iguana::Algorithm::GetCachedOption<std::vector<double, std::allocator<double> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 12 taken 28 times.
std::optional<std::vector<int, std::allocator<int> > > iguana::Algorithm::GetCachedOption<std::vector<int, std::allocator<int> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✓ Branch 7 → 8 taken 10 times.
✓ Branch 7 → 12 taken 12 times.
std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > iguana::Algorithm::GetCachedOption<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✓ Branch 7 → 8 taken 13 times.
✓ Branch 7 → 14 taken 169 times.
std::optional<double> iguana::Algorithm::GetCachedOption<double>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 22 times.
std::optional<int> iguana::Algorithm::GetCachedOption<int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const:
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 30 times.
289 if(auto it{m_option_cache.find(key)}; it != m_option_cache.end()) {
395 try { // get the expected type
396 return std::get<OPTION_TYPE>(it->second);
397 }
398 catch(std::bad_variant_access const& ex) {
399 auto printer = [&key, this](auto const& v) {
400 m_log->Error("wrong type used in SetOption call for option {:?}; using its default value instead", key);
401 PrintOptionValue(key, v, Logger::Level::error, " USER");
402 if(m_log->GetLevel() > Logger::Level::debug)
403 m_log->Error("to see the actual option values used (and their types), set the log level to 'debug' or lower");
404 };
405 std::visit(printer, it->second);
406 }
407 }
408 266 return {};
409 }
410 template std::optional<int> Algorithm::GetCachedOption(std::string const& key) const;
411 template std::optional<double> Algorithm::GetCachedOption(std::string const& key) const;
412 template std::optional<std::string> Algorithm::GetCachedOption(std::string const& key) const;
413 template std::optional<std::vector<int>> Algorithm::GetCachedOption(std::string const& key) const;
414 template std::optional<std::vector<double>> Algorithm::GetCachedOption(std::string const& key) const;
415 template std::optional<std::vector<std::string>> Algorithm::GetCachedOption(std::string const& key) const;
416
417 ///////////////////////////////////////////////////////////////////////////////
418
419 void Algorithm::ThrowSinceRenamed(std::string const& new_name, std::string const& version) const noexcept(false)
420 {
421 std::string new_path = new_name;
422 std::string::size_type it = 0;
423 while((it = new_path.find("::", it)) != std::string::npos)
424 new_path.replace(it, 2, "/");
425 m_log->Error("As of Iguana version {}, the algorithm {:?} has been renamed:", version, m_class_name);
426 m_log->Error("- the new name is: {:?}", new_name);
427 m_log->Error("- the new C++ header is: \"iguana/algorithms/{}/Algorithm.h\"", new_path);
428 m_log->Error("- please update your code (and custom configuration YAML, if you have one)");
429 m_log->Error("- sorry for the inconvenience!");
430 throw std::runtime_error("algorithm has been renamed");
431 }
432
433 ///////////////////////////////////////////////////////////////////////////////
434
435
2/2
✓ Branch 2 → 3 taken 106 times.
✓ Branch 2 → 9 taken 89 times.
195 void Algorithm::CompleteOptionNodePath(std::string const& key, YAMLReader::node_path_t& node_path) const
436 {
437
2/2
✓ Branch 2 → 3 taken 106 times.
✓ Branch 2 → 9 taken 89 times.
195 if(node_path.empty())
438 106 node_path.push_front(key);
439 195 node_path.push_front(m_class_name);
440 195 }
441 }
442