@@ -8,8 +8,8 @@ struct OpName{Name,Params}
88end
99name (:: OpName{Name} ) where {Name} = Name
1010params (n:: OpName ) = getfield (n, :params )
11-
1211Base. getproperty (n:: OpName , name:: Symbol ) = getfield (params (n), name)
12+ Base. get (t:: OpName , name:: Symbol , default) = get (params (t), name, default)
1313
1414OpName {N} (; kwargs... ) where {N} = OpName {N} ((; kwargs... ))
1515
5454# Generic to `StateName` or `OpName`.
5555const StateOrOpName = Union{StateName,OpName}
5656alias (n:: StateOrOpName ) = n
57- function (arrtype:: Type{<:AbstractArray} )(n:: StateOrOpName , domain:: Integer... )
57+ function (arrtype:: Type{<:AbstractArray} )(
58+ n:: StateOrOpName , domain:: Union{Integer,AbstractUnitRange} ...
59+ )
5860 return arrtype (n, domain)
5961end
6062(arrtype:: Type{<:AbstractArray} )(n:: StateOrOpName , ts:: SiteType... ) = arrtype (n, ts)
@@ -87,32 +89,50 @@ function nsites(n::StateOrOpName)
8789 return nsites (n′)
8890end
8991
92+ function array (a:: AbstractArray , ax:: Tuple{Vararg{AbstractUnitRange}} )
93+ return a[ax... ]
94+ end
95+
9096function op_convert (
9197 arrtype:: Type{<:AbstractArray{<:Any,N}} ,
92- domain:: Tuple{Vararg{Integer }} ,
98+ domain:: Tuple{Vararg{AbstractUnitRange }} ,
9399 a:: AbstractArray{<:Any,N} ,
94100) where {N}
95- # TODO : Check the dimensions.
96- return convert (arrtype, a)
101+ ax = (domain... , domain... )
102+ a′ = array (a, ax)
103+ return convert (arrtype, a′)
97104end
98105function op_convert (
99- arrtype:: Type{<:AbstractArray} , domain:: Tuple{Vararg{Integer }} , a:: AbstractArray
106+ arrtype:: Type{<:AbstractArray} , domain:: Tuple{Vararg{AbstractUnitRange }} , a:: AbstractArray
100107)
101- # TODO : Check the dimensions.
102- return convert (arrtype, a)
108+ ax = (domain... , domain... )
109+ a′ = array (a, ax)
110+ return convert (arrtype, a′)
103111end
104112function op_convert (
105- arrtype:: Type{<:AbstractArray{<:Any,N}} , domain:: Tuple{Vararg{Integer}} , a:: AbstractArray
113+ arrtype:: Type{<:AbstractArray{<:Any,N}} ,
114+ domain:: Tuple{Vararg{AbstractUnitRange}} ,
115+ a:: AbstractArray ,
106116) where {N}
107- size = (domain... , domain... )
108- @assert length (size) == N
109- return convert (arrtype, reshape (a, size))
117+ ax = (domain... , domain... )
118+ @assert length (ax) == N
119+ a′ = reshape (a, length .(ax))
120+ a′′ = array (a′, ax)
121+ return convert (arrtype, a′′)
110122end
111123function (arrtype:: Type{<:AbstractArray} )(n:: OpName , domain:: Tuple{Vararg{SiteType}} )
112- return op_convert (arrtype, length .(domain), n (domain... ))
124+ domain′ = AbstractUnitRange .(domain)
125+ return op_convert (arrtype, domain′, n (domain... ))
126+ end
127+
128+ function (arrtype:: Type{<:AbstractArray} )(
129+ n:: OpName , domain:: Tuple{Vararg{AbstractUnitRange}}
130+ )
131+ # TODO : Make `(::OpName)(domain...)` constructor process more general inputs.
132+ return op_convert (arrtype, domain, n (Int .(length .(domain))... ))
113133end
114134function (arrtype:: Type{<:AbstractArray} )(n:: OpName , domain:: Tuple{Vararg{Integer}} )
115- return op_convert ( arrtype, domain, n ( Int . (domain) ... ))
135+ return arrtype (n, Base . oneto . (domain))
116136end
117137
118138function op (arrtype:: Type{<:AbstractArray} , n:: String , domain... ; kwargs... )
0 commit comments