示例#1
0
        /// <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);
        }
示例#2
0
        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))));
        }