Say you have C = ComposedOperator(A::MatrixOperator, B::MatrixOperator). You're passing it to an iterative solver. Depending on the shapes of A and B, precomputing the product Cfused = A.A * B.A and passing that to the solver instead could be faster in some cases. You can't define C this way from the outset because A and B depend on (u, p, t), but you can always fuse ahead of any sequence of operations that lives on a constant (u, p, t)-slice.
Opt-in functionality to support this might be useful. For more complicated structures it may try to approximate the optimal solution or it may rely on a flag on each composite node to decide whether to fuse.
We touched on this in #12 (comment).
Low prioirity.
Say you have
C = ComposedOperator(A::MatrixOperator, B::MatrixOperator). You're passing it to an iterative solver. Depending on the shapes ofAandB, precomputing the productCfused = A.A * B.Aand passing that to the solver instead could be faster in some cases. You can't defineCthis way from the outset becauseAandBdepend on(u, p, t), but you can always fuse ahead of any sequence of operations that lives on a constant(u, p, t)-slice.Opt-in functionality to support this might be useful. For more complicated structures it may try to approximate the optimal solution or it may rely on a flag on each composite node to decide whether to fuse.
We touched on this in #12 (comment).
Low prioirity.