PeacebinfLow commited on
Commit
9ed6f67
·
verified ·
1 Parent(s): 8a63fdc

Create simulator.py

Browse files
Files changed (1) hide show
  1. engine_03/flow/simulator.py +41 -0
engine_03/flow/simulator.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Set
2
+
3
+ from .graph_models import FlowGraph, Node, Edge
4
+
5
+
6
+ def _find_start_nodes(flow: FlowGraph) -> List[Node]:
7
+ targets = {e.target for e in flow.edges}
8
+ return [n for n in flow.nodes if n.id not in targets] or (flow.nodes[:1] if flow.nodes else [])
9
+
10
+
11
+ def simulate_flowgraph(flow: FlowGraph) -> str:
12
+ if not flow.nodes:
13
+ return "No nodes defined. Add some nodes first."
14
+
15
+ start_nodes = _find_start_nodes(flow)
16
+ visited: Set[str] = set()
17
+ logs: List[str] = []
18
+
19
+ def dfs(node: Node, depth: int = 0):
20
+ if node.id in visited:
21
+ logs.append(f"{' '*depth}- Node `{node.id}` (already visited, skipping to avoid loops)")
22
+ return
23
+ visited.add(node.id)
24
+
25
+ type_tag = f" [{node.type}]" if node.type else ""
26
+ logs.append(f"{' '*depth}- Node `{node.id}`{type_tag}: {node.label}")
27
+
28
+ # Outgoing edges
29
+ for edge in flow.edges:
30
+ if edge.source == node.id:
31
+ next_node = flow.find_node(edge.target)
32
+ if next_node:
33
+ dfs(next_node, depth + 1)
34
+
35
+ for start in start_nodes:
36
+ dfs(start, 0)
37
+
38
+ if not logs:
39
+ return "No execution path found. Check your edges."
40
+
41
+ return "### Simulated Flow Execution\n" + "\n".join(logs)