MCPcopy Create free account
hub / github.com/numpy/numpy / traverse

Method traverse

numpy/f2py/symbolic.py:660–714  ·  view source on GitHub ↗

Traverse expression tree with visit function. The visit function is applied to an expression with given args and kwargs. Traverse call returns an expression returned by visit when not None, otherwise return a new normalized expression with traverse-visit sub

(self, visit, *args, **kwargs)

Source from the content-addressed store, hash-verified

658 raise NotImplementedError(f'substitute method for {self.op}: {self!r}')
659
660 def traverse(self, visit, *args, **kwargs):
661 """Traverse expression tree with visit function.
662
663 The visit function is applied to an expression with given args
664 and kwargs.
665
666 Traverse call returns an expression returned by visit when not
667 None, otherwise return a new normalized expression with
668 traverse-visit sub-expressions.
669 """
670 result = visit(self, *args, **kwargs)
671 if result is not None:
672 return result
673
674 if self.op in (Op.INTEGER, Op.REAL, Op.STRING, Op.SYMBOL):
675 return self
676 elif self.op in (Op.COMPLEX, Op.ARRAY, Op.CONCAT, Op.TERNARY):
677 return normalize(Expr(self.op, tuple(
678 item.traverse(visit, *args, **kwargs)
679 for item in self.data)))
680 elif self.op in (Op.TERMS, Op.FACTORS):
681 data = {}
682 for k, v in self.data.items():
683 k = k.traverse(visit, *args, **kwargs)
684 v = (v.traverse(visit, *args, **kwargs)
685 if isinstance(v, Expr) else v)
686 if k in data:
687 v = data[k] + v
688 data[k] = v
689 return normalize(Expr(self.op, data))
690 elif self.op is Op.APPLY:
691 obj = self.data[0]
692 func = (obj.traverse(visit, *args, **kwargs)
693 if isinstance(obj, Expr) else obj)
694 operands = tuple(operand.traverse(visit, *args, **kwargs)
695 for operand in self.data[1])
696 kwoperands = dict((k, v.traverse(visit, *args, **kwargs))
697 for k, v in self.data[2].items())
698 return normalize(Expr(self.op, (func, operands, kwoperands)))
699 elif self.op is Op.INDEXING:
700 obj = self.data[0]
701 obj = (obj.traverse(visit, *args, **kwargs)
702 if isinstance(obj, Expr) else obj)
703 indices = tuple(index.traverse(visit, *args, **kwargs)
704 for index in self.data[1:])
705 return normalize(Expr(self.op, (obj,) + indices))
706 elif self.op in (Op.REF, Op.DEREF):
707 return normalize(Expr(self.op,
708 self.data.traverse(visit, *args, **kwargs)))
709 elif self.op is Op.RELATIONAL:
710 rop, left, right = self.data
711 left = left.traverse(visit, *args, **kwargs)
712 right = right.traverse(visit, *args, **kwargs)
713 return normalize(Expr(self.op, (rop, left, right)))
714 raise NotImplementedError(f'traverse method for {self.op}')
715
716 def contains(self, other):
717 """Check if self contains other.

Callers 5

containsMethod · 0.95
symbolsMethod · 0.95
polynomial_atomsMethod · 0.95
visitMethod · 0.80
test_traverseMethod · 0.80

Calls 2

normalizeFunction · 0.85
ExprClass · 0.85

Tested by 1

test_traverseMethod · 0.64