package org.drools.chance.distribution.probability.gaussian; import org.drools.chance.degree.Degree; import org.drools.chance.distribution.ContinuousProbabilityDistribution; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Set; public class GaussianDistribution<T extends Number> implements ContinuousProbabilityDistribution<T> { private Degree falze; private Double mu; private Double sigma; public GaussianDistribution( Double mean, Double stdev, Degree f ) { mu = mean; sigma = stdev; falze = f; } public Double getMu() { return mu; } public void setMu( Double mu ) { this.mu = mu; } public Double getSigma() { return sigma; } public void setSigma( Double sigma ) { this.sigma = sigma; } public Set<T> getSupport() { return new RealNumberSet(); } public Degree getDegree( T value ) { return falze; } public Degree get( T object ) { return falze; } public Number domainSize() { return Double.POSITIVE_INFINITY; } public boolean isDiscrete() { return false; } public boolean isNormalized() { return true; } public void setNormalized( boolean normalized ) { } public int size() { return Integer.MAX_VALUE; } public Iterator<T> iterator() { return Collections.EMPTY_SET.iterator(); } public Degree getCumulative( T object ) { double d = object.doubleValue(); return falze.fromConst( Phi( d, mu, sigma ) ); } public static double phi( double x ) { return Math.exp( -x * x / 2 ) / Math.sqrt( 2 * Math.PI ); } public static double Phi( double x ) { if ( x < -8.0 ) { return 0.0; } if ( x > 8.0 ) { return 1.0; } double sum = 0.0; double term = x; for ( int i = 3; sum + term != sum; i += 2 ) { sum = sum + term; term = term * x * x / i; } return 0.5 + sum * phi( x ); } public static double Phi( double x, double mu, double sigma ) { return Phi( ( x - mu ) / sigma ); } }