From 0aeac4b054008a3a795bae6540b12cf6b3e1c459 Mon Sep 17 00:00:00 2001 From: Mitch Phillipson Date: Thu, 9 May 2024 11:48:46 -0500 Subject: [PATCH 1/3] Added alias support --- src/dense_sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dense_sparse.jl b/src/dense_sparse.jl index b0cf33f..fc056dd 100644 --- a/src/dense_sparse.jl +++ b/src/dense_sparse.jl @@ -22,7 +22,7 @@ description(P::DenseSparseArray) = "" -@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d]) ? (x == d ? [[i] for i∈GU[d]] : [[x]]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) +@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d].aliases || x∈GU[d]) ? (x == d || x∈GU[d].aliases ? [[i] for i∈GU[d]] : [[x]]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) function _convert_idx(x::Vector,GU::GamsUniverse,d::Symbol) From 64df2f89d7f74995d40811f4b1dca73069b8bfb4 Mon Sep 17 00:00:00 2001 From: Mitch Phillipson Date: Thu, 9 May 2024 11:52:16 -0500 Subject: [PATCH 2/3] Revert "Merge branch 'main' of https://github.com/mitchphillipson/GamsStructure.jl" This reverts commit b184f859765e49c80b9de6c040301d0a571671bd, reversing changes made to 0aeac4b054008a3a795bae6540b12cf6b3e1c459. --- src/dense_sparse.jl | 56 ++++++++++++++++++++++++++++----------------- src/parameter.jl | 55 -------------------------------------------- 2 files changed, 35 insertions(+), 76 deletions(-) diff --git a/src/dense_sparse.jl b/src/dense_sparse.jl index 88a02c9..fc056dd 100644 --- a/src/dense_sparse.jl +++ b/src/dense_sparse.jl @@ -22,17 +22,17 @@ description(P::DenseSparseArray) = "" -@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d].aliases || x∈GU[d]) ? (x == d || x∈GU[d].aliases ? [i for i∈GU[d]] : [x]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) +@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d].aliases || x∈GU[d]) ? (x == d || x∈GU[d].aliases ? [[i] for i∈GU[d]] : [[x]]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) function _convert_idx(x::Vector,GU::GamsUniverse,d::Symbol) @assert (all(i∈GU[d] for i∈x)) "At least one element of $x is not in set $d" - return x + return [[i] for i∈x] end function _convert_idx(x::GamsSet,GU::GamsUniverse,d::Symbol) @assert x==GU[d] "The set\n\n$x\ndoes not match the domain set $d" - return [i for i∈x] + return [[i] for i∈x] end @@ -49,45 +49,59 @@ function Base.getindex(P::DenseSparseArray{T,N},idx::CartesianIndex{N}) where {T end +""" -#Assume input has no masks -function Base.getindex(P::DenseSparseArray{T,N},idx::Vararg{Any,N}) where {T,N} - return _getindex(P,idx...) +if v = [:a,:b,:c,:d,:e] and p = (2,2,1) + +we expect output of + +[[:a,:b],[:c,:d],[:e]] +""" +function partition(v,p) + ind = ((sum(p[i] for i∈1:n;init=1),sum(p[i] for i∈1:(n+1);init=1)-1) for n∈0:(length(p)-1)) + return [[v[i] for i∈a:b] for (a,b)∈ind] +end + +function dimension(x) + return 1 end +function Base.getindex(P::DenseSparseArray{T,N},idx::Vararg{Any}) where {T,N} + domain_match = partition(domain(P),dimension.(idx)) #Used for masking -function _getindex(P::DenseSparseArray{T,N},idx::Vararg{Any,N}) where {T,N} + @assert sum(length.(domain_match)) == dimension(P) "Not enough inputs, or something. Get a better error message" + GU = universe(P) - d = domain(P) + idx = map((x,d)->_convert_idx(x,GU,d...),idx,domain_match) - idx = map((x,d) -> _convert_idx(x,GU,d), idx, d) |> - x -> collect(Iterators.product(x...)) |> - x -> dropdims(x,dims=tuple(findall(size(x).==1)...)) + X = Tuple.(Iterators.flatten.(Iterators.product(idx...))) data_dict = data(P) - length(idx) == 1 ? get(data_dict,idx[1],zero(T)) : get.(Ref(data_dict),idx,zero(T)) + length(X) == 1 ? get(data_dict,X[1],0) : get.(Ref(data_dict),X,0) end + ################ ### setindex ### ################ function Base.setindex!(P::DenseSparseArray{T,N}, value, idx::Vararg{Any,N}) where {T,N} - #domain_match = partition(domain(P),dimension.(idx)) - #@assert sum(length.(domain_match)) == dimension(P) "Not enough inputs, or something. Get a better error message" + domain_match = partition(domain(P),dimension.(idx)) + @assert sum(length.(domain_match)) == dimension(P) "Not enough inputs, or something. Get a better error message" GU = universe(P) - d = domain(P) - idx = map((x,d) -> _convert_idx(x,GU,d), idx, d) - - idx = collect(Iterators.product(idx...)) + idx = map((x,d)->_convert_idx(x,GU,d...),idx,domain_match) + + X = Tuple.(Iterators.flatten.(Iterators.product(idx...))) + + - if length(idx) == 1 - _setindex!(P,value,idx[1]) + if length(X) == 1 + _setindex!(P,value,X[1]) else - _setindex!.(Ref(P), value, idx) + _setindex!.(Ref(P), value, X) end end diff --git a/src/parameter.jl b/src/parameter.jl index 351dad5..7b5ff3b 100644 --- a/src/parameter.jl +++ b/src/parameter.jl @@ -17,61 +17,6 @@ function _convert_idx(x::Mask,GU::GamsUniverse,d::Vararg{Symbol}) return keys(data(x)) end -""" - -if v = [:a,:b,:c,:d,:e] and p = (2,2,1) - -we expect output of - -[[:a,:b],[:c,:d],[:e]] -""" -function partition(v,p) - ind = ((sum(p[i] for i∈1:n;init=1),sum(p[i] for i∈1:(n+1);init=1)-1) for n∈0:(length(p)-1)) - return [[v[i] for i∈a:b] for (a,b)∈ind] -end - -function dimension(x) - return 1 -end - -function Base.getindex(P::Parameter{T,N},idx::Vararg{Any}) where {T,N} - if any(isa(x,Mask) for x∈idx) - _getindex_mask(P,idx...) - else - - GamsStructure._getindex(P,idx...) - end -end - -""" - Code from TupleTools.jl package -""" -flatten(x::Any) = (x,) -flatten(t::Tuple{}) = () -flatten(t::Tuple) = (flatten(t[1])..., flatten(Base.tail(t))...) -flatten(x, r...) = (flatten(x)..., flatten(r)...) - -function _getindex_mask(P::Parameter{T,N},idx...) where {T,N} - - GU = GamsStructure.universe(P) - d = GamsStructure.domain(P) - - domain_match = GamsStructure.partition(d,GamsStructure.dimension.(idx)) - - idx = map((x,d) -> GamsStructure._convert_idx(x,GU,d...), idx, domain_match) |> - x -> GamsStructure.collect(Iterators.product(x...)) |> - x -> GamsStructure.dropdims(x,dims=tuple(findall(size(x).==1)...)) |> - x -> flatten.(x) - - - #return idx - data_dict = GamsStructure.data(P) - length(idx) == 1 ? get(data_dict,idx[1],zero(T)) : get.(Ref(data_dict),idx,zero(T)) - -end - - - """ @create_parameters(GU,block) From feecad5cf96be5b8bc1b61ee4ef0d0d8e0b48230 Mon Sep 17 00:00:00 2001 From: Mitch Phillipson Date: Thu, 9 May 2024 11:52:40 -0500 Subject: [PATCH 3/3] Revert "Added alias support" This reverts commit 0aeac4b054008a3a795bae6540b12cf6b3e1c459. --- src/dense_sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dense_sparse.jl b/src/dense_sparse.jl index fc056dd..b0cf33f 100644 --- a/src/dense_sparse.jl +++ b/src/dense_sparse.jl @@ -22,7 +22,7 @@ description(P::DenseSparseArray) = "" -@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d].aliases || x∈GU[d]) ? (x == d || x∈GU[d].aliases ? [[i] for i∈GU[d]] : [[x]]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) +@inline _convert_idx(x::Symbol,GU::GamsUniverse,d::Symbol) = (x==d || x∈GU[d]) ? (x == d ? [[i] for i∈GU[d]] : [[x]]) : throw(DomainError(x, "Symbol $x is neither a set nor an element of the set $d.")) function _convert_idx(x::Vector,GU::GamsUniverse,d::Symbol)