@@ -40,6 +40,25 @@ function test_objective_dot_univariate()
4040 return
4141end
4242
43+ function test_objective_dot_univariate_and_scalar_mult ()
44+ model = Nonlinear. Model ()
45+ x = MOI. VariableIndex (1 )
46+ Nonlinear. set_objective (model, :(2 * (dot ([$ x], [$ x]))))
47+ evaluator = Nonlinear. Evaluator (model, ArrayDiff. Mode (), [x])
48+ MOI. initialize (evaluator, [:Grad ])
49+ sizes = evaluator. backend. objective. expr. sizes
50+ @test sizes. ndims == [0 , 0 , 0 , 1 , 0 , 1 , 0 ]
51+ @test sizes. size_offset == [0 , 0 , 0 , 1 , 0 , 0 , 0 ]
52+ @test sizes. size == [1 , 1 ]
53+ @test sizes. storage_offset == [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
54+ x = [1.2 ]
55+ @test MOI. eval_objective (evaluator, x) == 2 * x[1 ]^ 2
56+ g = ones (1 )
57+ MOI. eval_objective_gradient (evaluator, g, x)
58+ @test g[1 ] == 4 x[1 ]
59+ return
60+ end
61+
4362function test_objective_dot_bivariate ()
4463 model = Nonlinear. Model ()
4564 x = MOI. VariableIndex (1 )
@@ -280,62 +299,62 @@ function test_objective_norm_of_row()
280299 return
281300end
282301
283- # function test_objective_norm_of_matrix()
284- # model = Nonlinear.Model()
285- # x1 = MOI.VariableIndex(1)
286- # x2 = MOI.VariableIndex(2)
287- # x3 = MOI.VariableIndex(3)
288- # x4 = MOI.VariableIndex(4)
289- # Nonlinear.set_objective(model, :(norm([$x1 $x2; $x3 $x4])))
290- # evaluator = Nonlinear.Evaluator(model, ArrayDiff.Mode(), [x1, x2, x3, x4])
291- # MOI.initialize(evaluator, [:Grad])
292- # sizes = evaluator.backend.objective.expr.sizes
293- # @test sizes.ndims == [0, 2, 2, 0, 0, 2, 0, 0]
294- # @test sizes.size_offset == [0, 4, 2, 0, 0, 0, 0, 0]
295- # @test sizes.size == [1, 2, 1, 2, 2, 2]
296- # @test sizes.storage_offset == [0, 1, 5, 7, 8, 9, 11, 12, 13]
297- # x1 = 1.0
298- # x2 = 2.0
299- # x3 = 3.0
300- # x4 = 4.0
301- # @test MOI.eval_objective(evaluator, [x1, x2, x3, x4]) == sqrt(30.0)
302- # g = ones(4)
303- # MOI.eval_objective_gradient(evaluator, g, [x1, x2, x3, x4])
304- # @test g == [
305- # 1.0 / sqrt(30.0),
306- # 2.0 / sqrt(30.0),
307- # 3.0 / sqrt(30.0),
308- # 4.0 / sqrt(30.0),
309- # ]
310- # return
311- # end
312- #
313- # function test_objective_norm_of_matrix_with_sum()
314- # model = Nonlinear.Model()
315- # x1 = MOI.VariableIndex(1)
316- # x2 = MOI.VariableIndex(2)
317- # x3 = MOI.VariableIndex(3)
318- # x4 = MOI.VariableIndex(4)
319- # Nonlinear.set_objective(model, :(norm([$x1 $x2; $x3 $x4] - [1 1; 1 1])))
320- # evaluator = Nonlinear.Evaluator(model, ArrayDiff.Mode(), [x1, x2, x3, x4])
321- # MOI.initialize(evaluator, [:Grad])
322- # sizes = evaluator.backend.objective.expr.sizes
323- # @test sizes.ndims == [0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0]
324- # @test sizes.size_offset ==
325- # [0, 12, 10, 8, 0, 0, 6, 0, 0, 4, 2, 0, 0, 0, 0, 0]
326- # @test sizes.size == [1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2]
327- # @test sizes.storage_offset ==
328- # [0, 1, 5, 9, 11, 12, 13, 15, 16, 17, 21, 23, 24, 25, 27, 28, 29]
329- # x1 = 1.0
330- # x2 = 2.0
331- # x3 = 3.0
332- # x4 = 4.0
333- # @test MOI.eval_objective(evaluator, [x1, x2, x3, x4]) == sqrt(14.0)
334- # g = ones(4)
335- # MOI.eval_objective_gradient(evaluator, g, [x1, x2, x3, x4])
336- # @test g == [0.0, 1.0 / sqrt(14.0), 2.0 / sqrt(14.0), 3.0 / sqrt(14.0)]
337- # return
338- # end
302+ function test_objective_norm_of_matrix ()
303+ model = Nonlinear. Model ()
304+ x1 = MOI. VariableIndex (1 )
305+ x2 = MOI. VariableIndex (2 )
306+ x3 = MOI. VariableIndex (3 )
307+ x4 = MOI. VariableIndex (4 )
308+ Nonlinear. set_objective (model, :(norm ([$ x1 $ x2; $ x3 $ x4])))
309+ evaluator = Nonlinear. Evaluator (model, ArrayDiff. Mode (), [x1, x2, x3, x4])
310+ MOI. initialize (evaluator, [:Grad ])
311+ sizes = evaluator. backend. objective. expr. sizes
312+ @test sizes. ndims == [0 , 2 , 2 , 0 , 0 , 2 , 0 , 0 ]
313+ @test sizes. size_offset == [0 , 4 , 2 , 0 , 0 , 0 , 0 , 0 ]
314+ @test sizes. size == [1 , 2 , 1 , 2 , 2 , 2 ]
315+ @test sizes. storage_offset == [0 , 1 , 5 , 7 , 8 , 9 , 11 , 12 , 13 ]
316+ x1 = 1.0
317+ x2 = 2.0
318+ x3 = 3.0
319+ x4 = 4.0
320+ @test MOI. eval_objective (evaluator, [x1, x2, x3, x4]) == sqrt (30.0 )
321+ g = ones (4 )
322+ MOI. eval_objective_gradient (evaluator, g, [x1, x2, x3, x4])
323+ @test g == [
324+ 1.0 / sqrt (30.0 ),
325+ 2.0 / sqrt (30.0 ),
326+ 3.0 / sqrt (30.0 ),
327+ 4.0 / sqrt (30.0 ),
328+ ]
329+ return
330+ end
331+
332+ function test_objective_norm_of_matrix_with_sum ()
333+ model = Nonlinear. Model ()
334+ x1 = MOI. VariableIndex (1 )
335+ x2 = MOI. VariableIndex (2 )
336+ x3 = MOI. VariableIndex (3 )
337+ x4 = MOI. VariableIndex (4 )
338+ Nonlinear. set_objective (model, :(norm ([$ x1 $ x2; $ x3 $ x4] - [1 1 ; 1 1 ])))
339+ evaluator = Nonlinear. Evaluator (model, ArrayDiff. Mode (), [x1, x2, x3, x4])
340+ MOI. initialize (evaluator, [:Grad ])
341+ sizes = evaluator. backend. objective. expr. sizes
342+ @test sizes. ndims == [0 , 2 , 2 , 2 , 0 , 0 , 2 , 0 , 0 , 2 , 2 , 0 , 0 , 2 , 0 , 0 ]
343+ @test sizes. size_offset ==
344+ [0 , 12 , 10 , 8 , 0 , 0 , 6 , 0 , 0 , 4 , 2 , 0 , 0 , 0 , 0 , 0 ]
345+ @test sizes. size == [1 , 2 , 1 , 2 , 2 , 2 , 1 , 2 , 1 , 2 , 2 , 2 , 2 , 2 ]
346+ @test sizes. storage_offset ==
347+ [0 , 1 , 5 , 9 , 11 , 12 , 13 , 15 , 16 , 17 , 21 , 23 , 24 , 25 , 27 , 28 , 29 ]
348+ x1 = 1.0
349+ x2 = 2.0
350+ x3 = 3.0
351+ x4 = 4.0
352+ @test MOI. eval_objective (evaluator, [x1, x2, x3, x4]) == sqrt (14.0 )
353+ g = ones (4 )
354+ MOI. eval_objective_gradient (evaluator, g, [x1, x2, x3, x4])
355+ @test g == [0.0 , 1.0 / sqrt (14.0 ), 2.0 / sqrt (14.0 ), 3.0 / sqrt (14.0 )]
356+ return
357+ end
339358
340359end # module
341360
0 commit comments