예제 #1
0
    def test_simple_substitute_param(self):
        def diffeq(m, t, i):
            return m.dxdt[t, i] == t * m.x[t, i - 1] ** 2 + m.y ** 2 + m.x[t, i + 1] + m.x[t, i - 1]

        m = self.m
        t = IndexTemplate(m.TIME)
        e = diffeq(m, t, 2)

        self.assertTrue(isinstance(e, EXPR._ExpressionBase))

        _map = {}
        E = substitute_template_expression(e, substitute_getitem_with_param, _map)
        self.assertIsNot(e, E)

        self.assertEqual(len(_map), 3)

        idx1 = _GetItemIndexer(m.x[t, 1])
        self.assertIs(idx1._base, m.x)
        self.assertEqual(len(idx1._args), 2)
        self.assertIs(idx1._args[0], t)
        self.assertEqual(idx1._args[1], 1)
        self.assertIn(idx1, _map)

        idx2 = _GetItemIndexer(m.dxdt[t, 2])
        self.assertIs(idx2._base, m.dxdt)
        self.assertEqual(len(idx2._args), 2)
        self.assertIs(idx2._args[0], t)
        self.assertEqual(idx2._args[1], 2)
        self.assertIn(idx2, _map)

        idx3 = _GetItemIndexer(m.x[t, 3])
        self.assertIs(idx3._base, m.x)
        self.assertEqual(len(idx3._args), 2)
        self.assertIs(idx3._args[0], t)
        self.assertEqual(idx3._args[1], 3)
        self.assertIn(idx3, _map)

        self.assertFalse(idx1 == idx2)
        self.assertFalse(idx1 == idx3)
        self.assertFalse(idx2 == idx3)

        idx4 = _GetItemIndexer(m.x[t, 2])
        self.assertNotIn(idx4, _map)

        t.set_value(5)
        self.assertEqual((e._args[0](), e._args[1]()), (10, 136))

        self.assertEqual(str(E), "dxdt[{TIME},2]  ==  {TIME} * x[{TIME},1]**2.0 + y**2.0 + x[{TIME},3] + x[{TIME},1]")

        _map[idx1].set_value(value(m.x[value(t), 1]))
        _map[idx2].set_value(value(m.dxdt[value(t), 2]))
        _map[idx3].set_value(value(m.x[value(t), 3]))
        self.assertEqual((E._args[0](), E._args[1]()), (10, 136))

        _map[idx1].set_value(12)
        _map[idx2].set_value(34)
        self.assertEqual((E._args[0](), E._args[1]()), (34, 738))
예제 #2
0
 def _test_template_scalar_with_set(self):
     m = self.m
     t = IndexTemplate(m.I)
     e = m.s[t]
     self.assertIs(type(e), EXPR.GetItemExpression)
     self.assertIs(e._base, m.s)
     self.assertEqual(tuple(e.args), (t, ))
     self.assertFalse(e.is_constant())
     self.assertTrue(e.is_fixed())
     self.assertEqual(e.polynomial_degree(), 0)
     t.set_value(5)
     self.assertRaises(TypeError, e)
     self.assertIs(e.resolve_template(), m.s[5])
     t.set_value(None)
예제 #3
0
 def _test_template_scalar_with_set(self):
     m = self.m
     t = IndexTemplate(m.I)
     e = m.s[t]
     self.assertIs(type(e), EXPR.GetItemExpression)
     self.assertIs(e._base, m.s)
     self.assertEqual(tuple(e.args), (t,))
     self.assertFalse(e.is_constant())
     self.assertTrue(e.is_fixed())
     self.assertEqual(e.polynomial_degree(), 0)
     t.set_value(5)
     self.assertRaises(TypeError, e)
     self.assertIs(e.resolve_template(), m.s[5])
     t.set_value(None)
예제 #4
0
    def test_simple_substitute_index(self):
        def diffeq(m, t, i):
            return m.dxdt[t, i] == t * m.x[t, i]**2 + m.y**2

        m = self.m
        t = IndexTemplate(m.TIME)
        e = diffeq(m, t, 2)
        t.set_value(5)

        self.assertTrue(isinstance(e, EXPR._ExpressionBase))
        self.assertEqual((e._args[0](), e._args[1]()), (10, 126))

        E = substitute_template_expression(e, substitute_template_with_value)
        self.assertIsNot(e, E)

        self.assertEqual(str(E), 'dxdt[5,2]  ==  5.0 * x[5,2]**2.0 + y**2.0')
예제 #5
0
    def test_simple_substitute_index(self):
        def diffeq(m, t, i):
            return m.dxdt[t, i] == t * m.x[t, i] ** 2 + m.y ** 2

        m = self.m
        t = IndexTemplate(m.TIME)
        e = diffeq(m, t, 2)
        t.set_value(5)

        self.assertTrue(isinstance(e, EXPR._ExpressionBase))
        self.assertEqual((e._args[0](), e._args[1]()), (10, 126))

        E = substitute_template_expression(e, substitute_template_with_value)
        self.assertIsNot(e, E)

        self.assertEqual(str(E), "dxdt[5,2]  ==  5.0 * x[5,2]**2.0 + y**2.0")
