Assignment 05 Java solution

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Assignment 05 Java solution
Dear all,

as promised, here is my Java solution (adapted from last year) to assignment 05, which I wanted to show in my tutorial yesterday but couldn’t due to issues with the projector.

Remark: In two places I use Java Streams - they can be used to work with lists, arrays etc. without the need for for-loops etc.

If you have any questions or suggestions, feel free to respond to this thread.

package info.kwarc.teaching.bayes.SS19;

import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;
import info.kwarc.teaching.bayes.*;

public class MyQuery extends Query {
    @Override
    public Double query(Network network, Node node, ArrayList<Pair<Node, Boolean>> evidence) {
        Map<Node, Boolean> assignments =
                evidence.stream().collect(Collectors.toMap(Pair::getLeft, Pair::getRight));

        assignments.put(node, true);
        double p1 = pquery(network, assignments);
        assignments.put(node, false);
        double p2 = pquery(network, assignments);
        return p1/(p1 + p2);
    }

    private static Double pquery(Network network, Map<Node, Boolean> assignments) {
        for (Node node : network.getNodes()) {
            if (!assignments.containsKey(node)) {
                assignments.put(node, true);
                double prob = pquery(network, assignments);
                assignments.put(node, false);
                prob += pquery(network, assignments);
                assignments.remove(node);
                return prob;
            }
        }
        return getFullProbability(network, assignments);
    }

    private static Double getFullProbability(Network network, Map<Node, Boolean> assignments) {
        double probability = 1.0;
        for (Node node : network.getNodes()) {
            double parent_prob = node.getProb(node.parents
                                                  .stream()
                                                  .map(assignments::get)
                                                  .toArray(Boolean[]::new));
            probability *= assignments.get(node) ? parent_prob : 1 - parent_prob;
        }
        return probability;
    }
}