コード例 #1
0
ファイル: test_visitor.py プロジェクト: zypher22/pyomo
    def test_OLD_beforeChild_acceptChildResult_afterChild(self):
        counts = [0,0,0]
        def before(node, child):
            counts[0] += 1
            if type(child) in nonpyomo_leaf_types \
               or not child.is_expression_type():
                return False, None
        def accept(node, data, child_result):
            counts[1] += 1
        def after(node, child):
            counts[2] += 1

        os = StringIO()
        with LoggingIntercept(os, 'pyomo'):
            walker = StreamBasedExpressionVisitor(
                beforeChild=before, acceptChildResult=accept, afterChild=after)
        self.assertIn(
            "Note that the API for the StreamBasedExpressionVisitor "
            "has changed to include the child index for the "
            "beforeChild() method", os.getvalue().replace('\n',' '))
        self.assertIn(
            "Note that the API for the StreamBasedExpressionVisitor "
            "has changed to include the child index for the "
            "acceptChildResult() method", os.getvalue().replace('\n',' '))
        self.assertIn(
            "Note that the API for the StreamBasedExpressionVisitor "
            "has changed to include the child index for the "
            "afterChild() method", os.getvalue().replace('\n',' '))

        ans = walker.walk_expression(self.e)
        m = self.m
        self.assertEqual(ans, None)
        self.assertEquals(counts, [9,9,9])
