Skip to content

Commit 7fa092b

Browse files
committed
Merge branch 'main' into 89-dev-choose-what-to-plot
2 parents a7a39ae + 683ad7b commit 7fa092b

8 files changed

Lines changed: 105 additions & 61 deletions

File tree

ext/CTModelsJSON.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function CTModels.export_ocp_solution(
1717

1818
blob = Dict(
1919
"time_grid" => CTModels.time_grid(sol),
20-
"state" => CTModels.discretize(CTModels.state(sol), T),
20+
"state" => CTModels.discretize(CTModels.state(sol), T),
2121
"control" => CTModels.discretize(CTModels.control(sol), T),
2222
"variable" => CTModels.variable(sol),
2323
"costate" => CTModels.discretize(CTModels.costate(sol), T),

src/dual_model.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ function dual(sol::Solution, model::Model, label::Symbol)
4949
duals_lb = state_constraints_lb_dual(sol)
5050
duals_ub = state_constraints_ub_dual(sol)
5151
if length(indices) == 1
52-
return t -> ( duals_lb(t)[indices[1]] - duals_ub(t)[indices[1]] )
52+
return t -> (duals_lb(t)[indices[1]] - duals_ub(t)[indices[1]])
5353
else
54-
return t -> ( duals_lb(t)[indices] - duals_ub(t)[indices] )
54+
return t -> (duals_lb(t)[indices] - duals_ub(t)[indices])
5555
end
5656
end
5757

@@ -65,9 +65,9 @@ function dual(sol::Solution, model::Model, label::Symbol)
6565
duals_lb = control_constraints_lb_dual(sol)
6666
duals_ub = control_constraints_ub_dual(sol)
6767
if length(indices) == 1
68-
return t -> ( duals_lb(t)[indices[1]] - duals_ub(t)[indices[1]] )
68+
return t -> (duals_lb(t)[indices[1]] - duals_ub(t)[indices[1]])
6969
else
70-
return t -> ( duals_lb(t)[indices] - duals_ub(t)[indices] )
70+
return t -> (duals_lb(t)[indices] - duals_ub(t)[indices])
7171
end
7272
end
7373

src/solution.jl

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ function build_solution(
122122
fpcd = if isnothing(path_constraints_dual)
123123
nothing
124124
else
125-
(dim_path_constraints_nl(ocp) == 1) ?
126-
deepcopy(t -> path_constraints_dual_fun(t)[1]) :
125+
if (dim_path_constraints_nl(ocp) == 1)
126+
deepcopy(t -> path_constraints_dual_fun(t)[1])
127+
else
127128
deepcopy(t -> path_constraints_dual_fun(t))
129+
end
128130
end
129131

130132
# box constraints multipliers
@@ -138,9 +140,11 @@ function build_solution(
138140
fscbd = if isnothing(state_constraints_lb_dual)
139141
nothing
140142
else
141-
(dim_state_constraints_box(ocp) == 1) ?
142-
deepcopy(t -> state_constraints_lb_dual_fun(t)[1]) :
143+
if (dim_state_constraints_box(ocp) == 1)
144+
deepcopy(t -> state_constraints_lb_dual_fun(t)[1])
145+
else
143146
deepcopy(t -> state_constraints_lb_dual_fun(t))
147+
end
144148
end
145149

146150
state_constraints_ub_dual_fun = if isnothing(state_constraints_ub_dual)
@@ -153,10 +157,12 @@ function build_solution(
153157
fscud = if isnothing(state_constraints_ub_dual)
154158
nothing
155159
else
156-
(dim_state_constraints_box(ocp) == 1) ?
157-
deepcopy(t -> state_constraints_ub_dual_fun(t)[1]) :
160+
if (dim_state_constraints_box(ocp) == 1)
161+
deepcopy(t -> state_constraints_ub_dual_fun(t)[1])
162+
else
158163
deepcopy(t -> state_constraints_ub_dual_fun(t))
159-
end
164+
end
165+
end
160166

161167
control_constraints_lb_dual_fun = if isnothing(control_constraints_lb_dual)
162168
nothing
@@ -168,9 +174,11 @@ function build_solution(
168174
fccbd = if isnothing(control_constraints_lb_dual)
169175
nothing
170176
else
171-
(dim_control_constraints_box(ocp) == 1) ?
172-
deepcopy(t -> control_constraints_lb_dual_fun(t)[1]) :
177+
if (dim_control_constraints_box(ocp) == 1)
178+
deepcopy(t -> control_constraints_lb_dual_fun(t)[1])
179+
else
173180
deepcopy(t -> control_constraints_lb_dual_fun(t))
181+
end
174182
end
175183

176184
control_constraints_ub_dual_fun = if isnothing(control_constraints_ub_dual)
@@ -183,11 +191,13 @@ function build_solution(
183191
fccud = if isnothing(control_constraints_ub_dual)
184192
nothing
185193
else
186-
(dim_control_constraints_box(ocp) == 1) ?
187-
deepcopy(t -> control_constraints_ub_dual_fun(t)[1]) :
194+
if (dim_control_constraints_box(ocp) == 1)
195+
deepcopy(t -> control_constraints_ub_dual_fun(t)[1])
196+
else
188197
deepcopy(t -> control_constraints_ub_dual_fun(t))
198+
end
189199
end
190-
200+
191201
# build Models
192202
time_grid = TimeGridModel(T)
193203
state = StateModelSolution(state_name(ocp), state_components(ocp), fx)

test/test_export_import.jl

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,24 @@ function test_export_import()
88

99
# JSON
1010
CTModels.export_ocp_solution(sol; filename="solution_test", format=:JSON)
11-
sol_reloaded = CTModels.import_ocp_solution(
12-
ocp; filename="solution_test", format=:JSON
13-
)
11+
sol_reloaded = CTModels.import_ocp_solution(ocp; filename="solution_test", format=:JSON)
1412
@test sol.objective == sol_reloaded.objective
1513

1614
# JLD
1715
CTModels.export_ocp_solution(sol; filename="solution_test") # default is :JLD)
18-
sol_reloaded = CTModels.import_ocp_solution(
19-
ocp; filename="solution_test", format=:JLD
20-
)
16+
sol_reloaded = CTModels.import_ocp_solution(ocp; filename="solution_test", format=:JLD)
2117
@test sol.objective == sol_reloaded.objective
2218

2319
#
2420
ocp, sol = solution_example(; fun=true)
2521

2622
# JSON
2723
CTModels.export_ocp_solution(sol; filename="solution_test", format=:JSON)
28-
sol_reloaded = CTModels.import_ocp_solution(
29-
ocp; filename="solution_test", format=:JSON
30-
)
24+
sol_reloaded = CTModels.import_ocp_solution(ocp; filename="solution_test", format=:JSON)
3125
@test sol.objective == sol_reloaded.objective
3226

3327
# JLD
3428
CTModels.export_ocp_solution(sol; filename="solution_test", format=:JLD)
35-
sol_reloaded = CTModels.import_ocp_solution(
36-
ocp; filename="solution_test", format=:JLD
37-
)
29+
sol_reloaded = CTModels.import_ocp_solution(ocp; filename="solution_test", format=:JLD)
3830
@test sol.objective == sol_reloaded.objective
3931
end

test/test_ext_exceptions.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
function test_ext_exceptions()
2-
32
@test_throws CTBase.IncorrectArgument CTModels.export_ocp_solution(format=:dummy)
43
@test_throws CTBase.ExtensionError CTModels.export_ocp_solution(format=:JSON)
54
@test_throws CTBase.ExtensionError CTModels.export_ocp_solution(format=:JLD)
@@ -10,5 +9,4 @@ function test_ext_exceptions()
109

1110
ocp, sol, pre_ocp = solution_example()
1211
@test_throws CTBase.ExtensionError CTModels.plot(sol)
13-
14-
end
12+
end

test/test_model.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,4 @@ function test_model()
100100
CTModels.objective!(pre_ocp, :min; mayer=mayer, lagrange=lagrange)
101101
CTModels.definition!(pre_ocp, quote end)
102102
display(pre_ocp)
103-
104103
end

test/test_ocp.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,6 @@ function test_ocp()
293293
@test CTModels.has_mayer_cost(ocp) == true
294294
@test CTModels.has_lagrange_cost(ocp) == true
295295

296-
297296
# -------------------------------------------------------------------------- #
298297
# Just for printing
299298
#
@@ -329,5 +328,4 @@ function test_ocp()
329328
times, state, control, variable, dynamics, objective, constraints, definition
330329
)
331330
display(ocp)
332-
333331
end

test/test_solution.jl

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,8 @@ function test_solution()
6363
:variable_constraints_lb_dual => variable_constraints_lb_dual,
6464
:variable_constraints_ub_dual => variable_constraints_ub_dual,
6565
)
66-
sol = CTModels.build_solution(
67-
ocp,
68-
T,
69-
X,
70-
U,
71-
v,
72-
P;
73-
kwargs...,
74-
)
75-
66+
sol = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...)
67+
7668
# call getters and check the values
7769
@testset "state" begin
7870
@test CTModels.state_dimension(sol) == 2
@@ -135,71 +127,127 @@ function test_solution()
135127
# path constraints dual: matrix and function
136128
path_constraints_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
137129
path_constraints_dual_func = t -> [1.0+4.0*t, 2.0+4.0*t]
138-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
139-
path_constraints_dual=path_constraints_dual,
130+
sol_ = CTModels.build_solution(
131+
ocp, T, X, U, v, P; kwargs..., path_constraints_dual=path_constraints_dual
140132
)
141133
@test CTModels.path_constraints_dual(sol_)(1) == [5.0, 6.0]
142-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
143-
path_constraints_dual=path_constraints_dual_func,
134+
sol_ = CTModels.build_solution(
135+
ocp, T, X, U, v, P; kwargs..., path_constraints_dual=path_constraints_dual_func
144136
)
145137
@test CTModels.path_constraints_dual(sol_)(1) == [5.0, 6.0]
146138
# boundary constraints dual: vector
147139
boundary_constraints_dual = [3.0, 2.0]
148-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
140+
sol_ = CTModels.build_solution(
141+
ocp,
142+
T,
143+
X,
144+
U,
145+
v,
146+
P;
147+
kwargs...,
149148
boundary_constraints_dual=boundary_constraints_dual,
150149
)
151150
@test CTModels.boundary_constraints_dual(sol_) == [3.0, 2.0]
152151
# state constraints lower bounds dual: matrix
153152
state_constraints_lb_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
154-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
153+
sol_ = CTModels.build_solution(
154+
ocp,
155+
T,
156+
X,
157+
U,
158+
v,
159+
P;
160+
kwargs...,
155161
state_constraints_lb_dual=state_constraints_lb_dual,
156162
)
157163
@test CTModels.state_constraints_lb_dual(sol_)(1) == [5.0, 6.0]
158164
# state constraints upper bounds dual: matrix
159165
state_constraints_ub_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
160-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
166+
sol_ = CTModels.build_solution(
167+
ocp,
168+
T,
169+
X,
170+
U,
171+
v,
172+
P;
173+
kwargs...,
161174
state_constraints_ub_dual=state_constraints_ub_dual,
162175
)
163176
@test CTModels.state_constraints_ub_dual(sol_)(1) == [5.0, 6.0]
164177
# control constraints lower bounds dual: matrix
165178
ccld = zeros(3, 1)
166179
ccld[:, 1] = [1.0, 2.0, 3.0]
167180
control_constraints_lb_dual = ccld
168-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
181+
sol_ = CTModels.build_solution(
182+
ocp,
183+
T,
184+
X,
185+
U,
186+
v,
187+
P;
188+
kwargs...,
169189
control_constraints_lb_dual=control_constraints_lb_dual,
170190
)
171191
@test CTModels.control_constraints_lb_dual(sol_)(1) == 3.0
172192
# control constraints upper bounds dual: matrix
173193
control_constraints_ub_dual = ccld
174-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
194+
sol_ = CTModels.build_solution(
195+
ocp,
196+
T,
197+
X,
198+
U,
199+
v,
200+
P;
201+
kwargs...,
175202
control_constraints_ub_dual=control_constraints_ub_dual,
176203
)
177204
@test CTModels.control_constraints_ub_dual(sol_)(1) == 3.0
178205
# variable constraints lower bounds dual: vector
179206
variable_constraints_lb_dual = [1.0, 2.0]
180-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
207+
sol_ = CTModels.build_solution(
208+
ocp,
209+
T,
210+
X,
211+
U,
212+
v,
213+
P;
214+
kwargs...,
181215
variable_constraints_lb_dual=variable_constraints_lb_dual,
182216
)
183217
@test CTModels.variable_constraints_lb_dual(sol_) == [1.0, 2.0]
184218
# variable constraints upper bounds dual: vector
185219
variable_constraints_ub_dual = [1.0, 2.0]
186-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
220+
sol_ = CTModels.build_solution(
221+
ocp,
222+
T,
223+
X,
224+
U,
225+
v,
226+
P;
227+
kwargs...,
187228
variable_constraints_ub_dual=variable_constraints_ub_dual,
188229
)
189230
@test CTModels.variable_constraints_ub_dual(sol_) == [1.0, 2.0]
190231
end
191232
@testset "dual from label" begin
192233
path_constraints_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
193234
boundary_constraints_dual = [3.0, 2.0]
194-
state_constraints_lb_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
235+
state_constraints_lb_dual = [1.0 2.0; 3.0 4.0; 5.0 6.0]
195236
state_constraints_ub_dual = -[1.0 2.0; 3.0 4.0; 5.0 6.0]
196237
control_constraints_lb_dual = zeros(3, 1)
197238
control_constraints_lb_dual[:, 1] = [1.0, 2.0, 3.0]
198239
control_constraints_ub_dual = zeros(3, 1)
199240
control_constraints_ub_dual[:, 1] = -[1.0, 2.0, 3.0]
200-
variable_constraints_lb_dual = [1.0, 2.0]
241+
variable_constraints_lb_dual = [1.0, 2.0]
201242
variable_constraints_ub_dual = -[1.0, 2.0]
202-
sol_ = CTModels.build_solution(ocp, T, X, U, v, P; kwargs...,
243+
sol_ = CTModels.build_solution(
244+
ocp,
245+
T,
246+
X,
247+
U,
248+
v,
249+
P;
250+
kwargs...,
203251
path_constraints_dual=path_constraints_dual,
204252
boundary_constraints_dual=boundary_constraints_dual,
205253
state_constraints_lb_dual=state_constraints_lb_dual,
@@ -215,5 +263,4 @@ function test_solution()
215263
@test CTModels.dual(sol_, ocp, :control_rg)(1) == 3.0 - (-3.0)
216264
@test CTModels.dual(sol_, ocp, :variable_rg) == [1.0, 2.0] - (-[1.0, 2.0])
217265
end
218-
219-
end
266+
end

0 commit comments

Comments
 (0)