Coverage for /usr/lib/python3/dist-packages/sympy/strategies/branch/traverse.py: 33%

15 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-14 15:55 +0200

1""" Branching Strategies to Traverse a Tree """ 

2from itertools import product 

3from sympy.strategies.util import basic_fns 

4from .core import chain, identity, do_one 

5 

6 

7def top_down(brule, fns=basic_fns): 

8 """ Apply a rule down a tree running it on the top nodes first """ 

9 return chain(do_one(brule, identity), 

10 lambda expr: sall(top_down(brule, fns), fns)(expr)) 

11 

12 

13def sall(brule, fns=basic_fns): 

14 """ Strategic all - apply rule to args """ 

15 op, new, children, leaf = map(fns.get, ('op', 'new', 'children', 'leaf')) 

16 

17 def all_rl(expr): 

18 if leaf(expr): 

19 yield expr 

20 else: 

21 myop = op(expr) 

22 argss = product(*map(brule, children(expr))) 

23 for args in argss: 

24 yield new(myop, *args) 

25 return all_rl