package ecoparasite.completion; import ecoparasite.input.InputFactory; import ecoparasite.input.InputFileException; import ecoparasite.input.RawData; import ecoparasite.input.RawDataOverflow; import ecoparasite.poisson.Mackerel; import ecoparasite.poisson.Poisson; import java.util.HashSet; import java.util.concurrent.Callable; import java.util.function.*; /** * Permet de faire de la complétion de données. * Si une valeur est manquante, elle sera remplacé par la moyenne ou par regression linéaire. */ public class Completion { /** * Permet de remplacer les valeurs inexistantes d'un paramètre d'un HashSet par la moyenne des autres valeurs (non nulles). * Exemple d'utilisation : T = Poisson, V = Double, getValue = Poisson::getInfestation, setValue = Poisson::setInfestation. * * @param list La liste de données cobaye. * @param getValue La fonction (Getter) qui permet d'obtenir la valeur que l'on veut vérifier * @param setValue La fonction (Setter) qui permet de remplacer la valeur si null. * @return Le HashSet avec les valeurs remplacés. * @param Le type de données cobaye. Exemple : Poisson, Population * @param Le type de la donnée à vérifier, doit être un Wrapper Number. Exemple : Double. */ public static HashSet completeColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue ){ Double mean = calculateMean(list, getValue); for(T item : list){ if( getValue.apply(item) == null ){ setValue.accept( item, (V) mean); } } return list; } /** * Permet de calculer la moyenne d'une donnée des valeurs non nulles. * @param list La liste de données cobaye. * @param getValue La fonction qui permet d'obtenir la valeur de notre champ. * @return La moyenne calculé. * @param Le type de données cobaye/ Exemple : Poisson * @param Le type de la donnée à vérifier, doit être un wrapper Number. Exemple : Double. */ public static double calculateMean(HashSet list, Function getValue ){ double mean = 0.0; int i = 0; for( T item : list ){ V value = getValue.apply(item); if( value != null) { mean += value.doubleValue(); i++; } } return mean / i; } public static HashSet completeColumnsLinear(HashSet list, Function getX, Function getY, BiConsumer setY ){ double meanX = calculateMean(list, getX); double meanY = calculateMean(list, getY); double a = calculateLinearA(list,getX,getY,meanX,meanY); double b = calculateLinearB(meanX,meanY,a); for(T item : list){ if( getY.apply(item) == null && getX.apply(item) != null ){ Double value = a * getX.apply(item).doubleValue() + b; setY.accept( item, (V) value ); } } return list; } /** * Permet de calculer le coefficient A de notre regression linéaire. * @param list * @param getX * @param getY * @param meanX * @param meanY * @return * @param * @param */ public static double calculateLinearA( HashSet list, Function getX, Function getY, double meanX, double meanY ){ double numerateur = 0.0; double denominateur = 0.0; for( T item : list ){ if( getX.apply(item) == null || getY.apply(item) == null ){ continue; } numerateur += ( getX.apply(item).doubleValue() - meanX ) * ( getY.apply(item).doubleValue() - meanY ); denominateur += ( getX.apply(item).doubleValue() - meanX ) * ( getX.apply(item).doubleValue() - meanX ); } return numerateur / denominateur; } public static double calculateLinearB( double meanX, double meanY, double valueA ){ return meanY - valueA * meanX; } }