package net.certware.evidence.hugin.view.jobs;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Set;
import net.certware.core.ui.log.CertWareLog;
import net.certware.evidence.hugin.view.ViewTree;
import net.certware.evidence.hugin.view.tree.VariableNode;
import net.certware.evidence.hugin.view.tree.VariableNodeState;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import edu.ucla.belief.EliminationHeuristic;
import edu.ucla.belief.FiniteVariable;
import edu.ucla.belief.InferenceEngine;
import edu.ucla.belief.StateNotFoundException;
import edu.ucla.belief.VariableImpl;
import edu.ucla.belief.inference.JEngineGenerator;
import edu.ucla.belief.inference.JoinTreeSettings;
import edu.ucla.belief.io.PropertySuperintendent;
import edu.ucla.util.AbstractStringifier;
/**
* A job to perform the Pr(e) calculation and marginals.
* @author mrb
* @since 1.2.1
*/
public class PreCalculationJob extends AbstractCalculationJob
{
/**
* Constructor saves network and view references.
* @param jobName export job name for reporting
* @param view view part for reference
*/
public PreCalculationJob(String jobName, ViewTree view) {
super(jobName,view);
}
/**
* Production method for computations.
* @param monitor progress monitor
* @return CANCEL or OK
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public IStatus produce(IProgressMonitor monitor) {
/** network name for messages */
String networkName = "undefined"; //$NON-NLS-1$
try {
if ( initialNetwork == null ) {
cancel();
CertWareLog.logWarning("Network not defined for calculation");
view.setWarningMessage(CANCEL_MSG);
return Status.CANCEL_STATUS;
}
if ( nodes.isEmpty() ) {
cancel();
CertWareLog.logWarning("No variable selections available for Pr(e) calculation");
view.setWarningMessage(CANCEL_MSG);
return Status.CANCEL_STATUS;
}
// network name from loaded file
networkName = view.getSelectedFile().getName();
// initialize variables from selections
Set setPreVariables = new HashSet();
for ( VariableNode v : nodes ) {
if ( v.isSelected() ) {
setPreVariables.add( v.getNode() );
}
}
// initialize evidence from selections
HashMap evidence = new HashMap();
for ( VariableNode vn : nodes ) {
for ( VariableNodeState vns : vn.states ) {
if ( vns.isSelected() ) {
FiniteVariable fv = vn.getNode();
evidence.put( fv, fv.instance(vns.getStateName()) );
}
}
}
// instantiation formatter
VariableImpl.setStringifier( AbstractStringifier.VARIABLE_ID );
monitor.worked(1);
if ( monitor.isCanceled() ) {
CertWareLog.logWarning(CANCEL_MSG);
view.setWarningMessage(CANCEL_MSG);
return Status.CANCEL_STATUS;
}
/*
// create a new set of variables and remove those whose evidence have set keys
Set allVarsMinusEvidence = new HashSet( initialNetwork );
allVarsMinusEvidence.removeAll( evidence.keySet() );
// initialize a MapEngine and perform the MPE computation
MapEngine mpe = new MapEngine( initialNetwork, allVarsMinusEvidence, evidence );
VariableImpl.setStringifier( AbstractStringifier.VARIABLE_ID );
*/
// create the dynamator
JEngineGenerator dynamator = new JEngineGenerator();
// edit settings
JoinTreeSettings settings = dynamator.getSettings( (PropertySuperintendent)initialNetwork, true );
// define the elimination order heuristic used to create the join tree
settings.setEliminationHeuristic( EliminationHeuristic.MIN_FILL );
// create the inference engine
InferenceEngine engine = dynamator.manufactureInferenceEngine( initialNetwork );
// set the observations
try {
initialNetwork.getEvidenceController().setObservations( evidence );
} catch( StateNotFoundException e ) {
CertWareLog.logError("Performing Pr(e) query",e);
view.setErrorMessage(e.getMessage());
return null;
};
// results
double score = engine.probability();
// Map instantiation = engine.getInstance();
monitor.worked(2);
if ( monitor.isCanceled() ) {
CertWareLog.logWarning(CANCEL_MSG);
return Status.CANCEL_STATUS;
}
// reset marginals
// clearMarginals();
setMarginals(engine);
// update results in view
LinkedHashMap<String,String> rows = new LinkedHashMap<String,String>();
rows.put("Pr(e)",getProbability(score));
view.addResult(rows);
monitor.worked(1);
} catch( Exception e ) {
CertWareLog.logError(String.format("%s %s","Pr(e) query for",networkName), e);
return Status.CANCEL_STATUS;
}
String doneMessage = String.format("%s %s %s","Pr(e) query for", networkName, "complete.");
CertWareLog.logInfo( doneMessage );
return Status.OK_STATUS;
}
/**
* Runs the generator job, reporting to the given progress monitor.
* @param monitor progress monitor
* @return CANCEL or OK status
*/
protected IStatus run(IProgressMonitor monitor) {
int count = 5;
monitor.beginTask("Computing Pr(e)", count);
IStatus rv = produce(monitor);
if ( rv == Status.OK_STATUS ) {
view.setInfoMessage("Completed Pr(e) calculation");
monitor.done();
}
return rv;
}
}