MPI Dynamic SC IP Interface
- class MPIDynamicSchurComplementInteriorPointInterface(start_t: float, end_t: float, num_time_blocks: int, comm: Comm)
Bases:
DynamicSchurComplementInteriorPointInterface
A class for interfacing with Parapint’s interior point algorithm for the parallel solution of dynamic optimization problems using Schur-Complement decomposition. Users should inherit from this class and, at a minimum, implement the build_model_for_time_block method (see DynamicSchurComplementInteriorPointInterface.build_model_for_time_block for details).
- Parameters
- start_t: float
The starting time for the dynamic optimization problem
- end_t: float
The final time for the dynamic optimization problem
- num_time_blocks: int
The number of time blocks to split the time horizon into for parallel solution. This is typically equal to the number of processes available (i.e., comm.Get_size()).
- comm: MPI.Comm
The MPI communicator to use. Typically, this is mpi4py.MPI.COMM_WORLD.
- n_primals() int
- Returns
- n_primals: int
The number of primal variables
- evaluate_objective() float
- Returns
- objective_val: float
The value of the objective
- n_eq_constraints() int
- Returns
- n_eq_constraints: int
The number of equality constraints, including the coupling constraints
- n_ineq_constraints() int
- Returns
- n_ineq_constraints: int
The number of inequality constraints
- property ownership_map: Dict[int, int]
- Returns
- ownership_map: dict
This is a map from the time block index to the rank that owns that time block.
- property local_block_indices: Sequence[int]
- Returns
- local_block_indices: list
The indices of the time blocks owned by the current process.
- abstract build_model_for_time_block(ndx: int, start_t: float, end_t: float, add_init_conditions: bool) Tuple[_BlockData, Sequence[_GeneralVarData], Sequence[_GeneralVarData]]
This method should be implemented by derived classes. This method should build (and return) the model for the time interval [start_t, end_t] and return a list of states at start_t and a list of states at end_t (in the same order). This method will be called once for each time block. The start_states and end_states returned by this method must be in the same order for every time block.
- Parameters
- ndx: int
The time block index
- start_t: float
- end_t: float
- add_init_conditions: bool
This will only be True for time block 0.
- Returns
- pyomo_model: pyomo.core.base.block.Block
The model for the time interval [start_t, end_t].
- start_states: Sequence of _GeneralVarData
a list of the states at start_t; the order of this list should be the same for every time block
- end_states: Sequence of _GeneralVarData
a list of the states at end_t; the order of this list should be the same for every time block
- evaluate_eq_constraints() BlockVector
- Returns
- eq_resid: BlockVector
The residuals of the equality constraints, including the coupling constraints. This BlockVector has one block for every time block. Each block is itself a BlockVector with 3 blocks. The first block contains the residuals of the equality constraints in the corresponding time block. The second block has the residuals for the coupling constraints linking the states at the beginning of the time block to the coupling variables between the time block and the previous time block. The third block has the residuals for the coupling constraints linking the states at the end of the time block to the coupling variables between the time block and the next time block.
- evaluate_grad_objective() BlockVector
- Returns
- grad_obj: BlockVector
The gradient of the objective. This BlockVector has one block for every time block and one block for the coupling variables.
- evaluate_ineq_constraints() BlockVector
- Returns
- ineq_resid: BlockVector
The residuals of the inequality constraints. This BlockVector has one block for every time block.
- evaluate_jacobian_eq() BlockMatrix
- Returns
- jac_eq: BlockMatrix
The jacobian of the equality constraints. The rows have the same structure as the BlockVector returned from evaluate_eq_constraints. The columns have the same structure as the BlockVector returned from get_primals.
- evaluate_jacobian_ineq() BlockMatrix
- Returns
- jac_ineq: BlockMatrix
The jacobian of the inequality constraints. The rows have the same structure as the BlockVector returned from evaluate_ineq_constraints. The columns have the same structure as the BlockVector returned from get_primals.
- get_constraint_indices(ndx, pyomo_constraints) Sequence[int]
- Parameters
- ndx: int
The index of the time block
- pyomo_constraints: Sequence of _GeneralConstraintData
The pyomo constraints for which the indices should be returned
- Returns
- con_indices: Sequence of int
The indices of the corresponding pyomo constraints. Note that these indices correspond to the specified time block, not the overall indices.
- get_duals_eq() BlockVector
- Returns
- duals_eq: BlockVector
The values for the duals of the equality constraints, including the coupling constraints. This BlockVector has one block for every time block. Each block is itself a BlockVector with 3 blocks. The first block contains the duals of the equality constraints in the corresponding time block. The second block has the duals for the coupling constraints linking the states at the beginning of the time block to the coupling variables between the time block and the previous time block. The third block has the duals for the coupling constraints linking the states at the end of the time block to the coupling variables between the time block and the next time block.
- get_duals_ineq() BlockVector
- Returns
- duals_ineq: BlockVector
The values for the duals of the inequality constraints. This BlockVector has one block for every time block.
- get_primal_indices(ndx: int, pyomo_variables: Sequence[_GeneralVarData]) Sequence[int]
- Parameters
- ndx: int
The index of the time block
- pyomo_variables: Sequence of _GeneralVarData
The pyomo variables for which the indices should be returned
- Returns
- var_indices: Sequence of int
The indices of the corresponding pyomo variables. Note that these indices correspond to the specified time block, not the overall indices. In other words, the indices that are returned are the indices into the block within get_primals corresponding to ndx.
- get_primals() BlockVector
- Returns
- primals: BlockVector
The values for each primal variable. This BlockVector has one block for every time block and one block for the coupling variables.
- get_pyomo_constraints(ndx: int) Sequence[_GeneralConstraintData]
- Parameters
- ndx: int
The index of the time block for which pyomo constraints should be returned
- Returns
- pyomo_cons: list of _GeneralConstraintData
The pyomo constraints in the model for the time block corresponding to ndx
- get_pyomo_variables(ndx: int) Sequence[_GeneralVarData]
- Parameters
- ndx: int
The index of the time block for which pyomo variables should be returned
- Returns
- pyomo_vars: list of _GeneralVarData
The pyomo variables in the model for the time block corresponding to ndx
- ineq_lb() BlockVector
- Returns
- ineq_lb: BlockVector
The lower bounds for each inequality constraint. This BlockVector has one block for every time block.
- ineq_ub() BlockVector
- Returns
- ineq_lb: BlockVector
The lower bounds for each inequality constraint. This BlockVector has one block for every time block.
- init_duals_eq() BlockVector
- Returns
- init_duals_eq: BlockVector
The initial values for the duals of the equality constraints, including the coupling constraints. This BlockVector has one block for every time block. Each block is itself a BlockVector with 3 blocks. The first block contains the duals of the equality constraints in the corresponding time block. The second block has the duals for the coupling constraints linking the states at the beginning of the time block to the coupling variables between the time block and the previous time block. The third block has the duals for the coupling constraints linking the states at the end of the time block to the coupling variables between the time block and the next time block.
- init_duals_ineq() BlockVector
- Returns
- init_duals_ineq: BlockVector
The initial values for the duals of the inequality constraints. This BlockVector has one block for every time block.
- init_primals() BlockVector
- Returns
- init_primals: BlockVector
The initial values for each primal variable. This BlockVector has one block for every time block and one block for the coupling variables.
- load_primals_into_pyomo_model()
This method takes the current values for the primal variables (those you would get from the get_primals() method), and loads them into the corresponding Pyomo variables.
- primals_lb() BlockVector
- Returns
- primals_lb: BlockVector
The lower bounds for each primal variable. This BlockVector has one block for every time block and one block for the coupling variables.
- primals_ub() BlockVector
- Returns
- primals_ub: BlockVector
The upper bounds for each primal variable. This BlockVector has one block for every time block and one block for the coupling variables.
- pyomo_model(ndx: int) _BlockData
- Parameters
- ndx: int
The index of the time block for which the pyomo model should be returned.
- Returns
- m: _BlockData
The pyomo model for the time block corresponding to ndx.
- set_duals_eq(duals_eq: BlockVector)
- Parameters
- duals_eq: BlockVector
The values for the duals of the equality constraints, including the coupling constraints. This BlockVector has one block for every time block. Each block is itself a BlockVector with 3 blocks. The first block contains the duals of the equality constraints in the corresponding time block. The second block has the duals for the coupling constraints linking the states at the beginning of the time block to the coupling variables between the time block and the previous time block. The third block has the duals for the coupling constraints linking the states at the end of the time block to the coupling variables between the time block and the next time block.
- set_duals_ineq(duals_ineq: BlockVector)
- Parameters
- duals_ineq: BlockVector
The values for the duals of the inequality constraints. This BlockVector has one block for every time block.
- set_primals(primals: BlockVector)
Set the values of the primal variables for evaluation (i.e., the evaluate_* methods).
- Parameters
- primals: BlockVector
The values for each primal variable. This BlockVector should have one block for every time block and one block for the coupling variables.