@@ -459,6 +459,70 @@ function test_copy_to_bug_172()
459
459
return
460
460
end
461
461
462
+ function test_quadratic_modification_from_affine ()
463
+ model = HiGHS. Optimizer ()
464
+ MOI. set (model, MOI. Silent (), true )
465
+ x = MOI. add_variable (model)
466
+ MOI. add_constraint (model, x, MOI. GreaterThan (2.0 ))
467
+ f = 2.0 * x + 1.0
468
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
469
+ MOI. set (model, attr, f)
470
+ MOI. optimize! (model)
471
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 5 , atol = 1e-5 )
472
+ F = MOI. ScalarQuadraticFunction{Float64}
473
+ attr = MOI. ObjectiveFunction {F} ()
474
+ MOI. modify (model, attr, MOI. ScalarQuadraticCoefficientChange (x, x, 3.0 ))
475
+ MOI. optimize! (model)
476
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 11 , atol = 1e-5 )
477
+ return
478
+ end
479
+
480
+ function test_quadratic_off_diagonal_modification ()
481
+ model = HiGHS. Optimizer ()
482
+ MOI. set (model, MOI. Silent (), true )
483
+ x = MOI. add_variables (model, 2 )
484
+ MOI. add_constraint .(model, x, MOI. GreaterThan .([2.0 , 3.0 ]))
485
+ f = 4.0 * x[1 ] * x[1 ] + 2.0 * x[1 ] * x[2 ] + 2.0 * x[2 ] * x[2 ]
486
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
487
+ MOI. set (model, attr, f)
488
+ MOI. optimize! (model)
489
+ a = MOI. get (model, MOI. VariablePrimal (), x)
490
+ y = 0.5 * a' * [8 2 ; 2 4 ] * a
491
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), y, atol = 1e-5 )
492
+ MOI. modify (
493
+ model,
494
+ attr,
495
+ MOI. ScalarQuadraticCoefficientChange (x[1 ], x[2 ], - 1.0 ),
496
+ )
497
+ MOI. optimize! (model)
498
+ a = MOI. get (model, MOI. VariablePrimal (), x)
499
+ y = 0.5 * a' * [8 - 1 ; - 1 4 ] * a
500
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), y, atol = 1e-5 )
501
+ return
502
+ end
503
+
504
+ function test_quadratic_diagonal_modification ()
505
+ model = HiGHS. Optimizer ()
506
+ MOI. set (model, MOI. Silent (), true )
507
+ x = MOI. add_variable (model)
508
+ MOI. add_constraint (model, x, MOI. GreaterThan (2.0 ))
509
+ f = 3.0 * x * x + 2.0 * x + 1.0
510
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
511
+ MOI. set (model, attr, f)
512
+ MOI. optimize! (model)
513
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 17 , atol = 1e-5 )
514
+ MOI. modify (model, attr, MOI. ScalarConstantChange (2.0 ))
515
+ MOI. optimize! (model)
516
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 18 , atol = 1e-5 )
517
+ MOI. modify (model, attr, MOI. ScalarCoefficientChange (x, 3.0 ))
518
+ MOI. optimize! (model)
519
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 20 , atol = 1e-5 )
520
+ MOI. modify (model, attr, MOI. ScalarQuadraticCoefficientChange (x, x, 8.0 ))
521
+ MOI. optimize! (model)
522
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 24 , atol = 1e-5 )
523
+ return
524
+ end
525
+
462
526
end
463
527
464
528
TestMOIHighs. runtests ()
0 commit comments