Ejemplo n.º 1
0
        public void ProbabilityDistribution_OneD3_ReturnExpectedDistribution()
        {
            // Setup
            var rng  = MockRepository.GenerateStub <IRandomNumberGenerator>();
            var dice = new[]
            {
                new NumericalDie(3, rng),
            };

            var sumOf2D6 = new SumOfDice(dice, rng);

            // Call
            DiscreteValueProbabilityDistribution distribution = sumOf2D6.ProbabilityDistribution;

            // Assert
            var expectedProbabilityValuePairs = new[]
            {
                Tuple.Create(1, 1.0 / 3.0),
                Tuple.Create(2, 1.0 / 3.0),
                Tuple.Create(3, 1.0 / 3.0),
            };

            Assert.AreEqual(expectedProbabilityValuePairs.Length, distribution.Specification.Count);
            for (int i = 0; i < expectedProbabilityValuePairs.Length; i++)
            {
                Tuple <int, double>  expectedPair = expectedProbabilityValuePairs[i];
                ValueProbabilityPair actualPair   = distribution.Specification[i];

                Assert.AreEqual(expectedPair.Item1, actualPair.Value);
                Assert.AreEqual(expectedPair.Item2, actualPair.Probability, 1e-6);
            }
        }
Ejemplo n.º 2
0
        public void Roll_ReturnValueBasedOnProbabilityDistribution()
        {
            // Setup
            var spec = new[]
            {
                new ValueProbabilityPair(0, 0.5),
                new ValueProbabilityPair(1, 0.5),
            };
            var distribution = new DiscreteValueProbabilityDistribution(spec);

            var expectedValueAndProbabilities = new[]
            {
                Tuple.Create(0, 0.0),
                Tuple.Create(0, 0.324),
                Tuple.Create(0, 0.5),
                Tuple.Create(1, 0.5 + 1e-6),
                Tuple.Create(1, 0.75),
                Tuple.Create(1, 1.0),
            };

            var rng = new TestingRandomNumberGenerator();

            rng.AddFactorValues(expectedValueAndProbabilities.Select(t => t.Item2));

            AbstractDie die = new TestAbstractDie(rng, distribution);

            foreach (Tuple <int, double> tuple in expectedValueAndProbabilities)
            {
                // Call
                int rollResult = die.Roll();

                // Assert
                Assert.AreEqual(tuple.Item1, rollResult);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="NumericalDie"/> class.
        /// </summary>
        /// <param name="numberOfSides">The number of sides the die has.</param>
        /// <param name="rng">The random number generator.</param>
        public NumericalDie(int numberOfSides, IRandomNumberGenerator rng)
            : base(rng)
        {
            NumberOfSides = numberOfSides;
            ValueProbabilityPair[] dieProbabilities = CreateProbabilityDistribution(numberOfSides);
            ProbabilityDistribution = new DiscreteValueProbabilityDistribution(dieProbabilities);

            Debug.Assert(NumberOfSides == numberOfSides, "The property NumberOfSides should be initialized with the given argument.");
        }
Ejemplo n.º 4
0
        private static void AssertExpectedDistribution(int numberOfSides, DiscreteValueProbabilityDistribution actualDistribution)
        {
            var rng = MockRepository.GenerateStub <IRandomNumberGenerator>();
            var die = new NumericalDie(numberOfSides, rng);

            DiscreteValueProbabilityDistribution expectedDistribution = die.ProbabilityDistribution;

            AssertEquals(expectedDistribution, actualDistribution);
        }
Ejemplo n.º 5
0
 private static void AssertEquals(DiscreteValueProbabilityDistribution expectedDistribution, DiscreteValueProbabilityDistribution actualDistribution)
 {
     Assert.AreEqual(expectedDistribution.Specification.Count, actualDistribution.Specification.Count);
     for (int i = 0; i < expectedDistribution.Specification.Count; i++)
     {
         Assert.AreEqual(expectedDistribution.Specification[i].Value, actualDistribution.Specification[i].Value);
         Assert.AreEqual(expectedDistribution.Specification[i].Probability, actualDistribution.Specification[i].Probability);
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SumOfDice"/> class.
        /// </summary>
        /// <param name="dice">The dice that define this object.</param>
        /// <param name="rng">The random number generator.</param>
        public SumOfDice(IEnumerable <IAbstractDie> dice, IRandomNumberGenerator rng)
            : base(rng)
        {
            Debug.Assert(dice != null, "The collection of dice cannot be null.");
            Debug.Assert(dice.All(die => die != null), "The collection of dice cannot contain null.");
            Debug.Assert(dice.Count() > 0, "The collection of dice must contain at least 1 element.");

            this.dice = dice.ToArray();
            ValueProbabilityPair[] probabilitySpecification = CreateProbabilityDistribution(this.dice);
            ProbabilityDistribution = new DiscreteValueProbabilityDistribution(probabilitySpecification);
        }
Ejemplo n.º 7
0
        private static void AssertExpectedDistribution(int numberOfDice, int numberOfSides, DiscreteValueProbabilityDistribution actualDistribution)
        {
            var rng = MockRepository.GenerateStub <IRandomNumberGenerator>();
            IEnumerable <NumericalDie> dice = Enumerable.Repeat(numberOfSides, numberOfDice)
                                              .Select(nrOfSides => new NumericalDie(nrOfSides, rng));
            var sumOfDice = new SumOfDice(dice, rng);

            DiscreteValueProbabilityDistribution expectedDistribution = sumOfDice.ProbabilityDistribution;

            AssertEquals(expectedDistribution, actualDistribution);
        }
Ejemplo n.º 8
0
        public void ProbabilityDistribution_ValidArguments_ReturnExpectedResult()
        {
            // Setup
            var randomVariable = MockRepository.GenerateStub <IDiscreteBooleanRandomVariable>();

            randomVariable.Stub(rv => rv.ProbabilityDistribution)
            .Return(new BooleanProbabilityDistribution(0.25));
            var trueCase = MockRepository.GenerateStub <IDiscreteIntegerRandomVariable>();

            trueCase.Stub(rv => rv.ProbabilityDistribution)
            .Return(new DiscreteValueProbabilityDistribution(new[]
            {
                new ValueProbabilityPair(1, 0.25),
                new ValueProbabilityPair(2, 0.75),
            }));
            var falseCase = MockRepository.GenerateStub <IDiscreteIntegerRandomVariable>();

            falseCase.Stub(rv => rv.ProbabilityDistribution)
            .Return(new DiscreteValueProbabilityDistribution(new[]
            {
                new ValueProbabilityPair(2, 0.5),
                new ValueProbabilityPair(4, 0.5),
            }));

            var conditional = new ConditionalCombination(randomVariable, trueCase, falseCase);

            // Call
            DiscreteValueProbabilityDistribution distribution = conditional.ProbabilityDistribution;

            // Assert
            Assert.AreEqual(3, distribution.Specification.Count);
            var probabilitiesAndValues = new Tuple <double, int>[]
            {
                Tuple.Create(0.25 * 0.25, 1),
                Tuple.Create((0.25 * 0.75) + (0.75 * 0.5), 2),
                Tuple.Create(0.75 * 0.5, 4),
            };

            for (int i = 0; i < probabilitiesAndValues.Length; i++)
            {
                Tuple <double, int>  expectedProbabilityAndValue = probabilitiesAndValues[i];
                ValueProbabilityPair actualProbabilityAndValue   = distribution.Specification[i];

                Assert.AreEqual(expectedProbabilityAndValue.Item1, actualProbabilityAndValue.Probability);
                Assert.AreEqual(expectedProbabilityAndValue.Item2, actualProbabilityAndValue.Value);
            }
        }
        public void GetValueAtCdf_ForWholeSpectrum_ReturnExpectedValuesAccoringToDistribution(double probability, int expectedValue)
        {
            // Setup
            var valueProbabilityPairs = new[]
            {
                new ValueProbabilityPair(1, 0.5),
                new ValueProbabilityPair(2, 0.25),
                new ValueProbabilityPair(3, 0.10),
                new ValueProbabilityPair(4, 0.15 - 1e-8),
            };
            var distribution = new DiscreteValueProbabilityDistribution(valueProbabilityPairs);

            // Call
            int sampleValue = distribution.GetValueAtCdf(probability);

            // Assert
            Assert.AreEqual(expectedValue, sampleValue);
        }
Ejemplo n.º 10
0
        public void Distribution_SetValue_UpdatePlotModel()
        {
            // Setup
            var viewModel = new ProbabilityDensityFunctionChartViewModel();

            var distribution = new DiscreteValueProbabilityDistribution(new[]
            {
                new ValueProbabilityPair(1, 0.25),
                new ValueProbabilityPair(2, 0.50),
                new ValueProbabilityPair(3, 0.25),
            });

            // Call
            viewModel.Distribution = distribution;

            // Assert
            AssertPlotModelForExpectedDistribution(distribution, viewModel.Title, viewModel.ValueName, viewModel.PlotModel);
        }
Ejemplo n.º 11
0
        private void AssertPlotModelForExpectedDistribution(
            DiscreteValueProbabilityDistribution expectedDistribution,
            string expectedTitle,
            string expectedValueName,
            PlotModel plotModel)
        {
            Assert.AreEqual(expectedTitle, plotModel.Title);
            Assert.IsFalse(plotModel.IsLegendVisible);

            Assert.AreEqual(2, plotModel.Axes.Count);
            var horizontalAxis = (CategoryAxis)plotModel.Axes[0];

            Assert.AreEqual(expectedValueName, horizontalAxis.Title);
            Assert.AreEqual(AxisPosition.Bottom, horizontalAxis.Position);
            Assert.AreEqual(-1, horizontalAxis.AbsoluteMinimum);
            Assert.AreEqual(expectedDistribution == null ? double.MaxValue : expectedDistribution.Specification.Count, horizontalAxis.AbsoluteMaximum);
            Assert.IsFalse(horizontalAxis.IsZoomEnabled);
            Assert.IsFalse(horizontalAxis.IsPanEnabled);
            Assert.AreEqual(0.0, horizontalAxis.GapWidth);
            AssertItemSource(expectedDistribution, horizontalAxis.ItemsSource);
            Assert.AreEqual(nameof(ValueProbabilityPair.Value), horizontalAxis.LabelField);

            var verticalAxis = (LinearAxis)plotModel.Axes[1];

            Assert.AreEqual("Probability", verticalAxis.Title);
            Assert.AreEqual(AxisPosition.Left, verticalAxis.Position);
            Assert.AreEqual(0.0, verticalAxis.AbsoluteMinimum);
            Assert.AreEqual(1.0, verticalAxis.AbsoluteMaximum);
            Assert.AreEqual(0.0, verticalAxis.Minimum);
            Assert.AreEqual(1.0, verticalAxis.Maximum);
            Assert.IsFalse(verticalAxis.IsZoomEnabled);
            Assert.IsFalse(verticalAxis.IsPanEnabled);
            Assert.AreEqual("p", verticalAxis.StringFormat);

            Assert.AreEqual(1, plotModel.Series.Count);
            ColumnSeries series = (ColumnSeries)plotModel.Series[0];

            Assert.AreEqual($"{expectedValueName} probability", series.Title);
            AssertItemSource(expectedDistribution, horizontalAxis.ItemsSource);
            Assert.AreEqual(nameof(ValueProbabilityPair.Probability), series.ValueField);
            Assert.AreEqual(OxyColors.DarkCyan, series.FillColor);
            Assert.AreEqual("{0}\n{1}: {2:p}", series.TrackerFormatString);
        }
Ejemplo n.º 12
0
        public void ProbabilityDistribution_ForSomeNumberOfSides_DefinesUniformProbabilityDistribution(int numberOfSides)
        {
            // Setup
            var rng = MockRepository.GenerateStub <IRandomNumberGenerator>();

            var die = new NumericalDie(numberOfSides, rng);

            // Call
            DiscreteValueProbabilityDistribution distribution = die.ProbabilityDistribution;

            // Assert
            double uniformProbability = 1.0 / numberOfSides;

            foreach (ValueProbabilityPair pair in distribution.Specification)
            {
                Assert.AreEqual(uniformProbability, pair.Probability);
            }

            CollectionAssert.AreEquivalent(Enumerable.Range(1, numberOfSides), distribution.Specification.Select(p => p.Value));
        }
Ejemplo n.º 13
0
        private static void AssertItemSource(DiscreteValueProbabilityDistribution expectedDistribution, IEnumerable itemSource)
        {
            if (expectedDistribution == null)
            {
                CollectionAssert.IsEmpty(itemSource);
            }
            else
            {
                var valueProbabilities = (IList <ValueProbabilityPair>)itemSource;

                IList <ValueProbabilityPair> expectedProbabilities = expectedDistribution.Specification;

                Assert.AreEqual(expectedProbabilities.Count, valueProbabilities.Count);
                for (int i = 0; i < expectedProbabilities.Count; i++)
                {
                    Assert.AreEqual(expectedProbabilities[i].Value, valueProbabilities[i].Value);
                    Assert.AreEqual(expectedProbabilities[i].Probability, valueProbabilities[i].Probability);
                }
            }
        }
Ejemplo n.º 14
0
        public void ProbabilityDistribution_AddingValueTo1D6_ReturnExpectedDistribution(int modifierValue)
        {
            // Setup
            var rng = MockRepository.GenerateStub <IRandomNumberGenerator>();
            var die = new NumericalDie(6, rng);

            var modifier = new DiceModifier(die, modifierValue, rng);

            // Call
            DiscreteValueProbabilityDistribution distribution = modifier.ProbabilityDistribution;

            // Assert
            ReadOnlyCollection <ValueProbabilityPair> specification = die.ProbabilityDistribution.Specification;

            Assert.AreEqual(specification.Count, distribution.Specification.Count);
            for (int i = 0; i < specification.Count; i++)
            {
                ValueProbabilityPair referencePair = specification[i];
                ValueProbabilityPair actualPair    = distribution.Specification[i];
                Assert.AreEqual(referencePair.Probability, actualPair.Probability);
                Assert.AreEqual(referencePair.Value + modifierValue, actualPair.Value);
            }
        }
        public void Constructor_ValidDistributionSpecified_ExpectedValues()
        {
            // Setup
            var valueProbabilityPairs = new[]
            {
                new ValueProbabilityPair(1, 0.5),
                new ValueProbabilityPair(2, 0.25),
                new ValueProbabilityPair(3, 0.10),
                new ValueProbabilityPair(4, 0.15),
            };

            // Call
            var distribution = new DiscreteValueProbabilityDistribution(valueProbabilityPairs);

            // Assert
            ReadOnlyCollection <ValueProbabilityPair> specification = distribution.Specification;

            Assert.AreEqual(valueProbabilityPairs.Length, specification.Count);
            foreach (ValueProbabilityPair expectedPair in valueProbabilityPairs)
            {
                ValueProbabilityPair pair = specification.Single(s => s.Value == expectedPair.Value);
                Assert.AreEqual(expectedPair.Probability, pair.Probability);
            }
        }
Ejemplo n.º 16
0
 public TestAbstractDie(IRandomNumberGenerator rng, DiscreteValueProbabilityDistribution distribution)
     : base(rng)
 {
     ProbabilityDistribution = distribution;
 }