/**
* Cette classe assure le calcul du Khi2
* @author CnCBoy
*/
public class CalculKhi2 {
/**
* Pour l'appel de CollecterDonne sans argument
*/
public static int NB_TEST_DEFAUT = 300;
/**
* Pour l'appel de CollecterDonne sans argument
*/
public static int NB_CLASS_DEFAUT = 10;
private static int SERIE_THEORIQUE =0;
private static int SERIE_REELLE =1;
/**
* Donnee de collecte
* Serie 1 Valeur Theorique, Serie 2 Valeur Reele
*/
private XYSeriesCollection dataset;
/**
* Generateur mis à l'epreuve
*/
private Generator gen;
/**
* Utilise un generateur pour la mise à l'epreuve
* @param gen
*/
public CalculKhi2(Generator gen){
this.gen = gen;
}
/***
* Effectue l'epreuve sur le nombre de resultat par defaut
*/
public void CollecterDonnee(){
CollecterDonnee(NB_TEST_DEFAUT,NB_CLASS_DEFAUT);
}
/**
* Effectue l'epreuve sur le nombre de resultat nbTest
* @param nbTest Nombre de test à faire
* @param nbClass Nombre de classe utilisé
*/
public void CollecterDonnee(int nbTest, int nbClass){
//Largeur de chaque classe
double classWidth= (gen.getMaxSupport()-gen.getMinSupport())/nbClass;
//Serie des valeurs theoriques
XYSeries serieTheo = new XYSeries("theorique");
//Serie des valeurs theoriques
XYSeries serieExp = new XYSeries("experimental");
//Classeur des valeurs experimentale
HashMap> classeurExp
= new HashMap>(nbClass);
//Collecte des valeurs theoriques
for (Integer i = 0; i < nbClass; i++){
//Mediane de la classe (debut support + mediane de la classe + largeur)
double mediane = gen.getMinSupport()+classWidth/2.0+classWidth*i;
//Valeur inferieure et superieure pour
//la valeur moyenne de probabilite sur ce segment
double vInf = gen.getTheory(gen.getMinSupport()+classWidth*i);
double vSup = gen.getTheory(gen.getMinSupport()+classWidth*(i+1));
serieTheo.add(mediane,(vInf+vSup)/2.0);
//Ajout de la clef (Valeur i pour eviter les pb d'arrondis)
classeurExp.put(i,new LinkedList<Double>());
}
//Tirage aleatoire et rangement en classe
for(int i=0; i<nbTest; i++){
double value = gen.nextDouble();
//Test pour chaque tranche pour contourner
//des problème d'arrondis flottant en cas de division
//Classe ou l'on range l'element
int nClass=0;
//Protection pour eviter de sortir du support
while(nClass<=nbClass &&
!(value>=gen.getMinSupport()+nClass*classWidth
&& value <= gen.getMinSupport()+(nClass+1)*classWidth)){
nClass++;
}
//System.out.println(nClass+" " + value);
if (nClass<nbClass){
classeurExp.get(nClass).add(value);
}
}
//Calcul de la probabilite cumulé de chaque classe
double cumul =0;
for (int i = 0; i < nbClass; i++){
cumul += classeurExp.get(i).size();
serieExp.add(gen.getMinSupport()+i*classWidth+classWidth/2.0,cumul/(double)nbTest);
}
/*for(int i =0; i < serieTheo.getItemCount(); i++){
System.out.println(serieTheo.getX(i)+";"+serieTheo.getY(i));