/** * Resets the exponential family distributions of all nodes for the {@link VMP} object of this PlateuStructure. */ public void resetQs() { //And reset the Q's of the new replicated nodes. this.getNonReplictedNodes().filter(node -> node.isActive()).forEach(node -> { node.resetQDist(this.vmp.getRandom()); }); }
/** * Resets the exponential family distributions of all nodes for the {@link VMP} object of this PlateuStructure. */ public void resetQs() { //And reset the Q's of the new replicated nodes. this.getNonReplictedNodes().filter(node -> node.isActive()).forEach(node -> { node.resetQDist(this.vmp.getRandom()); }); }
if (!node.isActive() || node.isObserved()) continue; .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless); .filter(node -> node.isActive() && !node.isObserved()) .forEach(node -> { Message<NaturalParameters> selfMessage = this.vmp.newSelfMessage(node); .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless);
if (!node.isActive() || node.isObserved()) continue; .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless); .filter(node -> node.isActive() && !node.isObserved()) .forEach(node -> { Message<NaturalParameters> selfMessage = this.vmp.newSelfMessage(node); .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless);
for (Node node : nodes) { if (!node.isActive() || node.isObserved()) continue; .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless); .filter(node -> node.isActive() && !node.isObserved()) .forEach(node -> { .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless);
if (!node.isActive() || node.isObserved()) continue; .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless); .filter(node -> node.isActive() && !node.isObserved()) .forEach(node -> { Message<NaturalParameters> selfMessage = this.vmp.newSelfMessage(node); .filter(children -> children.isActive()) .map(children -> this.vmp.newMessageToParent(children, node)) .reduce(Message::combineNonStateless);
private double computeELBO() { double elbo = this.vmp.getNodes().parallelStream().filter(node -> node.isActive() && !node.isObserved()).mapToDouble(node -> this.vmp.computeELBO(node)).sum(); elbo += this.vmp.getNodes() .parallelStream() .filter(node -> node.isActive() && node.isObserved()).mapToDouble(node -> { EF_BaseDistribution_MultinomialParents base = (EF_BaseDistribution_MultinomialParents) node.getPDist(); Variable topicVariable = (Variable) base.getMultinomialParents().get(0); Map<Variable, MomentParameters> momentParents = node.getMomentParents(); double localELBO = 0; MomentParameters topicMoments = momentParents.get(topicVariable); int wordIndex = (int) node.getAssignment().getValue(node.getMainVariable())%node.getMainVariable().getNumberOfStates(); for (int i = 0; i < topicMoments.size(); i++) { EF_SparseMultinomial_Dirichlet dist = (EF_SparseMultinomial_Dirichlet)base.getBaseEFConditionalDistribution(i); MomentParameters dirichletMoments = momentParents.get(dist.getDirichletVariable()); localELBO += node.getSufficientStatistics().get(wordIndex)*dirichletMoments.get(wordIndex)*topicMoments.get(i); } return localELBO; }).sum(); return elbo; }
if (!node.isActive() || node.isObserved() || plateuStructure.isNonReplicatedVar(node.getMainVariable())) continue; .filter(children -> children.isActive()) .map(children -> newMessageToParent(children, node)) .reduce(Message::combineNonStateless); if (!node.isActive() || node.isObserved() || plateuStructure.isReplicatedVar(node.getMainVariable())) continue; .filter(children -> children.isActive()) .map(children -> newMessageToParent(children, node)) .reduce(Message::combineNonStateless);