Exemple #1
0
        /// <summary>
        /// Create a bernoulli distribution.
        /// </summary>
        /// <param name="zeroes">The amount of zeroes in the distribution.</param>
        /// <param name="ones">The amount of ones in the distribution.</param>
        /// <returns>A correct distribution.</returns>
        /// <exception cref="ArgumentException">Thrown when one of the chances is less than zero.</exception>
        public static IDiscreteDistribution <int> Distribution(int zeroes, int ones)
        {
            // Needs to be more or equal to zero.
            if (zeroes < 0 || ones < 0)
            {
                throw new ArgumentException();
            }
            // Empty distribution if both have no chance.
            if (zeroes == 0 && ones == 0)
            {
                return(Empty <int> .Distribution());
            }

            // Singleton if only one has any chance.
            if (zeroes == 0)
            {
                return(Singleton <int> .Distribution(1));
            }
            if (ones == 0)
            {
                return(Singleton <int> .Distribution(0));
            }

            return(new Bernoulli(zeroes, ones));
        }
Exemple #2
0
        public static IDiscreteDistribution <int> Distribution(int minimum, int maximum)
        {
            if (minimum > maximum)
            {
                return(Empty <int> .Distribution());
            }

            if (minimum == maximum)
            {
                return(Singleton <int> .Distribution(minimum));
            }

            return(new SDU(minimum, maximum));
        }
Exemple #3
0
        public static IDiscreteDistribution <R> Distribution(IDiscreteDistribution <A> underlying, Func <A, R> projection)
        {
            var result = new Projected <A, R>(underlying, projection);

            if (result._weights.Count == 0)
            {
                return(Empty <R> .Distribution());
            }

            var support = result.Support().ToList();

            if (support.Count == 1)
            {
                return(Singleton <R> .Distribution(support.First()));
            }

            return(result);
        }
        public static IDiscreteDistribution <int> Distribution(IEnumerable <int> weightCollection)
        {
            var weights = MathHelper.ShrinkValues(weightCollection).ToList();

            // Ensure we have valid weights.
            if (weights.Any(x => x < 0))
            {
                throw new ArgumentException();
            }

            // If no weights above 0, empty distribution.
            if (!weights.Any(x => x > 0))
            {
                return(Empty <int> .Distribution());
            }

            weights = weights.DropEndWhile(weight => weight == 0).ToList();

            if (weights.Count == 1)
            {
                return(Singleton <int> .Distribution(0));
            }

            if (weights.GetIndexIfSingle(i => i != 0, out int index))
            {
                return(Singleton <int> .Distribution(index));
            }

            if (weights.Count == 2)
            {
                int zeroes = weights[0];
                int ones   = weights[1];
                return(Bernoulli.Distribution(zeroes, ones));
            }

            return(new WeightedInteger(weights));
        }
Exemple #5
0
        public static IWeightedDistribution <T> Distribution(IDictionary <T, float> weights)
        {
            var weightArray = weights.ToArray();

            switch (weightArray.Length)
            {
            case 0:
                return(Empty <T> .Distribution());

            case 1:
                var item = weights.Keys.First();
                return(Singleton <T> .Distribution(item));

            case 2:
                var item1 = weights.First();
                var item2 = weights.Last();

                var probability = item1.Value / (item1.Value + item2.Value);
                return(Flip <T> .Distribution(item1.Key, item2.Key, probability));

            default:
                return(new FloatWeighted <T>(weights));
            }
        }
Exemple #6
0
        public Markov <T> ToDistribution()
        {
            var initial     = _initial.ToDistribution();
            var transitions = _transitions.ToDictionary(
                kv => kv.Key,
                kv => kv.Value.ToDistribution());

            IDistribution <T> Transition(T state) => transitions.GetValueOrDefault(state, Empty <T> .Distribution());

            return(Markov <T> .Distribution(initial, Transition));
        }