Skip to content

Commit ffc05f2

Browse files
authored
Merge pull request #174 from vpuri3/compose_cache
clean up caching for composeoperator
2 parents 8c981be + 3561160 commit ffc05f2

File tree

1 file changed

+11
-19
lines changed

1 file changed

+11
-19
lines changed

src/basic.jl

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -578,32 +578,24 @@ function Base.:*(L::ComposedOperator, u::AbstractVecOrMat)
578578
end
579579

580580
function cache_self(L::ComposedOperator, u::AbstractVecOrMat)
581-
if has_mul(L)
582-
vec = zero(u)
583-
cache = (vec,)
584-
for i in reverse(2:length(L.ops))
585-
vec = L.ops[i] * vec
586-
cache = (vec, cache...)
587-
end
588-
elseif has_ldiv(L)
589-
m = size(L, 1)
590-
k = size(u, 2)
591-
vec = u isa AbstractMatrix ? similar(u, (m, k)) : similar(u, (m,))
592-
cache = ()
593-
for i in 1:length(L.ops)
594-
vec = L.ops[i] \ vec
595-
cache = (cache..., vec)
596-
end
597-
else
598-
error("ComposedOperator cannot be cached without supporting either mul or ldiv.")
581+
582+
K = size(u, 2)
583+
cache = (zero(u),)
584+
for i in reverse(2:length(L.ops))
585+
586+
M = size(L.ops[i], 1)
587+
T = promote_type(eltype.((L.ops[i], cache[1]))...)
588+
sz = u isa AbstractMatrix ? (M, K) : (M,)
589+
590+
cache = (similar(u, T, sz), cache...)
599591
end
600592

601593
@set! L.cache = cache
602594
L
603595
end
604596

605597
function cache_internals(L::ComposedOperator, u::AbstractVecOrMat)
606-
if !iscached(L)
598+
if isnothing(L.cache)
607599
L = cache_self(L, u)
608600
end
609601

0 commit comments

Comments
 (0)