// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/util/PotentialUtil.java
// public static Potential getPotential(Node node, List<Node> parents) {
//   Potential potential = getPotential(merge(node, parents));
// 
//   final int total = Math.min(node.probs().size(), potential.entries().size());
//   for (int i = 0; i < total; i++) {
//     Double prob = node.probs().get(i);
//     potential.entries().get(i).setValue(prob);
//   }
// 
//   return potential;
// }
// 
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/lpd/Potential.java
// public class Potential {
// 
//   private final List<PotentialEntry> entries;
// 
//   public Potential() {
//     entries = new ArrayList<>();
//   }
// 
//   /**
//    * Finds matching potential entries to the specified one passed in.
//    *
//    * @param potentialEntry Potential entry.
//    * @return List of ootential entries.
//    */
//   public List<PotentialEntry> match(PotentialEntry potentialEntry) {
//     List<PotentialEntry> entries = new ArrayList<>();
//     for (PotentialEntry entry : this.entries) {
//       if (entry.match(potentialEntry)) {
//         entries.add(entry);
//       }
//     }
//     return entries;
//   }
// 
//   public List<PotentialEntry> entries() {
//     return entries;
//   }
// 
//   public Potential addEntry(PotentialEntry entry) {
//     entries.add(entry);
//     return this;
//   }
// 
//   @Override
//   public String toString() {
//     return entries.stream()
//         .map(PotentialEntry::toString)
//         .collect(Collectors.joining(System.lineSeparator()));
//   }
// }
// 
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/traversal/DagShortestPath.java
// public class DagShortestPath extends GraphShortestPath {
// 
//   private final Dag dag;
// 
//   private DagShortestPath(Dag graph, Node start, Node stop, ShortestPathListener listener) {
//     super(graph, start, stop, listener);
//     this.dag = graph;
//   }
// 
//   public static boolean exists(Dag graph, Node start, Node stop, ShortestPathListener listener) {
//     return (new DagShortestPath(graph, start, stop, listener)).search();
//   }
// 
//   private boolean search() {
//     if (null != listener) {
//       listener.pre(graph, start, stop);
//     }
// 
//     if (start.equals(stop)) {
//       if (null != listener) {
//         listener.post(graph, start, stop);
//       }
//       return false;
//     }
// 
//     boolean result = search(start);
// 
//     if (null != listener) {
//       listener.post(graph, start, stop);
//     }
// 
//     return result;
//   }
// 
//   private boolean search(Node node) {
//     if (null != listener) {
//       listener.visited(node);
//     }
// 
//     List<Node> children = dag.children(node);
//     if (null == children || children.size() == 0) {
//       return false;
//     }
// 
//     if (children.contains(stop)) {
//       return true;
//     } else {
//       seen.add(node);
//       for (Node child : children) {
//         if (!seen.contains(child)) {
//           if (search(child)) {
//             return true;
//           }
//         }
//       }
//     }
// 
//     return false;
//   }
// }


