Bevisuali.UX.MainWindow.RequestConfigureVariableWithEvidence C# (CSharp) Method

RequestConfigureVariableWithEvidence() private method

private RequestConfigureVariableWithEvidence ( RandomVariable rv, int scenarioId, float value ) : void
rv RandomVariable
scenarioId int
value float
return void
        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;
        }