def setUp(self): """Resources for tests.""" # Random Seed np.random.seed(42) # Scalars, arrays and operators self.scalars = [0, int(1), 0.1, -4.2, np.nan, np.inf] self.arrays = [np.random.normal(size=[5, 4]), np.array([[3, 4], [1, 5]])] def mv(v): return np.array([2 * v[0], v[0] + 3 * v[1]]) self.mv = mv self.ops = [ linops.MatrixMult(np.array([[-1.5, 3], [0, -230]])), linops.LinearOperator(shape=(2, 2), matvec=mv), linops.Identity(shape=4), linops.Kronecker( A=linops.MatrixMult(np.array([[2, -3.5], [12, 6.5]])), B=linops.Identity(shape=3), ), linops.SymmetricKronecker( A=linops.MatrixMult(np.array([[1, -2], [-2.2, 5]])), B=linops.MatrixMult(np.array([[1, -3], [0, -0.5]])), ), ]
def test_addition(self): """Linear operator addition.""" for A, B in list(zip(self.arrays, self.arrays)): with self.subTest(): Aop = linops.MatrixMult(A) Bop = linops.MatrixMult(B) self.assertAllClose((Aop + Bop).todense(), A + B)
def setUp(self): """Resources for tests.""" # Seed np.random.seed(seed=42) # Parameters m = 7 n = 3 self.constants = [-1, -2.4, 0, 200, np.pi] sparsemat = scipy.sparse.rand(m=m, n=n, density=0.1, random_state=1) self.normal_params = [ # Univariate (-1.0, 3.0), (1, 3), # Multivariate (np.random.uniform(size=10), np.eye(10)), (np.random.uniform(size=10), random_spd_matrix(10)), # Matrixvariate ( np.random.uniform(size=(2, 2)), linops.SymmetricKronecker( A=np.array([[1.0, 2.0], [2.0, 1.0]]), B=np.array([[5.0, -1.0], [-1.0, 10.0]]), ).todense(), ), # Operatorvariate ( np.array([1.0, -5.0]), linops.MatrixMult(A=np.array([[2.0, 1.0], [1.0, -0.1]])), ), ( linops.MatrixMult(A=np.array([[0.0, -5.0]])), linops.Identity(shape=(2, 2)), ), ( np.array([[1.0, 2.0], [-3.0, -0.4], [4.0, 1.0]]), linops.Kronecker(A=np.eye(3), B=5 * np.eye(2)), ), ( linops.MatrixMult(A=sparsemat.todense()), linops.Kronecker(0.1 * linops.Identity(m), linops.Identity(n)), ), ( linops.MatrixMult(A=np.random.uniform(size=(2, 2))), linops.SymmetricKronecker( A=np.array([[1.0, 2.0], [2.0, 1.0]]), B=np.array([[5.0, -1.0], [-1.0, 10.0]]), ), ), # Symmetric Kronecker Identical Factors ( linops.Identity(shape=25), linops.SymmetricKronecker(A=linops.Identity(25)), ), ]
def test_scalar_mult(self): """Matrix linear operator multiplication with scalars.""" for A, alpha in list(itertools.product(self.arrays, self.scalars)): with self.subTest(): Aop = linops.MatrixMult(A) self.assertAllClose((alpha * Aop).todense(), alpha * A)
def get_randvar(rv_name): """Return a random variable for a given distribution name.""" # Distribution Means and Covariances mean_0d = np.random.rand() mean_1d = np.random.rand(5) mean_2d_mat = SPD_MATRIX_5x5 mean_2d_linop = linops.MatrixMult(SPD_MATRIX_5x5) cov_0d = np.random.rand() + 10**-12 cov_1d = SPD_MATRIX_5x5 cov_2d_kron = linops.Kronecker(A=SPD_MATRIX_5x5, B=SPD_MATRIX_5x5) cov_2d_symkron = linops.SymmetricKronecker(A=SPD_MATRIX_5x5) if rv_name == "univar_normal": randvar = rvs.Normal(mean=mean_0d, cov=cov_0d) elif rv_name == "multivar_normal": randvar = rvs.Normal(mean=mean_1d, cov=cov_1d) elif rv_name == "matrixvar_normal": randvar = rvs.Normal(mean=mean_2d_mat, cov=cov_2d_kron) elif rv_name == "symmatrixvar_normal": randvar = rvs.Normal(mean=mean_2d_mat, cov=cov_2d_symkron) elif rv_name == "operatorvar_normal": randvar = rvs.Normal(mean=mean_2d_linop, cov=cov_2d_symkron) else: raise ValueError("Random variable not found.") return randvar
def setUp(self): """Scalars, arrays, linear operators and random variables for tests.""" # Seed np.random.seed(42) # Random variable instantiation self.scalars = [0, int(1), 0.1, np.nan, np.inf] self.arrays = [np.empty(2), np.zeros(4), np.array([]), np.array([1, 2])] # Random variable arithmetic self.arrays2d = [ np.empty(2), np.zeros(2), np.array([np.inf, 1]), np.array([1, -2.5]), ] self.matrices2d = [np.array([[1, 2], [3, 2]]), np.array([[0, 0], [1.0, -4.3]])] self.linops2d = [linops.MatrixMult(A=np.array([[1, 2], [4, 5]]))] self.randvars2d = [ rvs.Normal(mean=np.array([1, 2]), cov=np.array([[2, 0], [0, 5]])) ] self.randvars2x2 = [ rvs.Normal( mean=np.array([[-2, 0.3], [0, 1]]), cov=linops.SymmetricKronecker(A=np.eye(2), B=np.ones((2, 2))), ), ] self.scipyrvs = [ scipy.stats.bernoulli(0.75), scipy.stats.norm(4, 2.4), scipy.stats.multivariate_normal(np.random.randn(10), np.eye(10)), scipy.stats.gamma(0.74), scipy.stats.dirichlet(alpha=np.array([0.1, 0.1, 0.2, 0.3])), ]
def test_trace_only_square(self): """Test that the trace can only be computed for square matrices.""" nonsquare_op = linops.MatrixMult(np.array([[-1.5, 3, 1], [0, -230, 0]])) with self.assertRaises(ValueError): nonsquare_op.trace()