diff options
-rw-r--r-- | tensorflow/contrib/linalg/BUILD | 4 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/__init__.py | 4 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/kernel_tests/linear_operator_addition_test.py | 13 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/kernel_tests/linear_operator_composition_test.py | 34 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/kernel_tests/linear_operator_full_matrix_test.py (renamed from tensorflow/contrib/linalg/python/kernel_tests/linear_operator_matrix_test.py) | 26 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/ops/linear_operator_addition.py | 8 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/ops/linear_operator_composition.py | 8 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/ops/linear_operator_full_matrix.py (renamed from tensorflow/contrib/linalg/python/ops/linear_operator_matrix.py) | 22 | ||||
-rw-r--r-- | tensorflow/contrib/linalg/python/ops/linear_operator_test_util.py | 2 |
9 files changed, 61 insertions, 60 deletions
diff --git a/tensorflow/contrib/linalg/BUILD b/tensorflow/contrib/linalg/BUILD index b6d4625e6b..9b196e2cf5 100644 --- a/tensorflow/contrib/linalg/BUILD +++ b/tensorflow/contrib/linalg/BUILD @@ -100,9 +100,9 @@ cuda_py_tests( ) cuda_py_tests( - name = "linear_operator_matrix_test", + name = "linear_operator_full_matrix_test", size = "medium", - srcs = ["python/kernel_tests/linear_operator_matrix_test.py"], + srcs = ["python/kernel_tests/linear_operator_full_matrix_test.py"], additional_deps = [ ":linalg_py", "//tensorflow/python:array_ops", diff --git a/tensorflow/contrib/linalg/__init__.py b/tensorflow/contrib/linalg/__init__.py index 8398956ee3..44421a6b7d 100644 --- a/tensorflow/contrib/linalg/__init__.py +++ b/tensorflow/contrib/linalg/__init__.py @@ -20,7 +20,7 @@ See the @{$python/contrib.linalg} guide. @@LinearOperatorDiag @@LinearOperatorIdentity @@LinearOperatorScaledIdentity -@@LinearOperatorMatrix +@@LinearOperatorFullMatrix @@LinearOperatorTriL @@LinearOperatorUDVHUpdate @@LinearOperatorComposition @@ -37,8 +37,8 @@ from tensorflow.contrib.linalg.python.ops.linear_operator import * from tensorflow.contrib.linalg.python.ops.linear_operator_addition import * from tensorflow.contrib.linalg.python.ops.linear_operator_composition import * from tensorflow.contrib.linalg.python.ops.linear_operator_diag import * +from tensorflow.contrib.linalg.python.ops.linear_operator_full_matrix import * from tensorflow.contrib.linalg.python.ops.linear_operator_identity import * -from tensorflow.contrib.linalg.python.ops.linear_operator_matrix import * from tensorflow.contrib.linalg.python.ops.linear_operator_tril import * from tensorflow.contrib.linalg.python.ops.linear_operator_udvh_update import * diff --git a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_addition_test.py b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_addition_test.py index 5bb1c61e14..4746484755 100644 --- a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_addition_test.py +++ b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_addition_test.py @@ -137,7 +137,8 @@ class LinearOperatorAdditionCorrectnessTest(test.TestCase): self.assertEqual(None, op.is_non_singular) def test_matrix_diag_tril_diag_uses_custom_name(self): - op0 = linalg.LinearOperatorMatrix([[-1., -1.], [-1., -1.]], name="matrix") + op0 = linalg.LinearOperatorFullMatrix( + [[-1., -1.], [-1., -1.]], name="matrix") op1 = linalg.LinearOperatorDiag([1., 1.], name="diag_a") op2 = linalg.LinearOperatorTriL([[2., 0.], [1.5, 2.]], name="tril") op3 = linalg.LinearOperatorDiag([3., 3.], name="diag_b") @@ -145,24 +146,24 @@ class LinearOperatorAdditionCorrectnessTest(test.TestCase): op_sum = add_operators([op0, op1, op2, op3], operator_name="my_operator") self.assertEqual(1, len(op_sum)) op = op_sum[0] - self.assertTrue(isinstance(op, linalg_lib.LinearOperatorMatrix)) + self.assertTrue(isinstance(op, linalg_lib.LinearOperatorFullMatrix)) self.assertAllClose([[5., -1.], [0.5, 5.]], op.to_dense().eval()) self.assertEqual("my_operator", op.name) def test_incompatible_domain_dimensions_raises(self): - op1 = linalg.LinearOperatorMatrix(rng.rand(2, 3)) + op1 = linalg.LinearOperatorFullMatrix(rng.rand(2, 3)) op2 = linalg.LinearOperatorDiag(rng.rand(2, 4)) with self.assertRaisesRegexp(ValueError, "must.*same domain dimension"): add_operators([op1, op2]) def test_incompatible_range_dimensions_raises(self): - op1 = linalg.LinearOperatorMatrix(rng.rand(2, 3)) + op1 = linalg.LinearOperatorFullMatrix(rng.rand(2, 3)) op2 = linalg.LinearOperatorDiag(rng.rand(3, 3)) with self.assertRaisesRegexp(ValueError, "must.*same range dimension"): add_operators([op1, op2]) def test_non_broadcastable_batch_shape_raises(self): - op1 = linalg.LinearOperatorMatrix(rng.rand(2, 3, 3)) + op1 = linalg.LinearOperatorFullMatrix(rng.rand(2, 3, 3)) op2 = linalg.LinearOperatorDiag(rng.rand(4, 3, 3)) with self.assertRaisesRegexp(ValueError, "Incompatible shapes"): add_operators([op1, op2]) @@ -397,7 +398,7 @@ class AddAndReturnMatrixTest(test.TestCase): self.assertTrue(self._adder.can_add(diag1, diag2)) operator = self._adder.add(diag1, diag2, "my_operator", hints) - self.assertTrue(isinstance(operator, linalg.LinearOperatorMatrix)) + self.assertTrue(isinstance(operator, linalg.LinearOperatorFullMatrix)) with self.test_session(): self.assertAllClose([[0., 0.], [0., 5.]], operator.to_dense().eval()) diff --git a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_composition_test.py b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_composition_test.py index 6309d36258..998073e28b 100644 --- a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_composition_test.py +++ b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_composition_test.py @@ -65,11 +65,11 @@ class SquareLinearOperatorCompositionTest( # feed_dict. matrices = sess.run(matrices) operator = linalg.LinearOperatorComposition( - [linalg.LinearOperatorMatrix(m_ph) for m_ph in matrices_ph]) + [linalg.LinearOperatorFullMatrix(m_ph) for m_ph in matrices_ph]) feed_dict = {m_ph: m for (m_ph, m) in zip(matrices_ph, matrices)} else: operator = linalg.LinearOperatorComposition( - [linalg.LinearOperatorMatrix(m) for m in matrices]) + [linalg.LinearOperatorFullMatrix(m) for m in matrices]) feed_dict = None # Convert back to Tensor. Needed if use_placeholder, since then we have @@ -86,7 +86,7 @@ class SquareLinearOperatorCompositionTest( # The matrix values do not effect auto-setting of the flags. matrix = [[1., 0.], [1., 1.]] operator = linalg.LinearOperatorComposition( - [linalg.LinearOperatorMatrix(matrix)], + [linalg.LinearOperatorFullMatrix(matrix)], is_positive_definite=True, is_non_singular=True, is_self_adjoint=False) @@ -98,8 +98,8 @@ class SquareLinearOperatorCompositionTest( # Matrix with two positive eigenvalues, 11 and 8. # The matrix values do not effect auto-setting of the flags. matrix = [[11., 0.], [1., 8.]] - operator_1 = linalg.LinearOperatorMatrix(matrix, is_non_singular=True) - operator_2 = linalg.LinearOperatorMatrix(matrix, is_non_singular=True) + operator_1 = linalg.LinearOperatorFullMatrix(matrix, is_non_singular=True) + operator_2 = linalg.LinearOperatorFullMatrix(matrix, is_non_singular=True) operator = linalg.LinearOperatorComposition( [operator_1, operator_2], @@ -114,8 +114,8 @@ class SquareLinearOperatorCompositionTest( def test_name(self): matrix = [[11., 0.], [1., 8.]] - operator_1 = linalg.LinearOperatorMatrix(matrix, name="left") - operator_2 = linalg.LinearOperatorMatrix(matrix, name="right") + operator_1 = linalg.LinearOperatorFullMatrix(matrix, name="left") + operator_2 = linalg.LinearOperatorFullMatrix(matrix, name="right") operator = linalg.LinearOperatorComposition([operator_1, operator_2]) @@ -123,8 +123,8 @@ class SquareLinearOperatorCompositionTest( def test_different_dtypes_raises(self): operators = [ - linalg.LinearOperatorMatrix(rng.rand(2, 3, 3)), - linalg.LinearOperatorMatrix(rng.rand(2, 3, 3).astype(np.float32)) + linalg.LinearOperatorFullMatrix(rng.rand(2, 3, 3)), + linalg.LinearOperatorFullMatrix(rng.rand(2, 3, 3).astype(np.float32)) ] with self.assertRaisesRegexp(TypeError, "same dtype"): linalg.LinearOperatorComposition(operators) @@ -176,11 +176,11 @@ class NonSquareLinearOperatorCompositionTest( # feed_dict. matrices = sess.run(matrices) operator = linalg.LinearOperatorComposition( - [linalg.LinearOperatorMatrix(m_ph) for m_ph in matrices_ph]) + [linalg.LinearOperatorFullMatrix(m_ph) for m_ph in matrices_ph]) feed_dict = {m_ph: m for (m_ph, m) in zip(matrices_ph, matrices)} else: operator = linalg.LinearOperatorComposition( - [linalg.LinearOperatorMatrix(m) for m in matrices]) + [linalg.LinearOperatorFullMatrix(m) for m in matrices]) feed_dict = None # Convert back to Tensor. Needed if use_placeholder, since then we have @@ -194,16 +194,16 @@ class NonSquareLinearOperatorCompositionTest( def test_static_shapes(self): operators = [ - linalg.LinearOperatorMatrix(rng.rand(2, 3, 4)), - linalg.LinearOperatorMatrix(rng.rand(2, 4, 5)) + linalg.LinearOperatorFullMatrix(rng.rand(2, 3, 4)), + linalg.LinearOperatorFullMatrix(rng.rand(2, 4, 5)) ] operator = linalg.LinearOperatorComposition(operators) self.assertAllEqual((2, 3, 5), operator.shape) def test_shape_tensors_when_statically_available(self): operators = [ - linalg.LinearOperatorMatrix(rng.rand(2, 3, 4)), - linalg.LinearOperatorMatrix(rng.rand(2, 4, 5)) + linalg.LinearOperatorFullMatrix(rng.rand(2, 3, 4)), + linalg.LinearOperatorFullMatrix(rng.rand(2, 4, 5)) ] operator = linalg.LinearOperatorComposition(operators) with self.test_session(): @@ -217,8 +217,8 @@ class NonSquareLinearOperatorCompositionTest( feed_dict = {mat_ph_1: mat_1, mat_ph_2: mat_2} operators = [ - linalg.LinearOperatorMatrix(mat_ph_1), - linalg.LinearOperatorMatrix(mat_ph_2) + linalg.LinearOperatorFullMatrix(mat_ph_1), + linalg.LinearOperatorFullMatrix(mat_ph_2) ] operator = linalg.LinearOperatorComposition(operators) with self.test_session(): diff --git a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_matrix_test.py b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_full_matrix_test.py index dcb2661197..93cbb48e1b 100644 --- a/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_matrix_test.py +++ b/tensorflow/contrib/linalg/python/kernel_tests/linear_operator_full_matrix_test.py @@ -29,7 +29,7 @@ linalg = linalg_lib random_seed.set_random_seed(23) -class SquareLinearOperatorMatrixTest( +class SquareLinearOperatorFullMatrixTest( linear_operator_test_util.SquareLinearOperatorDerivedClassTest): """Most tests done in the base class LinearOperatorDerivedClassTest.""" @@ -45,10 +45,10 @@ class SquareLinearOperatorMatrixTest( # values are random and we want the same value used for both mat and # feed_dict. matrix = matrix.eval() - operator = linalg.LinearOperatorMatrix(matrix) + operator = linalg.LinearOperatorFullMatrix(matrix) feed_dict = {matrix_ph: matrix} else: - operator = linalg.LinearOperatorMatrix(matrix) + operator = linalg.LinearOperatorFullMatrix(matrix) feed_dict = None # Convert back to Tensor. Needed if use_placeholder, since then we have @@ -60,7 +60,7 @@ class SquareLinearOperatorMatrixTest( def test_is_x_flags(self): # Matrix with two positive eigenvalues. matrix = [[1., 0.], [1., 11.]] - operator = linalg.LinearOperatorMatrix( + operator = linalg.LinearOperatorFullMatrix( matrix, is_positive_definite=True, is_non_singular=True, @@ -70,7 +70,7 @@ class SquareLinearOperatorMatrixTest( self.assertFalse(operator.is_self_adjoint) -class SquareLinearOperatorMatrixSymmetricPositiveDefiniteTest( +class SquareLinearOperatorFullMatrixSymmetricPositiveDefiniteTest( linear_operator_test_util.SquareLinearOperatorDerivedClassTest): """Most tests done in the base class LinearOperatorDerivedClassTest. @@ -104,11 +104,11 @@ class SquareLinearOperatorMatrixSymmetricPositiveDefiniteTest( # values are random and we want the same value used for both mat and # feed_dict. matrix = matrix.eval() - operator = linalg.LinearOperatorMatrix( + operator = linalg.LinearOperatorFullMatrix( matrix, is_self_adjoint=True, is_positive_definite=True) feed_dict = {matrix_ph: matrix} else: - operator = linalg.LinearOperatorMatrix( + operator = linalg.LinearOperatorFullMatrix( matrix, is_self_adjoint=True, is_positive_definite=True) feed_dict = None @@ -121,7 +121,7 @@ class SquareLinearOperatorMatrixSymmetricPositiveDefiniteTest( def test_is_x_flags(self): # Matrix with two positive eigenvalues. matrix = [[1., 0.], [0., 7.]] - operator = linalg.LinearOperatorMatrix( + operator = linalg.LinearOperatorFullMatrix( matrix, is_positive_definite=True, is_self_adjoint=True) self.assertTrue(operator.is_positive_definite) @@ -132,7 +132,7 @@ class SquareLinearOperatorMatrixSymmetricPositiveDefiniteTest( self.assertTrue(operator._is_spd) -class NonSquareLinearOperatorMatrixTest( +class NonSquareLinearOperatorFullMatrixTest( linear_operator_test_util.NonSquareLinearOperatorDerivedClassTest): """Most tests done in the base class LinearOperatorDerivedClassTest.""" @@ -144,10 +144,10 @@ class NonSquareLinearOperatorMatrixTest( # values are random and we want the same value used for both mat and # feed_dict. matrix = matrix.eval() - operator = linalg.LinearOperatorMatrix(matrix) + operator = linalg.LinearOperatorFullMatrix(matrix) feed_dict = {matrix_ph: matrix} else: - operator = linalg.LinearOperatorMatrix(matrix) + operator = linalg.LinearOperatorFullMatrix(matrix) feed_dict = None # Convert back to Tensor. Needed if use_placeholder, since then we have @@ -159,7 +159,7 @@ class NonSquareLinearOperatorMatrixTest( def test_is_x_flags(self): # Matrix with two positive eigenvalues. matrix = [[3., 0.], [1., 1.]] - operator = linalg.LinearOperatorMatrix( + operator = linalg.LinearOperatorFullMatrix( matrix, is_positive_definite=True, is_non_singular=True, @@ -170,7 +170,7 @@ class NonSquareLinearOperatorMatrixTest( def test_matrix_must_have_at_least_two_dims_or_raises(self): with self.assertRaisesRegexp(ValueError, "at least 2 dimensions"): - linalg.LinearOperatorMatrix([1.]) + linalg.LinearOperatorFullMatrix([1.]) if __name__ == "__main__": diff --git a/tensorflow/contrib/linalg/python/ops/linear_operator_addition.py b/tensorflow/contrib/linalg/python/ops/linear_operator_addition.py index 69e7f2bbd9..7617e1b591 100644 --- a/tensorflow/contrib/linalg/python/ops/linear_operator_addition.py +++ b/tensorflow/contrib/linalg/python/ops/linear_operator_addition.py @@ -24,8 +24,8 @@ import six from tensorflow.contrib.linalg.python.ops import linear_operator from tensorflow.contrib.linalg.python.ops import linear_operator_diag +from tensorflow.contrib.linalg.python.ops import linear_operator_full_matrix from tensorflow.contrib.linalg.python.ops import linear_operator_identity -from tensorflow.contrib.linalg.python.ops import linear_operator_matrix from tensorflow.contrib.linalg.python.ops import linear_operator_tril from tensorflow.python.framework import ops from tensorflow.python.ops import array_ops @@ -356,7 +356,7 @@ class _AddAndReturnTriL(_Adder): class _AddAndReturnMatrix(_Adder): - """"Handles additions resulting in a `LinearOperatorMatrix`.""" + """"Handles additions resulting in a `LinearOperatorFullMatrix`.""" def can_add(self, op1, op2): # pylint: disable=unused-argument return isinstance(op1, linear_operator.LinearOperator) and isinstance( @@ -367,7 +367,7 @@ class _AddAndReturnMatrix(_Adder): op_add_to_tensor, op_other = op1, op2 else: op_add_to_tensor, op_other = op2, op1 - return linear_operator_matrix.LinearOperatorMatrix( + return linear_operator_full_matrix.LinearOperatorFullMatrix( matrix=op_add_to_tensor.add_to_tensor(op_other.to_dense()), is_non_singular=hints.is_non_singular, is_self_adjoint=hints.is_self_adjoint, @@ -399,7 +399,7 @@ def _type(operator): return _DIAG if isinstance(operator, linear_operator_tril.LinearOperatorTriL): return _TRIL - if isinstance(operator, linear_operator_matrix.LinearOperatorMatrix): + if isinstance(operator, linear_operator_full_matrix.LinearOperatorFullMatrix): return _MATRIX if isinstance(operator, linear_operator_identity.LinearOperatorIdentity): return _IDENTITY diff --git a/tensorflow/contrib/linalg/python/ops/linear_operator_composition.py b/tensorflow/contrib/linalg/python/ops/linear_operator_composition.py index 781282eb35..11ce5e0e64 100644 --- a/tensorflow/contrib/linalg/python/ops/linear_operator_composition.py +++ b/tensorflow/contrib/linalg/python/ops/linear_operator_composition.py @@ -52,8 +52,8 @@ class LinearOperatorComposition(linear_operator.LinearOperator): ```python # Create a 2 x 2 linear operator composed of two 2 x 2 operators. - operator_1 = LinearOperatorMatrix([[1., 2.], [3., 4.]]) - operator_2 = LinearOperatorMatrix([[1., 0.], [0., 1.]]) + operator_1 = LinearOperatorFullMatrix([[1., 2.], [3., 4.]]) + operator_2 = LinearOperatorFullMatrix([[1., 0.], [0., 1.]]) operator = LinearOperatorComposition([operator_1, operator_2]) operator.to_dense() @@ -72,11 +72,11 @@ class LinearOperatorComposition(linear_operator.LinearOperator): # Create a [2, 3] batch of 4 x 5 linear operators. matrix_45 = tf.random_normal(shape=[2, 3, 4, 5]) - operator_45 = LinearOperatorMatrix(matrix) + operator_45 = LinearOperatorFullMatrix(matrix) # Create a [2, 3] batch of 5 x 6 linear operators. matrix_56 = tf.random_normal(shape=[2, 3, 5, 6]) - operator_56 = LinearOperatorMatrix(matrix_56) + operator_56 = LinearOperatorFullMatrix(matrix_56) # Compose to create a [2, 3] batch of 4 x 6 operators. opeartor_46 = LinearOperatorComposition([operator_45, operator_56]) diff --git a/tensorflow/contrib/linalg/python/ops/linear_operator_matrix.py b/tensorflow/contrib/linalg/python/ops/linear_operator_full_matrix.py index 2bd99845d8..f8d0202baf 100644 --- a/tensorflow/contrib/linalg/python/ops/linear_operator_matrix.py +++ b/tensorflow/contrib/linalg/python/ops/linear_operator_full_matrix.py @@ -25,10 +25,10 @@ from tensorflow.python.ops import array_ops from tensorflow.python.ops import linalg_ops from tensorflow.python.ops import math_ops -__all__ = ["LinearOperatorMatrix"] +__all__ = ["LinearOperatorFullMatrix"] -class LinearOperatorMatrix(linear_operator.LinearOperator): +class LinearOperatorFullMatrix(linear_operator.LinearOperator): """`LinearOperator` that wraps a [batch] matrix. This operator wraps a [batch] matrix `A` (which is a `Tensor`) with shape @@ -39,7 +39,7 @@ class LinearOperatorMatrix(linear_operator.LinearOperator): ```python # Create a 2 x 2 linear operator. matrix = [[1., 2.], [3., 4.]] - operator = LinearOperatorMatrix(matrix) + operator = LinearOperatorFullMatrix(matrix) operator.to_dense() ==> [[1., 2.] @@ -57,7 +57,7 @@ class LinearOperatorMatrix(linear_operator.LinearOperator): # Create a [2, 3] batch of 4 x 4 linear operators. matrix = tf.random_normal(shape=[2, 3, 4, 4]) - operator = LinearOperatorMatrix(matrix) + operator = LinearOperatorFullMatrix(matrix) ``` #### Shape compatibility @@ -72,14 +72,14 @@ class LinearOperatorMatrix(linear_operator.LinearOperator): #### Performance - `LinearOperatorMatrix` has exactly the same performance as would be achieved - by using standard `TensorFlow` matrix ops. Intelligent choices are made - based on the following initialization hints. + `LinearOperatorFullMatrix` has exactly the same performance as would be + achieved by using standard `TensorFlow` matrix ops. Intelligent choices are + made based on the following initialization hints. * If `dtype` is real, and `is_self_adjoint` and `is_positive_definite`, a Cholesky factorization is used for the determinant and solve. - In all cases, suppose `operator` is a `LinearOperatorMatrix` of shape + In all cases, suppose `operator` is a `LinearOperatorFullMatrix` of shape `[M, N]`, and `x.shape = [N, R]`. Then * `operator.apply(x)` is `O(M * N * R)`. @@ -108,8 +108,8 @@ class LinearOperatorMatrix(linear_operator.LinearOperator): is_non_singular=None, is_self_adjoint=None, is_positive_definite=None, - name="LinearOperatorMatrix"): - """Initialize a `LinearOperatorMatrix`. + name="LinearOperatorFullMatrix"): + """Initialize a `LinearOperatorFullMatrix`. Args: matrix: Shape `[B1,...,Bb, M, N]` with `b >= 0`, `M, N >= 0`. @@ -139,7 +139,7 @@ class LinearOperatorMatrix(linear_operator.LinearOperator): if self._is_spd: self._chol = linalg_ops.cholesky(self._matrix) - super(LinearOperatorMatrix, self).__init__( + super(LinearOperatorFullMatrix, self).__init__( dtype=self._matrix.dtype, graph_parents=[self._matrix], is_non_singular=is_non_singular, diff --git a/tensorflow/contrib/linalg/python/ops/linear_operator_test_util.py b/tensorflow/contrib/linalg/python/ops/linear_operator_test_util.py index 8fed8f7c46..0b7fc3da39 100644 --- a/tensorflow/contrib/linalg/python/ops/linear_operator_test_util.py +++ b/tensorflow/contrib/linalg/python/ops/linear_operator_test_util.py @@ -336,7 +336,7 @@ class NonSquareLinearOperatorDerivedClassTest(LinearOperatorDerivedClassTest): Square shapes are never tested by this class, so if you want to test your operator with a square shape, create two test classes, the other subclassing - SquareLinearOperatorMatrixTest. + SquareLinearOperatorFullMatrixTest. Sub-classes must still define all abstractmethods from LinearOperatorDerivedClassTest that are not defined here. |