Skip to content

Commit 6f0cf81

Browse files
authored
Orthogonalize defaultgetindex (#487)
1 parent ffa7033 commit 6f0cf81

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

src/Operators/Operator.jl

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -245,35 +245,35 @@ getindex(B::Operator,k::Block{2}) = B[Block.(k.n)...]
245245

246246
## override getindex.
247247

248-
defaultgetindex(B::Operator,k::Integer) = error("Override [k] for $(typeof(B))")
249-
defaultgetindex(B::Operator,k::Integer,j::Integer) = error("Override [k,j] for $(typeof(B))")
250-
248+
defaultgetindex(B::Operator,k::Integer) =
249+
error("Override getindex(::$(typeof(B)), ::Integer)")
250+
defaultgetindex(B::Operator,k::Integer,j::Integer) =
251+
error("Override getindex(::$(typeof(B)), ::Integer, ::Integer)")
252+
defaultgetindex(A::Operator,kj::CartesianIndex) = A[Tuple(kj)...]
251253

252254
# Ranges
253255

256+
index_ndim(::Integer) = 0
257+
index_ndim(::Union{AbstractVector, Block, Colon}) = 1
258+
index_ndims(inds...) = Val(sum(index_ndim, inds))
254259

255-
defaultgetindex(op::Operator,kr::AbstractRange) = eltype(op)[op[k] for k in kr]
256-
defaultgetindex(B::Operator,k::Block,j::Block) = AbstractMatrix(view(B,k,j))
257-
defaultgetindex(B::Operator,k::AbstractRange,j::Block) = AbstractMatrix(view(B,k,j))
258-
defaultgetindex(B::Operator,k::Block,j::AbstractRange) = AbstractMatrix(view(B,k,j))
259-
defaultgetindex(B::Operator,k::AbstractRange,j::AbstractRange) = AbstractMatrix(view(B,k,j))
260-
261-
defaultgetindex(op::Operator,k::Integer,jr::AbstractRange) = eltype(op)[op[k,j] for j in jr]
262-
defaultgetindex(op::Operator,kr::AbstractRange,j::Integer) = eltype(op)[op[k,j] for k in kr]
263-
264-
defaultgetindex(B::Operator,k::Block,j::BlockRange) = AbstractMatrix(view(B,k,j))
265-
defaultgetindex(B::Operator,k::BlockRange,j::BlockRange) = AbstractMatrix(view(B,k,j))
260+
select_vectorinds(a, b...) = a
261+
select_vectorinds(a::Integer, b...) = select_vectorinds(b...)
266262

267-
defaultgetindex(op::Operator,k::Integer,jr::BlockRange) = eltype(op)[op[k,j] for j in jr]
268-
defaultgetindex(op::Operator,kr::BlockRange,j::Integer) = eltype(op)[op[k,j] for k in kr]
263+
combine_inds(inds::Tuple, k) = (k, combine_inds(inds[2:end], k)...)
264+
combine_inds(inds::Tuple{Integer,Vararg}, k) = (inds[1], combine_inds(inds[2:end], k)...)
265+
combine_inds(::Tuple{}, k) = ()
269266

267+
defaultgetindex(B::Operator, kj...) = defaultgetindex(B, index_ndims(kj...), kj...)
270268

271-
# Colon casdes
272-
defaultgetindex(A::Operator,kj::CartesianIndex{2}) = A[kj[1],kj[2]]
273-
defaultgetindex(A::Operator,kj::CartesianIndex{1}) = A[kj[1]]
274-
defaultgetindex(A::Operator,k,j) = view(A,k,j)
275-
269+
defaultgetindex(op::Operator, ::Val{1}, inds...) =
270+
eltype(op)[op[combine_inds(inds, k)...] for k in select_vectorinds(inds...)]
276271

272+
function defaultgetindex(B::Operator, ::Val{2}, inds...)
273+
S = view(B,inds...)
274+
all(isfinite, size(S)) || return S
275+
AbstractMatrix(S)
276+
end
277277

278278
# TODO: finite dimensional blocks
279279
blockcolstart(A::Operator, J::Block{1}) = Block(max(1,Int(J)-blockbandwidth(A,2)))

0 commit comments

Comments
 (0)