@@ -476,6 +476,70 @@ function test_relax_integrality_after_solve()
476
476
return
477
477
end
478
478
479
+ function test_quadratic_modification_from_affine ()
480
+ model = HiGHS. Optimizer ()
481
+ MOI. set (model, MOI. Silent (), true )
482
+ x = MOI. add_variable (model)
483
+ MOI. add_constraint (model, x, MOI. GreaterThan (2.0 ))
484
+ f = 2.0 * x + 1.0
485
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
486
+ MOI. set (model, attr, f)
487
+ MOI. optimize! (model)
488
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 5 , atol = 1e-5 )
489
+ F = MOI. ScalarQuadraticFunction{Float64}
490
+ attr = MOI. ObjectiveFunction {F} ()
491
+ MOI. modify (model, attr, MOI. ScalarQuadraticCoefficientChange (x, x, 3.0 ))
492
+ MOI. optimize! (model)
493
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 11 , atol = 1e-5 )
494
+ return
495
+ end
496
+
497
+ function test_quadratic_off_diagonal_modification ()
498
+ model = HiGHS. Optimizer ()
499
+ MOI. set (model, MOI. Silent (), true )
500
+ x = MOI. add_variables (model, 2 )
501
+ MOI. add_constraint .(model, x, MOI. GreaterThan .([2.0 , 3.0 ]))
502
+ f = 4.0 * x[1 ] * x[1 ] + 2.0 * x[1 ] * x[2 ] + 2.0 * x[2 ] * x[2 ]
503
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
504
+ MOI. set (model, attr, f)
505
+ MOI. optimize! (model)
506
+ a = MOI. get (model, MOI. VariablePrimal (), x)
507
+ y = 0.5 * a' * [8 2 ; 2 4 ] * a
508
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), y, atol = 1e-5 )
509
+ MOI. modify (
510
+ model,
511
+ attr,
512
+ MOI. ScalarQuadraticCoefficientChange (x[1 ], x[2 ], - 1.0 ),
513
+ )
514
+ MOI. optimize! (model)
515
+ a = MOI. get (model, MOI. VariablePrimal (), x)
516
+ y = 0.5 * a' * [8 - 1 ; - 1 4 ] * a
517
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), y, atol = 1e-5 )
518
+ return
519
+ end
520
+
521
+ function test_quadratic_diagonal_modification ()
522
+ model = HiGHS. Optimizer ()
523
+ MOI. set (model, MOI. Silent (), true )
524
+ x = MOI. add_variable (model)
525
+ MOI. add_constraint (model, x, MOI. GreaterThan (2.0 ))
526
+ f = 3.0 * x * x + 2.0 * x + 1.0
527
+ attr = MOI. ObjectiveFunction {typeof(f)} ()
528
+ MOI. set (model, attr, f)
529
+ MOI. optimize! (model)
530
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 17 , atol = 1e-5 )
531
+ MOI. modify (model, attr, MOI. ScalarConstantChange (2.0 ))
532
+ MOI. optimize! (model)
533
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 18 , atol = 1e-5 )
534
+ MOI. modify (model, attr, MOI. ScalarCoefficientChange (x, 3.0 ))
535
+ MOI. optimize! (model)
536
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 20 , atol = 1e-5 )
537
+ MOI. modify (model, attr, MOI. ScalarQuadraticCoefficientChange (x, x, 8.0 ))
538
+ MOI. optimize! (model)
539
+ @test isapprox (MOI. get (model, MOI. ObjectiveValue ()), 24 , atol = 1e-5 )
540
+ return
541
+ end
542
+
479
543
end
480
544
481
545
TestMOIHighs. runtests ()
0 commit comments