/* * Copyright (C) * * 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; /** * PlanSensibilite4param.java - Plan de simulation avec en entree un csv avec les combinaisons de valeurs * de 4 parametres (prop_survie, derive_efficacite, standardisation,mortalite,stock_recrutement) * VOIR LES CONTRAINTES SUR LES VALEURS DES PARAMETRES DESSOUS * * Created: 19 février 2024 * * @author smahevas * @version $Revision: 1 $ * Last update: $Date: 19 février 2024 $ * * * * ATTENTION : A vérifier avant de lancer le plan : -bien vérifier le nom des regles de gestion appelées dans le plan et les begin & end step (PAR DEFAUT de 0 à 59) -chemin qui mène au csv contenant le plan d'expérience (CombinaisonsValeursParam.csv) -l'équation de recrutement qui figure dans la base : Ktemp = 4 (relation de reproduction) */ public class PlanSensibilite5param implements SimulationPlanIndependent { /** to use log facility, just put in your code: log.info("..."); */ private static Log log = LogFactory.getLog(PlanSensibilite5param.class); // Matrix columns static private final String SURVIE = "survie"; //proba_survie_langoustine (nouvelle valeur [0;1]) static private final String DERIVE = "derive"; //derive_effiacite (nouvelle valeur décimal > -1) static private final String STANDARDISATION = "standardisation"; //standardisation_chalut (proportion > 0 qui s'applique : newval = proportion * oldval) static private final String MORTALITE = "mortalite"; //mortalite naturelle (Ktemp de l'equation = proportion >0) static private final String FECONDITE = "fecondite"; //taux de reproduction (Ktemp de l'equation = proportion >0) static private final int param_parameterNumber = 5; //nb_col_csv //static private final int nb_size = 1000; // 5*nb_lignes_csv public int param_first = 0; public int param_simulationNumber = 1000; //nb_lignes_csv public String param_directory = "C:\\Users\\smahevas\\C-ISISFish\\2023_Atelier2_MIMI\\csv_plan\\"; public String param_matrixR = "CombinaisonsValeursParam.csv"; private MatrixND matrix = null; 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 "MIMI ISIS-Langoustine-GdG Plan Sensibilite 5 parametres"; } /** * 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 String path; path = param_directory + param_matrixR ; File simulations_plan = new File(path); matrix = MatrixFactory.getInstance().create(new int[]{param_simulationNumber, param_parameterNumber}); matrix.importCSV(new FileReader(simulations_plan), new int[]{0,0}); int matrix_size = param_simulationNumber*param_parameterNumber; 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[]{SURVIE,DERIVE,STANDARDISATION,MORTALITE,FECONDITE})); // To DO Add necessary rules to simulation context context.getParam().addExtraRules("DeriveEfficacite_5ans"); // derive d'efficacité context.getParam().addExtraRules("TailleMin"); // Rejet langoustine } /** * @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 { System.out.println("entre etapes 1 et 2"); int simNum = nextSimulation.getParameter().getSimulationPlanNumber() + param_first; System.out.println("etape 2 : 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); String speciesId = pop.getSpecies().getTopiaId(); GearDAO gearDAO = IsisFishDAOHelper.getGearDAO(db); if (simNum < param_simulationNumber){ // Modif de la base avec les valeurs pour la simu // ---------------------------------------------- List paramRules = nextSimulation.getParameter().getRules(); double der = matrix.getValue(simNum,DERIVE); double sur = matrix.getValue(simNum,SURVIE); double std = matrix.getValue(simNum,STANDARDISATION); double mor = matrix.getValue(simNum,MORTALITE); double fec = matrix.getValue(simNum,FECONDITE); System.out.println("etape 3 , lecture valeurs pour la simu :" + der + sur + std + mor + fec); // derive efficacite // Paramètres des règles à modifier // --------------------------------- int ruleNum = 0; // Premiere regle String ruleName = "DeriveEfficacite_5ans"; Properties propert = new Properties(); propert.put("rule."+ruleNum+".parameter.derive", ""+der); RuleStorage ruleStorage = RuleStorage.getRule(ruleName); Rule rule = ruleStorage.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule, propert); paramRules.add(rule); //survie // Paramètres des règles à modifier : uniquement avec regle TailleMin // --------------------------------- ruleNum+=1; // deuxieme regle ruleName = "TailleMin"; propert = new Properties(); propert.put("rule."+ruleNum+".parameter.propSurvie", ""+sur); propert.put("rule."+ruleNum+".parameter.beginStep", ""+0); propert.put("rule."+ruleNum+".parameter.endStep", ""+59); //propert.put("rule."+ruleNum+".parameter.species", ""+"fr.ifremer.isisfish.entities.Species\\#1223471368741\\#0.6919243284435815\\:langoustine"); //propert.put("rule."+ruleNum+".parameter.affectedSpecies", ""+"langoustine"); propert.put("rule."+ruleNum+".parameter.species", ""+ speciesId); propert.put("rule."+ruleNum+".parameter.TailleMin", ""+20); ruleStorage = RuleStorage.getRule(ruleName); rule = ruleStorage.getNewInstance(); RuleHelper.populateRule(ruleNum, nextSimulation.getStorage(), rule, propert); paramRules.add(rule); //standardisation // parametre pour Chalut jumeau et chalut simple // --------------------------------- Gear gear = gearDAO.findByName("Chalut jumeau"); System.out.println("Avant changement standardisation Chalut jumeau" + gear.getStandardisationFactor()); double newval = gear.getStandardisationFactor()*std; gear.setStandardisationFactor(newval); System.out.println("Apres changement standardisation Chalut jumeau" + gear.getStandardisationFactor()); gear = gearDAO.findByName("chalut simple"); System.out.println("Avant changement standardisation chalut simple" + gear.getStandardisationFactor()); newval = gear.getStandardisationFactor()*std; gear.setStandardisationFactor(newval); System.out.println("Apres changement standardisation chalut simple" + gear.getStandardisationFactor()); //mortalite //equation // --------------------------------- String eq_death_rate = pop.getNaturalDeathRate().getContent(); System.out.println("Avant changement mortalite : oldEq" + eq_death_rate); eq_death_rate = eq_death_rate.replaceFirst(".*\n", "double Ktemp=context.getValueAndCompute(\"nephrops.naturalDeathRate.Ktemp\","+mor+");\n"); pop.getNaturalDeathRate().setContent(eq_death_rate); System.out.println("EqqNew mortalite avant BD : " +eq_death_rate); System.out.println("EqqNew mortalite dans BD: "+ pop.getNaturalDeathRate().getContent()); //fecondite //equation // --------------------------------- String eq_reprod_rate = pop.getReproductionRateEquation().getContent(); System.out.println("Avant changement fecondite : oldEq" + eq_reprod_rate); eq_reprod_rate = eq_reprod_rate.replaceFirst(".*\n", "double Ktemp=context.getValueAndCompute(\"nephrops.reproductionRate.Ktemp\","+fec+");\n"); pop.getReproductionRateEquation().setContent(eq_reprod_rate); System.out.println("EqqNew fecondite avant BD : "+eq_reprod_rate); System.out.println("EqqNew fecondite dans BD : "+ pop.getReproductionRateEquation().getContent()); db.commitTransaction(); db.closeContext(); System.out.println("etape 4 : 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; } }