Policy Aggregation == For each Partial State Update, multiple policy dictionaries are aggregated into a single dictionary to be imputted into all state functions using an initial reduction function and optional subsequent map functions. #### Aggregate Function Composition: ```python # Reduce Function add = lambda a, b: a + b # Used to add policy values of the same key # Map Function mult_by_2 = lambda y: y * 2 # Used to multiply all policy values by 2 policy_ops=[add, mult_by_2] ``` ##### Example Policy Updates per Partial State Update (PSU) ```python def p1_psu1(_params, step, sH, s): return {'policy1': 1} def p2_psu1(_params, step, sH, s): return {'policy2': 2} ``` * `add` not applicable due to lack of redundant policies * `mult_by_2` applied to all policies * Result: `{'policy1': 2, 'policy2': 4}` ```python def p1_psu2(_params, step, sH, s): return {'policy1': 2, 'policy2': 2} def p2_psu2(_params, step, sH, s): return {'policy1': 2, 'policy2': 2} ``` * `add` applicable due to redundant policies * `mult_by_2` applied to all policies * Result: `{'policy1': 8, 'policy2': 8}` ```python def p1_psu3(_params, step, sH, s): return {'policy1': 1, 'policy2': 2, 'policy3': 3} def p2_psu3(_params, step, sH, s): return {'policy1': 1, 'policy2': 2, 'policy3': 3} ``` * `add` applicable due to redundant policies * `mult_by_2` applied to all policies * Result: `{'policy1': 4, 'policy2': 8, 'policy3': 12}` #### Aggregate Policies using functions ```python from cadCAD.configuration import append_configs append_configs( sim_configs=???, initial_state=???, partial_state_update_blocks=???, policy_ops=[add, mult_by_2] # Default: [lambda a, b: a + b] ) ``` #### Example ##### * [System Model Configuration](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/Documentation/examples/policy_aggregation.py) ##### * Simulation Results: ``` +----+---------------------------------------------+-------+------+-----------+------------+ | | policies | run | s1 | substep | timestep | |----+---------------------------------------------+-------+------+-----------+------------| | 0 | {} | 1 | 0 | 0 | 0 | | 1 | {'policy1': 2, 'policy2': 4} | 1 | 1 | 1 | 1 | | 2 | {'policy1': 8, 'policy2': 8} | 1 | 2 | 2 | 1 | | 3 | {'policy3': 12, 'policy1': 4, 'policy2': 8} | 1 | 3 | 3 | 1 | | 4 | {'policy1': 2, 'policy2': 4} | 1 | 4 | 1 | 2 | | 5 | {'policy1': 8, 'policy2': 8} | 1 | 5 | 2 | 2 | | 6 | {'policy3': 12, 'policy1': 4, 'policy2': 8} | 1 | 6 | 3 | 2 | | 7 | {'policy1': 2, 'policy2': 4} | 1 | 7 | 1 | 3 | | 8 | {'policy1': 8, 'policy2': 8} | 1 | 8 | 2 | 3 | | 9 | {'policy3': 12, 'policy1': 4, 'policy2': 8} | 1 | 9 | 3 | 3 | +----+---------------------------------------------+-------+------+-----------+------------+ ```