import static com.github.vangj.jbayes.inf.exact.graph.util.PotentialUtil.getPotential;
import com.github.vangj.jbayes.inf.exact.graph.lpd.Potential;
import com.github.vangj.jbayes.inf.exact.graph.traversal.DagShortestPath;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
    }

    super.addEdge(edge);
    Node n1 = edge.left;
    Node n2 = edge.right;

    List<Node> parents = parents(n2);
    if (!parents.contains(n1)) {
      parents.add(n1);
    }

    List<Node> children = children(n1);
    if (!children.contains(n2)) {
      children.add(n2);
    }
    return this;
  }

  /**
   * Gets the parent of the specified node.
   *
   * @param node Node.
   * @return List of parents.
   */
  public List<Node> parents(Node node) {
    List<Node> parents = this.parents.get(node.id);
    if (null == parents) {
      parents = new ArrayList<>();
      this.parents.put(node.id, parents);
    }
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/util/PotentialUtil.java
// public static Potential getPotential(Node node, List<Node> parents) {
//   Potential potential = getPotential(merge(node, parents));
// 
//   final int total = Math.min(node.probs().size(), potential.entries().size());
//   for (int i = 0; i < total; i++) {
//     Double prob = node.probs().get(i);
//     potential.entries().get(i).setValue(prob);
//   }
// 
//   return potential;
// }
// 
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/lpd/Potential.java
// public class Potential {
// 
//   private final List<PotentialEntry> entries;
// 
//   public Potential() {
//     entries = new ArrayList<>();
//   }
// 
//   /**
//    * Finds matching potential entries to the specified one passed in.
//    *
//    * @param potentialEntry Potential entry.
//    * @return List of ootential entries.
//    */
//   public List<PotentialEntry> match(PotentialEntry potentialEntry) {
//     List<PotentialEntry> entries = new ArrayList<>();
//     for (PotentialEntry entry : this.entries) {
//       if (entry.match(potentialEntry)) {
//         entries.add(entry);
//       }
//     }
//     return entries;
//   }
// 
//   public List<PotentialEntry> entries() {
//     return entries;
//   }
// 
//   public Potential addEntry(PotentialEntry entry) {
//     entries.add(entry);
//     return this;
//   }
// 
//   @Override
//   public String toString() {
//     return entries.stream()
//         .map(PotentialEntry::toString)
//         .collect(Collectors.joining(System.lineSeparator()));
//   }
// }
// 
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/traversal/DagShortestPath.java
// public class DagShortestPath extends GraphShortestPath {
// 
//   private final Dag dag;
// 
//   private DagShortestPath(Dag graph, Node start, Node stop, ShortestPathListener listener) {
//     super(graph, start, stop, listener);
//     this.dag = graph;
//   }
// 
//   public static boolean exists(Dag graph, Node start, Node stop, ShortestPathListener listener) {
//     return (new DagShortestPath(graph, start, stop, listener)).search();
//   }
// 
//   private boolean search() {
//     if (null != listener) {
//       listener.pre(graph, start, stop);
//     }
// 
//     if (start.equals(stop)) {
//       if (null != listener) {
//         listener.post(graph, start, stop);
//       }
//       return false;
//     }
// 
//     boolean result = search(start);
// 
//     if (null != listener) {
//       listener.post(graph, start, stop);
//     }
// 
//     return result;
//   }
// 
//   private boolean search(Node node) {
//     if (null != listener) {
//       listener.visited(node);
//     }
// 
//     List<Node> children = dag.children(node);
//     if (null == children || children.size() == 0) {
//       return false;
//     }
// 
//     if (children.contains(stop)) {
//       return true;
//     } else {
//       seen.add(node);
//       for (Node child : children) {
//         if (!seen.contains(child)) {
//           if (search(child)) {
//             return true;
//           }
//         }
//       }
//     }
// 
//     return false;
//   }
// }


// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/Dag.java
import static com.github.vangj.jbayes.inf.exact.graph.util.PotentialUtil.getPotential;
import com.github.vangj.jbayes.inf.exact.graph.lpd.Potential;
import com.github.vangj.jbayes.inf.exact.graph.traversal.DagShortestPath;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

    }

    super.addEdge(edge);
    Node n1 = edge.left;
    Node n2 = edge.right;

    List<Node> parents = parents(n2);
    if (!parents.contains(n1)) {
      parents.add(n1);
    }

    List<Node> children = children(n1);
    if (!children.contains(n2)) {
      children.add(n2);
    }
    return this;
  }

  /**
   * Gets the parent of the specified node.
   *
   * @param node Node.
   * @return List of parents.
   */
  public List<Node> parents(Node node) {
    List<Node> parents = this.parents.get(node.id);
    if (null == parents) {
      parents = new ArrayList<>();
      this.parents.put(node.id, parents);
    }
    return parents;