/// <summary> /// Initializes a new instance of the <see cref="ConditionalCombination"/> class. /// </summary> /// <param name="condition">The conditional event.</param> /// <param name="trueCase">The scenario to be used if <paramref name="condition"/> is <c>true</c>.</param> /// <param name="falseCase">The scenario to be used if <paramref name="condition"/> is <c>false</c>.</param> public ConditionalCombination( IDiscreteBooleanRandomVariable condition, IDiscreteIntegerRandomVariable trueCase, IDiscreteIntegerRandomVariable falseCase) { Debug.Assert(condition != null, "The conditional random variable cannot be null."); Debug.Assert(trueCase != null, "The random variable for when the conditional random variable is true cannot be null."); Debug.Assert(falseCase != null, "The random variable for when the conditional random variable is false cannot be null."); ProbabilityDistribution = GetProbabilityDistribution(condition, trueCase, falseCase); }
private static DiscreteValueProbabilityDistribution GetProbabilityDistribution( IDiscreteBooleanRandomVariable condition, IDiscreteIntegerRandomVariable trueCase, IDiscreteIntegerRandomVariable falseCase) { IDictionary <int, double> valueAndProbabilities = trueCase.ProbabilityDistribution.Specification .ToDictionary(pair => pair.Value, pair => pair.Probability * condition.ProbabilityDistribution.SuccessProbability); foreach (ValueProbabilityPair pair in falseCase.ProbabilityDistribution.Specification) { double probabilityComponent = condition.ProbabilityDistribution.FailureProbability * pair.Probability; if (valueAndProbabilities.ContainsKey(pair.Value)) { valueAndProbabilities[pair.Value] += probabilityComponent; } else { valueAndProbabilities[pair.Value] = probabilityComponent; } } return(new DiscreteValueProbabilityDistribution(valueAndProbabilities.Select(vp => new ValueProbabilityPair(vp.Key, vp.Value)))); }