Пример #1
0
 def test_volatile_parameters(self):
     ds = DictScope.from_kwargs(a=1, b=2, c=3, d=4, volatile={'c', 'd'})
     ms = MappedScope(ds, FrozenDict(x=ExpressionScalar('a * b'),
                                     c=ExpressionScalar('a - b'),
                                     y=ExpressionScalar('c - a')))
     expected_volatile = FrozenDict(d=ExpressionScalar('d'), y=ExpressionScalar('c - 1'))
     self.assertEqual(expected_volatile, ms.get_volatile_parameters())
     self.assertIs(ms.get_volatile_parameters(), ms.get_volatile_parameters())
Пример #2
0
    def test_update_constants(self):
        ds = DictScope.from_kwargs(a=1, b=2, c=3, volatile={'c'})
        ds2 = DictScope.from_kwargs(a=1, b=2, c=4, volatile={'c'})
        ms = MappedScope(ds, FrozenDict(x=ExpressionScalar('a * b'),
                                        c=ExpressionScalar('a - b')))
        ms2 = MappedScope(ds2, ms._mapping)

        self.assertIs(ms, ms.change_constants({'f': 1}))

        changes = {'c': 4}
        ms_result = ms.change_constants(changes)
        self.assertEqual(ms2, ms_result)
Пример #3
0
    def operation(cls, expression, **operands):
        expression = Expression(expression)
        assert set(expression.variables) == operands.keys()

        scope = JointScope(
            FrozenDict({
                operand_name:
                MappedScope(operand._scope,
                            FrozenDict({operand_name: operand._expression}))
                for operand_name, operand in operands.items()
            }))
        return cls(expression, scope)
Пример #4
0
    def test_mapping(self):
        ds = DictScope.from_kwargs(a=1, b=2, c=3)
        ms = MappedScope(ds, FrozenDict(x=ExpressionScalar('a * b'),
                                        c=ExpressionScalar('a - b')))

        self.assertEqual(4, len(ms))
        self.assertEqual(set('abcx'), set(ms.keys()))
        self.assertEqual([-1, 1, 2, 2], sorted(ms.values()))
        self.assertEqual({('a', 1), ('b', 2), ('c', -1), ('x', 2)}, set(ms.items()))
        self.assertEqual(set(ms), set(ms.keys()))

        self.assertIn('a', ms)
        self.assertIn('c', ms)
        self.assertIn('x', ms)

        self.assertNotIn('d', ms)
        self.assertEqual(-1, ms['c'])
        self.assertEqual(1, ms['a'])
        self.assertEqual(2, ms['x'])

        with self.assertRaises(TypeError):
            ms['d'] = 9

        with self.assertRaisesRegex(KeyError, 'd'):
            _ = ms['d']
Пример #5
0
    def test_eq(self):
        ds1 = DictScope.from_kwargs(a=1, b=2, c=3, d=4)
        ds2 = DictScope.from_kwargs(a=1, b=2, c=3, d=5)

        mapping1 = FrozenDict(x=ExpressionScalar('a * b'),
                              c=ExpressionScalar('a - b'),
                              y=ExpressionScalar('c - a'))

        mapping2 = FrozenDict(x=ExpressionScalar('a * b'),
                              c=ExpressionScalar('a - b'),
                              y=ExpressionScalar('d - a'))

        self.assertEqual(MappedScope(ds1, mapping1), MappedScope(ds1, mapping1))
        self.assertNotEqual(MappedScope(ds1, mapping1), MappedScope(ds1, mapping2))
        self.assertNotEqual(MappedScope(ds2, mapping1), MappedScope(ds1, mapping1))
        self.assertEqual(MappedScope(ds1, mapping2), MappedScope(ds1, mapping2))
Пример #6
0
    def test_parameter(self):
        mock_a = mock.Mock(wraps=1)
        mock_result = mock.Mock()

        ds = DictScope.from_kwargs(a=mock_a, b=2, c=3)
        ms = MappedScope(ds, FrozenDict(x=ExpressionScalar('a * b'),
                                        c=ExpressionScalar('a - b'),
                                        d=ExpressionScalar('y')))

        self.assertIs(mock_a, ms._calc_parameter('a'))

        with self.assertRaises(ParameterNotProvidedException):
            ms._calc_parameter('d')

        with mock.patch.object(ms._mapping['x'], 'evaluate_in_scope', return_value=mock_result) as evaluate_in_scope:
            self.assertIs(mock_result, ms._calc_parameter('x'))
            evaluate_in_scope.assert_called_once_with(ds)

        # effective caching tests
        with mock.patch.object(ms._mapping['x'], 'evaluate_in_scope', return_value=mock_result) as evaluate_in_scope:
            self.assertIs(mock_result, ms.get_parameter('x'))
            self.assertIs(mock_result, ms.get_parameter('x'))
            evaluate_in_scope.assert_called_once_with(ds)
Пример #7
0
 def map_scope(self, scope: Scope) -> MappedScope:
     return MappedScope(scope=scope, mapping=self.__parameter_mapping)