/** * Returns the Bayesian network at Time T. * @return a {@link BayesianNetwork} object. */ public BayesianNetwork toBayesianNetworkTimeT(){ DAG dagTimeT = this.getDynamicDAG().toDAGTimeT(); BayesianNetwork bnTimeT = new BayesianNetwork(dagTimeT); for (Variable dynamicVar : this.getDynamicVariables()) { Variable staticVar = dagTimeT.getVariables().getVariableByName(dynamicVar.getName()); ConditionalDistribution deepCopy = Serialization.deepCopy(this.getConditionalDistributionTimeT(dynamicVar)); deepCopy.setVar(staticVar); List<Variable> newParents = deepCopy.getConditioningVariables().stream().map(var -> dagTimeT.getVariables().getVariableByName(var.getName())).collect(Collectors.toList()); deepCopy.setConditioningVariables(newParents); bnTimeT.setConditionalDistribution(staticVar,deepCopy); } return bnTimeT; }
/** * Returns the log probability of a valid assignment at Time T. * @param assignment an object of type {@link Assignment}. * @return a {@code double} that represents the log probability of the assignment. */ public double getLogProbabiltyOfFullAssignmentTimeT(Assignment assignment){ double logProb = 0; for (Variable var: this.getDynamicVariables()){ if (assignment.getValue(var)== Utils.missingValue()) { throw new UnsupportedOperationException("This method can not compute the probabilty of a partial assignment."); } logProb += this.distributionsTimeT.get(var.getVarID()).getLogConditionalProbability(assignment); } return logProb; }
public <E extends UnivariateDistribution> E getPosteriorlDistribution(String varName) { if (learningAlgorithm !=null){ return (E) this.learningAlgorithm.getLearntDBN().getConditionalDistributionsTimeT() .stream() .filter(d -> d.getVariable().getName().equals(varName)) .findFirst().get(); } return null; } }
/** * Tests if two Dynamic Bayesian networks are equals. * Two Dynamic Bayesian networks are considered equals if they have an equal conditional distribution for each variable at both Time 0 and T. * @param bnet a given DynamicBayesianNetwork to be compared with this DynamicBayesianNetwork. * @param threshold a threshold value. * @return a boolean indicating if the two DynamicBNs are equals or not. */ public boolean equalDBNs(DynamicBayesianNetwork bnet, double threshold) { boolean equals = true; if (this.getDynamicDAG().equals(bnet.getDynamicDAG())){ for (Variable var : this.getDynamicVariables()) { equals = equals && this.getConditionalDistributionTime0(var).equalDist(bnet.getConditionalDistributionTime0(var), threshold) && this.getConditionalDistributionTimeT(var).equalDist(bnet.getConditionalDistributionTimeT(var), threshold); } } return equals; }
double sampledValue = network.getConditionalDistributionsTime0().get(var.getVarID()).getUnivariateDistribution(dataPresent).sample(random); dataPresent.setValue(var, sampledValue); double sampledValue = network.getConditionalDistributionsTimeT().get(var.getVarID()).getUnivariateDistribution(d).sample(random); dataPresent.setValue(var, sampledValue);
str.append(this.getConditionalDistributionTime0(var).label()+"\n"); }else { str.append("P(" + var.getName() + " | "); str.append(this.getConditionalDistributionTime0(var).label() + "\n"); str.append(this.getConditionalDistributionTime0(var).toString() + "\n"); str.append(this.getConditionalDistributionTimeT(var).label()+"\n"); }else { str.append("P(" + var.getName() + " | "); str.append(this.getConditionalDistributionTimeT(var).label() + "\n"); str.append(this.getConditionalDistributionTimeT(var).toString() + "\n");
double prob0 = conDist0.getConditionalProbability(assignment0); assignment1.setValue(dynVar.getInterfaceVariable(), previousState); assignment1.setValue(dynVar,currentState); probT = probT * conDistT.getConditionalProbability(assignment1);
/** * Initializes the distributions of this DynamicBayesianNetwork randomly. * @param random an object of type {@link java.util.Random}. */ public void randomInitialization(Random random){ this.distributionsTimeT.stream().forEach(w -> w.randomInitialization(random)); this.distributionsTime0.stream().forEach(w -> w.randomInitialization(random)); }
public static void baseTest(ExecutionEnvironment env, DataStream<DataInstance> data, BayesianNetwork network, int batchSize, double error) throws IOException, ClassNotFoundException { DataStreamWriter.writeDataToFile(data, "./datasets/simulated/tmp.arff"); DataFlink<DataInstance> dataFlink = DataFlinkLoader.loadDataFromFile(env, "./datasets/simulated/tmp.arff", false); network.getDAG().getVariables().setAttributes(dataFlink.getAttributes()); //Structure learning is excluded from the test, i.e., we use directly the initial Asia network structure // and just learn then test the parameter learning //Parameter Learning dVMP parallelVB = new dVMP(); parallelVB.setOutput(true); parallelVB.setMaximumGlobalIterations(10); parallelVB.setSeed(5); parallelVB.setBatchSize(batchSize); parallelVB.setLocalThreshold(0.001); parallelVB.setGlobalThreshold(0.01); parallelVB.setMaximumLocalIterations(100); parallelVB.setMaximumGlobalIterations(100); parallelVB.setDAG(network.getDAG()); parallelVB.initLearning(); parallelVB.updateModel(dataFlink); BayesianNetwork bnet = parallelVB.getLearntBayesianNetwork(); //Check if the probability distributions of each node for (Variable var : network.getVariables()) { if (Main.VERBOSE) System.out.println("\n------ Variable " + var.getName() + " ------"); if (Main.VERBOSE) System.out.println("\nTrue distribution:\n" + network.getConditionalDistribution(var)); if (Main.VERBOSE) System.out.println("\nLearned distribution:\n" + bnet.getConditionalDistribution(var)); Assert.assertTrue(bnet.getConditionalDistribution(var).equalDist(network.getConditionalDistribution(var), error)); } //Or check directly if the true and learned networks are equals Assert.assertTrue(bnet.equalBNs(network, error)); }
/** * Samples an {@link Assignment} randomly from a {@link BayesianNetwork} conditioned to a given Assignment. * The assignment must only contains assignments from head nodes. * @param random, a random number generator * @param conditionAssignment, an {@link Assignment} object. * @return A sampled Assignment */ public static Assignment sample(BayesianNetwork network, List<Variable> causalOrder, Random random, Assignment conditionAssignment) { HashMapAssignment assignment = new HashMapAssignment(network.getNumberOfVars()); for (Variable var : causalOrder) { if (Utils.isMissingValue(conditionAssignment.getValue(var))) { double sampledValue = network.getConditionalDistribution(var).getUnivariateDistribution(assignment).sample(random); assignment.setValue(var, sampledValue); }else{ assignment.setValue(var,conditionAssignment.getValue(var)); } } return assignment; }
probT = probT * conDistT.getConditionalProbability(assignment1);
/** * Returns the Bayesian network at Time 0. * @return a {@link BayesianNetwork} object. */ public BayesianNetwork toBayesianNetworkTime0(){ DAG dagTime0 = this.getDynamicDAG().toDAGTime0(); BayesianNetwork bnTime0 = new BayesianNetwork(dagTime0); for (Variable dynamicVar : this.getDynamicVariables()) { Variable staticVar = dagTime0.getVariables().getVariableByName(dynamicVar.getName()); ConditionalDistribution deepCopy = Serialization.deepCopy(this.getConditionalDistributionTime0(dynamicVar)); deepCopy.setVar(staticVar); List<Variable> newParents = deepCopy.getConditioningVariables().stream().map(var -> dagTime0.getVariables().getVariableByName(var.getName())).collect(Collectors.toList()); deepCopy.setConditioningVariables(newParents); bnTime0.setConditionalDistribution(staticVar,deepCopy); } return bnTime0; }
/** * Returns the log probability of a valid assignment at Time 0. * @param assignment an object of type {@link Assignment}. * @return a {@code double} that represents the log probability of the assignment. */ public double getLogProbabiltyOfFullAssignmentTime0(Assignment assignment){ double logProb = 0; for (Variable var: this.getDynamicVariables()){ if (assignment.getValue(var) == Utils.missingValue()) { throw new UnsupportedOperationException("This method can not compute the probabilty of a partial assignment."); } logProb += this.distributionsTime0.get(var.getVarID()).getLogConditionalProbability(assignment); } return logProb; }
@Override public DynamicBayesianNetwork getLearntDynamicBayesianNetwork() { BayesianNetwork bnTime0 = this.parallelVBTime0.getLearntBayesianNetwork(); BayesianNetwork bnTimeT = this.svbTimeT.getLearntBayesianNetwork(); DynamicVariables dynamicVariables = this.dynamicDAG.getDynamicVariables(); DynamicBayesianNetwork dbn = new DynamicBayesianNetwork(this.dynamicDAG); for (Variable dynamicVariable : dynamicVariables) { ConditionalDistribution dynamicDist = dbn.getConditionalDistributionTime0(dynamicVariable); ConditionalDistribution staticDist = bnTime0.getConditionalDistribution(bnTime0.getVariables().getVariableByName(dynamicVariable.getName())); staticDist.setVar(dynamicVariable); staticDist.setConditioningVariables(dynamicDist.getConditioningVariables()); dbn.setConditionalDistributionTime0(dynamicVariable,staticDist); } for (Variable dynamicVariable : dynamicVariables) { ConditionalDistribution dynamicDist = dbn.getConditionalDistributionTimeT(dynamicVariable); ConditionalDistribution staticDist = bnTimeT.getConditionalDistribution(bnTimeT.getVariables().getVariableByName(dynamicVariable.getName())); staticDist.setVar(dynamicVariable); staticDist.setConditioningVariables(dynamicDist.getConditioningVariables()); dbn.setConditionalDistributionTimeT(dynamicVariable,staticDist); } return dbn; }
cdist.getConditioningVariables().stream().forEachOrdered(cdvar -> parentList.add(variables.getVariableByName(cdvar.getName() + "_t0"))); cdist.getConditioningVariables().stream().forEachOrdered(cdvar -> { parentList.add(((cdvar.isInterfaceVariable() || (cdvar.getName().contains("_t"))) ? variables.getVariableByName(cdvar.getName().replace("_Interface", "_t" + Integer.toString(final_i - 1))) : }); cdist.setConditioningVariables(parentList); cdist.setVar(staticVar); bn.setConditionalDistribution(staticVar, cdist);
ConditionalDistribution conDist_dynamic = Serialization.deepCopy(model.getConditionalDistributionsTimeT().get(dynVar.getVarID())); ConditionalDistribution conditionalDistTime1 = groupedDistributionMAPVariableTimeT(dynVar, staticVar0, staticVar0_interface.getNumberOfStates(), parents, conDist_dynamic, modelNumber); conditionalDistTime1.setVar(staticVar0); bn.setConditionalDistribution(staticVar0, conditionalDistTime1); Variable staticVar1 = variables.getVariableByName(groupedClassName + "_t" + Integer.toString(timeStep)); ConditionalDistribution conditionalDistribution = Serialization.deepCopy(generalConditionalDistTimeT); conditionalDistribution.setConditioningVariables(dag.getParentSet(staticVar1).getParents()); conditionalDistribution.setVar(staticVar1); bn.setConditionalDistribution(staticVar1, conditionalDistribution); List<Variable> thisVarParents = conditionalDistribution.getConditioningVariables(); thisVarParents = thisVarParents.stream().map(parent -> variables.getVariableByName(parent.getName() + "_t0")).collect(Collectors.toList()); conditionalDistribution.setConditioningVariables(thisVarParents); conditionalDistribution.setVar(staticVar1); bn.setConditionalDistribution(staticVar1, conditionalDistribution); ConditionalDistribution conditionalDistribution1 = Serialization.deepCopy(model.getConditionalDistributionTimeT(dynVariable)); Variable staticVar2 = variables.getVariableByName(dynVariable.getName() + "_t" + Integer.toString(i)); List<Variable> thisVarParents1 = conditionalDistribution1.getConditioningVariables(); thisVarParents1 = thisVarParents1.stream().map(parent -> { if(parent.getName().contains("_Interface")) { conditionalDistribution1.setConditioningVariables(thisVarParents1); conditionalDistribution1.setVar(staticVar2); bn.setConditionalDistribution(staticVar2, conditionalDistribution1); });