Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/Utilities/product_of_sets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ function rows(
) where {T,S}
@assert sets.final_touch
i = set_index(sets, S)
return (i == 1 ? 0 : sets.num_rows[i-1]) + ci.value + 1
return (i == 1 ? 0 : sets.num_rows[i-1]) + ci.value
end

function rows(
Expand All @@ -219,18 +219,18 @@ function rows(
@assert sets.final_touch
i = set_index(sets, S)
offset = i == 1 ? 0 : sets.num_rows[i-1]
return (ci.value + offset) .+ (1:sets.dimension[(i, ci.value)])
return (offset + ci.value - 1) .+ (1:sets.dimension[(i, ci.value)])
end

function add_set(sets::OrderedProductOfSets, i)
@assert !sets.final_touch
sets.num_rows[i] += 1
return sets.num_rows[i] - 1
return sets.num_rows[i]
end

function add_set(sets::OrderedProductOfSets, i, dim)
@assert !sets.final_touch
ci = sets.num_rows[i]
ci = sets.num_rows[i] + 1
sets.dimension[(i, ci)] = dim
sets.num_rows[i] += dim
return ci
Expand Down Expand Up @@ -275,14 +275,14 @@ end
Base.IteratorSize(::_UnevenIterator) = Base.SizeUnknown()

function Base.iterate(it::_UnevenIterator, cur = it.start)
if cur >= it.stop
if cur > it.stop
return nothing
end
return (cur, cur + it.dimension[(it.i, cur)])
end

function Base.in(x::Int64, it::_UnevenIterator)
return it.start <= x < it.stop && haskey(it.dimension, (it.i, x))
return it.start <= x <= it.stop && haskey(it.dimension, (it.i, x))
end

function _range_iterator(
Expand All @@ -292,7 +292,7 @@ function _range_iterator(
stop::Int,
::Type{MOI.ScalarAffineFunction{T}},
) where {T}
return start:(stop-1)
return start:stop
end

function _range_iterator(
Expand All @@ -314,7 +314,7 @@ function _range_iterator(
if i === nothing || F != _affine_function_type(T, S)
return
end
return _range_iterator(sets, i, 0, _num_rows(sets, S), F)
return _range_iterator(sets, i, 1, _num_rows(sets, S), F)
end

_length(::Nothing) = 0
Expand Down
8 changes: 4 additions & 4 deletions src/Utilities/sparse_matrix.jl
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,19 @@ mutable struct MutableSparseMatrixCSC{Tv,Ti<:Integer,I<:AbstractIndexing}
end
end

function MOI.empty!(A::MutableSparseMatrixCSC)
function MOI.empty!(A::MutableSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
A.m = 0
A.n = 0
resize!(A.colptr, 1)
A.colptr[1] = 0
A.colptr[1] = zero(Ti)
empty!(A.rowval)
empty!(A.nzval)
return
end

function add_column(A::MutableSparseMatrixCSC)
function add_column(A::MutableSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
A.n += 1
push!(A.colptr, 0)
push!(A.colptr, zero(Ti))
return
end

Expand Down
51 changes: 38 additions & 13 deletions test/Utilities/matrix_of_constraints.jl
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,8 @@ function _test(
bridged::Bool,
Indexing,
)
optimizer = MOIU.GenericOptimizer{
Float64,
MOIU.MatrixOfConstraints{
Float64,
MOIU.MutableSparseMatrixCSC{Float64,Int,Indexing},
ConstantsType,
ProductOfSetsType,
},
}()
optimizer =
matrix_instance(Float64, ConstantsType, ProductOfSetsType, Indexing)
_inner(model::MOI.Bridges.LazyBridgeOptimizer) = _inner(model.model)
_inner(model::MOI.Utilities.CachingOptimizer) = _inner(model.optimizer)
_inner(model::MOI.Utilities.MockOptimizer) = _inner(model.inner_model)
Expand Down Expand Up @@ -146,17 +139,21 @@ function _lp(model, ::MOI.Test.Config{T}) where {T}
return MOI.add_constraint(model, 5fx - 4fy, MOI.Interval(T(6), T(7)))
end

function matrix_lp(T::Type, ProductOfSetsType::Type)
optimizer = MOIU.GenericOptimizer{
function matrix_instance(
T::Type,
ConstantsType,
ProductOfSetsType::Type,
Indexing,
)
return MOIU.GenericOptimizer{
T,
MOIU.MatrixOfConstraints{
T,
MOIU.MutableSparseMatrixCSC{T,Int,Indexing},
MOI.Utilities.Box{T},
ConstantsType,
ProductOfSetsType,
},
}()
return MOI.Utilities.final_touch(optimizer)
end

MOIU.@mix_of_scalar_sets(
Expand Down Expand Up @@ -345,3 +342,31 @@ MOIU.@product_of_sets(NonnegNonpos, MOI.Nonnegatives, MOI.Nonpositives)
return _lin3_query(optimizer, [(F, MOI.Nonnegatives)])
end
end

function test_get_by_name(T::Type, SetsType::Type)
model = matrix_instance(
T,
MOI.Utilities.Box{T},
SetsType,
MOI.Utilities.OneBasedIndexing,
)
MOI.empty!(model)
x = MOI.add_variable(model)
fx = MOI.SingleVariable(x)
c = MOI.add_constraint(model, one(T) * fx, MOI.EqualTo(one(T)))
MOI.set(model, MOI.ConstraintName(), c, "c")
@test "c" == MOI.get(model, MOI.ConstraintName(), c)
@test c == MOI.get(model, MOI.ConstraintIndex, "c")
@test c == MOI.get(model, typeof(c), "c")
end
function test_get_by_name()
for T in [Int, Float64]
for SetsType in [MixLP{T}, OrdLP{T}]
test_get_by_name(T, SetsType)
end
end
end

@testset "Get constraint by name" begin
test_get_by_name()
end
6 changes: 3 additions & 3 deletions test/Utilities/product_of_sets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -262,13 +262,13 @@ function test_vector_ListOfConstraintIndices()
VAF = MOI.VectorAffineFunction{Float64}
@test MOI.get(sets, MOI.ListOfConstraintIndices{VAF,MOI.Zeros}()) ==
MOI.ConstraintIndex{VAF,MOI.Zeros}[]
for (x, S) in zip([[0], [0, 2]], MOI.Utilities.set_types(sets)[1:2])
for (x, S) in zip([[1], [1, 3]], MOI.Utilities.set_types(sets)[1:2])
ci = MOI.get(sets, MOI.ListOfConstraintIndices{VAF,S}())
@test ci == MOI.ConstraintIndex{VAF,S}.(x)
end
F, S = MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}
@test MOI.get(sets, MOI.ListOfConstraintIndices{F,S}()) ==
[MOI.ConstraintIndex{F,S}(0)]
[MOI.ConstraintIndex{F,S}(1)]
return
end

Expand All @@ -288,7 +288,7 @@ function test_vector_ListOfConstraintIndices2()
S = MOI.Utilities.set_types(sets)[2]
VAF = MOI.VectorAffineFunction{Float64}
indices = MOI.get(sets, MOI.ListOfConstraintIndices{VAF,S}())
@test indices == MOI.ConstraintIndex{VAF,S}.([0, 2, 5, 7])
@test indices == MOI.ConstraintIndex{VAF,S}.([1, 3, 6, 8])
end

end
Expand Down