Public API
This page lists exported symbols of CTModels.Solutions.
From CTModels.Solutions
CTModels.Solutions [Module]
CTModels.Solutions Module
SolutionsSolutions module for CTModels — provides Solution and related types (TimeGridModel, DualModel, SolverInfos), the build_solution constructor, and all solution accessors (trajectories, duals, solver metadata).
Organisation
solution_types.jl:
Solution,AbstractSolution, time-grid types, solver infos.dual_model.jl:
DualModel,AbstractDualModel, and dual accessors.discretization_utils.jl: time-grid helpers used by
build_solution.interpolation_helpers.jl: trajectory interpolation helpers.
build_solution.jl:
build_solutionconstructor + all solution accessors.show.jl:
Base.show(::Solution)display with CTBase palette.
Public API
Exported types:
AbstractSolution,SolutionAbstractTimeGridModel,UnifiedTimeGridModel,MultipleTimeGridModel,EmptyTimeGridModelAbstractDualModel,DualModelAbstractSolverInfos,SolverInfos
Exported functions:
build_solution: Main constructor for solutionsclean_component_symbols: Clean and validate component symbolsis_empty: Check if time grid is emptytime_grid_model: Get time grid model from solutiondual: Get dual by labelpath_constraints_dual,boundary_constraints_dual: Dual accessorsstate_constraints_lb_dual,state_constraints_ub_dual: State dual accessorscontrol_constraints_lb_dual,control_constraints_ub_dual: Control dual accessorsvariable_constraints_lb_dual,variable_constraints_ub_dual: Variable dual accessors
Dependencies
CTBase: Core types and exceptions
CTModels.Components: Model components
CTModels.Models: Model types and accessors
CTBase.Components: Time and state components
Interpolations.jl: Trajectory interpolation
LinearAlgebra: Vector operations
See also
CTModels.Models: Model types and buildingCTModels.Components: Model componentsCTModels.Building: Model constructionCTModels.Serialization: Solution import/export
AbstractDualModel [Abstract Type]
CTModels.Solutions.AbstractDualModel Type
abstract type AbstractDualModelAbstract base type for dual variable models in optimal control solutions.
Subtypes store Lagrange multipliers (dual variables) associated with constraints.
See also: CTModels.Solutions.DualModel.
AbstractSolution [Abstract Type]
CTModels.Solutions.AbstractSolution Type
abstract type AbstractSolutionAbstract base type for optimal control problem solutions.
Subtypes store the complete solution including primal trajectories, dual variables, and solver information.
See also: CTModels.Solutions.Solution.
AbstractSolverInfos [Abstract Type]
CTModels.Solutions.AbstractSolverInfos Type
abstract type AbstractSolverInfosAbstract base type for solver information associated with an optimal control solution.
Subtypes store metadata about the numerical solution process.
See also: CTModels.Solutions.SolverInfos.
AbstractTimeGridModel [Abstract Type]
CTModels.Solutions.AbstractTimeGridModel Type
abstract type AbstractTimeGridModelAbstract base type for time grid models used in optimal control solutions.
Subtypes store the discretised time points at which the solution is evaluated.
See also: CTModels.Solutions.UnifiedTimeGridModel, CTModels.Solutions.MultipleTimeGridModel, CTModels.Solutions.EmptyTimeGridModel.
DualModel [Struct]
CTModels.Solutions.DualModel Type
struct DualModel{PC_Dual<:Union{Nothing, Function}, BC_Dual<:Union{Nothing, AbstractVector{<:Real}}, SC_LB_Dual<:Union{Nothing, Function}, SC_UB_Dual<:Union{Nothing, Function}, CC_LB_Dual<:Union{Nothing, Function}, CC_UB_Dual<:Union{Nothing, Function}, VC_LB_Dual<:Union{Nothing, AbstractVector{<:Real}}, VC_UB_Dual<:Union{Nothing, AbstractVector{<:Real}}} <: CTModels.Solutions.AbstractDualModelDual variables (Lagrange multipliers) for all constraints in an optimal control solution.
Fields
path_constraints_dual::PC_Dual: Multipliers for path constraintst -> μ(t), ornothing.boundary_constraints_dual::BC_Dual: Multipliers for boundary constraints (vector), ornothing.state_constraints_lb_dual::SC_LB_Dual: Multipliers for state lower boundst -> ν⁻(t), ornothing.state_constraints_ub_dual::SC_UB_Dual: Multipliers for state upper boundst -> ν⁺(t), ornothing.control_constraints_lb_dual::CC_LB_Dual: Multipliers for control lower boundst -> ω⁻(t), ornothing.control_constraints_ub_dual::CC_UB_Dual: Multipliers for control upper boundst -> ω⁺(t), ornothing.variable_constraints_lb_dual::VC_LB_Dual: Multipliers for variable lower bounds (vector), ornothing.variable_constraints_ub_dual::VC_UB_Dual: Multipliers for variable upper bounds (vector), ornothing.
Example
julia> using CTModels
julia> # Typically constructed internally by the solver
julia> dm = CTModels.DualModel(nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing)EmptyDualModel [Struct]
CTModels.Solutions.EmptyDualModel Type
struct EmptyDualModel <: CTModels.Solutions.AbstractDualModelSentinel type representing the absence of dual variables in an optimal control solution.
Used when a solution carries no Lagrange multipliers, for instance a solution built by a flow rather than by a solver.
Example
julia> using CTModels
julia> edm = CTModels.EmptyDualModel()EmptyTimeGridModel [Struct]
CTModels.Solutions.EmptyTimeGridModel Type
struct EmptyTimeGridModel <: CTModels.Solutions.AbstractTimeGridModelSentinel type representing an empty or uninitialised time grid.
Used when a solution does not yet have an associated time discretisation.
Example
julia> using CTModels
julia> etg = CTModels.EmptyTimeGridModel()MultipleTimeGridModel [Struct]
CTModels.Solutions.MultipleTimeGridModel Type
struct MultipleTimeGridModel <: CTModels.Solutions.AbstractTimeGridModelMultiple time grid model storing different time grids for each solution component.
Used when variables have different discretisations (e.g., different grid densities for state vs control).
Fields
grids::NamedTuple: Named tuple with time grids for each component:state::TimesDisc: Time grid for state and state box constraint dualscontrol::TimesDisc: Time grid for control and control box constraint dualscostate::TimesDisc: Time grid for costatepath::TimesDisc: Time grid for path constraints and their duals
Example
julia> using CTModels
julia> T_state = LinRange(0, 1, 101)
julia> T_control = LinRange(0, 1, 51)
julia> T_costate = LinRange(0, 1, 76)
julia> tg = CTModels.MultipleTimeGridModel(
state=T_state, control=T_control, costate=T_costate, path=T_state
)
julia> length(tg.grids.state)
101Solution [Struct]
CTModels.Solutions.Solution Type
struct Solution{TimeGridModelType<:CTModels.Solutions.AbstractTimeGridModel, TimesModelType<:CTModels.Components.AbstractTimesModel, StateModelType<:CTModels.Components.AbstractStateModel, ControlModelType<:CTModels.Components.AbstractControlModel, VariableModelType<:CTModels.Components.AbstractVariableModel, ModelType<:CTModels.Models.AbstractModel, CostateModelType<:Function, ObjectiveValueType<:Real, DualModelType<:CTModels.Solutions.AbstractDualModel, SolverInfosType<:CTModels.Solutions.AbstractSolverInfos} <: CTModels.Solutions.AbstractSolutionComplete solution of an optimal control problem.
Stores the optimal state, control, and costate trajectories, the optimisation variable value, objective value, dual variables, and solver information.
Fields
time_grid::TimeGridModelType: Discretised time points.times::TimesModelType: Initial and final time specification.state::StateModelType: State trajectoryt -> x(t)with metadata.control::ControlModelType: Control trajectoryt -> u(t)with metadata.variable::VariableModelType: Optimisation variable value with metadata.model::ModelType: Reference to the optimal control problem model.costate::CostateModelType: Costate (adjoint) trajectoryt -> p(t).objective::ObjectiveValueType: Optimal objective value.dual::DualModelType: Dual variables for all constraints.solver_infos::SolverInfosType: Solver statistics and status.
Example
julia> using CTModels
julia> # Solutions are typically returned by solvers
julia> sol = solve(ocp, ...) # Returns a Solution
julia> CTModels.objective(sol)SolverInfos [Struct]
CTModels.Solutions.SolverInfos Type
struct SolverInfos{V, TI<:Dict{Symbol, V}} <: CTModels.Solutions.AbstractSolverInfosSolver information and statistics from the numerical solution process.
Fields
iterations::Int: Number of iterations performed by the solver.status::Symbol: Termination status (e.g.,:first_order,:max_iter).message::String: Human-readable message describing the termination status.successful::Bool: Whether the solver converged successfully.constraints_violation::Float64: Maximum constraint violation at the solution.infos::TI: Dictionary of additional solver-specific information.
Example
julia> using CTModels
julia> si = CTModels.SolverInfos(100, :first_order, "Converged", true, 1e-8, Dict{Symbol,Any}())
julia> si.successful
trueTimeGridModel [Struct]
CTModels.Solutions.TimeGridModel Type
Legacy type alias for CTModels.Solutions.UnifiedTimeGridModel.
Kept for backward compatibility with code written before the multi-grid feature. Prefer CTModels.Solutions.UnifiedTimeGridModel for new code.
See also: CTModels.Solutions.UnifiedTimeGridModel, CTModels.Solutions.MultipleTimeGridModel.
UnifiedTimeGridModel [Struct]
CTModels.Solutions.UnifiedTimeGridModel Type
struct UnifiedTimeGridModel{T<:Union{StepRangeLen, AbstractVector{<:Real}}} <: CTModels.Solutions.AbstractTimeGridModelUnified time grid model storing a single discretised time grid for all solution components.
Used when all variables (state, control, costate, duals) share the same time grid.
Fields
value::T: Vector or range of time points (e.g.,LinRange(0, 1, 100)).
Example
julia> using CTModels
julia> tg = CTModels.UnifiedTimeGridModel(LinRange(0, 1, 101))
julia> length(tg.value)
101boundary_constraints_dual [Function]
CTModels.Solutions.boundary_constraints_dual Function
boundary_constraints_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, BC_Dual<:Union{Nothing, AbstractVector{<:Real}}}
) -> Union{Nothing, AbstractVector{<:Real}}Return the dual vector associated with the boundary constraints.
Arguments
model::DualModel: A model including dual variables for boundary constraints.
Returns
BC_Dual: A vector of dual values, ornothingif not set.
See also: CTModels.Solutions.path_constraints_dual, CTModels.Solutions.state_constraints_lb_dual.
boundary_constraints_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the boundary constraints dual is absent.
boundary_constraints_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, AbstractVector{<:Real}}Return the dual of the boundary constraints.
build_solution [Function]
CTModels.Solutions.build_solution Function
build_solution(
ocp::CTModels.Models.Model,
T_state::Vector{Float64},
T_control::Vector{Float64},
T_costate::Vector{Float64},
T_path::Union{Nothing, Vector{Float64}},
X::Union{Function, Matrix{Float64}},
U::Union{Function, Matrix{Float64}},
v::Vector{Float64},
P::Union{Function, Matrix{Float64}};
objective,
iterations,
constraints_violation,
message,
status,
successful,
path_constraints_dual,
boundary_constraints_dual,
state_constraints_lb_dual,
state_constraints_ub_dual,
control_constraints_lb_dual,
control_constraints_ub_dual,
variable_constraints_lb_dual,
variable_constraints_ub_dual,
infos,
control_interpolation
)Build a solution from an optimal control problem with independent time grids for each component.
This function constructs a Solution object by assembling trajectory data (state, control, costate, path constraint duals) defined on potentially different time discretizations. The solution automatically creates interpolated functions to evaluate trajectories at arbitrary time points, and optimizes storage when all grids are identical.
Time Grid Semantics
The solution supports four independent time grids, each associated with a specific trajectory component:
T_state: Time grid for the state trajectoryXand state box constraint dualsDefines discretization points where state values are known
State box constraint duals (
state_constraints_lb_dual,state_constraints_ub_dual) share this grid
T_control: Time grid for the control trajectoryUand control box constraint dualsDefines discretization points where control values are known
Control box constraint duals (
control_constraints_lb_dual,control_constraints_ub_dual) share this gridMay differ from
T_state(e.g., coarser discretization for piecewise constant controls)
T_costate: Time grid for the costate (adjoint) trajectoryPDefines discretization points where costate values are known
Independent from state grid to accommodate different numerical schemes
Example: symplectic integrators may use different grids for state and costate
T_path: Time grid for path constraint duals (can benothing)Defines discretization points for path constraint dual variables
Set to
nothingif no path constraints existWhen
nothing, internally defaults toT_statefor consistency
Grid Optimization: If all non-nothing grids are identical, the solution uses UnifiedTimeGridModel for memory efficiency. Otherwise, it uses MultipleTimeGridModel to store each grid separately.
Trajectory Data Formats
Trajectory data (X, U, P, path_constraints_dual) can be provided in two formats:
- Matrix format:
Matrix{Float64}with dimensions(n_points, n_dim)
Each row corresponds to a time point in the associated grid
Each column corresponds to a component dimension
Example:
Xis(length(T_state), state_dimension(ocp))
- Function format:
Functionthat takes timet::Float64and returns a vector
Allows analytical or pre-interpolated trajectories
Function signature:
t -> Vector{Float64}of appropriate dimensionUseful for exact solutions or when data is already interpolated
Arguments
Required Positional Arguments
ocp::Model: The optimal control problem model defining dimensions and structureT_state::Vector{Float64}: Time grid for state trajectory (must be strictly increasing)T_control::Vector{Float64}: Time grid for control trajectory (must be strictly increasing)T_costate::Vector{Float64}: Time grid for costate trajectory (must be strictly increasing)T_path::Union{Vector{Float64},Nothing}: Time grid for path constraint duals (ornothing)X::Union{Matrix{Float64},Function}: State trajectory dataU::Union{Matrix{Float64},Function}: Control trajectory datav::Vector{Float64}: Variable values (static optimization variables, not time-dependent)P::Union{Matrix{Float64},Function}: Costate (adjoint) trajectory data
Required Keyword Arguments
objective::Float64: Optimal objective function valueiterations::Int: Number of solver iterations performedconstraints_violation::Float64: Maximum constraint violation (feasibility measure)message::String: Solver status message (e.g., "Solve_Succeeded", "Iteration_Limit")status::Symbol: Solver termination status (e.g.,:Solve_Succeeded,:Iteration_Limit)successful::Bool: Whether the solve was successful (true/false)
Optional Keyword Arguments (Dual Variables)
All dual variable arguments default to nothing if not provided:
path_constraints_dual::Union{Matrix{Float64},Function,Nothing}: Path constraint duals onT_pathgridboundary_constraints_dual::Union{Vector{Float64},Nothing}: Boundary constraint duals (time-independent)state_constraints_lb_dual::Union{Matrix{Float64},Nothing}: State lower bound duals onT_stategridstate_constraints_ub_dual::Union{Matrix{Float64},Nothing}: State upper bound duals onT_stategridcontrol_constraints_lb_dual::Union{Matrix{Float64},Nothing}: Control lower bound duals onT_controlgridcontrol_constraints_ub_dual::Union{Matrix{Float64},Nothing}: Control upper bound duals onT_controlgridvariable_constraints_lb_dual::Union{Vector{Float64},Nothing}: Variable lower bound duals (time-independent)variable_constraints_ub_dual::Union{Vector{Float64},Nothing}: Variable upper bound duals (time-independent)infos::Dict{Symbol,Any}: Additional solver-specific information (default: empty dict)
Returns
sol::Solution: Complete solution object with interpolated trajectory functions and metadata
Example
using CTModels
# Build OCP
ocp = Model(...)
state!(ocp, 2)
control!(ocp, 1)
# ... define dynamics, objective, etc.
# Define independent time grids
T_state = collect(LinRange(0.0, 1.0, 101)) # Fine state grid (101 points)
T_control = collect(LinRange(0.0, 1.0, 51)) # Coarser control grid (51 points)
T_costate = collect(LinRange(0.0, 1.0, 76)) # Custom costate grid (76 points)
T_path = collect(LinRange(0.0, 1.0, 61)) # Path constraint grid (61 points)
# Trajectory data (matrix format)
X = rand(101, 2) # State on T_state grid
U = rand(51, 1) # Control on T_control grid
P = rand(76, 2) # Costate on T_costate grid
v = [0.5, 1.2] # Static variables
# Build solution
sol = build_solution(
ocp,
T_state, T_control, T_costate, T_path,
X, U, v, P;
objective=1.23,
iterations=50,
constraints_violation=1e-8,
message="Optimal",
status=:first_order,
successful=true
)
# Access trajectories (automatically interpolated)
x_at_t = state(sol)(0.5) # Interpolated from T_state grid
u_at_t = control(sol)(0.5) # Interpolated from T_control grid
p_at_t = costate(sol)(0.5) # Interpolated from T_costate grid
# Query time grids
time_grid(sol, :state) # Returns T_state
time_grid(sol, :control) # Returns T_control
time_grid(sol, :costate) # Returns T_costateNotes
Box Constraint Dual Dimensions
The dimensions of box constraint dual variables correspond to the component dimension, not the number of constraint declarations:
state_constraints_*_dual: Dimension(length(T_state), state_dimension(ocp))control_constraints_*_dual: Dimension(length(T_control), control_dimension(ocp))variable_constraints_*_dual: Dimensionvariable_dimension(ocp)
If multiple constraints are declared on the same component (e.g., x₂(t) ≤ 1.2 and x₂(t) ≤ 2.0), only the last bound value is retained, and a warning is emitted during model construction.
Grid Validation
All time grids must be:
Strictly increasing:
T[i] < T[i+1]for alliNon-empty: At least one time point
Finite: No
InforNaNvalues
The function automatically validates and fixes grids (e.g., converts ranges to vectors).
Automatic Grid Extension
When time grids differ by only the last element (e.g., T_control = T_state[1:end-1]), the function automatically extends the shorter grid to match the longest one. This enables the use of UnifiedTimeGridModel for memory optimization without modifying trajectory data.
The extension condition is:
The shorter grid must be a strict prefix of the longest grid
Only the last element may be missing:
length(T_short) == length(T_long) - 1All other elements must match exactly:
T_short == T_long[1:end-1]
If extended, the interpolation automatically uses only the available data points via T[1:N], so trajectory data matrices do not need to be extended.
Memory Optimization
When all grids are identical, the solution uses UnifiedTimeGridModel to store a single grid, reducing memory overhead. This is detected automatically.
Backward Compatibility
A legacy signature build_solution(ocp, T, X, U, v, P; ...) exists for single-grid solutions. It internally calls this multi-grid version with T_state = T_control = T_costate = T_path = T.
See also: CTModels.Solutions.Solution, CTModels.Solutions.UnifiedTimeGridModel, CTModels.Solutions.MultipleTimeGridModel, CTModels.Components.time_grid, CTModels.Components.state, CTModels.Components.control, CTModels.Components.costate.
build_solution(
ocp::CTModels.Models.Model,
T::Vector{Float64},
X::Union{Function, Matrix{Float64}},
U::Union{Function, Matrix{Float64}},
v::Vector{Float64},
P::Union{Function, Matrix{Float64}};
objective,
iterations,
constraints_violation,
message,
status,
successful,
path_constraints_dual,
boundary_constraints_dual,
state_constraints_lb_dual,
state_constraints_ub_dual,
control_constraints_lb_dual,
control_constraints_ub_dual,
variable_constraints_lb_dual,
variable_constraints_ub_dual,
infos,
control_interpolation
)Build a solution from the optimal control problem, the time grid, the state, control, variable, and dual variables.
Arguments
ocp::Model: the optimal control problem.T::Vector{Float64}: the time grid.X::Matrix{Float64}: the state trajectory.U::Matrix{Float64}: the control trajectory.v::Vector{Float64}: the variable trajectory.P::Matrix{Float64}: the costate trajectory.objective::Float64: the objective value.iterations::Int: the number of iterations.constraints_violation::Float64: the constraints violation.message::String: the message associated to the status criterion.status::Symbol: the status criterion.successful::Bool: the successful status.path_constraints_dual::Matrix{Float64}: the dual of the path constraints.boundary_constraints_dual::Vector{Float64}: the dual of the boundary constraints.state_constraints_lb_dual::Matrix{Float64}: the lower bound dual of the state constraints.state_constraints_ub_dual::Matrix{Float64}: the upper bound dual of the state constraints.control_constraints_lb_dual::Matrix{Float64}: the lower bound dual of the control constraints.control_constraints_ub_dual::Matrix{Float64}: the upper bound dual of the control constraints.variable_constraints_lb_dual::Vector{Float64}: the lower bound dual of the variable constraints.variable_constraints_ub_dual::Vector{Float64}: the upper bound dual of the variable constraints.infos::Dict{Symbol,Any}: additional solver information dictionary.
Returns
sol::Solution: the optimal control solution.
Notes
The dimensions of box constraint dual variables (state_constraints_*_dual, control_constraints_*_dual, variable_constraints_*_dual) correspond to the state/control/variable dimension, not the number of constraint declarations. If multiple constraints are declared on the same component (e.g., x₂(t) ≤ 1.2 and x₂(t) ≤ 2.0), only the last bound value is retained, and a warning is emitted during model construction.
clean_component_symbols [Function]
CTModels.Solutions.clean_component_symbols Function
clean_component_symbols(
description
) -> Tuple{Vararg{Symbol}}Clean and standardize component symbols for time grid access.
Maps :states→:state, :duals→:path, :costate→:costate, etc. Duplicates are removed and the result is a canonical Tuple{Symbol...}.
Arguments
description: Tuple of component symbols from the caller.
Returns
Tuple{Symbol...}: Cleaned, unique, canonical symbols.
constraints_violation [Function]
CTModels.Solutions.constraints_violation Function
constraints_violation(
sol::CTModels.Solutions.Solution
) -> AnyReturn the constraints violation.
control_constraints_lb_dual [Function]
CTModels.Solutions.control_constraints_lb_dual Function
control_constraints_lb_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, CC_LB_Dual<:Union{Nothing, Function}}
) -> Union{Nothing, Function}Return the dual function associated with the lower bounds of control constraints.
Arguments
model::DualModel: A model including dual variables for control lower bounds.
Returns
CC_LB_Dual: A function mapping timetto a vector of dual values, ornothingif not set.
See also: CTModels.Solutions.control_constraints_ub_dual, CTModels.Solutions.state_constraints_lb_dual.
control_constraints_lb_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the control lower-bound dual is absent.
control_constraints_lb_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, Function}Return the lower bound dual of the control constraints.
control_constraints_ub_dual [Function]
CTModels.Solutions.control_constraints_ub_dual Function
control_constraints_ub_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, CC_UB_Dual<:Union{Nothing, Function}}
) -> Union{Nothing, Function}Return the dual function associated with the upper bounds of control constraints.
Arguments
model::DualModel: A model including dual variables for control upper bounds.
Returns
CC_UB_Dual: A function mapping timetto a vector of dual values, ornothingif not set.
See also: CTModels.Solutions.control_constraints_lb_dual, CTModels.Solutions.state_constraints_ub_dual.
control_constraints_ub_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the control upper-bound dual is absent.
control_constraints_ub_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, Function}Return the upper bound dual of the control constraints.
control_interpolation [Function]
CTModels.Solutions.control_interpolation Function
control_interpolation(
sol::CTModels.Solutions.Solution
) -> SymbolReturn the interpolation type of the control.
Arguments
sol::Solution: The optimal control solution.
Returns
Symbol: The interpolation type (:constantor:linear).
See also: CTModels.Components.control, CTModels.Models.control_dimension.
dim_dual_control_constraints_box [Function]
CTModels.Solutions.dim_dual_control_constraints_box Function
dim_dual_control_constraints_box(
sol::CTModels.Solutions.Solution
) -> Int64Return the dimension of the box constraints duals on control.
Arguments
sol::Solution: The optimal control solution.
Returns
Dimension: The control box constraints duals dimension.
See also: CTModels.Solutions.control_constraints_lb_dual, CTModels.Solutions.dim_dual_state_constraints_box.
dim_dual_state_constraints_box [Function]
CTModels.Solutions.dim_dual_state_constraints_box Function
dim_dual_state_constraints_box(
sol::CTModels.Solutions.Solution
) -> Int64Return the dimension of the box constraints duals on state.
Arguments
sol::Solution: The optimal control solution.
Returns
Dimension: The state box constraints duals dimension.
See also: CTModels.Solutions.state_constraints_lb_dual, CTModels.Solutions.dim_dual_control_constraints_box.
dim_dual_variable_constraints_box [Function]
CTModels.Solutions.dim_dual_variable_constraints_box Function
dim_dual_variable_constraints_box(
sol::CTModels.Solutions.Solution
) -> Int64Return the dimension of the variable box constraints duals.
Arguments
sol::Solution: The optimal control solution.
Returns
Dimension: The variable box constraints duals dimension.
See also: CTModels.Solutions.variable_constraints_lb_dual, CTModels.Solutions.variable_constraints_ub_dual.
dual [Function]
CTModels.Solutions.dual Function
dual(
sol::CTModels.Solutions.Solution,
model::CTModels.Models.Model,
label::Symbol
) -> AnyReturn the dual variable associated with a constraint identified by its label.
Searches through all constraint types (path, boundary, state, control, and variable constraints) defined in the model and returns the corresponding dual value from the solution.
Arguments
sol::Solution: Solution object containing dual variables.model::Model: Model containing constraint definitions.label::Symbol: Symbol corresponding to a constraint label.
Returns
A function of time t for time-dependent constraints, or a scalar/vector for time-invariant duals. If the label is not found, throws an IncorrectArgument exception.
Notes
For path/boundary constraints, duals are indexed per declaration (one column per row of the stacked nonlinear constraint vector).
For box constraints (state/control/variable), the dual matrices/vectors stored in the
Solutionare indexed by primal component (i.e.state_dimension(model)columns for state, etc.), following the CTDirect convention. For a label targeting component indicesrg, this function returnsduals_lb[:, rg] - duals_ub[:, rg](or the time-independent analogue for variables). Components never constrained carry a zero multiplier.If several labels target the same component,
dual(sol, model, :label)returns the (same) per-component multiplier for each: CTModels does not track which declaration "owns" the multiplier, because the solver only sees the effective (intersected) bound.
has_duals [Function]
CTModels.Solutions.has_duals Function
has_duals(model::CTModels.Solutions.EmptyDualModel) -> BoolReturn false for an empty dual model: the solution carries no dual variables.
Arguments
model::EmptyDualModel: An empty dual model
Returns
Bool: Alwaysfalsefor empty dual models
Example
julia> edm = CTModels.EmptyDualModel()
julia> CTModels.has_duals(edm)
falsehas_duals(
model::CTModels.Solutions.AbstractDualModel
) -> BoolReturn true for a non-empty dual model: the solution carries dual variables.
Arguments
model::AbstractDualModel: Any non-empty dual model
Returns
Bool: Alwaystruefor non-empty dual models
Example
julia> dm = CTModels.DualModel(nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing)
julia> CTModels.has_duals(dm)
truehas_duals(sol::CTModels.Solutions.Solution) -> BoolReturn true if the solution carries dual variables (Lagrange multipliers).
A solution produced by a solver carries duals; a solution built by a flow does not (its dual model is an CTModels.Solutions.EmptyDualModel).
infos [Function]
CTModels.Solutions.infos Function
infos(sol::CTModels.Solutions.Solution) -> Dict{Symbol, Any}Return a dictionary of additional infos depending on the solver or nothing.
is_empty_time_grid [Function]
CTModels.Solutions.is_empty_time_grid Function
is_empty_time_grid(sol::CTModels.Solutions.Solution) -> BoolCheck if the time grid is empty from the solution.
iterations [Function]
CTModels.Solutions.iterations Function
iterations(sol::CTModels.Solutions.Solution) -> AnyReturn the number of iterations (if solved by an iterative method).
message [Function]
CTModels.Solutions.message Function
message(sol::CTModels.Solutions.Solution) -> AnyReturn the message associated to the status criterion.
model [Function]
CTModels.Solutions.model Function
model(
sol::CTModels.Solutions.Solution{<:CTModels.Solutions.AbstractTimeGridModel, <:CTModels.Components.AbstractTimesModel, <:CTModels.Components.AbstractStateModel, <:CTModels.Components.AbstractControlModel, <:CTModels.Components.AbstractVariableModel, M<:CTModels.Models.AbstractModel}
) -> CTModels.Models.AbstractModelReturn the model of the optimal control problem.
path_constraints_dual [Function]
CTModels.Solutions.path_constraints_dual Function
path_constraints_dual(
model::CTModels.Solutions.DualModel{PC_Dual<:Union{Nothing, Function}}
) -> Union{Nothing, Function}Return the dual function associated with the nonlinear path constraints.
Arguments
model::DualModel: A model including dual variables for path constraints.
Returns
PC_Dual: A function mapping timetto the vector of dual values, ornothingif not set.
See also: CTModels.Solutions.boundary_constraints_dual, CTModels.Solutions.state_constraints_lb_dual.
path_constraints_dual(_::CTModels.Solutions.EmptyDualModel)Return nothing for an empty dual model: the path constraints dual is absent.
path_constraints_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, Function}Return the dual of the path constraints.
state_constraints_lb_dual [Function]
CTModels.Solutions.state_constraints_lb_dual Function
state_constraints_lb_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, SC_LB_Dual<:Union{Nothing, Function}}
) -> Union{Nothing, Function}Return the dual function associated with the lower bounds of state constraints.
Arguments
model::DualModel: A model including dual variables for state lower bounds.
Returns
SC_LB_Dual: A function mapping timetto a vector of dual values, ornothingif not set.
See also: CTModels.Solutions.state_constraints_ub_dual, CTModels.Solutions.control_constraints_lb_dual.
state_constraints_lb_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the state lower-bound dual is absent.
state_constraints_lb_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, Function}Return the lower bound dual of the state constraints.
state_constraints_ub_dual [Function]
CTModels.Solutions.state_constraints_ub_dual Function
state_constraints_ub_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, <:Union{Nothing, Function}, SC_UB_Dual<:Union{Nothing, Function}}
) -> Union{Nothing, Function}Return the dual function associated with the upper bounds of state constraints.
Arguments
model::DualModel: A model including dual variables for state upper bounds.
Returns
SC_UB_Dual: A function mapping timetto a vector of dual values, ornothingif not set.
See also: CTModels.Solutions.state_constraints_lb_dual, CTModels.Solutions.control_constraints_ub_dual.
state_constraints_ub_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the state upper-bound dual is absent.
state_constraints_ub_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, Function}Return the upper bound dual of the state constraints.
status [Function]
CTModels.Solutions.status Function
status(sol::CTModels.Solutions.Solution) -> AnyReturn the status criterion (a Symbol).
successful [Function]
CTModels.Solutions.successful Function
successful(sol::CTModels.Solutions.Solution) -> BoolReturn the successful status.
time_grid_model [Function]
CTModels.Solutions.time_grid_model Function
time_grid_model(
sol::CTModels.Solutions.Solution
) -> CTModels.Solutions.AbstractTimeGridModelGet the time grid model from a solution.
Returns
AbstractTimeGridModel: The time grid model (UnifiedTimeGridModel or MultipleTimeGridModel)
variable_constraints_lb_dual [Function]
CTModels.Solutions.variable_constraints_lb_dual Function
variable_constraints_lb_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, VC_LB_Dual<:Union{Nothing, AbstractVector{<:Real}}}
) -> Union{Nothing, AbstractVector{<:Real}}Return the dual vector associated with the lower bounds of variable constraints.
Arguments
model::DualModel: A model including dual variables for variable lower bounds.
Returns
VC_LB_Dual: A vector of dual values, ornothingif not set.
See also: CTModels.Solutions.variable_constraints_ub_dual, CTModels.Solutions.state_constraints_lb_dual.
variable_constraints_lb_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the variable lower-bound dual is absent.
variable_constraints_lb_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, AbstractVector{<:Real}}Return the lower bound dual of the variable constraints.
variable_constraints_ub_dual [Function]
CTModels.Solutions.variable_constraints_ub_dual Function
variable_constraints_ub_dual(
model::CTModels.Solutions.DualModel{<:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, Function}, <:Union{Nothing, AbstractVector{<:Real}}, VC_UB_Dual<:Union{Nothing, AbstractVector{<:Real}}}
) -> Union{Nothing, AbstractVector{<:Real}}Return the dual vector associated with the upper bounds of variable constraints.
Arguments
model::DualModel: A model including dual variables for variable upper bounds.
Returns
VC_UB_Dual: A vector of dual values, ornothingif not set.
See also: CTModels.Solutions.variable_constraints_lb_dual, CTModels.Solutions.state_constraints_ub_dual.
variable_constraints_ub_dual(
_::CTModels.Solutions.EmptyDualModel
)Return nothing for an empty dual model: the variable upper-bound dual is absent.
variable_constraints_ub_dual(
sol::CTModels.Solutions.Solution
) -> Union{Nothing, AbstractVector{<:Real}}Return the upper bound dual of the variable constraints.