Skip to content

Commit 3588933

Browse files
committed
feat: add default ode solver'
1 parent d0cd1e3 commit 3588933

File tree

6 files changed

+112
-123
lines changed

6 files changed

+112
-123
lines changed

Project.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
6666
BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665"
6767
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
6868
DeepDiffs = "ab62b9b5-e342-54a8-a765-a90f495de1a6"
69-
DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d"
7069
FMI = "14a09403-18e3-468f-ad8a-74f8dda2d9ac"
7170
InfiniteOpt = "20393b10-9daf-11e9-18c9-8db751c92c57"
7271
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
@@ -78,7 +77,7 @@ MTKChainRulesCoreExt = "ChainRulesCore"
7877
MTKDeepDiffsExt = "DeepDiffs"
7978
MTKFMIExt = "FMI"
8079
MTKInfiniteOptExt = "InfiniteOpt"
81-
MTKJuMPDynamicOptExt = ["JuMP", "DiffEqDevTools", "InfiniteOpt"]
80+
MTKJuMPDynamicOptExt = ["JuMP", "InfiniteOpt"]
8281
MTKLabelledArraysExt = "LabelledArrays"
8382

8483
[compat]

ext/MTKJuMPDynamicOptExt.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,13 @@ function add_jump_cost_function!(model::InfiniteModel, sys, tspan, pmap; is_free
175175

176176
# Substitute integral
177177
iv = MTK.get_iv(sys)
178-
jcosts = map(
179-
c -> Symbolics.substitute(c, MTK.() => Symbolics.Integral(iv in tspan)), jcosts)
180178

181179
intmap = Dict()
182180
for int in MTK.collect_applied_operators(jcosts, Symbolics.Integral)
183181
op = MTK.operation(int)
184182
arg = only(arguments(MTK.value(int)))
185183
lo, hi = (op.domain.domain.left, op.domain.domain.right)
184+
hi = haskey(pmap, hi) ? 1 : hi
186185
intmap[int] = tₛ * InfiniteOpt.(arg, model[:t], lo, hi)
187186
end
188187
jcosts = map(c -> Symbolics.substitute(c, intmap), jcosts)
@@ -325,6 +324,23 @@ function add_jump_solve_constraints!(prob, tableau; is_free_t = false)
325324
end
326325
end
327326

327+
"""
328+
Default ODE Tableau: RadauIIA5
329+
"""
330+
function constructDefault(T::Type = Float64)
331+
sq6 = sqrt(6)
332+
A = [11 // 45-7sq6 / 360 37 // 225-169sq6 / 1800 -2 // 225+sq6 / 75
333+
37 // 225+169sq6 / 1800 11 // 45+7sq6 / 360 -2 // 225-sq6 / 75
334+
4 // 9-sq6 / 36 4 // 9+sq6 / 36 1//9]
335+
c = [2 // 5 - sq6 / 10; 2 / 5 + sq6 / 10; 1]
336+
α = [4 // 9 - sq6 / 36; 4 // 9 + sq6 / 36; 1 // 9]
337+
A = map(T, A)
338+
α = map(T, α)
339+
c = map(T, c)
340+
341+
(; A = A, α = α, c = c)
342+
end
343+
328344
"""
329345
Solve JuMPDynamicOptProblem. Arguments:
330346
- prob: a JumpDynamicOptProblem
@@ -335,7 +351,7 @@ Solve JuMPDynamicOptProblem. Arguments:
335351
Returns a DynamicOptSolution, which contains both the model and the ODE solution.
336352
"""
337353
function DiffEqBase.solve(
338-
prob::JuMPDynamicOptProblem, jump_solver, ode_solver::Symbol; silent = false)
354+
prob::JuMPDynamicOptProblem, jump_solver, ode_solver::Symbol = :Default; silent = false)
339355
model = prob.model
340356
tableau_getter = Symbol(:construct, ode_solver)
341357
@eval tableau = $tableau_getter()

src/ModelingToolkit.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,5 @@ include("systems/optimal_control_interface.jl")
351351
export AbstractDynamicOptProblem, JuMPDynamicOptProblem, InfiniteOptDynamicOptProblem,
352352
PyomoDynamicOptProblem, CasADiDynamicOptProblem
353353
export DynamicOptSolution
354-
export
355354

356355
end # module

src/systems/optimal_control_interface.jl

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ end
1818

1919
function JuMPDynamicOptProblem end
2020
function InfiniteOptDynamicOptProblem end
21-
function CasADiDynamicOptProblem end
22-
function PyomoDynamicOptProblem end
2321

2422
function warn_overdetermined(sys, u0map)
2523
constraintsys = get_constraintsystem(sys)
@@ -142,29 +140,6 @@ function SciMLBase.ODEInputFunction{false}(sys::AbstractODESystem, args...;
142140
ODEInputFunction{false, SciMLBase.FullSpecialize}(sys, args...; kwargs...)
143141
end
144142

145-
"""
146-
Integral operator. When applied to an expression in a cost
147-
function, assumes that the integration variable is the
148-
iv of the system, and assumes that the bounds are the
149-
tspan.
150-
Equivalent to Integral(t in tspan) in Symbolics.
151-
"""
152-
struct<: Symbolics.Operator end
153-
(x) = ()(x)
154-
Base.show(io::IO, x::∫) = print(io, "")
155-
Base.nameof(::∫) = :∫
156-
157-
function (I::∫)(x)
158-
Term{symtype(x)}(I, Any[x])
159-
end
160-
161-
function (I::∫)(x::Num)
162-
v = value(x)
163-
Num(I(v))
164-
end
165-
166-
SymbolicUtils.promote_symtype(::Int, t) = t
167-
168143
# returns the JuMP timespan, the number of steps, and whether it is a free time problem.
169144
function process_tspan(tspan, dt, steps)
170145
is_free_time = false

test/downstream/jump_control.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ end
220220
@parameters tf
221221
eqs = [D(x(t)) ~ -2 + 0.5 * u(t)]
222222
# Integral cost function
223-
costs = [-(x(t) - u(t)), -x(tf)]
223+
costs = [-Symbolics.Integral(t in (0, tf))(x(t) - u(t)), -x(tf)]
224224
consolidate(u) = u[1] + u[2]
225225
@named rocket = ODESystem(eqs, t; costs, consolidate)
226226
rocket, input_idxs = structural_simplify(rocket, ([u(t)], []))

test/runtests.jl

Lines changed: 91 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -23,102 +23,102 @@ function activate_downstream_env()
2323
end
2424

2525
@time begin
26-
#if GROUP == "All" || GROUP == "InterfaceI"
27-
# @testset "InterfaceI" begin
28-
# @safetestset "Linear Algebra Test" include("linalg.jl")
29-
# @safetestset "AbstractSystem Test" include("abstractsystem.jl")
30-
# @safetestset "Variable Scope Tests" include("variable_scope.jl")
31-
# @safetestset "Symbolic Parameters Test" include("symbolic_parameters.jl")
32-
# @safetestset "Parsing Test" include("variable_parsing.jl")
33-
# @safetestset "Simplify Test" include("simplify.jl")
34-
# @safetestset "Direct Usage Test" include("direct.jl")
35-
# @safetestset "System Linearity Test" include("linearity.jl")
36-
# @safetestset "Input Output Test" include("input_output_handling.jl")
37-
# @safetestset "Clock Test" include("clock.jl")
38-
# @safetestset "ODESystem Test" include("odesystem.jl")
39-
# @safetestset "Dynamic Quantities Test" include("dq_units.jl")
40-
# @safetestset "Unitful Quantities Test" include("units.jl")
41-
# @safetestset "Mass Matrix Test" include("mass_matrix.jl")
42-
# @safetestset "Reduction Test" include("reduction.jl")
43-
# @safetestset "Split Parameters Test" include("split_parameters.jl")
44-
# @safetestset "StaticArrays Test" include("static_arrays.jl")
45-
# @safetestset "Components Test" include("components.jl")
46-
# @safetestset "Model Parsing Test" include("model_parsing.jl")
47-
# @safetestset "Error Handling" include("error_handling.jl")
48-
# @safetestset "StructuralTransformations" include("structural_transformation/runtests.jl")
49-
# @safetestset "Basic transformations" include("basic_transformations.jl")
50-
# @safetestset "State Selection Test" include("state_selection.jl")
51-
# @safetestset "Symbolic Event Test" include("symbolic_events.jl")
52-
# @safetestset "Stream Connect Test" include("stream_connectors.jl")
53-
# @safetestset "Domain Connect Test" include("domain_connectors.jl")
54-
# @safetestset "Lowering Integration Test" include("lowering_solving.jl")
55-
# @safetestset "Dependency Graph Test" include("dep_graphs.jl")
56-
# @safetestset "Function Registration Test" include("function_registration.jl")
57-
# @safetestset "Precompiled Modules Test" include("precompile_test.jl")
58-
# @safetestset "DAE Jacobians Test" include("dae_jacobian.jl")
59-
# @safetestset "Jacobian Sparsity" include("jacobiansparsity.jl")
60-
# @safetestset "Modelingtoolkitize Test" include("modelingtoolkitize.jl")
61-
# @safetestset "FuncAffect Test" include("funcaffect.jl")
62-
# @safetestset "Constants Test" include("constants.jl")
63-
# @safetestset "Parameter Dependency Test" include("parameter_dependencies.jl")
64-
# @safetestset "Equation Type Accessors Test" include("equation_type_accessors.jl")
65-
# @safetestset "System Accessor Functions Test" include("accessor_functions.jl")
66-
# @safetestset "Equations with complex values" include("complex.jl")
67-
# end
68-
#end
26+
if GROUP == "All" || GROUP == "InterfaceI"
27+
@testset "InterfaceI" begin
28+
@safetestset "Linear Algebra Test" include("linalg.jl")
29+
@safetestset "AbstractSystem Test" include("abstractsystem.jl")
30+
@safetestset "Variable Scope Tests" include("variable_scope.jl")
31+
@safetestset "Symbolic Parameters Test" include("symbolic_parameters.jl")
32+
@safetestset "Parsing Test" include("variable_parsing.jl")
33+
@safetestset "Simplify Test" include("simplify.jl")
34+
@safetestset "Direct Usage Test" include("direct.jl")
35+
@safetestset "System Linearity Test" include("linearity.jl")
36+
@safetestset "Input Output Test" include("input_output_handling.jl")
37+
@safetestset "Clock Test" include("clock.jl")
38+
@safetestset "ODESystem Test" include("odesystem.jl")
39+
@safetestset "Dynamic Quantities Test" include("dq_units.jl")
40+
@safetestset "Unitful Quantities Test" include("units.jl")
41+
@safetestset "Mass Matrix Test" include("mass_matrix.jl")
42+
@safetestset "Reduction Test" include("reduction.jl")
43+
@safetestset "Split Parameters Test" include("split_parameters.jl")
44+
@safetestset "StaticArrays Test" include("static_arrays.jl")
45+
@safetestset "Components Test" include("components.jl")
46+
@safetestset "Model Parsing Test" include("model_parsing.jl")
47+
@safetestset "Error Handling" include("error_handling.jl")
48+
@safetestset "StructuralTransformations" include("structural_transformation/runtests.jl")
49+
@safetestset "Basic transformations" include("basic_transformations.jl")
50+
@safetestset "State Selection Test" include("state_selection.jl")
51+
@safetestset "Symbolic Event Test" include("symbolic_events.jl")
52+
@safetestset "Stream Connect Test" include("stream_connectors.jl")
53+
@safetestset "Domain Connect Test" include("domain_connectors.jl")
54+
@safetestset "Lowering Integration Test" include("lowering_solving.jl")
55+
@safetestset "Dependency Graph Test" include("dep_graphs.jl")
56+
@safetestset "Function Registration Test" include("function_registration.jl")
57+
@safetestset "Precompiled Modules Test" include("precompile_test.jl")
58+
@safetestset "DAE Jacobians Test" include("dae_jacobian.jl")
59+
@safetestset "Jacobian Sparsity" include("jacobiansparsity.jl")
60+
@safetestset "Modelingtoolkitize Test" include("modelingtoolkitize.jl")
61+
@safetestset "FuncAffect Test" include("funcaffect.jl")
62+
@safetestset "Constants Test" include("constants.jl")
63+
@safetestset "Parameter Dependency Test" include("parameter_dependencies.jl")
64+
@safetestset "Equation Type Accessors Test" include("equation_type_accessors.jl")
65+
@safetestset "System Accessor Functions Test" include("accessor_functions.jl")
66+
@safetestset "Equations with complex values" include("complex.jl")
67+
end
68+
end
6969

70-
#if GROUP == "All" || GROUP == "Initialization"
71-
# @safetestset "Guess Propagation" include("guess_propagation.jl")
72-
# @safetestset "Hierarchical Initialization Equations" include("hierarchical_initialization_eqs.jl")
73-
# @safetestset "InitializationSystem Test" include("initializationsystem.jl")
74-
# @safetestset "Initial Values Test" include("initial_values.jl")
75-
#end
70+
if GROUP == "All" || GROUP == "Initialization"
71+
@safetestset "Guess Propagation" include("guess_propagation.jl")
72+
@safetestset "Hierarchical Initialization Equations" include("hierarchical_initialization_eqs.jl")
73+
@safetestset "InitializationSystem Test" include("initializationsystem.jl")
74+
@safetestset "Initial Values Test" include("initial_values.jl")
75+
end
7676

77-
#if GROUP == "All" || GROUP == "InterfaceII"
78-
# @testset "InterfaceII" begin
79-
# @safetestset "Code Generation Test" include("code_generation.jl")
80-
# @safetestset "IndexCache Test" include("index_cache.jl")
81-
# @safetestset "Variable Utils Test" include("variable_utils.jl")
82-
# @safetestset "Variable Metadata Test" include("test_variable_metadata.jl")
83-
# @safetestset "OptimizationSystem Test" include("optimizationsystem.jl")
84-
# @safetestset "Discrete System" include("discrete_system.jl")
85-
# @safetestset "Implicit Discrete System" include("implicit_discrete_system.jl")
86-
# @safetestset "SteadyStateSystem Test" include("steadystatesystems.jl")
87-
# @safetestset "SDESystem Test" include("sdesystem.jl")
88-
# @safetestset "DDESystem Test" include("dde.jl")
89-
# @safetestset "NonlinearSystem Test" include("nonlinearsystem.jl")
90-
# @safetestset "SCCNonlinearProblem Test" include("scc_nonlinear_problem.jl")
91-
# @safetestset "PDE Construction Test" include("pdesystem.jl")
92-
# @safetestset "JumpSystem Test" include("jumpsystem.jl")
93-
# @safetestset "Optimal Control + Constraints Tests" include("optimal_control.jl")
94-
# @safetestset "print_tree" include("print_tree.jl")
95-
# @safetestset "Constraints Test" include("constraints.jl")
96-
# @safetestset "IfLifting Test" include("if_lifting.jl")
97-
# @safetestset "Analysis Points Test" include("analysis_points.jl")
98-
# @safetestset "Causal Variables Connection Test" include("causal_variables_connection.jl")
99-
# @safetestset "Debugging Test" include("debugging.jl")
100-
# @safetestset "Namespacing test" include("namespacing.jl")
101-
# @safetestset "Subsystem replacement" include("substitute_component.jl")
102-
# end
103-
#end
77+
if GROUP == "All" || GROUP == "InterfaceII"
78+
@testset "InterfaceII" begin
79+
@safetestset "Code Generation Test" include("code_generation.jl")
80+
@safetestset "IndexCache Test" include("index_cache.jl")
81+
@safetestset "Variable Utils Test" include("variable_utils.jl")
82+
@safetestset "Variable Metadata Test" include("test_variable_metadata.jl")
83+
@safetestset "OptimizationSystem Test" include("optimizationsystem.jl")
84+
@safetestset "Discrete System" include("discrete_system.jl")
85+
@safetestset "Implicit Discrete System" include("implicit_discrete_system.jl")
86+
@safetestset "SteadyStateSystem Test" include("steadystatesystems.jl")
87+
@safetestset "SDESystem Test" include("sdesystem.jl")
88+
@safetestset "DDESystem Test" include("dde.jl")
89+
@safetestset "NonlinearSystem Test" include("nonlinearsystem.jl")
90+
@safetestset "SCCNonlinearProblem Test" include("scc_nonlinear_problem.jl")
91+
@safetestset "PDE Construction Test" include("pdesystem.jl")
92+
@safetestset "JumpSystem Test" include("jumpsystem.jl")
93+
@safetestset "Optimal Control + Constraints Tests" include("optimal_control.jl")
94+
@safetestset "print_tree" include("print_tree.jl")
95+
@safetestset "Constraints Test" include("constraints.jl")
96+
@safetestset "IfLifting Test" include("if_lifting.jl")
97+
@safetestset "Analysis Points Test" include("analysis_points.jl")
98+
@safetestset "Causal Variables Connection Test" include("causal_variables_connection.jl")
99+
@safetestset "Debugging Test" include("debugging.jl")
100+
@safetestset "Namespacing test" include("namespacing.jl")
101+
@safetestset "Subsystem replacement" include("substitute_component.jl")
102+
end
103+
end
104104

105-
#if GROUP == "All" || GROUP == "SymbolicIndexingInterface"
106-
# @safetestset "SymbolicIndexingInterface test" include("symbolic_indexing_interface.jl")
107-
# @safetestset "SciML Problem Input Test" include("sciml_problem_inputs.jl")
108-
# @safetestset "MTKParameters Test" include("mtkparameters.jl")
109-
#end
105+
if GROUP == "All" || GROUP == "SymbolicIndexingInterface"
106+
@safetestset "SymbolicIndexingInterface test" include("symbolic_indexing_interface.jl")
107+
@safetestset "SciML Problem Input Test" include("sciml_problem_inputs.jl")
108+
@safetestset "MTKParameters Test" include("mtkparameters.jl")
109+
end
110110

111-
#if GROUP == "All" || GROUP == "Extended"
112-
# @safetestset "Test Big System Usage" include("bigsystem.jl")
113-
# println("C compilation test requires gcc available in the path!")
114-
# @safetestset "C Compilation Test" include("ccompile.jl")
115-
# @testset "Distributed Test" include("distributed.jl")
116-
# @testset "Serialization" include("serialization.jl")
117-
#end
111+
if GROUP == "All" || GROUP == "Extended"
112+
@safetestset "Test Big System Usage" include("bigsystem.jl")
113+
println("C compilation test requires gcc available in the path!")
114+
@safetestset "C Compilation Test" include("ccompile.jl")
115+
@testset "Distributed Test" include("distributed.jl")
116+
@testset "Serialization" include("serialization.jl")
117+
end
118118

119-
#if GROUP == "All" || GROUP == "RegressionI"
120-
# @safetestset "Latexify recipes Test" include("latexify.jl")
121-
#end
119+
if GROUP == "All" || GROUP == "RegressionI"
120+
@safetestset "Latexify recipes Test" include("latexify.jl")
121+
end
122122

123123
if GROUP == "All" || GROUP == "Downstream"
124124
activate_downstream_env()

0 commit comments

Comments
 (0)