19 package ca.uqac.lif.synthia.explanation;
21 import java.util.ArrayDeque;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Queue;
28 import ca.
uqac.
lif.dag.NestedNode.NestedNodeCrawler;
31 import ca.
uqac.
lif.petitpoucet.NodeFactory;
34 import ca.
uqac.
lif.petitpoucet.function.ExplanationQueryable;
46 NodeFactory factory = NodeFactory.getFactory().getFactory(part, picker);
47 Queue<PartNode> to_visit =
new ArrayDeque<PartNode>();
48 PartNode root = factory.getPartNode(part, picker);
50 Set<PartNode> visited =
new HashSet<PartNode>();
51 while (!to_visit.isEmpty())
53 LabelledNode current = to_visit.remove();
54 if (visited.contains(current) || !(current instanceof PartNode))
58 PartNode pn_current = (PartNode) current;
59 visited.add(pn_current);
60 if (!(pn_current.getSubject() instanceof ExplanationQueryable))
64 Part ppn_current = pn_current.getPart();
65 ExplanationQueryable eq = (ExplanationQueryable) pn_current.getSubject();
66 PartNode under = eq.getExplanation(ppn_current, factory);
67 if (under.equals(pn_current))
69 for (Pin<?> p : under.getOutputLinks(0))
71 Node n_child = (Node) p.getNode();
72 pn_current.addChild(n_child);
73 NestedNodeCrawler c =
new NestedNodeCrawler(n_child);
75 List<Node> leaves = c.getLeaves();
78 if (n instanceof PartNode && !to_visit.contains(n) && !visited.contains(n))
80 to_visit.add((PartNode) n);
87 pn_current.addChild(under);
88 NestedNodeCrawler c =
new NestedNodeCrawler(under);
89 List<Node> leaves = c.getLeaves();
92 if (n instanceof PartNode && !to_visit.contains(n) && !visited.contains(n))
94 to_visit.add((PartNode) n);