Esempio n. 1
0
    def setUp(self):
        self.x = Variable(2, name="x")
        self.y = Variable(2, name="y")

        self.A = Constant([[1, 2], [1, 2]])

        self.xAff = AffObjective([self.x], [deque([self.x])], u.Shape(2, 1))
        self.yAff = AffObjective([self.y], [deque([self.y])], u.Shape(2, 1))
        self.constAff = AffObjective([self.A], [deque([self.A])], u.Shape(2, 2))
        self.intf = intf.DEFAULT_INTERFACE
Esempio n. 2
0
class TestAffObjective(unittest.TestCase):
    """ Unit tests for the expressions.affine module. """

    def setUp(self):
        self.x = Variable(2, name="x")
        self.y = Variable(2, name="y")

        self.A = Constant([[1, 2], [1, 2]])

        self.xAff = AffObjective([self.x], [deque([self.x])], u.Shape(2, 1))
        self.yAff = AffObjective([self.y], [deque([self.y])], u.Shape(2, 1))
        self.constAff = AffObjective([self.A], [deque([self.A])], u.Shape(2, 2))
        self.intf = intf.DEFAULT_INTERFACE

    # Test adding AffObjectives.
    def test_add(self):
        add = self.xAff + self.yAff
        self.assertItemsEqual(add._terms, [deque([self.x]), deque([self.y])])
        self.assertItemsEqual(add.variables(), [self.x, self.y])

        add = self.xAff + self.xAff
        self.assertItemsEqual(add._terms, [deque([self.x]), deque([self.x])])
        self.assertItemsEqual(add.variables(), [self.x, self.x])

        with self.assertRaises(Exception) as cm:
            self.xAff + self.constAff
        self.assertEqual(str(cm.exception), "Incompatible dimensions.")

    # Test multiplying AffObjectives.
    def test_mul(self):
        mul = self.constAff * self.xAff
        self.assertItemsEqual(mul._terms, [deque([self.x, self.A])])
        self.assertItemsEqual(mul.variables(), [self.x])

        mul = self.constAff * (self.yAff + self.xAff)
        self.assertItemsEqual(mul._terms, [deque([self.x, self.A]), deque([self.y, self.A])])
        self.assertItemsEqual(mul.variables(), [self.x, self.y])

        with self.assertRaises(Exception) as cm:
            self.xAff * self.yAff
        self.assertEqual(str(cm.exception), "Incompatible dimensions.")

    # Test negating AffObjectives.
    def test_neg(self):
        neg = -self.xAff
        self.assertEqual(neg._terms[0][1].name(), "-1")
        self.assertItemsEqual(neg.variables(), [self.x])

    # Test subtracting AffObjectives.
    def test_sub(self):
        sub = self.xAff - self.yAff
        self.assertItemsEqual(sub._terms, (self.xAff + -self.yAff)._terms)
        self.assertItemsEqual(sub.variables(), [self.x, self.y])

        with self.assertRaises(Exception) as cm:
            self.xAff - self.constAff
        self.assertEqual(str(cm.exception), "Incompatible dimensions.")

    # Test coefficients method.
    def test_coefficients(self):
        # Leaf
        coeffs = self.xAff.coefficients(self.intf)
        self.assertEqual(coeffs.keys(), self.x.coefficients(self.intf).keys())

        # Sum with different keys
        exp = self.xAff + self.yAff
        coeffs = exp.coefficients(self.intf)
        keys = self.x.coefficients(self.intf).keys() + self.y.coefficients(self.intf).keys()
        self.assertItemsEqual(coeffs.keys(), keys)

        # Sum with same keys
        exp = self.xAff + self.xAff
        coeffs = exp.coefficients(self.intf)
        xCoeffs = self.x.coefficients(self.intf)
        self.assertItemsEqual(coeffs.keys(), xCoeffs)
        self.assertEqual(list(coeffs[self.x]), [2, 0, 0, 2])

        # Product
        exp = self.constAff * self.yAff
        coeffs = exp.coefficients(self.intf)
        yCoeffs = self.y.coefficients(self.intf)
        self.assertItemsEqual(coeffs.keys(), yCoeffs)
        self.assertEqual(list(coeffs[self.y]), [1, 2, 1, 2])

        # Distributed product
        exp = self.constAff * (self.xAff + self.yAff)
        coeffs = exp.coefficients(self.intf)
        xCoeffs = self.x.coefficients(self.intf)
        yCoeffs = self.y.coefficients(self.intf)
        self.assertItemsEqual(coeffs.keys(), xCoeffs.keys() + yCoeffs.keys())
        self.assertEqual(list(coeffs[self.x]), [1, 2, 1, 2])