55 SingleVariable -in- EqualTo
66 SingleVariable -in- Interval
77
8- TODO
9-
10- Binary
118 SingleVariable -in- ZeroOne
129 SingleVariable -in- Integer
10+ SingleVariable -in- Semiinteger
11+ SingleVariable -in- Semicontinuous
1312=#
1413constrdict (m:: LinQuadOptimizer , :: SVCI{LE} ) = cmap (m). upper_bound
1514constrdict (m:: LinQuadOptimizer , :: SVCI{GE} ) = cmap (m). lower_bound
@@ -19,6 +18,9 @@ constrdict(m::LinQuadOptimizer, ::SVCI{IV}) = cmap(m).interval_bound
1918constrdict (m:: LinQuadOptimizer , :: SVCI{MOI.ZeroOne} ) = cmap (m). binary
2019constrdict (m:: LinQuadOptimizer , :: SVCI{MOI.Integer} ) = cmap (m). integer
2120
21+ constrdict (m:: LinQuadOptimizer , :: SVCI{MOI.Semicontinuous{Float64}} ) = cmap (m). semicontinuous
22+ constrdict (m:: LinQuadOptimizer , :: SVCI{MOI.Semiinteger{Float64}} ) = cmap (m). semiinteger
23+
2224function setvariablebound! (m:: LinQuadOptimizer , col:: Int , bound:: Float64 , sense:: Cchar )
2325 change_variable_bounds! (m, [col], [bound], [sense])
2426end
@@ -49,7 +51,7 @@ function MOI.addconstraint!(m::LinQuadOptimizer, v::SinVar, set::S) where S <: L
4951end
5052
5153# delete constraint
52- MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{S} ) where S <: LinSets = true
54+ MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{S} ) where S <: LinSets = MOI . isvalid (m, c)
5355function MOI. delete! (m:: LinQuadOptimizer , c:: SVCI{S} ) where S <: LinSets
5456 deleteconstraintname! (m, c)
5557 dict = constrdict (m, c)
@@ -116,7 +118,7 @@ function MOI.addconstraint!(m::LinQuadOptimizer, v::SinVar, set::MOI.ZeroOne)
116118 ref
117119end
118120
119- MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{MOI.ZeroOne} ) = true
121+ MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{MOI.ZeroOne} ) = MOI . isvalid (m, c)
120122function MOI. delete! (m:: LinQuadOptimizer , c:: SVCI{MOI.ZeroOne} )
121123 deleteconstraintname! (m, c)
122124 dict = constrdict (m, c)
@@ -134,7 +136,7 @@ MOI.canget(m::LinQuadOptimizer, ::MOI.ConstraintSet, ::Type{SVCI{MOI.ZeroOne}})
134136MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintSet , c:: SVCI{MOI.ZeroOne} ) = MOI. ZeroOne ()
135137
136138MOI. canget (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , :: Type{SVCI{MOI.ZeroOne}} ) = true
137- MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , c:: SVCI{MOI.ZeroOne} ) = m[c]
139+ MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , c:: SVCI{MOI.ZeroOne} ) = SinVar ( m[c][ 1 ])
138140
139141#=
140142 Integer constraints
@@ -150,6 +152,7 @@ function MOI.addconstraint!(m::LinQuadOptimizer, v::SinVar, set::MOI.Integer)
150152 ref
151153end
152154
155+ MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{MOI.Integer} ) = MOI. isvalid (m, c)
153156function MOI. delete! (m:: LinQuadOptimizer , c:: SVCI{MOI.Integer} )
154157 deleteconstraintname! (m, c)
155158 dict = constrdict (m, c)
@@ -160,10 +163,52 @@ function MOI.delete!(m::LinQuadOptimizer, c::SVCI{MOI.Integer})
160163 make_problem_type_continuous (m)
161164 end
162165end
163- MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{MOI.Integer} ) = true
164166
165167MOI. canget (m:: LinQuadOptimizer , :: MOI.ConstraintSet , :: Type{SVCI{MOI.Integer}} ) = true
166168MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintSet , c:: SVCI{MOI.Integer} ) = MOI. Integer ()
167169
168- MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , c:: SVCI{MOI.Integer} ) = m[c]
169170MOI. canget (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , :: Type{SVCI{MOI.Integer}} ) = true
171+ MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , c:: SVCI{MOI.Integer} ) = SinVar (m[c])
172+
173+ #=
174+ Semicontinuous / Semiinteger constraints
175+ =#
176+ const SEMI_TYPES = Union{MOI. Semicontinuous{Float64}, MOI. Semiinteger{Float64}}
177+ function MOI. addconstraint! (m:: LinQuadOptimizer , v:: SinVar , set:: SEMI_TYPES )
178+ change_variable_types! (m, [getcol (m, v)], [backend_type (m, set)])
179+ setvariablebound! (m, getcol (m, v), set. upper, backend_type (m, Val {:Upperbound} ()))
180+ setvariablebound! (m, getcol (m, v), set. lower, backend_type (m, Val {:Lowerbound} ()))
181+
182+ m. last_constraint_reference += 1
183+ ref = SVCI {typeof(set)} (m. last_constraint_reference)
184+ dict = constrdict (m, ref)
185+ dict[ref] = v. variable
186+ make_problem_type_integer (m)
187+ ref
188+ end
189+
190+ MOI. candelete (m:: LinQuadOptimizer , c:: SVCI{<:SEMI_TYPES} ) = MOI. isvalid (m, c)
191+ function MOI. delete! (m:: LinQuadOptimizer , c:: SVCI{<:SEMI_TYPES} )
192+ deleteconstraintname! (m, c)
193+ dict = constrdict (m, c)
194+ v = dict[c]
195+ change_variable_types! (m, [getcol (m, v)], [backend_type (m, Val {:Continuous} ())])
196+ setvariablebound! (m, getcol (m, v), Inf , backend_type (m, Val {:Upperbound} ()))
197+ setvariablebound! (m, getcol (m, v), - Inf , backend_type (m, Val {:Lowerbound} ()))
198+ delete! (dict, c)
199+ if ! hasinteger (m)
200+ make_problem_type_continuous (m)
201+ end
202+ end
203+
204+ MOI. canget (m:: LinQuadOptimizer , :: MOI.ConstraintSet , :: Type{SVCI{S}} ) where S <: SEMI_TYPES = true
205+ function MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintSet , c:: SVCI{S} ) where S <: SEMI_TYPES
206+ dict = constrdict (m, c)
207+ v = dict[c]
208+ lb = get_variable_lowerbound (m, getcol (m, v))
209+ ub = get_variable_upperbound (m, getcol (m, v))
210+ return S (lb, ub)
211+ end
212+
213+ MOI. canget (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , :: Type{SVCI{S}} ) where S <: SEMI_TYPES = true
214+ MOI. get (m:: LinQuadOptimizer , :: MOI.ConstraintFunction , c:: SVCI{<:SEMI_TYPES} ) = SinVar (m[c])
0 commit comments