public override double[] Probabilities(Population <TGene, TAllele> population, int count) { var fitness = new double[population.Count]; for (var i = population.Count; --i >= 0;) { fitness[i] = population[i].GetFitness().ToDouble(null); } var worst = Math.Min(Statistics.Min(fitness), 0.0); var sum = DoubleAdder.Sum(fitness) - worst * population.Count; if (Equality.Eq(sum, 0.0)) { for (var i = 0; i < fitness.Length; i++) { fitness[i] = 1.0 / population.Count; } } else { for (var i = population.Count; --i >= 0;) { fitness[i] = (fitness[i] - worst) / sum; } } return(fitness); }
public static bool Sum2One(double[] probabilities) { var sum = probabilities.Length > 0 ? DoubleAdder.Sum(probabilities) : 1.0; return(Math.Abs(Base.UlpDistance(sum, 1.0)) < MaxUlpDistance); }
public static double[] Incremental(double[] values) { var adder = new DoubleAdder(values[0]); for (var i = 1; i < values.Length; ++i) { values[i] = adder.Add(values[i]).DoubleValue; } return(values); }