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