コード例 #2
0
    def test_enterNode_noLeafList(self):
        # This is an alternative way to implement the beforeChild test:
        def enter(node):
            if type(node) in nonpyomo_leaf_types \
               or not node.is_expression_type():
                return (), node
            return node.args, []
        walker = StreamBasedExpressionVisitor(
            enterNode=enter)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [
            [m.x, 2],
            m.y,
            [m.z, [m.x, m.y]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = m.x
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = 2
        self.assertEqual(str(ans), str(ref))
コード例 #3
0
    def test_enterNode_withFinalize(self):
        # This is an alternative way to implement the beforeChild test:
        def enter(node):
            if type(node) in nonpyomo_leaf_types \
               or not node.is_expression_type():
                return (), node
            return node.args, []

        def finalize(result):
            if type(result) is list:
                return result
            else:
                return [result]

        walker = StreamBasedExpressionVisitor(enterNode=enter,
                                              finalizeResult=finalize)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [[m.x, 2], m.y, [m.z, [m.x, m.y]]]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = [m.x]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = [2]
        self.assertEqual(str(ans), str(ref))
コード例 #4
0
    def test_exitNode(self):
        # This is an alternative way to implement the beforeChild test:
        def exit(node, data):
            if data:
                return data
            else:
                return [node]
        walker = StreamBasedExpressionVisitor(exitNode=exit)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [
            [[m.x], [2]],
            [m.y],
            [[m.z], [[m.x], [m.y]]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = [m.x]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = [2]
        self.assertEqual(str(ans), str(ref))
コード例 #5
0
    def test_old_beforeChild(self):
        def before(node, child):
            if type(child) in nonpyomo_leaf_types \
               or not child.is_expression_type():
                return False, [child]

        os = StringIO()
        with LoggingIntercept(os, 'pyomo'):
            walker = StreamBasedExpressionVisitor(beforeChild=before)
        self.assertIn(
            "Note that the API for the StreamBasedExpressionVisitor "
            "has changed to include the child index for the beforeChild() "
            "method",
            os.getvalue().replace('\n', ' '))

        ans = walker.walk_expression(self.e)
        m = self.m
        ref = [[[m.x], [2]], [m.y], [[m.z], [[m.x], [m.y]]]]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = []
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = []
        self.assertEqual(str(ans), str(ref))
コード例 #6
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
    def test_exitNode(self):
        # This is an alternative way to implement the beforeChild test:
        def exit(node, data):
            if data:
                return data
            else:
                return [node]
        walker = StreamBasedExpressionVisitor(exitNode=exit)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [
            [[m.x], [2]],
            [m.y],
            [[m.z], [[m.x], [m.y]]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = [m.x]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = [2]
        self.assertEqual(str(ans), str(ref))
コード例 #7
0
    def test_finalize(self):
        ans = []

        def before(node, child, child_idx):
            if type(child) in nonpyomo_leaf_types \
               or not child.is_expression_type():
                return False, child

        def accept(node, data, child_result, child_idx):
            if data is not child_result:
                data.append(child_result)
            return data

        def enter(node):
            return node.args, ans

        def finalize(result):
            return len(result)

        walker = StreamBasedExpressionVisitor(enterNode=enter,
                                              beforeChild=before,
                                              acceptChildResult=accept,
                                              finalizeResult=finalize)
        ans = walker.walk_expression(self.e)
        self.assertEqual(ans, 6)
コード例 #8
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
    def test_enterNode_withFinalize(self):
        # This is an alternative way to implement the beforeChild test:
        def enter(node):
            if type(node) in nonpyomo_leaf_types \
               or not node.is_expression_type():
                return (), node
            return node.args, []
        def finalize(result):
            if type(result) is list:
                return result
            else:
                return[result]
        walker = StreamBasedExpressionVisitor(
            enterNode=enter, finalizeResult=finalize)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [
            [m.x, 2],
            m.y,
            [m.z, [m.x, m.y]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = [m.x]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = [2]
        self.assertEqual(str(ans), str(ref))
コード例 #9
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
    def test_enterNode_noLeafList(self):
        # This is an alternative way to implement the beforeChild test:
        def enter(node):
            if type(node) in nonpyomo_leaf_types \
               or not node.is_expression_type():
                return (), node
            return node.args, []
        walker = StreamBasedExpressionVisitor(
            enterNode=enter)
        m = self.m

        ans = walker.walk_expression(self.e)
        ref = [
            [m.x, 2],
            m.y,
            [m.z, [m.x, m.y]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = m.x
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = 2
        self.assertEqual(str(ans), str(ref))
コード例 #10
0
 def test_default(self):
     walker = StreamBasedExpressionVisitor()
     ans = walker.walk_expression(self.e)
     ref = [[[], []], [], [
         [],
         [[], []],
     ]]
     self.assertEqual(ans, ref)
コード例 #11
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
 def test_reduce_in_accept(self):
     def enter(node):
         return None, 1
     def accept(node, data, child_result):
         return data + child_result
     walker = StreamBasedExpressionVisitor(
         enterNode=enter, acceptChildResult=accept)
     # 4 operators, 6 leaf nodes
     self.assertEquals(walker.walk_expression(self.e), 10)
コード例 #12
0
 def test_reduce_in_accept(self):
     def enter(node):
         return None, 1
     def accept(node, data, child_result):
         return data + child_result
     walker = StreamBasedExpressionVisitor(
         enterNode=enter, acceptChildResult=accept)
     # 4 operators, 6 leaf nodes
     self.assertEquals(walker.walk_expression(self.e), 10)
コード例 #13
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
 def test_default(self):
     walker = StreamBasedExpressionVisitor()
     ans = walker.walk_expression(self.e)
     ref = [
         [[],[]],
         [],
         [[],[[],[]],]
     ]
     self.assertEqual(ans, ref)
コード例 #14
0
def resolve_template(expr):
    """Resolve a template into a concrete expression

    This takes a template expression and returns the concrete equivalent
    by substituting the current values of all IndexTemplate objects and
    resolving (evaluating and removing) all GetItemExpression,
    GetAttrExpression, and TemplateSumExpression expression nodes.

    """
    def beforeChild(node, child, child_idx):
        # Efficiency: do not decend into leaf nodes.
        if type(child) in native_types or not child.is_expression_type():
            if hasattr(child, '_resolve_template'):
                return False, child._resolve_template(())
            return False, child
        else:
            return True, None

    def exitNode(node, args):
        if hasattr(node, '_resolve_template'):
            return node._resolve_template(args)
        if len(args) == node.nargs() and all(a is b
                                             for a, b in zip(node.args, args)):
            return node
        return node.create_node_with_local_data(args)

    return StreamBasedExpressionVisitor(
        initializeWalker=lambda x: beforeChild(None, x, None),
        beforeChild=beforeChild,
        exitNode=exitNode,
    ).walk_expression(expr)
コード例 #15
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
 def test_beforeChild_acceptChildResult_afterChild(self):
     counts = [0,0,0]
     def before(node, child):
         counts[0] += 1
         if type(child) in nonpyomo_leaf_types \
            or not child.is_expression_type():
             return False, None
     def accept(node, data, child_result):
         counts[1] += 1
     def after(node, child):
         counts[2] += 1
     walker = StreamBasedExpressionVisitor(
         beforeChild=before, acceptChildResult=accept, afterChild=after)
     ans = walker.walk_expression(self.e)
     m = self.m
     self.assertEqual(ans, None)
     self.assertEquals(counts, [9,9,9])
コード例 #16
0
 def test_beforeChild_acceptChildResult_afterChild(self):
     counts = [0,0,0]
     def before(node, child):
         counts[0] += 1
         if type(child) in nonpyomo_leaf_types \
            or not child.is_expression_type():
             return False, None
     def accept(node, data, child_result):
         counts[1] += 1
     def after(node, child):
         counts[2] += 1
     walker = StreamBasedExpressionVisitor(
         beforeChild=before, acceptChildResult=accept, afterChild=after)
     ans = walker.walk_expression(self.e)
     m = self.m
     self.assertEqual(ans, None)
     self.assertEquals(counts, [9,9,9])
コード例 #17
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
 def test_enterNode_acceptChildResult_beforeChild(self):
     ans = []
     def before(node, child):
         if type(child) in nonpyomo_leaf_types \
            or not child.is_expression_type():
             return False, child
     def accept(node, data, child_result):
         if data is not child_result:
             data.append(child_result)
         return data
     def enter(node):
         return node.args, ans
     walker = StreamBasedExpressionVisitor(
         enterNode=enter, beforeChild=before, acceptChildResult=accept)
     ans = walker.walk_expression(self.e)
     m = self.m
     ref = [m.x, 2, m.y, m.z, m.x, m.y]
     self.assertEqual(str(ans), str(ref))
コード例 #18
0
 def test_enterNode_acceptChildResult_beforeChild(self):
     ans = []
     def before(node, child):
         if type(child) in nonpyomo_leaf_types \
            or not child.is_expression_type():
             return False, child
     def accept(node, data, child_result):
         if data is not child_result:
             data.append(child_result)
         return data
     def enter(node):
         return node.args, ans
     walker = StreamBasedExpressionVisitor(
         enterNode=enter, beforeChild=before, acceptChildResult=accept)
     ans = walker.walk_expression(self.e)
     m = self.m
     ref = [m.x, 2, m.y, m.z, m.x, m.y]
     self.assertEqual(str(ans), str(ref))
コード例 #19
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
 def test_finalize(self):
     ans = []
     def before(node, child):
         if type(child) in nonpyomo_leaf_types \
            or not child.is_expression_type():
             return False, child
     def accept(node, data, child_result):
         if data is not child_result:
             data.append(child_result)
         return data
     def enter(node):
         return node.args, ans
     def finalize(result):
         return len(result)
     walker = StreamBasedExpressionVisitor(
         enterNode=enter, beforeChild=before, acceptChildResult=accept,
         finalizeResult=finalize)
     ans = walker.walk_expression(self.e)
     self.assertEqual(ans, 6)
コード例 #20
0
    def test_beforeChild(self):
        def before(node, child, child_idx):
            if type(child) in nonpyomo_leaf_types \
               or not child.is_expression_type():
                return False, [child]

        walker = StreamBasedExpressionVisitor(beforeChild=before)
        ans = walker.walk_expression(self.e)
        m = self.m
        ref = [[[m.x], [2]], [m.y], [[m.z], [[m.x], [m.y]]]]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = []
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = []
        self.assertEqual(str(ans), str(ref))
コード例 #21
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
    def test_beforeChild(self):
        def before(node, child):
            if type(child) in nonpyomo_leaf_types \
               or not child.is_expression_type():
                return False, [child]
        walker = StreamBasedExpressionVisitor(beforeChild=before)
        ans = walker.walk_expression(self.e)
        m = self.m
        ref = [
            [[m.x], [2]],
            [m.y],
            [[m.z], [[m.x], [m.y]]]
        ]
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(m.x)
        ref = []
        self.assertEqual(str(ans), str(ref))

        ans = walker.walk_expression(2)
        ref = []
        self.assertEqual(str(ans), str(ref))
コード例 #22
0
ファイル: manager.py プロジェクト: cog-imperial/galini
def _check_cut_coefficients_are_numerically_reasonable(cut):
    def enter_node(node):
        return None, []

    def exit_node(node, data):
        node_type = type(node)
        if node_type in nonpyomo_leaf_types:
            return np.isfinite(node)
        elif not node.is_expression_type() and not node.is_variable_type():
            return np.isfinite(node.value)
        return True

    return StreamBasedExpressionVisitor(
        enterNode=enter_node,
        exitNode=exit_node,
    ).walk_expression(cut)
コード例 #23
0
    def test_all_function_pointers(self):
        ans = []

        def name(x):
            if type(x) in nonpyomo_leaf_types:
                return str(x)
            else:
                return x.name

        def enter(node):
            ans.append("Enter %s" % (name(node)))

        def exit(node, data):
            ans.append("Exit %s" % (name(node)))

        def before(node, child, child_idx):
            ans.append("Before %s (from %s)" % (name(child), name(node)))

        def accept(node, data, child_result, child_idx):
            ans.append("Accept into %s" % (name(node)))

        def after(node, child, child_idx):
            ans.append("After %s (from %s)" % (name(child), name(node)))

        def finalize(result):
            ans.append("Finalize")

        walker = StreamBasedExpressionVisitor(enterNode=enter,
                                              exitNode=exit,
                                              beforeChild=before,
                                              acceptChildResult=accept,
                                              afterChild=after,
                                              finalizeResult=finalize)
        self.assertIsNone(walker.walk_expression(self.e))
        self.assertEqual(
            "\n".join(ans), """Enter sum
Before pow (from sum)
Enter pow
Before x (from pow)
Enter x
Exit x
Accept into pow
After x (from pow)
Before 2 (from pow)
Enter 2
Exit 2
Accept into pow
After 2 (from pow)
Exit pow
Accept into sum
After pow (from sum)
Before y (from sum)
Enter y
Exit y
Accept into sum
After y (from sum)
Before prod (from sum)
Enter prod
Before z (from prod)
Enter z
Exit z
Accept into prod
After z (from prod)
Before sum (from prod)
Enter sum
Before x (from sum)
Enter x
Exit x
Accept into sum
After x (from sum)
Before y (from sum)
Enter y
Exit y
Accept into sum
After y (from sum)
Exit sum
Accept into prod
After sum (from prod)
Exit prod
Accept into sum
After prod (from sum)
Exit sum
Finalize""")
コード例 #24
0
ファイル: test_visitor.py プロジェクト: Pyomo/pyomo
    def test_all_function_pointers(self):
        ans = []
        def name(x):
            if type(x) in nonpyomo_leaf_types:
                return str(x)
            else:
                return x.name
        def enter(node):
            ans.append("Enter %s" % (name(node)))
        def exit(node, data):
            ans.append("Exit %s" % (name(node)))
        def before(node, child):
            ans.append("Before %s (from %s)" % (name(child), name(node)))
        def accept(node, data, child_result):
            ans.append("Accept into %s" % (name(node)))
        def after(node, child):
            ans.append("After %s (from %s)" % (name(child), name(node)))
        def finalize(result):
            ans.append("Finalize")
        walker = StreamBasedExpressionVisitor(
            enterNode=enter, exitNode=exit, beforeChild=before, 
            acceptChildResult=accept, afterChild=after, finalizeResult=finalize)
        self.assertIsNone( walker.walk_expression(self.e) )
        self.assertEqual("\n".join(ans),"""Enter sum
Before pow (from sum)
Enter pow
Before x (from pow)
Enter x
Exit x
Accept into pow
After x (from pow)
Before 2 (from pow)
Enter 2
Exit 2
Accept into pow
After 2 (from pow)
Exit pow
Accept into sum
After pow (from sum)
Before y (from sum)
Enter y
Exit y
Accept into sum
After y (from sum)
Before prod (from sum)
Enter prod
Before z (from prod)
Enter z
Exit z
Accept into prod
After z (from prod)
Before sum (from prod)
Enter sum
Before x (from sum)
Enter x
Exit x
Accept into sum
After x (from sum)
Before y (from sum)
Enter y
Exit y
Accept into sum
After y (from sum)
Exit sum
Accept into prod
After sum (from prod)
Exit prod
Accept into sum
After prod (from sum)
Exit sum
Finalize""")
コード例 #25
0
 def test_bad_args(self):
     with self.assertRaisesRegexp(
             RuntimeError, "Unrecognized keyword arguments: {'foo': None}"):
         StreamBasedExpressionVisitor(foo=None)