/// <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)); }
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)); }
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)); }
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)); } }
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)); }