|
26 | 26 | ################################################################################ |
27 | 27 | DP.InfiniteLogical(prefs...) = DP.Logical(InfiniteOpt.Infinite(prefs...)) |
28 | 28 |
|
| 29 | +const _InfExpr = Union{ |
| 30 | + InfiniteOpt.GeneralVariableRef, |
| 31 | + JuMP.GenericAffExpr{<:Any, InfiniteOpt.GeneralVariableRef}, |
| 32 | + JuMP.GenericQuadExpr{<:Any, InfiniteOpt.GeneralVariableRef}, |
| 33 | + JuMP.GenericNonlinearExpr{InfiniteOpt.GeneralVariableRef} |
| 34 | +} |
| 35 | + |
| 36 | +# The parameters of every expression, in the order encountered |
| 37 | +function _union_parameter_refs(exprs) |
| 38 | + return unique!([pref for expr in exprs |
| 39 | + for pref in InfiniteOpt.parameter_refs(expr)]) |
| 40 | +end |
| 41 | + |
| 42 | +# A product indicator varies over the parameters of its parents, so the |
| 43 | +# linking constraints stay pointwise-consistent with the originals |
| 44 | +function DP.product_indicator_variable( |
| 45 | + model::InfiniteOpt.InfiniteModel, |
| 46 | + parents |
| 47 | + ) |
| 48 | + prefs = _union_parameter_refs(DP.binary_variable(p) for p in parents) |
| 49 | + lvar = DP.LogicalVariable(nothing, nothing, nothing) |
| 50 | + isempty(prefs) && return lvar |
| 51 | + return DP._TaggedLogicalVariable(lvar, InfiniteOpt.Infinite(prefs...)) |
| 52 | +end |
| 53 | + |
29 | 54 | _is_parameter(vref::InfiniteOpt.GeneralVariableRef) = |
30 | 55 | _is_parameter(InfiniteOpt.dispatch_variable_ref(vref)) |
31 | 56 | _is_parameter(::InfiniteOpt.DependentParameterRef) = true |
@@ -88,21 +113,8 @@ function DP.VariableProperties( |
88 | 113 | return DP.VariableProperties(info, "", nothing, var_type) |
89 | 114 | end |
90 | 115 |
|
91 | | -function DP.VariableProperties( |
92 | | - exprs::Vector{<:Union{ |
93 | | - InfiniteOpt.GeneralVariableRef, |
94 | | - JuMP.GenericAffExpr{<:Any, InfiniteOpt.GeneralVariableRef}, |
95 | | - JuMP.GenericQuadExpr{<:Any, InfiniteOpt.GeneralVariableRef}, |
96 | | - JuMP.GenericNonlinearExpr{InfiniteOpt.GeneralVariableRef} |
97 | | - }} |
98 | | -) |
99 | | - all_prefs = Set{InfiniteOpt.GeneralVariableRef}() |
100 | | - for expr in exprs |
101 | | - for pref in InfiniteOpt.parameter_refs(expr) |
102 | | - push!(all_prefs, pref) |
103 | | - end |
104 | | - end |
105 | | - prefs = Tuple(all_prefs) |
| 116 | +function DP.VariableProperties(exprs::AbstractVector{<:_InfExpr}) |
| 117 | + prefs = _union_parameter_refs(exprs) |
106 | 118 | info = DP._free_variable_info() |
107 | 119 | var_type = !isempty(prefs) ? InfiniteOpt.Infinite(prefs...) : nothing |
108 | 120 | return DP.VariableProperties(info, "", nothing, var_type) |
@@ -159,6 +171,34 @@ function JuMP.add_constraint( |
159 | 171 | error("Cannot add, subtract, or multiply with logical variables.") |
160 | 172 | end |
161 | 173 |
|
| 174 | +# Resolve the ambiguity between InfiniteOpt's generic |
| 175 | +# `delete(::InfiniteModel, vref)` and DP's typed deletes (needed when a |
| 176 | +# basic step deletes its inputs). The ref types must be concrete, since |
| 177 | +# a `Union` of them is not specific enough. |
| 178 | +function JuMP.delete( |
| 179 | + m::InfiniteOpt.InfiniteModel, cref::DP.DisjunctionRef |
| 180 | + ) |
| 181 | + return DP._delete(m, cref) |
| 182 | +end |
| 183 | + |
| 184 | +function JuMP.delete( |
| 185 | + m::InfiniteOpt.InfiniteModel, cref::DP.DisjunctConstraintRef |
| 186 | + ) |
| 187 | + return DP._delete(m, cref) |
| 188 | +end |
| 189 | + |
| 190 | +function JuMP.delete( |
| 191 | + m::InfiniteOpt.InfiniteModel, cref::DP.LogicalConstraintRef |
| 192 | + ) |
| 193 | + return DP._delete(m, cref) |
| 194 | +end |
| 195 | + |
| 196 | +function JuMP.delete( |
| 197 | + m::InfiniteOpt.InfiniteModel, vref::DP.LogicalVariableRef |
| 198 | + ) |
| 199 | + return DP._delete(m, vref) |
| 200 | +end |
| 201 | + |
162 | 202 | ################################################################################ |
163 | 203 | # METHODS |
164 | 204 | ################################################################################ |
|
0 commit comments