// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/Node.java
// public class Node extends Variable {
// 
//   private final List<Double> probs;
//   private List<String> valueList;
//   private Potential potential;
//   private Map<String, Object> metadata;
// 
//   public Node() {
//     probs = new ArrayList<>();
//   }
// 
//   public Node(Variable v) {
//     probs = new ArrayList<>();
//     metadata = new HashMap<>();
//     this.id = v.id;
//     this.name = v.name;
//     this.values = v.values;
//     this.valueList = this.values.stream()
//         .collect(Collectors.toList());
//   }
// 
//   private Node(NodeBuilder builder) {
//     id = builder.id;
//     metadata = new HashMap<>();
//     name = builder.name;
//     values = builder.values;
//     probs = builder.probs;
//     this.valueList = this.values.stream()
//         .collect(Collectors.toList());
//   }
// 
//   public static NodeBuilder builder() {
//     return new NodeBuilder();
//   }
// 
//   /**
//    * Adds any metadata.
//    *
//    * @param k Key.
//    * @param v Value.
//    */
//   public void addMetadata(String k, Object v) {
//     metadata.put(k, v);
//   }
// 
//   /**
//    * Gets the metadata associated with the specified key.
//    *
//    * @param k Key.
//    * @return Value.
//    */
//   public Object getMetadata(String k) {
//     return metadata.get(k);
//   }
// 
//   public Potential getPotential() {
//     return potential;
//   }
// 
//   public void setPotential(Potential potential) {
//     this.potential = potential;
//   }
// 
//   public Node addProb(Double prob) {
//     probs.add(prob);
//     return this;
//   }
// 
//   public int weight() {
//     return values.size();
//   }
// 
//   public List<Double> probs() {
//     return probs;
//   }
// 
//   public List<String> getValueList() {
//     return valueList;
//   }
// 
//   public static final class NodeBuilder {
// 
//     private String id;
//     private String name;
//     private Set<String> values;
//     private List<Double> probs;
// 
//     private NodeBuilder() {
//       values = new LinkedHashSet<>();
//       probs = new ArrayList<>();
//     }
// 
//     public NodeBuilder from(Variable v) {
//       this.id = v.id;
//       this.name = v.name;
//       this.values = v.values;
//       return this;
//     }
// 
//     public NodeBuilder id(String val) {
//       id = val;
//       return this;
//     }
// 
//     public NodeBuilder name(String val) {
//       name = val;
//       return this;
//     }
// 
//     public NodeBuilder value(String val) {
//       values.add(val);
//       return this;
//     }
// 
//     public NodeBuilder values(Set<String> val) {
//       values = val;
//       return this;
//     }
// 
//     public NodeBuilder probs(List<Double> probs) {
//       this.probs = probs;
//       return this;
//     }
// 
//     public NodeBuilder prob(Double prob) {
//       this.probs.add(prob);
//       return this;
//     }
// 
//     public Node build() {
//       return new Node(this);
//     }
//   }
// }
// 
// 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()));
//   }
// }


import com.github.vangj.jbayes.inf.exact.graph.Node;
import com.github.vangj.jbayes.inf.exact.graph.lpd.Potential;
import java.util.LinkedHashMap;
import java.util.Map;
package com.github.vangj.jbayes.inf.exact.graph.pptc;


/**
 * Evidence.
 */
public class Evidence {

  private final Node node;
  private final Map<String, Double> values;
  private final Type type;

  private Evidence(Builder builder) {
    node = builder.node;
    values = builder.values;
    type = builder.type;
  }

  /**
   * Converts a map of values to potentials to a map of values to likelihoods.
   *
   * @param map Map.
   * @return Map.
   */
// Path: src/main/java/com/github/vangj/jbayes/inf/exact/graph/Node.java
// public class Node extends Variable {
// 
//   private final List<Double> probs;
//   private List<String> valueList;
//   private Potential potential;
//   private Map<String, Object> metadata;
// 
//   public Node() {
//     probs = new ArrayList<>();
//   }
// 
//   public Node(Variable v) {
//     probs = new ArrayList<>();
//     metadata = new HashMap<>();
//     this.id = v.id;
//     this.name = v.name;
//     this.values = v.values;
//     this.valueList = this.values.stream()
//         .collect(Collectors.toList());
//   }
// 
//   private Node(NodeBuilder builder) {
//     id = builder.id;
//     metadata = new HashMap<>();
//     name = builder.name;
//     values = builder.values;
//     probs = builder.probs;
//     this.valueList = this.values.stream()
//         .collect(Collectors.toList());
//   }
// 
//   public static NodeBuilder builder() {
//     return new NodeBuilder();
//   }
// 
//   /**
//    * Adds any metadata.
//    *
//    * @param k Key.
//    * @param v Value.
//    */
//   public void addMetadata(String k, Object v) {
//     metadata.put(k, v);
//   }
// 
//   /**
//    * Gets the metadata associated with the specified key.
//    *
//    * @param k Key.
//    * @return Value.
//    */
//   public Object getMetadata(String k) {
//     return metadata.get(k);
//   }
// 
//   public Potential getPotential() {
//     return potential;
//   }
// 
//   public void setPotential(Potential potential) {
//     this.potential = potential;
//   }
// 
//   public Node addProb(Double prob) {
//     probs.add(prob);
//     return this;
//   }
// 
//   public int weight() {
//     return values.size();
//   }
// 
//   public List<Double> probs() {
//     return probs;
//   }
// 
//   public List<String> getValueList() {
//     return valueList;
//   }
// 
//   public static final class NodeBuilder {
// 
//     private String id;
//     private String name;
//     private Set<String> values;
//     private List<Double> probs;
// 
//     private NodeBuilder() {
//       values = new LinkedHashSet<>();
//       probs = new ArrayList<>();
//     }
// 
//     public NodeBuilder from(Variable v) {
//       this.id = v.id;
//       this.name = v.name;
//       this.values = v.values;
//       return this;
//     }
// 
//     public NodeBuilder id(String val) {
//       id = val;
//       return this;
//     }
// 
//     public NodeBuilder name(String val) {
//       name = val;
//       return this;
//     }
// 
//     public NodeBuilder value(String val) {
//       values.add(val);
//       return this;
//     }
// 
//     public NodeBuilder values(Set<String> val) {
//       values = val;
//       return this;
//     }
// 
//     public NodeBuilder probs(List<Double> probs) {
//       this.probs = probs;
//       return this;
//     }
// 
//     public NodeBuilder prob(Double prob) {
//       this.probs.add(prob);
//       return this;
//     }
// 
//     public Node build() {
//       return new Node(this);
//     }
//   }
// }
// 
// 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/pptc/Evidence.java
import com.github.vangj.jbayes.inf.exact.graph.Node;
import com.github.vangj.jbayes.inf.exact.graph.lpd.Potential;
import java.util.LinkedHashMap;
import java.util.Map;

package com.github.vangj.jbayes.inf.exact.graph.pptc;


/**
 * Evidence.
 */
public class Evidence {

  private final Node node;
  private final Map<String, Double> values;
  private final Type type;

  private Evidence(Builder builder) {
    node = builder.node;
    values = builder.values;
    type = builder.type;
  }

  /**
   * Converts a map of values to potentials to a map of values to likelihoods.
   *
   * @param map Map.
   * @return Map.
   */
  private static Map<String, Double> convert(Map<String, Potential> map) {