/**
* Copyright (c) 2011 Michael Kutschke.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Kutschke - initial API and implementation.
*/
package org.eclipse.recommenders.jayes.inference;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.recommenders.jayes.BayesNet;
import org.eclipse.recommenders.jayes.BayesNode;
import org.eclipse.recommenders.jayes.sampling.BasicSampler;
import org.eclipse.recommenders.jayes.util.BayesNodeUtil;
import org.eclipse.recommenders.jayes.util.MathUtils;
@SuppressWarnings("deprecation")
public class LikelihoodWeightedSampling extends AbstractInferer {
private static final int DEFAULT_SAMPLE_COUNT = 200;
private int sampleCount = DEFAULT_SAMPLE_COUNT;
private final BasicSampler sampler = new BasicSampler();
@Override
public void setNetwork(BayesNet bn) {
super.setNetwork(bn);
sampler.setNetwork(bn);
}
@Override
protected void updateBeliefs() {
sampler.setEvidence(evidence);
for (int i = 0; i < sampleCount; i++) {
Map<BayesNode, String> sample = sampler.sample();
double weight = computeEvidenceProbability(sample);
for (Entry<BayesNode, String> e : sample.entrySet()) {
BayesNode n = e.getKey();
beliefs[n.getId()][n.getOutcomeIndex(e.getValue())] += weight;
}
}
normalizeBeliefs();
}
private void normalizeBeliefs() {
for (int i = 0; i < beliefs.length; i++) {
beliefs[i] = MathUtils.normalize(beliefs[i]);
}
}
private double computeEvidenceProbability(Map<BayesNode, String> sample) {
double factor = 1.0;
for (Entry<BayesNode, String> entry : evidence.entrySet()) {
BayesNode n = entry.getKey();
factor *= BayesNodeUtil.getSubCpt(n, sample)[n.getOutcomeIndex(entry.getValue())];
}
return factor;
}
public void setSampleCount(int sampleCount) {
this.sampleCount = sampleCount;
}
public void seed(long seed) {
sampler.seed(seed);
}
}