/*
 * Poisson.java
 *
 * Created on March 10, 2006, 12:02 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package probabilitycalculator;

/**
 *
 * @author Rinaman
 */
public class Poisson extends Distributions{
    
    private double x, lambda;
    private int option;
    
    /** Creates a new instance of Poisson */
    public Poisson(double dx, double ParmOne, int ioption) {
        x = dx;
        lambda = ParmOne;
        option = ioption;
    }
    
    public double PoissonCalc() {
        if(option == 1)return df(x, lambda, 1.0);
        else if(option == 2)
            if((double)(int)x == x)return 1.0 - df(x-1.0, lambda, 1.0);
            else return 1.0 - df(x, lambda, 1.0);
        else if(option == 3)return invPoissonDF(x, lambda);
        else return invPoissonDFC(x, lambda);   
    }
    
    public double df(double x, double lambda, double ParmTwo) {
        double dx;
        int i;
        if(x < 0)return 0.0;
        i = 0;
        while((double)i <= x)i++;
        dx = (double)i - 1.0;
        return gammq(dx+1.0,lambda);
    }
    
    public double invPoissonDF(double x, double lambda) {
        int i;
        double xi;
        if(x <= 0.0)return -2.0;
        if(x >= 1.0)return -5.0;
        i = 0;
        xi = 0.0;
        while(df(xi, lambda, 1.0) < x) {
            i++;
            xi = xi + 1.0;
        }
        return xi;
    }
    
    public double invPoissonDFC(double x, double lambda) {
        int i;
        double xi;
        if(x >= 1.0)return -2.0;
        if(x <= 0.0)return -5.0;
        i = 0;
        xi = 1.0;
        while((1.0 - df(xi-1.0, lambda, 1.0))> x) {
            i++;
            xi = xi + 1.0;
        }
        return xi - 1.0;
    }
}
