4#include <iguana/algorithms/AlgorithmSequence.h>
5#ifdef USE_HIPO_MULTITHREADED_CHAIN
8#include <hipo4/chain.h>
11inline int TestMultithreading(
12 std::string
const algo_name,
13 std::vector<std::string>
const prerequisite_algos,
14 std::vector<std::string>
const bank_names,
15 std::string
const data_file,
18 int const num_threads,
20 std::string
const log_level)
23#ifdef USE_HIPO_MULTITHREADED_CHAIN
26 log.SetLevel(log_level);
29 if(algo_name.empty() || bank_names.empty()) {
30 log.Error(
"need algorithm name and banks");
33 if(data_file.empty()) {
34 log.Error(
"need a data file for command 'multithreading'");
39 iguana::GlobalConcurrencyModel =
"memoize";
42 std::optional<hipo::banklist::size_type> run_config_bank_idx{};
44 for(hipo::banklist::size_type idx = 0; idx < bank_names.size(); idx++) {
45 if(bank_names.at(idx) ==
"RUN::config") {
46 run_config_bank_idx = idx;
53 hipo::chain ch(num_threads,
false,
false);
54 ch.set_tags({data_tag});
56 auto banks = ch.getBanks(bank_names);
60 for(
auto const& prerequisite_algo : prerequisite_algos)
61 seq.
Add(prerequisite_algo);
65 seq.iguana::Algorithm::SetLogLevel(log_level);
73 seq.
GetLog()->Warn(
"==================================================================================================");
74 seq.
GetLog()->Warn(
"RUN NUMBER VARIATION IS ENABLED, DO NOT ATTEMPT TO CROSS CHECK RESULTS WITH SINGLE-THREADED TESTS!");
75 seq.
GetLog()->Warn(
"==================================================================================================");
79 auto processor = [&seq,
82 &fuzz](
auto& banks,
int file_idx,
long event_idx) {
86 if(vary_run && run_config_bank_idx.has_value()) {
88 if(random_run.has_value()) {
89 seq.
GetLog()->Trace(
"RANDOMLY VARIED RUN NUMBER TO BE {}", random_run.value());
90 banks[run_config_bank_idx.value()].putInt(
"run", 0, random_run.value());
98 double percentage = num_events == 0 ? 100 :
static_cast<double>(num_events) / ch.total_events() * 100;
99 auto frac = std::clamp(percentage, 0.0, 100.0) / 100.0;
101 assert((num_events == std::lround(ch.total_events() * frac)));
102 ch.process(banks, processor, percentage);
109 throw std::runtime_error(
"called command `multithreading` but HIPO version does not support it");
std::optional< int > RunNumRandom()
Algorithm: An algorithm that can run a sequence of algorithms
void Add(std::string const &algo_class_name, std::string const &algo_instance_name="")
void PrintSequence(Logger::Level level=Logger::info) const
void SetLogLevel(std::string const &algo_instance_name, std::string const &lev)
Set an algorithm log level.
virtual bool Run(hipo::banklist &banks) const final
Run Function: Process an event's hipo::banklist
virtual void Stop() final
Stop Function: Finalize this algorithm after all events are processed.
virtual void Start(hipo::banklist &banks) final
Start Function: Initialize this algorithm before any events are processed, with the intent to process...
std::unique_ptr< Logger > & GetLog()