/* * Copyright (C) 2014 slehuta * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . */ package simulationplans; import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.datastore.RuleStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.simulator.SimulationPlanIndependent; import fr.ifremer.isisfish.simulator.SimulationPlanContext; import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.*; import org.nuiton.topia.*; import org.nuiton.util.*; //import org.apache.commons.lang3.StringUtils.splitByWholeSeparator; /** * PlanGalion.java * * Created: 30 Novembre 2018 * * @author slehuta * @version $Revision: 1 $ * Last update: $Date: 30 novembre 2018 $ * by : $Author: slehuta $ */ public class PlanGalionTout_So2 implements SimulationPlanIndependent { /** to use log facility, just put in your code: log.info("..."); */ private static Log log = LogFactory.getLog(PlanGalionTout_So2.class); static private String MATRIX = "CombinaisonSimulation"; private MatrixND matrix = null; // Matrix columns static private final String EFFECT = "EffectifsInitiaux"; static private final String RECRUT = "Recrutement"; static private final String CONNEC = "Connectivite"; static private final String RULE = "Rule"; static private final int parameterNumber = 4; static private final int matrix_size = 240; public int param_first = 0; public int param_simulationNumber = 240; public String param_directory = "/home/zigrid/Bureau/Sophie/lancement_plan_1/CombinaisonSimulation/"; private MatrixND mateffInit0 = null; private MatrixND mateffInit1 = null; private MatrixND mateffInit2 = null; private MatrixND mateffInit3 = null; // TO DO enter correct matrix path and names static private final String effInit0 = "/home/zigrid/Bureau/Sophie/lancement_plan_1/AbondanceRecalculee/abondInit.csv"; static private final String effInit1 = "/home/zigrid/Bureau/Sophie/lancement_plan_1/AbondanceRecalculee/abond_z1.csv"; static private final String effInit2 = "/home/zigrid/Bureau/Sophie/lancement_plan_1/AbondanceRecalculee/abond_z0.5.csv"; static private final String effInit3 = "/home/zigrid/Bureau/Sophie/lancement_plan_1/AbondanceRecalculee/abond_z2.csv"; protected String[] necessaryResult = { }; @Override 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 */ @Override public String getDescription() throws Exception { return "Galion management scenarios and main uncertainty hypotheses for GDL Hake"; } /** * Called once before {@code beforeSimulation} call. * * @param context plan context */ @Override public void init(SimulationPlanContext context) throws Exception { System.out.println("etape0"); // Load simulation plan matrix matrix = MatrixFactory.getInstance().create(new int[]{matrix_size, parameterNumber}); matrix.importCSV(new FileReader(new File(param_directory, MATRIX + ".csv")), new int[]{0,0}); List dim0 = new ArrayList(); for (int i=0; i < matrix_size; i++) { dim0.add(i); } System.out.println("etape1 : lecture plan de combinaisons"); matrix.setSemantic(0, dim0); matrix.setSemantic(1, Arrays.asList(new String[]{EFFECT,RECRUT,CONNEC,RULE})); // To DO Add necessary rules to simulation context context.getParam().addExtraRules("Effort_2015_2017_GDL"); // Load initial abundance matrices mateffInit0 = MatrixFactory.getInstance().create(new int[]{6,2}); mateffInit0.importCSV(new FileReader(new File(effInit0)), new int[]{0,0}); mateffInit1 = MatrixFactory.getInstance().create(new int[]{6,2}); mateffInit1.importCSV(new FileReader(new File(effInit1)), new int[]{0,0}); mateffInit2 = MatrixFactory.getInstance().create(new int[]{6,2}); mateffInit2.importCSV(new FileReader(new File(effInit2)), new int[]{0,0}); mateffInit3 = MatrixFactory.getInstance().create(new int[]{6,2}); mateffInit3.importCSV(new FileReader(new File(effInit3)), new int[]{0,0}); System.out.println("etape2 : lecture plan des abondances initiales"); } /** * @param name le nom de l'element a recuperer * @param simulation le numero de la simulation * @return */ private double getDouble(String name,String colname, 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, colname); System.out.println("nom "+name+"mod :"+mod); double result = Double.parseDouble(prop.getProperty(""+mod)); return result; } /** * 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 */ @Override public boolean beforeSimulation(SimulationPlanContext context, SimulationStorage nextSimulation) throws Exception { int simNum = nextSimulation.getParameter().getSimulationPlanNumber() + param_first; System.out.println("etape3 : determiner getDouble valeur simNum : " + simNum); TopiaContext db = nextSimulation.getStorage().beginTransaction(); String populationId = nextSimulation.getParameter().getPopulations().get(0).getTopiaId(); PopulationDAO populationDAO = IsisFishDAOHelper.getPopulationDAO(db); Population pop = populationDAO.findByTopiaId(populationId); if (simNum < param_simulationNumber+param_first){ ////////////////////////////////////////////////////////////////////////////////////////// // Modif rules List paramRules = nextSimulation.getParameter().getRules(); double eff = matrix.getValue(simNum,EFFECT); double rec = matrix.getValue(simNum,RECRUT); double con = matrix.getValue(simNum,CONNEC); double rul = matrix.getValue(simNum,RULE); int ruleNum = 0; // StatuQuo System.out.println("etape4 , " + eff + rec + con + rul); // Param��tres des r��gles �� modifier pour chaque sc��nario if(rul == 1){ // fermeture 100 m -> remplacee par fermeture 6mn Zone sixmn = IsisFishDAOHelper.getZoneDAO(db).findByName("6mn"); //nom zone 6mn Gear OTB = IsisFishDAOHelper.getGearDAO(db).findByName("OTB"); Gear OTM = IsisFishDAOHelper.getGearDAO(db).findByName("OTM"); Gear OTT = IsisFishDAOHelper.getGearDAO(db).findByName("OTT"); //OTB String ruleName1 = "Cantonnement"; Properties propert1 = new Properties(); propert1.put("rule."+ruleNum+".parameter.zone", sixmn.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.gear", OTB.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.beginStep", ""+60); //debut en janvier de l'annee 2020 propert1.put("rule."+ruleNum+".parameter.endStep", ""+119); // fin en decembre 2025 propert1.put("rule."+ruleNum+".parameter.beginMonth", ""+4); // debut mai propert1.put("rule."+ruleNum+".parameter.endMonth", ""+6); // fin juillet RuleStorage ruleStorage1 = RuleStorage.getRule(ruleName1); Rule rule1 = ruleStorage1.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule1, propert1); paramRules.add(rule1); ruleNum+=1; //OTT String ruleName2 = "Cantonnement"; Properties propert2 = new Properties(); propert2.put("rule."+ruleNum+".parameter.zone", sixmn.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.gear", OTT.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.beginStep", ""+60); //debut en janvier de l'annee 2020 propert2.put("rule."+ruleNum+".parameter.endStep", ""+119); // fin en decembre 2025 propert2.put("rule."+ruleNum+".parameter.beginMonth", ""+4); // debut mai propert2.put("rule."+ruleNum+".parameter.endMonth", ""+6); // fin juillet RuleStorage ruleStorage2 = RuleStorage.getRule(ruleName2); Rule rule2 = ruleStorage2.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule2, propert2); paramRules.add(rule2); ruleNum+=1; // OTM String ruleName3 = "Cantonnement"; Properties propert3 = new Properties(); propert3.put("rule."+ruleNum+".parameter.zone", sixmn.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.gear", OTM.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert3.put("rule."+ruleNum+".parameter.endStep", ""+119); propert3.put("rule."+ruleNum+".parameter.beginMonth", ""+4); propert3.put("rule."+ruleNum+".parameter.endMonth", ""+6); RuleStorage ruleStorage3 = RuleStorage.getRule(ruleName3); Rule rule3 = ruleStorage3.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule3, propert3); paramRules.add(rule3); System.out.println("TOTO 1"); }else if(rul == 2){ // zone FRA Zone FRA = IsisFishDAOHelper.getZoneDAO(db).findByName("FRA"); Gear OTB = IsisFishDAOHelper.getGearDAO(db).findByName("OTB"); Gear OTM = IsisFishDAOHelper.getGearDAO(db).findByName("OTM"); Gear OTT = IsisFishDAOHelper.getGearDAO(db).findByName("OTT"); //OTB String ruleName1 = "Cantonnement"; Properties propert1 = new Properties(); propert1.put("rule."+ruleNum+".parameter.zone", FRA.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.gear", OTB.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert1.put("rule."+ruleNum+".parameter.endStep", ""+119); propert1.put("rule."+ruleNum+".parameter.beginMonth", ""+0); //fermeture toute l'annee propert1.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage1 = RuleStorage.getRule(ruleName1); Rule rule1 = ruleStorage1.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule1, propert1); paramRules.add(rule1); ruleNum+=1; //OTT String ruleName2 = "Cantonnement"; Properties propert2 = new Properties(); propert2.put("rule."+ruleNum+".parameter.zone", FRA.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.gear", OTT.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.beginStep", ""+60); //debut en janvier de l'annee 2020 propert2.put("rule."+ruleNum+".parameter.endStep", ""+119); // fin en decembre 2025 propert2.put("rule."+ruleNum+".parameter.beginMonth", ""+0); propert2.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage2 = RuleStorage.getRule(ruleName2); Rule rule2 = ruleStorage2.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule2, propert2); paramRules.add(rule2); ruleNum+=1; // OTM String ruleName3 = "Cantonnement"; Properties propert3 = new Properties(); propert3.put("rule."+ruleNum+".parameter.zone", FRA.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.gear", OTM.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert3.put("rule."+ruleNum+".parameter.endStep", ""+119); propert3.put("rule."+ruleNum+".parameter.beginMonth", ""+0); propert3.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage3 = RuleStorage.getRule(ruleName3); Rule rule3 = ruleStorage3.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule3, propert3); paramRules.add(rule3); System.out.println("TOTO 2"); }else if(rul == 3){ // fermeture zone derogation : Fermeture �� plus de 90m d���Octobre �� Avril + fermeture �� plus de 200m toute l���ann��e // 90m Zone quatrevingtdixm = IsisFishDAOHelper.getZoneDAO(db).findByName("90m"); Gear OTB = IsisFishDAOHelper.getGearDAO(db).findByName("OTB"); Gear OTM = IsisFishDAOHelper.getGearDAO(db).findByName("OTM"); Gear OTT = IsisFishDAOHelper.getGearDAO(db).findByName("OTT"); // OTB String ruleName1 = "Cantonnement"; Properties propert1 = new Properties(); propert1.put("rule."+ruleNum+".parameter.zone", quatrevingtdixm.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.gear", OTB.getTopiaId()); propert1.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert1.put("rule."+ruleNum+".parameter.endStep", ""+119); propert1.put("rule."+ruleNum+".parameter.beginMonth", ""+9); //debut octobre propert1.put("rule."+ruleNum+".parameter.endMonth", ""+3); // avril RuleStorage ruleStorage1 = RuleStorage.getRule(ruleName1); Rule rule1 = ruleStorage1.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule1, propert1); paramRules.add(rule1); ruleNum+=1; //OTT String ruleName2 = "Cantonnement"; Properties propert2 = new Properties(); propert2.put("rule."+ruleNum+".parameter.zone", quatrevingtdixm.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.gear", OTT.getTopiaId()); propert2.put("rule."+ruleNum+".parameter.beginStep", ""+60); //debut en janvier de l'annee 2020 propert2.put("rule."+ruleNum+".parameter.endStep", ""+119); // fin en decembre 2025 propert2.put("rule."+ruleNum+".parameter.beginMonth", ""+9); propert2.put("rule."+ruleNum+".parameter.endMonth", ""+3); RuleStorage ruleStorage2 = RuleStorage.getRule(ruleName2); Rule rule2 = ruleStorage2.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule2, propert2); paramRules.add(rule2); ruleNum+=1; // OTM String ruleName3 = "Cantonnement"; Properties propert3 = new Properties(); propert3.put("rule."+ruleNum+".parameter.zone", quatrevingtdixm.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.gear", OTM.getTopiaId()); propert3.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert3.put("rule."+ruleNum+".parameter.endStep", ""+119); propert3.put("rule."+ruleNum+".parameter.beginMonth", ""+9); propert3.put("rule."+ruleNum+".parameter.endMonth", ""+3); RuleStorage ruleStorage3 = RuleStorage.getRule(ruleName3); Rule rule3 = ruleStorage3.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule3, propert3); paramRules.add(rule3); // 200m Zone deuxcentm = IsisFishDAOHelper.getZoneDAO(db).findByName("200m"); // OTB String ruleName4 = "Cantonnement"; Properties propert4 = new Properties(); propert4.put("rule."+ruleNum+".parameter.zone", deuxcentm.getTopiaId()); propert4.put("rule."+ruleNum+".parameter.gear", OTB.getTopiaId()); propert4.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert4.put("rule."+ruleNum+".parameter.endStep", ""+119); propert4.put("rule."+ruleNum+".parameter.beginMonth", ""+0); propert4.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage4 = RuleStorage.getRule(ruleName4); Rule rule4 = ruleStorage4.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule4, propert4); paramRules.add(rule4); ruleNum+=1; // OTM String ruleName5 = "Cantonnement"; Properties propert5 = new Properties(); propert5.put("rule."+ruleNum+".parameter.zone", deuxcentm.getTopiaId()); propert5.put("rule."+ruleNum+".parameter.gear", OTM.getTopiaId()); propert5.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert5.put("rule."+ruleNum+".parameter.endStep", ""+119); propert5.put("rule."+ruleNum+".parameter.beginMonth", ""+0); propert5.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage5 = RuleStorage.getRule(ruleName5); Rule rule5 = ruleStorage5.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule5, propert5); paramRules.add(rule5); ruleNum+=1; // OTT String ruleName6 = "Cantonnement"; Properties propert6 = new Properties(); propert6.put("rule."+ruleNum+".parameter.zone", deuxcentm.getTopiaId()); propert6.put("rule."+ruleNum+".parameter.gear", OTT.getTopiaId()); propert6.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert6.put("rule."+ruleNum+".parameter.endStep", ""+119); propert6.put("rule."+ruleNum+".parameter.beginMonth", ""+0); propert6.put("rule."+ruleNum+".parameter.endMonth", ""+11); RuleStorage ruleStorage6 = RuleStorage.getRule(ruleName6); Rule rule6 = ruleStorage6.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule6, propert6); paramRules.add(rule6); ruleNum+=1; System.out.println("TOTO 3"); }else if(rul == 4){ // reduction effort String ruleName = "EffortReduction_So"; Properties propert = new Properties(); propert.put("rule."+ruleNum+".parameter.beginStep", ""+60); propert.put("rule."+ruleNum+".parameter.endStep", ""+119); RuleStorage ruleStorage = RuleStorage.getRule(ruleName); Rule rule = ruleStorage.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule, propert); paramRules.add(rule); ruleNum+=1; System.out.println("TOTO 4"); } //////////////////////////////////////////////////////////// // Modif Recrutement String recEq_part1 = "double recru = 31296;"; if(rec == 1){ recEq_part1 = "double recru = 111418;"; }else if(rec==2){ recEq_part1 = "double recru = 25000;"; }else if(rec == 3){ recEq_part1 = "double alpha = 70; double k = 3000000; double SSBTot = 0.0;MatrixND NGroup = N.sumOverDim(1).reduceDims(1);for(PopulationGroup gr : groups) { SSBTot += NGroup.getValue(gr) * gr.getMeanWeight() * gr.getMaturityOgive() * prepro; } double recru = SSBTot*alpha/(1+(SSBTot/k));"; } //////////////////////////////////////////////////////////////// // modif connectivite String recEq_part2 = "double[] recZone = {0.165,0.835};"; if(con ==1){ recEq_part2 = "double[] recZone = {0.452,0.548};"; }else if(con ==2){ recEq_part2 = "double[] recZone = {0.026,0.974};"; } System.out.println("Avant changement recrutement"); Equation eqq = pop.getReproductionEquation(); String eqqs = eqq.getContent(); System.out.println("eqqs : "+eqqs); String eqqNew = recEq_part1 + recEq_part2 ; eqqs = eqqs.replaceAll("double recru = 31296\\; double\\[\\] recZone = \\{0.165,0.835\\}\\;", eqqNew); System.out.println("EqqNew : "+eqqNew); eqq.setContent(eqqs); System.out.println("EqqNew : "+ eqq.getContent()); System.out.println("TOTO 6"); //////////////////////////////////////////////////////////// // Modif effectifs initiaux MatrixND mat = nextSimulation.getParameter().getNumberOf(pop); MatrixND mateffInit = null; if(eff == 0){ mateffInit = mateffInit0; }else if(eff == 1){ mateffInit = mateffInit1; }else if(eff == 2){ mateffInit = mateffInit2; }else if(eff == 3){ mateffInit = mateffInit3; } for(MatrixIterator i = mat.iterator(); i.hasNext();){ i.next(); int[] dim = i.getCoordinates(); double val = mateffInit.getValue(dim); i.setValue(val); System.out.println("eff_initiaux" + i.getValue()); } db.commitTransaction(); db.closeContext(); System.out.println("etape4 : Fin de la mise en place des combinaisons"); return true; }else return false; } /** * Call after each simulation. * * @param context plan context * @param lastSimulation storage used for simulation * @return true if we must do next simulation, false to stop plan * @throws Exception */ @Override public boolean afterSimulation(SimulationPlanContext context, SimulationStorage lastSimulation) throws Exception { return true; } }