def test_linear_composition(): A = np.random.rand(5, 4) B = np.random.rand(4, 3) x = np.random.rand(3) y = np.random.rand(5) Aop = MatVecOperator(A) Bop = MatVecOperator(B) xvec = Bop.domain.element(x) yvec = Aop.range.element(y) C = OperatorComp(Aop, Bop) assert C.is_linear assert C.adjoint.is_linear assert all_almost_equal(C(xvec), np.dot(A, np.dot(B, x))) assert all_almost_equal(C.adjoint(yvec), np.dot(B.T, np.dot(A.T, y)))
def test_functional_composition(): r3 = odl.Rn(3) Aop = SumFunctional(r3) Bop = ConstantVector(r3) x = r3.element([1, 2, 3]) y = 1 C = OperatorComp(Bop, Aop) assert C.is_linear assert C.adjoint.is_linear assert all_almost_equal(C(x), np.sum(x) * np.ones(3)) assert all_almost_equal(C.adjoint(x), np.sum(x) * np.ones(3)) assert all_almost_equal(C.adjoint.adjoint(x), C(x)) # Using operator overloading assert (Aop * Bop)(y) == y * 3 assert (Aop * Bop).adjoint(y) == y * 3 assert all_almost_equal((Bop * Aop)(x), np.sum(x) * np.ones(3)) assert all_almost_equal((Bop * Aop).adjoint(x), np.sum(x) * np.ones(3))