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))
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)
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)
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')
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")
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)
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))
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)