@@ -116,6 +116,131 @@ end
116
116
=#
117
117
# ###############################################
118
118
119
+ function test_analytical_simple (; P = 2 ) # Number of parameters
120
+ @testset " Bounds Bounds" begin
121
+ m = Model (() -> DiffOpt. diff_optimizer (Ipopt. Optimizer, with_parametric_opt_interface= false ))
122
+
123
+ @variable (m, 0 ≤ x[1 : P] ≤ 1 )
124
+ @variable (m, p[1 : P] ∈ Parameter .(0.5 ))
125
+
126
+ @constraint (m, x .≥ p)
127
+
128
+ @objective (m, Min, sum (x))
129
+
130
+ optimize! (m)
131
+ @assert is_solved_and_feasible (m)
132
+
133
+ # Set pertubations
134
+ Δp = [0.1 for _ in 1 : P]
135
+ MOI. set .(m, DiffOpt. ForwardConstraintSet (), ParameterRef .(p), Parameter .(Δp))
136
+
137
+ # Compute derivatives
138
+ DiffOpt. forward_differentiate! (m)
139
+
140
+ # Test sensitivities
141
+ @test all (
142
+ isapprox (
143
+ [MOI. get (m, DiffOpt. ForwardVariablePrimal (), x[i]) for i in 1 : P],
144
+ [0.1 for _ in 1 : P],
145
+ atol = 1e-8 ,
146
+ ),
147
+ )
148
+ end
149
+ @testset " Bounds as RHS constraints" begin
150
+ m = Model (() -> DiffOpt. diff_optimizer (Ipopt. Optimizer, with_parametric_opt_interface= false ))
151
+
152
+ @variable (m, x[1 : P])
153
+ @constraint (m, x .≥ 0 )
154
+ @constraint (m, x .≤ 1 )
155
+ @variable (m, p[1 : P] ∈ Parameter .(0.5 ))
156
+
157
+ @constraint (m, x .≥ p)
158
+
159
+ @objective (m, Min, sum (x))
160
+
161
+ optimize! (m)
162
+ @assert is_solved_and_feasible (m)
163
+
164
+ # Set pertubations
165
+ Δp = [0.1 for _ in 1 : P]
166
+ MOI. set .(m, DiffOpt. ForwardConstraintSet (), ParameterRef .(p), Parameter .(Δp))
167
+
168
+ # Compute derivatives
169
+ DiffOpt. forward_differentiate! (m)
170
+
171
+ # Test sensitivities
172
+ @test all (
173
+ isapprox (
174
+ [MOI. get (m, DiffOpt. ForwardVariablePrimal (), x[i]) for i in 1 : P],
175
+ [0.1 for _ in 1 : P],
176
+ atol = 1e-8 ,
177
+ ),
178
+ )
179
+ end
180
+ @testset " Bounds as Mixed constraints" begin
181
+ m = Model (() -> DiffOpt. diff_optimizer (Ipopt. Optimizer, with_parametric_opt_interface= false ))
182
+
183
+ @variable (m, x[1 : P])
184
+ @constraint (m, 0 .≤ x)
185
+ @constraint (m, x .≤ 1 )
186
+ @variable (m, p[1 : P] ∈ Parameter .(0.5 ))
187
+
188
+ @constraint (m, x .≥ p)
189
+
190
+ @objective (m, Min, sum (x))
191
+
192
+ optimize! (m)
193
+ @assert is_solved_and_feasible (m)
194
+
195
+ # Set pertubations
196
+ Δp = [0.1 for _ in 1 : P]
197
+ MOI. set .(m, DiffOpt. ForwardConstraintSet (), ParameterRef .(p), Parameter .(Δp))
198
+
199
+ # Compute derivatives
200
+ DiffOpt. forward_differentiate! (m)
201
+
202
+ # Test sensitivities
203
+ @test all (
204
+ isapprox (
205
+ [MOI. get (m, DiffOpt. ForwardVariablePrimal (), x[i]) for i in 1 : P],
206
+ [0.1 for _ in 1 : P],
207
+ atol = 1e-8 ,
208
+ ),
209
+ )
210
+ end
211
+ @testset " Bounds as LHS constraints" begin
212
+ m = Model (() -> DiffOpt. diff_optimizer (Ipopt. Optimizer, with_parametric_opt_interface= false ))
213
+
214
+ @variable (m, x[1 : P])
215
+ @constraint (m, 0 .≤ x)
216
+ @constraint (m, 1 .≥ x)
217
+ @variable (m, p[1 : P] ∈ Parameter .(0.5 ))
218
+
219
+ @constraint (m, x .≥ p)
220
+
221
+ @objective (m, Min, sum (x))
222
+
223
+ optimize! (m)
224
+ @assert is_solved_and_feasible (m)
225
+
226
+ # Set pertubations
227
+ Δp = [0.1 for _ in 1 : P]
228
+ MOI. set .(m, DiffOpt. ForwardConstraintSet (), ParameterRef .(p), Parameter .(Δp))
229
+
230
+ # Compute derivatives
231
+ DiffOpt. forward_differentiate! (m)
232
+
233
+ # Test sensitivities
234
+ @test all (
235
+ isapprox (
236
+ [MOI. get (m, DiffOpt. ForwardVariablePrimal (), x[i]) for i in 1 : P],
237
+ [0.1 for _ in 1 : P],
238
+ atol = 1e-8 ,
239
+ ),
240
+ )
241
+ end
242
+ end
243
+
119
244
# f(x, p) = 0
120
245
# x = g(p)
121
246
# ∂x/∂p = ∂g/∂p
0 commit comments