atomica.optimization.TotalSpendConstraint¶
- class atomica.optimization.TotalSpendConstraint(total_spend=None, t=None, budget_factor=1.0)[source]¶
Bases:
Constraint
Fix total spending
This class implements a constraint on the total spend at every time point when a program is optimizable. A program is considered optimizable if an Adjustment reaches that program at the specified time. Spending is constrained independently at all times when any program is adjustable.
The
initial_total_spend
argument allows the total spending in a particular year to be explicitly specified rather than drawn from the initial allocation. This can be useful when using parametric programs where the adjustables do not directly correspond to spending value. If the total spend is not provided, it will automatically be computed from the first ASD step. Note that it is computed based on the initial instructions after the initial ASD values have been applied. This is because relative constraints on all adjustables are interpreted relative to the initial value of the adjustable, since not all adjustables map directly to values in the instructions. Since the adjustable hard upper and lower bounds are used as part of the constraint, for consistency, the total spend constraint itself is drawn from the same set of instructions (i.e. after the initial value has been applied). In cases where this is not the desired behaviour, the cause would likely be that the default value does not agree with a known desired total spend value. In that case, the desired total spend should simply be specified here explicitly as an absolute value.This constraint can also be set to only apply in certain years.
The
budget_factor
multiplies the total spend at the time thehard_constraint
is assigned Typically this is to scale up the available spending when that spending is being drawn from the instructions/progset (otherwise the budget_factor could already be part of the specified total spend)Note that if no times are specified, the budget factor should be a scalar but no explicit spending values can be specified. This is because in the case where different programs are optimized in different years, an explicit total spending constraint applying to all times is unlikely to be a sensible choice (so we just ask the user to specify the time as well).
- Parameters:
total_spend – A list of spending amounts the same size as
t
(can contain Nones), orNone
. For times in which the total spend isNone
, it will be automatically set to the sum of spending on optimizable programs in the corresponding yeart – A time, or list of times, at which to apply the total spending constraint. If None, it will automatically be set to all years in which spending adjustments are being made
budget_factor – The budget factor multiplies whatever the
initial_total_spend
is. This can either be a single value, or a year specific value
Methods
Apply total spend constraint
Return hard constraint dictionary
- constrain_instructions(instructions, hard_constraints, optimization)[source]¶
Apply total spend constraint
- Parameters:
instructions (
ProgramInstructions
) – TheProgramInstructions
instance to constrainhard_constraints (
dict
) – Dictionary of hard constraintsoptimization – The parent optimization, in case it’s needed
- Return type:
- Returns:
Distance-like difference between initial spending and constrained spending, np.inf if constraint failed
- get_hard_constraint(optimization, instructions)[source]¶
Return hard constraint dictionary
- Parameters:
optimization –
Optimization
instanceinstructions (
ProgramInstructions
) – InitialProgramInstructions
- Return type:
- Returns: