/* * Copyright 2015 JBoss, by Red Hat, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.wires.bayesian.network.parser.client.builder; import java.util.ArrayList; import java.util.List; import org.uberfire.ext.wires.bayesian.network.parser.client.model.BayesNetwork; import org.uberfire.ext.wires.bayesian.network.parser.client.model.BayesVariable; import org.uberfire.ext.wires.bayesian.network.parser.client.parser.Bif; import org.uberfire.ext.wires.bayesian.network.parser.client.parser.Definition; import org.uberfire.ext.wires.bayesian.network.parser.client.parser.Network; import org.uberfire.ext.wires.bayesian.network.parser.client.parser.Variable; public class BayesianBuilder { public BayesNetwork build(Bif bif) { BayesNetwork bayesNetwork = new BayesNetwork(bif.getNetwork().getName()); int id = 1; for (Definition def : bif.getNetwork().getDefinitions()) { BayesVariable nodo = buildVariable(def, bif.getNetwork(), id); bayesNetwork.getNodos().add(nodo); id += 1; } this.setIncomingNodes(bayesNetwork); return bayesNetwork; } private BayesVariable buildVariable(Definition def, Network network, int id) { List<String> outcomes = new ArrayList<String>(); double[][] position = new double[2][2]; this.getOutcomesByVariable(network, def.getName(), outcomes, position); return new BayesVariable(def.getName(), id, outcomes, this.getProbabilities(def.getProbabilities(), outcomes), def.getGiven(), position); } private void getOutcomesByVariable(Network network, String nameDefinition, List<String> outcomes, double[][] position) { for (Variable var : network.getVariables()) { if (var.getName().equals(nameDefinition)) { for (String outcome : var.getOutComes()) { outcomes.add(outcome); } // get position position = getPosition(var.getPosition(), position); } } } private double[][] getProbabilities(String table, List<String> outcomes) { double probabilities[][] = new double[table.split(" ").length][table.split(" ").length]; String[] values = table.split(" "); int k = 0; for (int i = 0; i < values.length / outcomes.size(); i++) { for (int j = 0; j < outcomes.size(); j++) { probabilities[i][j] = Double.valueOf(values[k]); k += 1; } } return probabilities; } private double[][] getPosition(String stringPosition, double[][] position) { if (stringPosition != null) { stringPosition = this.clearStringPosticion(stringPosition); int i = 0; int j = 0; for (String pos : stringPosition.split(",")) { position[i][j] = Double.parseDouble(pos); if (i < j) { i += 1; } j += 1; } } return null; } private String clearStringPosticion(String stringPosition) { stringPosition = stringPosition.replace("position", ""); stringPosition = stringPosition.replace("=", ""); stringPosition = stringPosition.replace("(", ""); stringPosition = stringPosition.replace(")", ""); stringPosition = stringPosition.trim(); return stringPosition; } private void setIncomingNodes(BayesNetwork bayesNetwork) { for (BayesVariable node : bayesNetwork.getNodos()) { if (node.getGiven() != null && !node.getGiven().isEmpty()) { node.setIncomingNodes(this.getNodesByGiven(node.getGiven(), bayesNetwork.getNodos())); } } } private List<BayesVariable> getNodesByGiven(List<String> given, List<BayesVariable> nodes) { List<BayesVariable> listIncoming = new ArrayList<BayesVariable>(); for (String giv : given) { for (BayesVariable node : nodes) { if (node.getName().equals(giv)) { listIncoming.add(node); break; } } } return listIncoming; } }