예제 #6
0
    def test_template_scalar(self):
        m = self.m
        t = IndexTemplate(m.I)
        e = m.x[t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.x)
        self.assertEqual(e._args, (t, ))
        self.assertFalse(e.is_constant())
        self.assertFalse(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 1)
        t.set_value(5)
        self.assertEqual(e(), 6)
        self.assertIs(e.resolve_template(), m.x[5])
        t.set_value(None)

        e = m.p[t, 10]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.p)
        self.assertEqual(e._args, (t, 10))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(5)
        self.assertEqual(e(), 510)
        self.assertIs(e.resolve_template(), m.p[5, 10])
        t.set_value(None)

        e = m.p[5, t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.p)
        self.assertEqual(e._args, (5, t))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(10)
        self.assertEqual(e(), 510)
        self.assertIs(e.resolve_template(), m.p[5, 10])
        t.set_value(None)

        e = m.s[t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.s)
        self.assertEqual(e._args, (t, ))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(5)
        self.assertRaises(TypeError, e)
        self.assertIs(e.resolve_template(), m.s[5])
        t.set_value(None)
예제 #7
0
    def test_simple_substitute_param(self):
        def diffeq(m, t, i):
            return m.dxdt[t, i] == t*m.x[t, i-1]**2 + m.y**2 + \
                m.x[t, i+1] + m.x[t, i-1]

        m = self.m
        t = IndexTemplate(m.TIME)
        e = diffeq(m, t, 2)

        self.assertTrue(isinstance(e, EXPR._ExpressionBase))

        _map = {}
        E = substitute_template_expression(e, substitute_getitem_with_param,
                                           _map)
        self.assertIsNot(e, E)

        self.assertEqual(len(_map), 3)

        idx1 = _GetItemIndexer(m.x[t, 1])
        self.assertIs(idx1._base, m.x)
        self.assertEqual(len(idx1._args), 2)
        self.assertIs(idx1._args[0], t)
        self.assertEqual(idx1._args[1], 1)
        self.assertIn(idx1, _map)

        idx2 = _GetItemIndexer(m.dxdt[t, 2])
        self.assertIs(idx2._base, m.dxdt)
        self.assertEqual(len(idx2._args), 2)
        self.assertIs(idx2._args[0], t)
        self.assertEqual(idx2._args[1], 2)
        self.assertIn(idx2, _map)

        idx3 = _GetItemIndexer(m.x[t, 3])
        self.assertIs(idx3._base, m.x)
        self.assertEqual(len(idx3._args), 2)
        self.assertIs(idx3._args[0], t)
        self.assertEqual(idx3._args[1], 3)
        self.assertIn(idx3, _map)

        self.assertFalse(idx1 == idx2)
        self.assertFalse(idx1 == idx3)
        self.assertFalse(idx2 == idx3)

        idx4 = _GetItemIndexer(m.x[t, 2])
        self.assertNotIn(idx4, _map)

        t.set_value(5)
        self.assertEqual((e._args[0](), e._args[1]()), (10, 136))

        self.assertEqual(
            str(E),
            'dxdt[{TIME},2]  ==  {TIME} * x[{TIME},1]**2.0 + y**2.0 + x[{TIME},3] + x[{TIME},1]'
        )

        _map[idx1].set_value(value(m.x[value(t), 1]))
        _map[idx2].set_value(value(m.dxdt[value(t), 2]))
        _map[idx3].set_value(value(m.x[value(t), 3]))
        self.assertEqual((E._args[0](), E._args[1]()), (10, 136))

        _map[idx1].set_value(12)
        _map[idx2].set_value(34)
        self.assertEqual((E._args[0](), E._args[1]()), (34, 738))
예제 #8
0
    def test_template_scalar(self):
        m = self.m
        t = IndexTemplate(m.I)
        e = m.x[t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.x)
        self.assertEqual(e._args, (t,))
        self.assertFalse(e.is_constant())
        self.assertFalse(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 1)
        t.set_value(5)
        self.assertEqual(e(), 6)
        self.assertIs(e.resolve_template(), m.x[5])
        t.set_value(None)

        e = m.p[t, 10]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.p)
        self.assertEqual(e._args, (t, 10))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(5)
        self.assertEqual(e(), 510)
        self.assertIs(e.resolve_template(), m.p[5, 10])
        t.set_value(None)

        e = m.p[5, t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.p)
        self.assertEqual(e._args, (5, t))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(10)
        self.assertEqual(e(), 510)
        self.assertIs(e.resolve_template(), m.p[5, 10])
        t.set_value(None)

        e = m.s[t]
        self.assertIs(type(e), EXPR._GetItemExpression)
        self.assertIs(e._base, m.s)
        self.assertEqual(e._args, (t,))
        self.assertFalse(e.is_constant())
        self.assertTrue(e.is_fixed())
        self.assertEqual(e.polynomial_degree(), 0)
        t.set_value(5)
        self.assertRaises(TypeError, e)
        self.assertIs(e.resolve_template(), m.s[5])
        t.set_value(None)