예제 #1
0
  /*
   * Eliminates all variables defined as evidence.
   * The order of the variables that are not eliminated is
   * the same order in the original function.
   */
  private ProbabilityFunction check_evidence(ProbabilityFunction pf) {
    int i, j, k, v, aux_i;
    boolean markers[] = new boolean[bn.number_variables()];
    int n = build_evidence_markers(pf, markers);

    // Handle special cases
    if (n == 0) return (null); // No variable remains
    if (n == pf.number_variables()) return (pf); // No relevant evidence

    // Calculate necessary quantities in such a
    // way that the order of variables in the original
    // function is not altered.
    int joined_indexes[] = new int[n];
    for (i = 0, j = 0, v = 1; i < pf.number_variables(); i++) {
      aux_i = pf.get_variable(i).get_index();
      if (markers[aux_i] == true) {
        joined_indexes[j] = aux_i;
        j++;
        v *= bn.get_probability_variable(aux_i).number_values();
      }
    }

    // Create new function to be filled with joined variables
    ProbabilityFunction new_pf = new ProbabilityFunction(bn, n, v, null);
    for (i = 0; i < n; i++) new_pf.set_variable(i, bn.get_probability_variable(joined_indexes[i]));

    // Loop through the values
    check_evidence_loop(new_pf, pf);

    return (new_pf);
  }
예제 #2
0
 /*
  * Transform an observed ProbabilityVariable into a ProbabilityFunction
  * to handle the case where the query involves an observed variable.
  */
 private ProbabilityFunction transform_to_probability_function(
     BayesNet bn, ProbabilityVariable pv) {
   ProbabilityFunction pf = new ProbabilityFunction(bn, 1, pv.number_values(), null);
   pf.set_variable(0, pv);
   int index_of_value = pv.get_observed_index();
   pf.set_value(index_of_value, 1.0);
   return (pf);
 }