@@ -479,3 +479,58 @@ for state in (MOIU.NO_OPTIMIZER, MOIU.EMPTY_OPTIMIZER, MOIU.ATTACHED_OPTIMIZER)
479
479
end
480
480
end
481
481
end
482
+
483
+ mutable struct NoFreeVariables <: MOI.AbstractOptimizer
484
+ inner:: MOIU.Model{Float64}
485
+ function NoFreeVariables ()
486
+ return new (MOIU. Model {Float64} ())
487
+ end
488
+ end
489
+ MOI. is_empty (model:: NoFreeVariables ) = MOI. is_empty (model. inner)
490
+ MOI. empty! (model:: NoFreeVariables ) = MOI. empty! (model. inner)
491
+ MOI. get (model:: NoFreeVariables , attr:: MOI.AnyAttribute , idx:: Vector ) = MOI. get (model. inner, attr, idx)
492
+ MOI. get (model:: NoFreeVariables , attr:: MOI.AnyAttribute , args... ) = MOI. get (model. inner, attr, args... )
493
+ MOI. supports_add_constrained_variables (:: NoFreeVariables , :: Type{MOI.Reals} ) = false
494
+ MOI. supports_add_constrained_variable (:: NoFreeVariables , :: Type{<:MOI.AbstractScalarSet} ) = true
495
+ function MOI. add_constrained_variable (model:: NoFreeVariables , set:: MOI.AbstractScalarSet )
496
+ return MOI. add_constrained_variable (model. inner, set)
497
+ end
498
+ MOI. supports_add_constrained_variables (:: NoFreeVariables , :: Type{<:MOI.AbstractVectorSet} ) = true
499
+ function MOI. add_constrained_variables (model:: NoFreeVariables , set:: MOI.AbstractVectorSet )
500
+ return MOI. add_constrained_variables (model. inner, set)
501
+ end
502
+
503
+ MOI. Utilities. supports_default_copy_to (:: NoFreeVariables , names:: Bool ) = ! names
504
+ function MOI. copy_to (dest:: NoFreeVariables , src:: MOI.ModelLike ; kwargs... )
505
+ return MOI. Utilities. automatic_copy_to (dest, src; kwargs... )
506
+ end
507
+
508
+ function constrained_variables_test (model)
509
+ @test ! MOI. supports_add_constrained_variables (model, MOI. Reals)
510
+ @test MOI. supports_add_constrained_variable (model, MOI. ZeroOne)
511
+ @test ! MOI. supports_constraint (model, MOI. SingleVariable, MOI. ZeroOne)
512
+ @test MOI. supports_add_constrained_variables (model, MOI. Nonnegatives)
513
+ @test ! MOI. supports_constraint (model, MOI. VectorOfVariables, MOI. Nonnegatives)
514
+ scalar_set = MOI. ZeroOne ()
515
+ x, cx = MOI. add_constrained_variable (model, scalar_set)
516
+ vector_set = MOI. Nonnegatives (2 )
517
+ y, cy = MOI. add_constrained_variables (model, vector_set)
518
+ constraint_types = Set ([(MOI. SingleVariable, MOI. ZeroOne), (MOI. VectorOfVariables, MOI. Nonnegatives)])
519
+ @test Set (MOI. get (model. model_cache, MOI. ListOfConstraints ())) == constraint_types
520
+ if MOIU. state (model) == MOIU. EMPTY_OPTIMIZER
521
+ MOIU. attach_optimizer (model)
522
+ end
523
+ @test Set (MOI. get (model. optimizer, MOI. ListOfConstraints ())) == constraint_types
524
+ end
525
+
526
+ @testset " Constrained Variables" begin
527
+ cache = NoFreeVariables ()
528
+ optimizer = NoFreeVariables ()
529
+ model = MOIU. CachingOptimizer (cache, optimizer)
530
+ constrained_variables_test (model)
531
+ MOI. empty! (cache)
532
+ MOI. empty! (optimizer)
533
+ model = MOIU. CachingOptimizer (cache, MOIU. AUTOMATIC)
534
+ MOIU. reset_optimizer (model, optimizer)
535
+ constrained_variables_test (model)
536
+ end
0 commit comments