Belle II Software  release-05-01-25
calculation_list.py
1 try:
2  from funcsigs import signature
3 except ImportError:
4  from inspect import signature
5 import itertools
6 
7 from hep_ipython_tools import calculation_queue
8 
9 
10 def create_all_calculations(parameter_creator_function, **calculation_lists):
11  """
12  Create all calculations.
13  """
14 
15  parameter_names_in_list = calculation_lists.keys()
16  parameter_values_in_list = calculation_lists.values()
17 
18  every_parameter_combination = create_every_parameter_combination(parameter_names_in_list,
19  parameter_values_in_list)
20 
21  all_queues = [calculation_queue.CalculationQueue() for _ in every_parameter_combination]
22 
23  def add_queue_if_needed(c_queue, param_combination):
24  param_combination_copy = param_combination.copy()
25  args = signature(parameter_creator_function).parameters
26  if "queue" in args:
27  param_combination_copy.update({"queue": c_queue})
28 
29  return param_combination_copy
30 
31  every_parameter_combination_with_queue = [add_queue_if_needed(c_queue, parameters) for
32  c_queue, parameters in zip(all_queues, every_parameter_combination)]
33 
34  def call_creator(param_combination):
35  calculation_kwargs = parameter_creator_function(**param_combination)
36  return calculation_kwargs
37 
38  all_calculation_kwargs = map(call_creator, every_parameter_combination_with_queue)
39  return all_calculation_kwargs, all_queues, every_parameter_combination
40 
41 
42 def create_every_parameter_combination(parameter_names, parameter_values):
43  """
44  Combine all parameter values with all other parameter values and form dictionaries with the correct
45  names.
46 
47  Parameters:
48  parameter_names: A list of names of the parameters.
49  parameter_values: A list of lists with parameter values. Each list stands
50  for one parameter (so the len of parameter_names must be the len of
51  parameter_value).
52 
53  Returns:
54  A list of dictionaries, each a single combination of parameters.
55  """
56 
57  assert len(parameter_names) == len(parameter_values)
58 
59  every_parameter_combination = itertools.product(*parameter_values)
60  every_parameter_combination_with_names = [
61  {parameter_name: value for parameter_name, value in zip(
62  parameter_names, values)} for values in every_parameter_combination]
63  return every_parameter_combination_with_names