def test_constants(self): c = Constant(2) self.assertEqual(c.name(), str(2)) c = Constant(2) self.assertEqual(c.value, 2) self.assertEqual(c.size, (1, 1)) self.assertEqual(c.curvature, u.Curvature.CONSTANT_KEY) self.assertEqual(c.sign, u.Sign.POSITIVE_KEY) self.assertEqual(Constant(-2).sign, u.Sign.NEGATIVE_KEY) self.assertEqual(Constant(0).sign, u.Sign.ZERO_KEY) self.assertEqual(c.canonical_form[0].size, (1, 1)) self.assertEqual(c.canonical_form[1], []) coeffs = c.coefficients() self.assertEqual(coeffs.keys(), [s.CONSTANT]) self.assertEqual(coeffs[s.CONSTANT], [2]) # Test the sign. c = Constant([[2], [2]]) self.assertEqual(c.size, (1, 2)) self.assertEqual(c._dcp_attr.sign.neg_mat.shape, (1, 2)) # Test sign of a complex expression. c = Constant([1, 2]) A = Constant([[1, 1], [1, 1]]) exp = c.T * A * c self.assertEqual(exp.sign, u.Sign.POSITIVE_KEY) self.assertEqual((c.T * c).sign, u.Sign.POSITIVE_KEY) exp = c.T.T self.assertEqual(exp._dcp_attr.sign.pos_mat.shape, (2, 1)) exp = c.T * self.A self.assertEqual(exp._dcp_attr.sign.pos_mat.shape, (1, 2))
def test_constants(self): c = Constant(2) self.assertEqual(c.name(), str(2)) c = Constant(2, name="c") self.assertEqual(c.name(), "c") self.assertEqual(c.value, 2) self.assertEqual(c.size, (1,1)) self.assertEqual(c.curvature, u.Curvature.CONSTANT) self.assertEqual(c.sign, u.Sign.POSITIVE) self.assertEqual(Constant(-2).sign, u.Sign.NEGATIVE) self.assertEqual(Constant(0).sign, u.Sign.ZERO) self.assertEqual(c.canonicalize()[0].size, (1,1)) self.assertEqual(c.canonicalize()[1], []) coeffs = c.coefficients(self.intf) self.assertEqual(coeffs.keys(), [Constant]) self.assertEqual(coeffs[Constant], 2) # Test the sign. c = Constant([[2],[2]]) self.assertEqual(c.size, (1,2)) self.assertEqual(c.sign.neg_mat.value.shape, (1,2)) # Test sign of a complex expression. c = Constant([1, 2]) A = Constant([[1,1],[1,1]]) exp = c.T*A*c self.assertEqual(exp.sign, u.Sign.POSITIVE) self.assertEqual((c.T*c).sign, u.Sign.POSITIVE) exp = c.T.T self.assertEqual(exp.sign.pos_mat.value.ndim, 2) exp = c.T*self.A self.assertEqual(exp.sign.pos_mat.value.ndim, 2)
def test_constants(self): c = Constant(2) self.assertEqual(c.name(), str(2)) c = Constant(2) self.assertEqual(c.value, 2) self.assertEqual(c.size, (1,1)) self.assertEqual(c.curvature, u.Curvature.CONSTANT_KEY) self.assertEqual(c.sign, u.Sign.POSITIVE_KEY) self.assertEqual(Constant(-2).sign, u.Sign.NEGATIVE_KEY) self.assertEqual(Constant(0).sign, u.Sign.ZERO_KEY) self.assertEqual(c.canonical_form[0].size, (1,1)) self.assertEqual(c.canonical_form[1], []) coeffs = c.coefficients() self.assertEqual(coeffs.keys(), [s.CONSTANT]) self.assertEqual(coeffs[s.CONSTANT], [2]) # Test the sign. c = Constant([[2],[2]]) self.assertEqual(c.size, (1,2)) self.assertEqual(c._dcp_attr.sign.neg_mat.shape, (1,2)) # Test sign of a complex expression. c = Constant([1, 2]) A = Constant([[1,1],[1,1]]) exp = c.T*A*c self.assertEqual(exp.sign, u.Sign.POSITIVE_KEY) self.assertEqual((c.T*c).sign, u.Sign.POSITIVE_KEY) exp = c.T.T self.assertEqual(exp._dcp_attr.sign.pos_mat.shape, (2,1)) exp = c.T*self.A self.assertEqual(exp._dcp_attr.sign.pos_mat.shape, (1,2))
def test_constants(self): c = Constant(2) self.assertEqual(c.name(), str(2)) c = Constant(2, name="c") self.assertEqual(c.name(), "c") self.assertEqual(c.value, 2) self.assertEqual(c.size, (1,1)) self.assertEqual(c.curvature, u.Curvature.CONSTANT) self.assertEqual(c.sign, u.Sign.POSITIVE) self.assertEqual(Constant(-2).sign, u.Sign.NEGATIVE) self.assertEqual(Constant(0).sign, u.Sign.ZERO) self.assertEqual(c.canonicalize()[0].size, (1,1)) self.assertEqual(c.canonicalize()[1], []) coeffs = c.coefficients(self.intf) self.assertEqual(coeffs.keys(), [s.CONSTANT]) self.assertEqual(coeffs[s.CONSTANT], 2) # Test the sign. c = Constant([[2],[2]]) self.assertEqual(c.size, (1,2)) self.assertEqual(c.sign.neg_mat.value.shape, (1,2))
class test_coefficients(unittest.TestCase): """ Unit tests for the expressions.affine module. """ def setUp(self): self.a = Variable() self.x = Variable(2, name='x') self.y = Variable(2, name='y') self.A = Variable(2,2) self.c = Constant(3) self.C = Constant([[1, 2], [1, 2]]) def test_leaf_coeffs(self): """Test the coefficients for Variables and Constants. """ # Scalars coeffs = self.a.coefficients() self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], 1) # Vectors coeffs = self.x.coefficients() self.assertItemsEqual(coeffs.keys(), [self.x]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) # Matrices coeffs = self.A.coefficients() self.assertItemsEqual(coeffs.keys(), [self.A]) blocks = coeffs[self.A] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].size, (2,4)) # Constants coeffs = self.c.coefficients() self.assertItemsEqual(coeffs.keys(), [s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], 3) coeffs = self.C.coefficients() self.assertItemsEqual(coeffs.keys(), [s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].size, (2,1)) self.assertEqual(blocks[0][0,0], 1) def test_add(self): """Test adding coefficients. """ coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) coeffs = cu.add(coeffs, coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) self.assertEqual(blocks[0][0,0], 2) coeffs = cu.add(coeffs, self.C.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y, s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].size, (2,1)) self.assertEqual(blocks[0][0,0], 1) def test_neg(self): """Test negating coefficients. """ coeffs = cu.neg(self.a.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], -1) coeffs = cu.neg(self.A.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.A]) blocks = coeffs[self.A] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].size, (2,4)) self.assertEqual(blocks[0][0,0], -1) def test_sub(self): """Test subtracting coefficients. """ coeffs = cu.sub(self.x.coefficients(), self.y.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) self.assertEqual(blocks[0][0,0], -1) coeffs = cu.sub(coeffs, self.x.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) self.assertEqual(blocks[0][0,0], 0) def test_mul(self): """Test multiplying coefficients. """ coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) coeffs = cu.mul(self.C.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) self.assertEqual(blocks[0][1,0], 2) # Scalar by Matrix multiplication. coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) coeffs = cu.mul(self.c.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,2)) self.assertEqual(blocks[0][0,0], 3) # Matrix by Scalar multiplication. coeffs = self.a.coefficients() coeffs = cu.mul(self.C.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].size, (2,1)) self.assertEqual(blocks[0][1,0], 2) self.assertEqual(blocks[1].size, (2,1)) self.assertEqual(blocks[1][1,0], 2) def test_index(self): """Test indexing/slicing into coefficients. """ # Index. sum_coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) key = ku.validate_key((1, 0), self.x.shape) coeffs = cu.index(sum_coeffs, key) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (1,2)) self.assertEqual(blocks[0][0,0], 0) # Slice. sum_coeffs = cu.add(self.A.coefficients(), self.C.coefficients()) key = ku.validate_key((slice(None, None, None), 1), self.A.shape) coeffs = cu.index(sum_coeffs, key) self.assertItemsEqual(coeffs.keys(), [self.A, s.CONSTANT]) # Variable. blocks = coeffs[self.A] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,4)) # Constant. blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].size, (2,1))
class test_coefficients(unittest.TestCase): """ Unit tests for the expressions.affine module. """ def setUp(self): self.a = Variable() self.x = Variable(2, name='x') self.y = Variable(2, name='y') self.A = Variable(2, 2) self.c = Constant(3) self.C = Constant([[1, 2], [1, 2]]) def test_leaf_coeffs(self): """Test the coefficients for Variables and Constants. """ # Scalars coeffs = self.a.coefficients() self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], 1) # Vectors coeffs = self.x.coefficients() self.assertItemsEqual(coeffs.keys(), [self.x]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) # Matrices coeffs = self.A.coefficients() self.assertItemsEqual(coeffs.keys(), [self.A]) blocks = coeffs[self.A] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].shape, (2, 4)) # Constants coeffs = self.c.coefficients() self.assertItemsEqual(coeffs.keys(), [s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], 3) coeffs = self.C.coefficients() self.assertItemsEqual(coeffs.keys(), [s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 2) print blocks[0] self.assertEqual(blocks[0].shape, (2, 1)) self.assertEqual(blocks[0][0, 0], 1) def test_add(self): """Test adding coefficients. """ coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) coeffs = cu.add(coeffs, coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) self.assertEqual(blocks[0][0, 0], 2) coeffs = cu.add(coeffs, self.C.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y, s.CONSTANT]) blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].shape, (2, 1)) self.assertEqual(blocks[0][0, 0], 1) def test_neg(self): """Test negating coefficients. """ coeffs = cu.neg(self.a.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0], -1) coeffs = cu.neg(self.A.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.A]) blocks = coeffs[self.A] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].shape, (2, 4)) self.assertEqual(blocks[0][0, 0], -1) def test_sub(self): """Test subtracting coefficients. """ coeffs = cu.sub(self.x.coefficients(), self.y.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) self.assertEqual(blocks[0][0, 0], -1) coeffs = cu.sub(coeffs, self.x.coefficients()) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.x] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) self.assertEqual(blocks[0][0, 0], 0) def test_mul(self): """Test multiplying coefficients. """ coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) coeffs = cu.mul(self.C.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) self.assertEqual(blocks[0][1, 0], 2) # Scalar by Matrix multiplication. coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) coeffs = cu.mul(self.c.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 2)) self.assertEqual(blocks[0][0, 0], 3) # Matrix by Scalar multiplication. coeffs = self.a.coefficients() coeffs = cu.mul(self.C.coefficients(), coeffs) self.assertItemsEqual(coeffs.keys(), [self.a]) blocks = coeffs[self.a] self.assertEqual(len(blocks), 2) self.assertEqual(blocks[0].shape, (2, 1)) self.assertEqual(blocks[0][1, 0], 2) self.assertEqual(blocks[1].shape, (2, 1)) self.assertEqual(blocks[1][1, 0], 2) def test_index(self): """Test indexing/slicing into coefficients. """ # Index. sum_coeffs = cu.add(self.x.coefficients(), self.y.coefficients()) key = ku.validate_key((1, 0), self.x.shape) coeffs = cu.index(sum_coeffs, key) self.assertItemsEqual(coeffs.keys(), [self.x, self.y]) blocks = coeffs[self.y] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (1, 2)) self.assertEqual(blocks[0][0, 0], 0) # Slice. sum_coeffs = cu.add(self.A.coefficients(), self.C.coefficients()) key = ku.validate_key((slice(None, None, None), 1), self.A.shape) coeffs = cu.index(sum_coeffs, key) self.assertItemsEqual(coeffs.keys(), [self.A, s.CONSTANT]) # Variable. blocks = coeffs[self.A] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 4)) # Constant. blocks = coeffs[s.CONSTANT] self.assertEqual(len(blocks), 1) self.assertEqual(blocks[0].shape, (2, 1))