package rules; import java.util.*; import java.io.*; import java.util.regex.*; import org.nuiton.math.matrix.*; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.annotations.Doc; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.types.*; import scripts.SiMatrix; import static scripts.PTAtoolbox.expandEnvirVar; /** * version EMU1 de la règle Effort_2015_2017_mean_GDL * * Auteure: LEFORESTIER Sophie, 2018 * Dernière modif: PHAN Tuan Anh, 2022: * - adapter pour EMU1 2018-2020 * - ajouter la fonctionnalité qui permet de d’utiliser les variables d’environnement, * (il faut être accompagné du script PTAtoolbox) * - dapation macco : 2015-2018, forcage pour toutes les strategies, * changement inactivite, effort_prop, nb vessels et prop_vessels, * lecture d'un fichier par annee */ public class ForcageEffortMacco_2015-2018mean2010-2020 extends AbstractRule { @Doc("README") public String param_README = String.join(" ►►► ", "auteure: LEFORESTIER Sophie, 2018", "dernière modif: PHAN Tuan Anh, 2022", "adaptation macco : SM 2023 " ); // public static String param_cheminFichierAverage = "${PBS_O_WORKDIR}/forcage/" ; public static String param_cheminFichierAverage = "C:/Users/smahevas/C-ISISFish/AppliBobMerluSoleLangoustinePlus4esp/Fichiers_Rules/forcage/" ; public static String param_cheminFichierInactivity = "inactivite/years/" public static String param_cheminFichierEffortProp = "str_prop_met/years/" //public static String param_InactivityFileName = "Total.Inactivite.effort.csv"; //public static String param_nbVessFileName = "Total.NbBateau.effort.csv"; public static String param_nbVessFileName = "nb_vessels/years/"; public static String param_propNbVessFileName = "nb_prop_vessels/years"; //public static String param_EffortPropFileName = "Total.Proportion.strategy.csv"; @Doc(value = "simulation starting year compared to estimation starting year (0: 2015; 1: 2016; 2: 2017; 3: 2018; 4: average 2010-20)") public int param_startDate = 0; public int param_endDate = 0; private int param_year = 2015 + param_startDate; //annee de debut private List allStrategies; private MatrixND matInactivity; //anneexstr private MatrixNDmat matEffort; //anneexstrxmetierxmois private MatrixNDmat matNbVess; //anneexsov private MatrixNDmat matPropVess; //anneexstr //Pattern notTrawlerPattern = Pattern.compile("^(GNS|LLS)"); Pattern notForeignPattern = Pattern.compile("^(ES|UK|BE)"); private boolean first = true; // ne boucler que sur un seul métier dans la préaction : public String[] necessaryResult = {}; // must be initialized, error if not public String[] getNecessaryResult() { return this.necessaryResult; } /** Permet d’afficher à l’utilisateur une aide sur la règle */ public String getDescription() { return "Forcer chaque année et mois les % efforts et inactivité observés entre 2015 et 2018 puis leur moyenne"; } /** * Appelée au démarrage de la simulation, cette méthode permet d’initialiser des valeurs. * * @param context la simulation pour lequel on utilise cette règle */ public void init(SimulationContext context) throws Exception { // récupération des set of vessels, stratégies SiMatrix siMatrix = SiMatrix.getSiMatrix(context); TimeStep date = new TimeStep(0); // récupération des stratégies allStrategies = siMatrix.getStrategies(date); //New : recuperation de tous les set of vessels allSetOfVessels = siMatrix.getSofVessels(date); // a verifier param_cheminFichierAverage = expandEnvirVar.replace(param_cheminFichierAverage); // je ne sais pas à quoi ca sert String param_StringYear; //chargement dans l'init des matrices pour toutes les annnees // Boucle sur les annees (year) de startDate a endDate pour remplir les matrices - // Import des matrices 2015,2016,2017,2018,moyenne2010-2020 param_year = param_year + year; param_StringYear = param_year + ""; // transformation int en string pour nom de fichier // boucle sur les SOV File nbVessSov = new File(param_cheminFichierAverage + param_nbVessSovFileName + param_StringYear + SOV + ".txt""); // NEW : nb vessels de set of vessels :fichier avec semantic des setof vessels et annee de 0 =2015 à ... matNbVessSov.set(year) = MatrixFactory.getInstance().create(nbVessSov); // A CODER System.out.println("matrice nb navires Set of Vessels " + matNbVessSov); //fin de boucle sur SOV // boucle sur les str File Inactivity = new File(param_cheminFichierAverage + param_InactivityFileName + param_StringYear + str + ".txt""); File nbVess = new File(param_cheminFichierAverage + param_nbVessFileName + param_StringYear + str + ".txt"")); //double nbv = matNbVess.getValue(str, ts.getYear()); donc fichier avec semantic des stratégies et annee de 0 =2015 à ... File Effort = new File(param_cheminFichierAverage + param_EffortPropFileName + param_StringYear + str + ".txt"")); // double newProp = matEffort.getValue(str, strMetier, ts); ; donc fichier avec semantic des stratégies, des metiers et annee de 0 =2015 à ... Y0matInactivity.set(year) = MatrixFactory.getInstance().create(Inactivity); // A CODER System.out.println("matrice inactivite " + matInactivity); matEffort.set(year) = MatrixFactory.getInstance().create(Effort); // A CODER System.out.println("matrice effort " + matEffort); matNbVessSov.set(year) = MatrixFactory.getInstance().create(nbVessSov); // A CODER System.out.println("matrice nb navires Set of Vessels " + matNbVessSov); // fin de boucle sur str } /** * La condition qui doit être vraie pour faire les actions. * * @param context la simulation pour laquelle on utilise cette règle * @param step le pas de temps courant * @param metier le métier concerné * @return vrai si on souhaite que les actions soit faites */ public boolean condition(SimulationContext context, TimeStep step, Metier metier) { return true; } /** Si la condition est vraie alors cette action est exécutée avant le pas de temps de la simulation. */ public void preAction(SimulationContext context, TimeStep step, Metier metier) { if (first) { System.out.println("Oui, preaction : "); // If startDate != 0 int start = param_startDate * 12; TimeStep ts = step.add(start); //if (step.getStep() + 12 > 47) ts = new TimeStep(ts.getMonth().getMonthNumber() + 36); if (step.getStep() + 12 > 59) ts = new TimeStep(ts.getMonth().getMonthNumber() + 48); // une annee de plus System.out.println("Timestep : " + ts); //Boucle sur les Set of Vessels : a verifier for (SetOfVessels sovIndex : allSetOfVessels){ String sovName=sovIndex.getName(); System.out.println("Set of Vessels : "+sovName); // interdit de faire des set sur les stratégies de la sémantique de la matrice, il faut récupérer les stratégies de la date courante ?? pour sov SetOfVessels sov=(SetOfVessels)context.getDB().findByTopiaId(sovIndex.getTopiaId()); // Change vessel number int nbvSov=matNbVess.getValue(sov,ts.getYear()); sov.setgetNumberOfVessels(nbvSov); System.out.println("Nb bateaux : "+nbvSov); } // Boucle sur les stratégies for (Strategy strIndex : allStrategies) { String strName = strIndex.getName(); System.out.println("Strategie : " + strName); // interdit de faire des set sur les stratégies de la sémantique de la matrice, il faut récupérer les stratégies de la date courante Strategy str = (Strategy) context.getDB().findByTopiaId(strIndex.getTopiaId()); // Change vessel number double nbv = matNbVess.getValue(str, ts.getYear()); str.setProportionSetOfVessels(nbv); System.out.println("Nb bateaux : " + nbv); //Matcher notTrawlerMatch = notTrawlerPattern.matcher(strName); // if (notTrawlerMatch.find()) { // System.out.println(" not trawler, don’t change proportion metier"); // } else { // Change Effort proportion StrategyMonthInfo smi = str.getStrategyMonthInfo(ts.getMonth()); Collection strMet = str.getSetOfVessels().getPossibleMetiers() ; for (EffortDescription ed : strMet) { Metier strMetier = ed.getPossibleMetiers(); double newProp = matEffort.getValue(str, strMetier, ts); // a changer pour mettre l'annee dans le nom du fichier smi.setProportionMetier(strMetier,newProp); System.out.println("proportion : " + strMetier + " " + newProp); System.out.println(smi.getProportionMetier(strMetier)); // } } // Change Inactivity équation double newInactivity = matInactivity.getValue(str, ts); //double newInactivity = 20; System.out.println("newInactivity :" + newInactivity); Equation eqInac = str.getInactivityEquation(); eqInac.setContent("return " + newInactivity + " ;"); str.setInactivityEquationUsed(true) ; System.out.println("Inactivity :" + eqInac.getContent()); } first = false; } } /** Si la condition est vraie alors cette action est exécutée après le pas de temps de la simulation. */ public void postAction(SimulationContext context, TimeStep step, Metier metier) { first = true; } }