internal void RequestConfigureVariableWithEvidence(RandomVariable rv, int scenarioId, float? value)
{
if (scenarioId <= 0)
{
throw new ArgumentOutOfRangeException("ScenarioId");
}
// Find existing scenario.
IScenario oldScenario;
oldScenario = Model.Scenarios.FirstOrDefault(s => s.Id == scenarioId.ToString());
if (oldScenario == null)
{
oldScenario = new Scenario(scenarioId.ToString(), new FObservation(), Model.BayesianNetwork);
}
else
{
oldScenario.InferenceUpdated -= OnScenarioInferenceUpdated;
oldScenario.InferenceFinished -= OnScenarioInferenceFinished;
}
FObservation oldEvidence = oldScenario.Evidence;
FObservation newEvidence;
// Build new evidence.
if (value == null)
{
newEvidence = FObservation.op_DotMinusDot(oldEvidence, rv.Name);
}
else
{
newEvidence
= FObservation.op_DotPlusDot(
oldEvidence,
new Tuple<string, float>(rv.Name, value.Value)
);
}
if (object.Equals(newEvidence, oldEvidence))
{
return;
}
// Create new scenario.
IScenario newScenario = new Scenario(scenarioId.ToString(), newEvidence, Model.BayesianNetwork);
newScenario.InferenceUpdated += OnScenarioInferenceUpdated;
newScenario.InferenceFinished += OnScenarioInferenceFinished;
Model.Scenarios.Remove(oldScenario);
Model.Scenarios.Add(newScenario);
// Update UI immediately.
{
xGraphInspector.SetInferenceResults(null, scenarioId, newEvidence);
var evidencesForEvidenceInspector =
Model.Scenarios.ToDictionary(
e => string.Format("Scenario {0}", e.Id),
e => new Tuple<FObservation, FRandomVariable[]>(e.Evidence, e.Workbench.BayesianNetwork.VariablesOrdered.ToArray())
);
xEvidenceInspector.SetEvidence(evidencesForEvidenceInspector, this.Model.BayesianNetworkVariableAbbreviations);
}
// Reset to simple node selection state.
Model.SelectedVariable = rv.Name;
Model.SelectedVariableMode = Mode.Inspecting;
}