| 670 | |
| 671 | |
| 672 | def dfs(aa, seq=None, seqset=None): |
| 673 | if seq is None: |
| 674 | assert seqset is None |
| 675 | seq = [] |
| 676 | seqset = {} |
| 677 | # -- seqset is the set of all nodes we have seen (which may be still on |
| 678 | # the stack) |
| 679 | # N.B. it used to be a stack, but now it's a dict mapping to inputs |
| 680 | # because that's an optimization saving us from having to call inputs |
| 681 | # so often. |
| 682 | if aa in seqset: |
| 683 | return |
| 684 | assert isinstance(aa, Apply) |
| 685 | seqset[aa] = aa.inputs() |
| 686 | for ii in seqset[aa]: |
| 687 | dfs(ii, seq, seqset) |
| 688 | seq.append(aa) |
| 689 | return seq |
| 690 | |
| 691 | |
| 692 | def toposort(expr): |