@@ -205,7 +205,7 @@ function _resize(dest::AbstractMatrix, sz::Tuple{<:Integer,<:Integer})
205205end
206206
207207function _compositemul! (y:: AbstractVecOrMat ,
208- A:: CompositeMap ,
208+ A:: CompositeMap{<:Any,<:LinearMapTuple} ,
209209 x:: AbstractVecOrMat ,
210210 source = similar (y, (size (A. maps[1 ],1 ), size (x)[2 : end ]. .. )),
211211 dest = similar (y, (size (A. maps[2 ],1 ), size (x)[2 : end ]. .. )))
@@ -219,3 +219,40 @@ function _compositemul!(y::AbstractVecOrMat,
219219 _unsafe_mul! (y, A. maps[N], source)
220220 return y
221221end
222+
223+ function _compositemul! (y:: AbstractVecOrMat ,
224+ A:: CompositeMap{<:Any,<:LinearMapVector} ,
225+ x:: AbstractVecOrMat )
226+ N = length (A. maps)
227+ if N == 1
228+ return _unsafe_mul! (y, A. maps[1 ], x)
229+ elseif N == 2
230+ return _compositemul2! (y, A, x)
231+ else
232+ return _compositemulN! (y, A, x)
233+ end
234+ end
235+
236+ function _compositemul2! (y:: AbstractVecOrMat ,
237+ A:: CompositeMap{<:Any,<:LinearMapVector} ,
238+ x:: AbstractVecOrMat ,
239+ source = similar (y, (size (A. maps[1 ],1 ), size (x)[2 : end ]. .. )))
240+ _unsafe_mul! (source, A. maps[1 ], x)
241+ _unsafe_mul! (y, A. maps[2 ], source)
242+ return y
243+ end
244+ function _compositemulN! (y:: AbstractVecOrMat ,
245+ A:: CompositeMap{<:Any,<:LinearMapVector} ,
246+ x:: AbstractVecOrMat ,
247+ source = similar (y, (size (A. maps[1 ],1 ), size (x)[2 : end ]. .. )),
248+ dest = similar (y, (size (A. maps[2 ],1 ), size (x)[2 : end ]. .. )))
249+ N = length (A. maps)
250+ _unsafe_mul! (source, A. maps[1 ], x)
251+ for n in 2 : N- 1
252+ dest = _resize (dest, (size (A. maps[n],1 ), size (x)[2 : end ]. .. ))
253+ _unsafe_mul! (dest, A. maps[n], source)
254+ dest, source = source, dest # alternate dest and source
255+ end
256+ _unsafe_mul! (y, A. maps[N], source)
257+ return y
258+ end
0 commit comments