diff --git a/src/general_variables.jl b/src/general_variables.jl index 3a13d205..37380033 100644 --- a/src/general_variables.jl +++ b/src/general_variables.jl @@ -53,15 +53,23 @@ julia> index(vref) FiniteVariableIndex(1) ``` """ -function JuMP.index(vref::GeneralVariableRef)::AbstractInfOptIndex - index_type = _index_type(vref) - if index_type == DependentParameterIndex - return index_type(DependentParametersIndex(_raw_index(vref)), - _param_index(vref)) - else - return index_type(_raw_index(vref)) +function JuMP.index(vref::GeneralVariableRef) + return JuMP.index(vref.index_type, vref) +end + +# Implement dispatch functions +for idx in (:IndependentParameterIndex, :FiniteParameterIndex, + :InfiniteVariableIndex, :SemiInfiniteVariableIndex, + :PointVariableIndex, :MeasureIndex, :DerivativeIndex, + :FiniteVariableIndex, :ParameterFunctionIndex) + @eval begin + JuMP.index(::Type{$idx}, vref::GeneralVariableRef) = $idx(vref.raw_index) end end +function JuMP.index(::Type{DependentParameterIndex}, vref::GeneralVariableRef) + return DependentParameterIndex(DependentParametersIndex(vref.raw_index), + vref.param_index) +end """ JuMP.index(vref::DispatchVariableRef)::AbstractInfOptIndex diff --git a/test/utilities.jl b/test/utilities.jl index a91a4167..b5447191 100644 --- a/test/utilities.jl +++ b/test/utilities.jl @@ -44,6 +44,7 @@ struct TestVariableRef <: DispatchVariableRef index::TestIndex end InfiniteOpt.dispatch_variable_ref(m::InfiniteModel, i::TestIndex) = TestVariableRef(m, i) +JuMP.index(::Type{TestIndex}, v::GeneralVariableRef) = TestIndex(v.raw_index) struct TestIndex2 <: ObjectIndex value::Int @@ -53,6 +54,7 @@ struct TestVariableRef2 <: DispatchVariableRef index::TestIndex2 end InfiniteOpt.dispatch_variable_ref(m::InfiniteModel, i::TestIndex2) = TestVariableRef2(m, i) +JuMP.index(::Type{TestIndex2}, v::GeneralVariableRef) = TestIndex2(v.raw_index) JuMP.name(::TestVariableRef2) = "test" InfiniteOpt.support_label(::TestGenMethod) = InternalLabel