Demonstration of Operator Algebras and Kron

Let M, D, F be matrix-based, diagonal-matrix-based, and function-based SciMLOperators respectively. Here are some examples of composing operators in order to build more complex objects and using their operations.

using SciMLOperators, LinearAlgebra
N = 4
function f(v, u, p, t)
    u .* v
end
function f(w, v, u, p, t)
    w .= u .* v
end

u = rand(4)
p = nothing # parameter struct
t = 0.0     # time

M = MatrixOperator(rand(N, N))
D = DiagonalOperator(rand(N))
F = FunctionOperator(f, zeros(N), zeros(N); u, p, t)
FunctionOperator(4 × 4)

Then, the following codes just work.

L1 = 2M + 3F + LinearAlgebra.I + rand(N, N)
L2 = D * F * M'
L3 = kron(M, D, F)
L4 = lu(M) \ D
L5 = [M; D]' * [M F; F D] * [F; D]
((((MatrixOperator(4 × 4) * MatrixOperator(4 × 4)) + (DiagonalOperator(4 × 4) * FunctionOperator(4 × 4))) * FunctionOperator(4 × 4)) + (((MatrixOperator(4 × 4) * FunctionOperator(4 × 4)) + (DiagonalOperator(4 × 4) * DiagonalOperator(4 × 4))) * DiagonalOperator(4 × 4)))

Each L# can be applied to AbstractVectors of appropriate sizes:

v = rand(N)
w = L1(v, u, p, t) # == L1 * v

v_kron = rand(N^3)
w_kron = L3(v_kron, u, p, t) # == L3 * v_kron
64-element reshape(transpose(::Matrix{Float64}), 64) with eltype Float64:
 0.07431798513383761
 0.8444859473403462
 0.40915797268199317
 0.13461841500824717
 0.0458482473243616
 0.35861410755000145
 0.2806994331943854
 0.06626654737555782
 0.0016089134725679262
 0.01314983965574334
 ⋮
 0.024106757363104615
 0.00040885873013236744
 0.0024613721324647105
 0.0011070946624111239
 0.0005701836268048969
 0.003186861607592521
 0.0215200351192637
 0.006271435285666838
 0.0036474215039439496

For mutating operator evaluations, call cache_operator to generate an in-place cache, so the operation is nonallocating.

α, β = rand(2)

# allocate cache
L2 = cache_operator(L2, u)
L4 = cache_operator(L4, u)

# allocation-free evaluation
L2(w, v, u, p, t) # == mul!(w, L2, v)
L4(w, v, u, p, t, α, β) # == mul!(w, L4, v, α, β)
4-element Vector{Float64}:
 -0.08448723582634418
  0.29799087488480897
 -0.01854959148867576
 -0.011681586604193859