package poisson;




import edu.csusb.danby.stat.*;
import edu.csusb.danby.math.ProbMath;// for loggamma

/**
*  SharkModel  class  for SharkG applet to demonstrate Poisson Random variables
* @author Charles S. Stanton			
* @version Sun Jul 28 09:23:16 PDT 2002		
*/	
public class SharkModel implements HistogramIF  {
    Distribution p_random = new Distribution();
    
    double lambda ;   //Poisson distribution parameter
    
    int numberBins;
    int xcount[];
    int nSharks; 
    int total_n_repetitions=0;
    double[] theoreticalCount; 
                //total_n_repetitions*p(x), where p(x) is theoretical value
    
    public SharkModel( double aLambda) {
        lambda = aLambda;
        numberBins = (int)Math.floor(lambda*2.0)+5;
        xcount  = new int[numberBins];
        theoreticalCount =new double[numberBins];
        
    } 






/**
*  fish simulates the poisson distribution using random number  
*  generators.							
* @param n_repetitions is the number of repetitions to do.
* @param lambda is the parameter of the Poisson Distribution
*/
    public void fish(int n_repetitions) {
        
        for (int j= 0; j < n_repetitions; j++) { 
            nSharks=p_random.nextPoisson(lambda);
            if  (nSharks < numberBins) {
                xcount[nSharks]++;
            }
        }
        total_n_repetitions += n_repetitions;
        for (int i=0; i< numberBins; i++){	
                theoreticalCount[i] = (double)total_n_repetitions*	
                        Math.exp(-1*lambda+i*Math.log(lambda)
                        -ProbMath.loggamma((double)(i+1)));
        }
        
    }  
    
    public void setLambda( double aLambda){
        lambda = aLambda;
    }

    public int getNSharks(){ return nSharks;}

    public void reset(){
        total_n_repetitions=0;
        numberBins = (int)Math.floor(lambda*2.0)+5;
        xcount  = new int[numberBins];
        theoreticalCount =new double[numberBins];
        nSharks =0;
    }

//HistogramIF methods
    public int getNumberBins(){ return numberBins;}
    public int[] getBinCount() { return xcount;}
    public int getLowValue(){return 0;}
    public boolean drawTheoretical(){return true;}
    public boolean useClassMarkLabels(){return false;}
    public double[] getTheoreticalCount(){return theoreticalCount;}
    public double[] getClassMarks(){ return null;}
    public String[] getClassMarkLabels(){ return null;}
    public void setNumberBins(int n){numberBins = n;}


}




