package analyseplans; import static org.codelutin.i18n.I18n._; import org.codelutin.math.matrix.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.topia.TopiaException; import org.apache.commons.beanutils.ConversionException; import org.apache.commons.beanutils.Converter; import org.codelutin.topia.persistence.TopiaEntity; import scripts.ResultName; import java.io.*; import java.io.File; import java.io.FileReader; import java.io.Writer; import java.util.*; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.codelutin.topia.*; // pour pouvoir utiliser la methode StringUtil.toDouble() import fr.ifremer.isisfish.util.Doc; // pour pouvoir afficher une aide contextuelle (BUG#1605) import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.IsisConfig; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.entities.Cell; import fr.ifremer.isisfish.entities.CellDAO; import fr.ifremer.isisfish.entities.FisheryRegion; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.export.Export; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.simulator.AnalysePlan; import fr.ifremer.isisfish.simulator.AnalysePlanContext; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.datastore.RuleStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * ManagementMeasures.java * * Created: 12 juin 2009 * * @author HUSSEIN chirine * */ public class ManagementMeasures implements AnalysePlan { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(ManagementMeasures.class); static private final String MATRIX = "matrix"; static private final String SELECTIVITY = "selectivity"; static private final String SELECTIVITYFiletMer = "selectivityFiletMer"; static private final String SELECTIVITYFiletEtang = "selectivityFiletEtang"; static private final String SELECTIVITYLignecote = "selectivityLignecote"; static private final String SELECTIVITYLigneemb = "selectivityLigneemb"; static private final String SELECTIVITYChalut = "selectivityChalut"; static private final String SELECTIVITYHarpon = "selectivityHarpon"; static private final String PAR_VALUE = "ParameterValue"; static private final String AMP_R = "ampr"; static private final String AMP_R1 = "ampRPrepro_Lignecote"; static private final String AMP_R2 = "ampRPrepro_FiletMer"; static private final String AMP_R3 = "ampRPrepro_Ligneemb"; static private final String AMP_R4 = "ampRreproMreserve_chalut"; static private final String AMP_R5 = "ampRreproMreserve_FiletMer"; static private final String AMP_R6 = "ampRreproMreserve_Harpon"; static private final String AMP_R7 = "ampRreproMreserve_Lignecote"; static private final String AMP_R8 = "ampRreproMreserve_Ligneemb"; static private final String AMP_R9 = "ampSrepro_chalut"; static private final String AMP_R10= "ampSrepro_FiletMer"; static private final String AMP_R11= "ampSrepro_Harpon"; static private final String AMP_R12= "ampSrepro_Lignecote"; static private final String AMP_R13= "ampSrepro_Ligneemb"; static private final String AMP_N = "ampn"; static private final String AMP_N1 = "ampRjeunesMreserve_chalut"; static private final String AMP_N2 = "ampRjeunesMreserve_FiletMer"; static private final String AMP_N3 = "ampRjeunesMreserve_Harpon"; static private final String AMP_N4 = "ampRjeunesMreserve_Lignecote"; static private final String AMP_N5 = "ampRjeunesMreserve_Ligneemb"; static private final String AMP_N6 = "ampRPjeunes_FiletMer"; static private final String AMP_N7 = "ampRPjeunes_Lignecote"; static private final String AMP_N8 = "ampRPjeunes_Ligneemb"; static private final String AMP_N9 = "ampSjeunes_chalut"; static private final String AMP_N10 = "ampSjeunes_FiletMer"; static private final String AMP_N11 = "ampSjeunes_Harpon"; static private final String AMP_N12 = "ampSjeunes_Lignecote"; static private final String AMP_N13 = "ampSjeunes_Ligneemb"; static private final String AMP_N14 = "ampSLagune_FiletEtang"; static private final String AMP_RP = "ampRP"; static private final String AMP_RP1 = "ampRP_FiletMer"; static private final String AMP_RP2 = "ampRP_Lignecote"; static private final String AMP_RP3 = "ampRP_Ligneemb"; public int param_parameterNumber =5; public int param_first = 0; public int param_simulationNumber =162; public String param_directory = "C:/Documents and Settings/hussein/Bureau/isis-fish-3.1.3/isis-fish-3.1.3/management_measures//"; // public Gear param_gear = null; private MatrixND matrix = null; public String [] necessaryResult = { // put here all necessary result for this rule // example: // ResultName.MATRIX_BIOMASS, // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur le plan. * @return L'aide ou la description du plan */ public String getDescription() throws Exception { // TODO return _("r�alise les exp�riences d'un plan complet pour 4 parametres � 3 modalit�s et d'un paramtres � 2 modalit�"); } /** * Appel? au d?marrage de la simulation, cette m?thode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(AnalysePlanContext context) throws Exception { File dir = new File(param_directory); File csvFile = new File(dir, MATRIX + ".txt"); log.info("CSV file is : " + csvFile.getAbsolutePath()); if(!csvFile.exists()) { log.warn("File doesn't exists"); } matrix = MatrixFactory.getInstance().create(new int[]{param_simulationNumber, param_parameterNumber}); matrix.importCSV(new FileReader(new File(dir, MATRIX + ".txt")), new int[]{0,0}); matrix.setSemantics(1, Arrays.asList(new String[]{SELECTIVITY,PAR_VALUE,AMP_R,AMP_N,AMP_RP})); //log.info("Matrix: " + matrix); // ajout des regles qui seront utilis� dans les parametres context.getParam().addExtraRules("Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement","Cantonnement"); } /// Cr�ation des m�thodes qui r�ccup�re dans la matrice la modalit� du param�tre pour l'exp�rience en cours /// Les arguments des m�thodes sont le nom du fichier et le num�ro de la simulation /// (On d�termine l'exp�rience en cours et donc la ligne de la matrice en sommant le num�ro de la simulation et le param_first) /// pour un double private double getDouble(String name, int simulation) throws Exception { File dir = new File(param_directory); Properties prop = new Properties(); prop.load(new BufferedReader(new FileReader(new File(dir, name + ".txt")))); // va chercher dans matrix si c est la modalit� 1 ou -1 du facteur int ligne = simulation + param_first; int mod = (int)matrix.getValue(ligne, name); System.out.println("mod et ligne : "+ mod+" "+ligne); double result = Double.parseDouble(prop.getProperty(""+mod)); System.out.println("result : "+ result); return result; } private double [] getList(String name, int simulation) throws Exception { File dir = new File(param_directory); Properties prop = new Properties(); prop.load(new BufferedReader(new FileReader(new File(dir, name + ".txt")))); int ligne = simulation + param_first; int mod = (int)matrix.getValue(ligne, name); double [] result = StringUtil.toArrayDouble(prop.getProperty(""+mod).split(";")); // ""+ ca construit une chaine de caractere return result; } private String getString(String name,String col, int simulation) throws Exception { File dir = new File(param_directory); Properties prop = new Properties(); prop.load(new BufferedReader(new FileReader(new File(dir, name + ".txt")))); int ligne = simulation + param_first; int mod = (int)matrix.getValue(ligne , col); String result = prop.getProperty(""+mod); return result; } private Rule getRule(RegionStorage regionStorage, String name, String col, int simulation) throws Exception { File dir = new File(param_directory); Properties prop = new Properties(); prop.load(new BufferedReader(new FileReader(new File(dir, name+".txt")))); int ligne = simulation + param_first; int mod = (int)matrix.getValue(ligne , col); String ruleName = prop.getProperty(""+mod); System.out.println("ruleName : "+ ruleName); RuleStorage ruleStorage = RuleStorage.getRule(ruleName); Rule rule = ruleStorage.getNewRuleInstance(); RuleHelper.populateRule(mod, regionStorage, rule, prop); return rule; } /** * Call before each simulation * @param context plan context * @param nextSimulation storage used for next simulation * @return true if we must do next simulation, false to stop plan * @throws Exception */ public boolean beforeSimulation(AnalysePlanContext context, SimulationStorage nextSimulation) throws Exception { int simNum = context.getNumber()+ param_first; if(simNum < param_simulationNumber+1) { /// On v�rifie qu'il reste des exp�riences � faire /// On utilise les m�thodes cr�es pour r�cup�rer les valeurs des modalit�s pour l'exp�rience en cours String selectivityFiletMer = getString (SELECTIVITYFiletMer,SELECTIVITY, simNum); String selectivityFiletEtang = getString (SELECTIVITYFiletEtang,SELECTIVITY, simNum); String selectivityLignecote = getString (SELECTIVITYLignecote,SELECTIVITY, simNum); String selectivityLigneemb = getString (SELECTIVITYLigneemb,SELECTIVITY, simNum); String selectivityChalut = getString (SELECTIVITYChalut,SELECTIVITY, simNum); String selectivityHarpon = getString (SELECTIVITYHarpon,SELECTIVITY, simNum); double ParameterValue = getDouble (PAR_VALUE, simNum); Rule ampr1 = getRule(context.getParam().getRegion(), AMP_R1,AMP_R,simNum); Rule ampr2 = getRule(context.getParam().getRegion(), AMP_R2,AMP_R,simNum); Rule ampr3 = getRule(context.getParam().getRegion(), AMP_R3,AMP_R,simNum); Rule ampr4 = getRule(context.getParam().getRegion(), AMP_R4,AMP_R,simNum); Rule ampr5 = getRule(context.getParam().getRegion(), AMP_R5,AMP_R, simNum); Rule ampr6 = getRule(context.getParam().getRegion(), AMP_R6,AMP_R,simNum); Rule ampr7 = getRule(context.getParam().getRegion(), AMP_R7,AMP_R,simNum); Rule ampr8 = getRule(context.getParam().getRegion(), AMP_R8,AMP_R,simNum); Rule ampr9 = getRule(context.getParam().getRegion(), AMP_R9,AMP_R, simNum); Rule ampr10 = getRule(context.getParam().getRegion(), AMP_R10,AMP_R,simNum); Rule ampr11 = getRule(context.getParam().getRegion(), AMP_R11,AMP_R, simNum); Rule ampr12 = getRule(context.getParam().getRegion(), AMP_R12,AMP_R, simNum); Rule ampr13 = getRule(context.getParam().getRegion(), AMP_R13,AMP_R, simNum); Rule ampn1 = getRule(context.getParam().getRegion(), AMP_N1 ,AMP_N , simNum); Rule ampn2 = getRule(context.getParam().getRegion(), AMP_N2 ,AMP_N, simNum); Rule ampn3 = getRule(context.getParam().getRegion(), AMP_N3 ,AMP_N, simNum); Rule ampn4 = getRule(context.getParam().getRegion(), AMP_N4 ,AMP_N, simNum); Rule ampn5 = getRule(context.getParam().getRegion(), AMP_N5 ,AMP_N, simNum); Rule ampn6 = getRule(context.getParam().getRegion(), AMP_N6,AMP_N, simNum); Rule ampn7 = getRule(context.getParam().getRegion(), AMP_N7,AMP_N, simNum); Rule ampn8 = getRule(context.getParam().getRegion(), AMP_N8,AMP_N, simNum); Rule ampn9 = getRule(context.getParam().getRegion(), AMP_N9,AMP_N, simNum); Rule ampn10 = getRule(context.getParam().getRegion(), AMP_N10,AMP_N, simNum); Rule ampn11 = getRule(context.getParam().getRegion(), AMP_N11,AMP_N, simNum); Rule ampn12 = getRule(context.getParam().getRegion(), AMP_N12,AMP_N, simNum); Rule ampn13 = getRule(context.getParam().getRegion(), AMP_N13,AMP_N, simNum); Rule ampn14 = getRule(context.getParam().getRegion(), AMP_N14,AMP_N, simNum); Rule amprp1 = getRule(context.getParam().getRegion(), AMP_RP1,AMP_RP, simNum); Rule amprp2 = getRule(context.getParam().getRegion(), AMP_RP2,AMP_RP, simNum); Rule amprp3 = getRule(context.getParam().getRegion(), AMP_RP3,AMP_RP,simNum); // modif les parametres des regles de gestion /* attention il faut avoir charger les regles dans le lanceur de simu avec des param qui font qu elles ne s'appliquent pas*/ // on enleve les regles de la simulation pass� // on retient les regles que l'on va ajouter // on ajoute les regles List paramRules = nextSimulation.getParameter().getRules(); paramRules.remove(context.getValue("lastAMP_R1")); context.setValue("lastAMP_R1", ampr1); paramRules.add(ampr1); paramRules.remove(context.getValue("lastAMP_R2")); context.setValue("lastAMP_R2", ampr2); paramRules.add(ampr2); paramRules.remove(context.getValue("lastAMP_R3")); context.setValue("lastAMP_R3", ampr3); paramRules.add(ampr3); paramRules.remove(context.getValue("lastAMP_R4")); context.setValue("lastAMP_R4", ampr4); paramRules.add(ampr4); paramRules.remove(context.getValue("lastAMP_R5")); context.setValue("lastAMP_R5", ampr5); paramRules.add(ampr5); paramRules.remove(context.getValue("lastAMP_R6")); context.setValue("lastAMP_R6", ampr6); paramRules.add(ampr6); paramRules.remove(context.getValue("lastAMP_R7")); context.setValue("lastAMP_R7", ampr7); paramRules.add(ampr7); paramRules.remove(context.getValue("lastAMP_R8")); context.setValue("lastAMP_R8", ampr8); paramRules.add(ampr8); paramRules.remove(context.getValue("lastAMP_R9")); context.setValue("lastAMP_R9", ampr9); paramRules.add(ampr9); paramRules.remove(context.getValue("lastAMP_R10")); context.setValue("lastAMP_R10", ampr10); paramRules.add(ampr10); paramRules.remove(context.getValue("lastMP_R11")); context.setValue("lastAMP_R11", ampr11); paramRules.add(ampr11); paramRules.remove(context.getValue("lastAMP_R12")); context.setValue("lastAMP_R12", ampr12); paramRules.add(ampr12); paramRules.remove(context.getValue("lastAMP_R13")); context.setValue("lastAMP_R13", ampr13); paramRules.add(ampr13); // AMP zone de nurssuries paramRules.remove(context.getValue("lastAMP_N1")); context.setValue("lastAMP_N1", ampn1); paramRules.add(ampn1); paramRules.remove(context.getValue("lastAMP_N2")); context.setValue("lastAMP_N2", ampn2); paramRules.add(ampn2); paramRules.remove(context.getValue("lastAMP_N3")); context.setValue("lastAMP_N3", ampn3); paramRules.add(ampn3); paramRules.remove(context.getValue("lastAMP_N4")); context.setValue("lastAMP_N4", ampn4); paramRules.add(ampn4); paramRules.remove(context.getValue("lastAMP_N5")); context.setValue("lastAMP_N5", ampn5); paramRules.add(ampn5); paramRules.remove(context.getValue("lastAMP_N6")); context.setValue("lastAMP_N6", ampn6); paramRules.add(ampn6); paramRules.remove(context.getValue("lastAMP_N7")); context.setValue("lastAMP_N7", ampn7); paramRules.add(ampn7); paramRules.remove(context.getValue("lastAMP_N8")); context.setValue("lastAMP_N8", ampn8); paramRules.add(ampn8); paramRules.remove(context.getValue("lastAMP_N9")); context.setValue("lastAMP_N9", ampn9); paramRules.add(ampn9); paramRules.remove(context.getValue("lastAMP_N10")); context.setValue("lastAMP_N10", ampn10); paramRules.add(ampn10); paramRules.remove(context.getValue("lastAMP_N11")); context.setValue("lastAMP_N11", ampn11); paramRules.add(ampn11); paramRules.remove(context.getValue("lastAMP_N12")); context.setValue("lastAMP_N12", ampn12); paramRules.add(ampn12); paramRules.remove(context.getValue("lastAMP_N13")); context.setValue("lastAMP_N13", ampn13); paramRules.add(ampn13); paramRules.remove(context.getValue("lastAMP_N14")); context.setValue("lastAMP_N14", ampn14); paramRules.add(ampn14); //RP zones paramRules.remove(context.getValue("lastAMP_RP1")); context.setValue("lastAMP_RP1", amprp1); paramRules.add(amprp1); paramRules.remove(context.getValue("lastAMP_RP2")); context.setValue("lastAMP_RP2", amprp2); paramRules.add(amprp2); paramRules.remove(context.getValue("lastAMP_RP3")); context.setValue("lastAMP_RP3", amprp3); paramRules.add(amprp3); TopiaContext tx = nextSimulation.getStorage().beginTransaction(); PopulationDAO popDAO = IsisFishDAOHelper.getPopulationDAO(tx); Population pop = popDAO.findByName("CSar"); List groups = pop.getPopulationGroup(); GearDAO gearDAO = IsisFishDAOHelper.getGearDAO(tx); List gears = gearDAO.findAll(); /// modif selectivit�, on dispose que le dispositif am�liorait de 25% la s�lectivit� pour les hors tailles pour la modalit� 1 et de 50% pour la modalit� 2 for (Gear gear : gears) { if ("FiletMer".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityFiletMer); } else if ("FiletEtang".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityFiletEtang); }else if ("Lignecote".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityLignecote); }else if ("Ligneemb".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityLigneemb); }else if ("Chalut".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityChalut); }else if ("Harpon".equals(gear.getName())) { Selectivity sel = gear.getPopulationSelectivity(pop); Equation eq = sel.getEquation(); eq.setContent(selectivityHarpon); } } //modifie les param�tres controlables de l'engin FiletMer MetierDAO metierDAO = IsisFishDAOHelper.getMetierDAO(tx); List metiers = metierDAO.findAll(); for(Metier metier : metiers){ log.info("metier examin� " + metier.getName() + " son engin " + metier.getGear().getName()); String [] values = new String[]{"ParameterValue"}; int number = context.getNumber(); if (number < values.length) { if ("FiletMer".equals(metier.getName()) || "FiletRreserve".equals(metier.getName())){ //log.info("metier = " + metier.getName()); metier.setGearParameterValue(values[number]); } } } tx.commitTransaction(); return true; } else { return false; } } /** * Call after each simulation * @param context plan context * @param nextSimulation storage used for next simulation * @return true if we must do next simulation, false to stop plan * @throws Exception */ public boolean afterSimulation(AnalysePlanContext context, SimulationStorage lastSimulation) throws Exception { return true; } }