Bonjour, Pour l instant le script de calibration existant utilise la methode du simplexe a pas variable et permet de calibrer 2 parametres sur les debarquements observes avec pour fonction objectif la somme (sur les classes) des carres des ecarts entre debarquements observes et simules a chaque pas de temps. (plan d analyse CalibrationAnchois3 en pj a adapter en fonction de ton nb de classe etc) : a chaque pas de temps la valeur des 2 parametres est recalcule pour minimiser la fonction objectif jusqu a passer sous un seuil que tu auras choisi. Ca converge assez vite. Autre possibilité si tu veux calibrer plus de 2 variables sans creer un nouveau script, il est a mon avis possible de le faire "a la main" en tatonnant un peu : tu pourrais lister des valeurs a essayer dans l intervalle de definition de chaque variable et simuler toutes les combinaisons possibles de ces valeurs pour chaque variable (plan complet de simulation) pour trouver la combinaison qui minimise la fonction objectif quand tu as trouvé, tu peux affiner en relancant une serie de simu sur un intervalle plus petit etc le plan d analyse pour lancer une liste de simulations en specifiant la valeur des variables a chaque simu existe deja mais il faudra rajouter le bout de code qui calcule la valeur de la fonction objectif (ou la calculer a la main) problemeSS de cette methode : tu n est pas sur d avoir un minimum global et le nombre de simu augmente tres vite avec le nb de variables et de valeurs... mais bon voici le code (SAAnchois) existant si tu decides de faire comme ca je peux t expliquer comment le modifier voili voilou ce qu a mon avis on peut faire avec les scripts existants, mais si t as d autres idees je peux essayer de te donner un coup de main. desolee pour le délai de reponse et pour la tartine Sigrid Nicolas Pascal a écrit :
Bonjour de Barcelone à Dominique, Mario et Chririne que je connais un peu plus et sinon bonjour aux autres lecteurs,
L’Isis 3.0.19 marche bien pour le moment pour 1 des 2 especes parametrisées (Solea solea) avec les flottes artisanales et j’espère que le Sar ne devrait pas trop poser de problème. Je cherche à calibrer ma capturabilite/M/effectifs initiaux sur mes données de captures réelles et j’aimerais pouvoir utiliser les scripts pour cela. Pour le moment, je désire me concentrer sur la partie paramètre plus que sur le language ECMAScipt et si quelqu’un pouvait m’envoyer les scripts pour simuler les valeurs de M et de capturabilités (je les ai comme constantes par age), ce me serait bien utile. (J’ai vu dans le fichier d’aide une description preliminaire de ce script, mais j’aboutis toujours à un plantage).
Merci
Nicolas Pascal
------------------------------------------------------------------------ SERVICIOS DE CORREO ELECTRONICO DE GRUPO LAR ------------------------------------------------------------------------ ADVERTENCIA LEGAL
Le informamos, como destinatario de este mensaje, que el correo electrónico y las comunicaciones por medio de Internet no permiten asegurar ni garantizar la confidencialidad de los mensajes transmitidos, así como tampoco su integridad o su correcta recepción, por lo que el emisor no asume responsabilidad alguna por tales circunstancias.
Si no consintiese en la utilización del correo electrónico o de las comunicaciones vía Internet le rogamos nos lo comunique y ponga en nuestro conocimiento de manera inmediata.
Este mensaje va dirigido, de manera exclusiva, a su destinatario y contiene información confidencial y sujeta al secreto profesional, cuya divulgación no está permitida por la ley. En caso de haber recibido este mensaje por error, le rogamos que, de forma inmediata, nos lo comunique mediante correo electrónico remitido a nuestra atención o a través del teléfono (+ 34) 91 529 99 15 y proceda a su eliminación, así como a la de cualquier documento adjunto al mismo. Asimismo, le comunicamos que la distribución, copia o utilización de este mensaje, o de cualquier documento adjunto al mismo, cualquiera que fuera su finalidad, están prohibidas por la ley. ------------------------------------------------------------------------ PRIVILEGED AND CONFIDENTIAL
We hereby inform you, as addressee of this message, that e-mail and Internet do not guarantee the confidentiality, nor the completeness or proper reception of the messages sent and, thus, the sender does not assume any liability for those circumstances.
Should you not agree to the use of e-mail or to communications via Internet, you are kindly requested to notify us immediately.
This message is intended exclusively for the person to whom it is addressed and contains privileged and confidential information protected from disclosure by law. If you are not the addressee indicated in this message, you should immediately delete it and any attachments and notify the sender by reply e-mail or by phone (+ 34) 91 529 99 15. In such case, you are hereby notified that any dissemination, distribution, copying or use of this message or any attachments, for any purpose, is strictly prohibited by law. ------------------------------------------------------------------------
*P* Respeta el medio ambiente. Antes de imprimir este e-mail, piensa si realmente es necesario imprimirlo. Please, consider your environmental responsibility: before printing this e-mail, ask yourself whether you need a hard copy!
------------------------------------------------------------------------
_______________________________________________ Isis-fish-user mailing list Isis-fish-user@lists.labs.libre-entreprise.org http://lists.labs.libre-entreprise.org/mailman/listinfo/isis-fish-user
-- Sigrid LEHUTA stagiaire Master 2 Ecologie et Modèles pour l'Halieutique IFREMer, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 package analyseplans; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import java.io.*; import java.util.*; import org.codelutin.math.matrix.*; import org.codelutin.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; 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.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * CalibrationAnchois.java * * Created: 8 mars 2007 * * @author <> * @version $Revision: 1.1 $ * * Last update: $Date: 2007/03/09 15:27:21 $ * by : $Author: bpoussin $ */ public class CalibrationAnchois3 implements AnalysePlan { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(CalibrationAnchois3.class); enum State {STATE_INIT, STATE_0, STATE_1, STATE_2, STATE_3, STATE_4}; //parametres de la simu 3 points initiaux d un simplex d ordre 2 public Population param_Population = null; public String param_M1 = "2.42e-5;2.11e-6";// devient un parametre du plan d analyse public String param_M2 = "2.34e-5;2.59e-6";// devient un parametre du plan d analyse public String param_M3 = "2.59e-5;2.41e-6";// devient un parametre du plan d analyse public String param_pas = "1e-5";// devient un parametre du plan d analyse public String param_nomfichier_debarquements = "";//nom + chemin du fichier contenant les debarquements observes par groupe pour la derniere annee protected File debarquementsObserves; protected MatrixND matrixDebarquement; protected State state = State.STATE_INIT; protected Experiences experiences = new Experiences(); public String [] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_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 { return _("Simplexe_methode2 avec simu inutiles evitées"); } /** * Appele au demarrage de la simulation, cette methode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(AnalysePlanContext context) throws Exception { if (param_nomfichier_debarquements==null || "".equals(param_nomfichier_debarquements)){ debarquementsObserves = FileUtil.getFile(".*.csv", "fichier csv séparateur ';'"); } else { debarquementsObserves = new File(param_nomfichier_debarquements); } int nbYear = context.getParam().getNumberOfYear(); TopiaContext db = context.getParam().getRegion().getStorage().beginTransaction(); Population pop = (Population)db.findByTopiaId(param_Population.getTopiaId()); int nbGroup = 4 ;//pop.sizePopulationGroup(); int nbTrim = nbYear * 4; int [] dimMatrix = {nbTrim,nbGroup}; matrixDebarquement = MatrixFactory.getInstance().create(dimMatrix); //matrixDebarquement = MatrixFactory.getInstance().create(new int[]{nbGroup}); // List<PopulationGroup> groups = pop.getPopulationGroup(); // matrixDebarquement = MatrixFactory.getInstance().create(new List[]{groups}); matrixDebarquement.importCSV(new FileReader(debarquementsObserves),new int []{0,0}); db.closeContext(); } /** * 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 */ double g1; double g2; double worst1; double worst2; public boolean beforeSimulation(AnalysePlanContext context, SimulationStorage nextSimulation) throws Exception { boolean doNext = true; boolean doBoucle = true; log.info("before simulation"); int number = context.getNumber(); if (number <3) { log.info("number<3"); String [] M1 = param_M1.split(";"); String [] M2 = param_M2.split(";"); String [] M3 = param_M3.split(";"); double [] q1 = StringUtil.toArrayDouble(M1[0], M2[0], M3[0]); double [] q2 = StringUtil.toArrayDouble(M1[1], M2[1], M3[1]); experiences.getExperience(number).q1 = q1[number]; experiences.getExperience(number).q2 = q2[number]; changeDB(experiences.getExperience(number), nextSimulation); } else { double q1 = 1000; double q2 = 1000; double lastCritere = experiences.getExperience(number-1).criteria; while (doBoucle){ doBoucle = false; if (state == State.STATE_INIT) { doBoucle = false ; log.info("state init"); //ordonne les 3 premieres experiences selon leur critere Collections.sort(experiences.current); //log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + experiences.current.get(2).criteria ); log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + experiences.current.get(2).criteria ); log.info("SIMPLEXE : Best q1 = " + experiences.current.get(0).q1 + " q2 = " + experiences.current.get(0).q2); log.info("SIMPLEXE : NextBest q1 = " + experiences.current.get(1).q1 + " q2 = " + experiences.current.get(1).q2); log.info("SIMPLEXE : Worst q1 = " + experiences.current.get(2).q1 + " q2 = " + experiences.current.get(2).q2); //Calcul et evaluation de R double g1 = (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0; double g2 = (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0; double worst1 = experiences.current.get(2).q1; double worst2 = experiences.current.get(2).q2; state = State.STATE_0; q1 = 2 * g1 - worst1; q2 = 2 * g2 - worst2; log.info ("R : q1 = " + q1 + "; q2 = " + q2 ); } else if (state == State.STATE_0) { doBoucle = false; log.info("state 0"); // on fait la 5eme avec des q qui dependent de la 4eme dans le dernier cas //log.info("g1 = " + g1 + " " + "g2 = " + g2); //log.info("worst1 = " + worst1 + " " + "worst2 = " + worst2); if (lastCritere > experiences.current.get(2).criteria) { log.info("State 0 : R : lastCtritere > current2 : R pire de W"); state = State.STATE_1; //calcul de Cw q1 = ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - ( ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - experiences.current.get(2).q1 ) / 2.0; q2 = ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - ( ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - experiences.current.get(2).q2 ) / 2.0; log.info("Cw : Q1 = " + q1 + "Q2 = " + q2); } else if (lastCritere > experiences.current.get(1).criteria) { log.info("State 0 :R : lastCritere > current 1 : R meilleur que W et moins bon que N"); state = State.STATE_2; // calcul de Cr q1 = ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) + ( ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - experiences.current.get(2).q1 ) / 2.0; q2 = ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) + ( ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - experiences.current.get(2).q2 ) / 2.0; log.info("Cr : Q1 = " + q1 + "Q2 = " + q2); } else if (lastCritere > experiences.current.get(0).criteria) { log.info("State 0 :R : lastCritere > current0 : R meilleur que N et moins bon que B"); state = State.STATE_INIT; experiences.current.remove(2);//remove(3)avant doBoucle = true; log.info("remove W, simplex BNR"); } else { // dernier cas possible: if (lastCritere < experiences.current.get(0).critere) { log.info("State 0 :R : lastCritere < current 0 : R meilleur que B, calcul de E"); state = State.STATE_4; q1 = experiences.getExperience(number-1).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; q2 = experiences.getExperience(number-1).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; //q1 = experiences.current.get(3).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; //q2 = experiences.current.get(3).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; log.info("E : q1 = " + q1 + "q2 = " + q2); } } else if (state == State.STATE_1) { log.info("state 1, simplex BNCw"); experiences.current.remove(3); experiences.current.remove(2); state = State.STATE_INIT; doBoucle = true; } else if (state == State.STATE_2) { log.info("state 2, simplex BNCr"); experiences.current.remove(3); experiences.current.remove(2); state = State.STATE_INIT; doBoucle = true; } else if (state == State.STATE_4) { log.info("state 4 :comparaison de E a B"); doBoucle = true; if (lastCritere < experiences.current.get(0).criteria) { log.info("E meilleur que B, remove 2 et 3 : simplex BNE"); experiences.current.remove(3); experiences.current.remove(2); } else { log.info("E moins bon que B, remove 2 et 4, simplex BNR"); experiences.current.remove(4); experiences.current.remove(2); } state = State.STATE_INIT; } }//fin du while //on remplit la table experiences experiences.getExperience(number).q1 = q1; experiences.getExperience(number).q2 = q2; log.info("on change Q dans la DB avec : q1 = " + q1 + " " + "q2 = " + q2); // on change la valeur de q dans la DB changeDB(experiences.getExperience(number), nextSimulation); }// fin du else (number > 3) return doNext; }// fin du before simulation /** * Call after each simulation, compute criteria for last 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 { boolean doNext = true; log.info("after simulation"); int number = context.getNumber(); ResultStorage result = lastSimulation.getResultStorage(); // Pour sommer sur certaines classes les resultats : MatrixND L2 = result.getMatrix(param_Population, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET); log.info("dim de L2" + " " + Arrays.toString(L2.getDim())); MatrixND L = L2.getSubMatrix(1,0,15).copy(); //on ne prend que les 15 premieres strategies (pas live bait) //log.info("sous matrice extraite"); L = L.sumOverDim(1);// sum sur les strategies L = L.sumOverDim(2);// sum sur les metiers L = L.sumOverDim(4);// sum sur les zones log.info("sommes sur les strategies, metiers et zones faites"); // on crée la matrice de captures en age int [] dims = new int[]{L.getDim(0), L.getDim(1), L.getDim(2), 4, L.getDim(4)}; // matrice a 5 dimension MatrixND tmp = MatrixFactory.getInstance().create(L.getName(), dims); int [] origin = new int[5]; // origin est un compteur : on initialise l'origine a [0,0,0,0,0] log.info("Début de la boucle while"); while (origin[0] < dims[0]-1){ //on boucle sur les dates //remarque : origin commence à 0 tandis que dim[0] commence a 1 Date date = new Date(origin[0]); // transforme le pas de temps en mois-année MatrixND age = L.getSubMatrix(0,origin[0],1).copy(); //recupere la la ligne qui correspond a la date // on somme les classes de taille en fonction de la periode de l année if (date.getMonth().before(Month.JULY)) { age = age.sumOverDim(3,0,5); age = age.sumOverDim(3,1,10); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,2); }else if (date.getMonth().equals(Month.JULY) || date.getMonth().equals(Month.AUGUST)) { //origin[0] >= 6+i*12 && origin[0]<= 7+i*12 ){ age = age.sumOverDim(3,0,5); age = age.sumOverDim(3,1,11); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,1); } else { // apres aout //(origin[0] >= 8+i*12 && origin[0]<= 11+i*12 ) age = age.sumOverDim(3,0,15); age = age.sumOverDim(3,1,1); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,1); }//fin du else tmp.paste (origin, age); // colle les nouvelles captures pour la date dans tmp origin[0]++; }//fin du while log.info("fin du while"); L = tmp.sumOverDim(0,3); // captures par trimestre L = L.reduce(); // supprime les dimensions de taille 0 ///////////////////Calcul du critere////////////////// log.info("calcul du critere"); log.info("dim de L" + " " + Arrays.toString(L.getDim())); log.info("dim de obs" + " " + Arrays.toString(matrixDebarquement.getDim())); double crit = 0; for ( MatrixIterator g = L.iterator(); g.hasNext();){ g.next(); //boucle sur les trimestres et les classes d age int [] dim = g.getCoordinates(); double obs = matrixDebarquement.getValue(dim); double simules = g.getValue(); crit += Math.pow(obs-simules, 2); // crit = crit + (obs-simules)^2 }// fin du for log.info("critere " + number + " = " + crit ); //ajoute le critere dans la table experiences experiences.getExperience(number).criteria = crit; return doNext; }// fin du after simulation /** * Modify nextSimulation database with q1 and q2 in exp. * @param exp * @param nextSimulation * @throws Exception */ protected void changeDB(Experience exp, SimulationStorage nextSimulation) throws Exception { //methode appelee dans before simualtion TopiaContext db = nextSimulation.getStorage().beginTransaction();//ouvrir un context pour modifier les donnees Population pop = (Population)db.findByTopiaId(param_Population.getTopiaId()); //reccupere la pop ciblee MatrixND c = pop.getCapturability(); // reccupere la matrice de capturabilité //log.info("Pour cette simulation : q1 = " + exp.q1 + ";" + "q2 = " + exp.q2 ); for (MatrixIterator i = c.iterator(); i.hasNext();){ i.next(); Object [] sem = i.getSemanticsCoordinates(); PopulationGroup group = (PopulationGroup)sem[0]; PopulationSeasonInfo season = (PopulationSeasonInfo)sem[1]; if (group.getId() < 12){ i.setValue(exp.q2); }else { i.setValue(exp.q1); } }//fin du for db.commitTransaction(); // effectue la modification db.closeContext(); // ferme le context } public class Experiences { // cree la liste experiences ou sont stoqués q1,q2 et critere pour chaque simulation /** contains last simplex and potentialy 2 more simulation */ protected List<Experience> current = new ArrayList<Experience>(); /** contains all experience done */ protected List<Experience> history = new ArrayList<Experience>(); /** * return experience requested, if this experience doesn't exist * create it. * * @param i simulation number * @return experience with simulation number fixed if new experience * is returned */ public Experience getExperience(int i) { Experience result; if (i<history.size()) { result = history.get(i); } else { result = new Experience(); result.simNumber = i; history.add(i, result); current.add(result); } return result; }//fin de la definition de getExperience /** * @return the history */ public List<Experience> getHistory() { return this.history; } }// fin de la creation des listes experiences class Experience implements Comparable { public int simNumber; public double criteria; public double q1; public double q2; /** * Permit to order experience, first is experience with smallest criteria */ public int compareTo(Object arg0) { Experience other = (Experience)arg0; int result = Double.compare(this.criteria, other.criteria); return result; } } } package analyseplans; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.math.matrix.*; import org.codelutin.util.*; import org.codelutin.topia.*; import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; 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; /* * SAAnchois.java * * Created: 6 juin 2007 * * @author bpoussin <bpoussin@labs.libre-entreprise.org> * @version $Revision: 1.27 $ * * Last update: $Date: 2007/05/24 09:29:18 $ * by : $Author: bpoussin $ */ /** * Le principe est d'avoir dans un repertoire un fichier matrix.txt et un * fichier par parametre. Si le parametre s'appelle tac, le fichier sera tac.txt * * Les fichiers pour les parametres de type double sont de la forme * <pre> * -1=0.8 * 1=1.2 * </pre> * * Les fichiers pour les parametres de type String sont de la forme * <pre> * -1=L'equation ecrite sur une seul ligne * 1=une autre equation toujours sur une ligne * </pre> * * Les fichiers pour les parametres de type Rule sont de la forme * <pre> -1=Cantonnement rule.-1.parameter.gear=fr.ifremer.isisfish.entities.Gear\#11690286646709\#0.5814158398678262 rule.-1.parameter.zone=fr.ifremer.isisfish.entities.Zone\#11690286645767\#0.37798185123822536 rule.-1.parameter.beginDate=0 rule.-1.parameter.endDate=119 rule.-1.parameter.enginSelectivite=false rule.-1.parameter.beginMonth=8 rule.-1.parameter.endMonth=11 1=Cantonnement rule.1.parameter.gear=fr.ifremer.isisfish.entities.Gear\#11690286646709\#0.5814158398678262 rule.1.parameter.zone=fr.ifremer.isisfish.entities.Zone\#11690286645767\#0.37798185123822536 rule.1.parameter.beginDate=0 rule.1.parameter.endDate=119 rule.1.parameter.enginSelectivite=false rule.1.parameter.beginMonth=3 rule.1.parameter.endMonth=11 * </pre> */ public class SAAnchois implements AnalysePlan { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(SAAnchois.class); static private final String MATRIX = "matrix"; static private final String VBGF = "growth"; static private final String FECONDITY = "fecondity"; static private final String SPAWNINGF = "spawningFract"; static private final String MORTALITYA = "Madult"; static private final String MORTALITYJ = "Mjuv"; static private final String CATCHABILITY = "capturabilite"; static private final String FSTD = "facteurStd"; static private final String SELECTIVITY = "selectivity"; static private final String TARGET = "targetFact"; static private final String EFFORT = "effort"; static private final String TAC = "tac"; static private final String APM = "apm"; // FIXME en fait ca ne sert a rien de mettre 13 en parametre, le plan // est trop specifique pour pouvoir jouer sur le nombre de parametre public int param_parameterNumber = 12; public int param_first = 0; public int param_simulationNumber = 256; public String param_directory = ""; 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 FFD de resolution V pour 12 parametres"); } /** * 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); 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[]{VBGF,FECONDITY,SPAWNINGF,MORTALITYA,MORTALITYJ,CATCHABILITY,FSTD, SELECTIVITY, TARGET,EFFORT,TAC, APM})); log.info("Matrix: " + matrix); // ajout des regles qui seront utilisé dans les parametres context.getParam().addExtraRules("Cantonnement", "TACpoids"); } /** * @param name le nom de l'element a recuperer * @param simulation le numero de la simulation * @return */ 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); double result = Double.parseDouble(prop.getProperty(""+mod)); 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(";")); return result; } /** * @param name le nom de l'element a recuperer * @param simulation le numero de la simulation * @return */ private String getString(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); String result = prop.getProperty(""+mod); return result; } private Rule getRule(RegionStorage regionStorage, 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); String ruleName = prop.getProperty(""+mod); 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(); if (simNum < param_simulationNumber) { double [] croissance = getList (VBGF , simNum); double reproductionRate = getDouble (FECONDITY, simNum); double spawningFraction = getDouble (SPAWNINGF, simNum); String adultMortality = getString (MORTALITYA, simNum); String juvMortality = getString (MORTALITYJ, simNum); double catchability = getDouble (CATCHABILITY, simNum); double standardisation = getDouble (FSTD, simNum); String selectivityEquation = getString(SELECTIVITY, simNum); double targetFactor = getDouble (TARGET, simNum); double effort = getDouble (EFFORT, simNum); Rule tac = getRule(context.getParam().getRegion(), TAC, simNum); Rule apm = getRule(context.getParam().getRegion(), APM, simNum); log.info("Fecondites ("+simNum+")= " + reproductionRate); log.info("Selectivites ("+simNum+")= " + selectivityEquation); log.info("spawningFraction ("+simNum+")= " + spawningFraction); log.info("catchability ("+simNum+")= " + catchability); log.info("Fstd ("+simNum+")= " + standardisation); log.info("Ftarget("+simNum+")= " + targetFactor); log.info("effort ("+simNum+")= " + effort); log.info("croissance ("+simNum+")= " + croissance[0] + " ; " + croissance[6]); nextSimulation.getInformation().addInformation("Fecondites ("+context.getNumber()+")= " + reproductionRate); nextSimulation.getInformation().addInformation("Selectivites ("+context.getNumber()+")= " + selectivityEquation); // 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é List<Rule> paramRules = nextSimulation.getParameter().getRules(); paramRules.remove(context.getValue("lastTac")); paramRules.remove(context.getValue("lastAPM")); // on retient les regles que l'on va ajouter context.setValue("lastTac", tac); context.setValue("lastAPM", apm); // on ajoute les regles paramRules.add(tac); paramRules.add(apm); TopiaContext tx = nextSimulation.getStorage().beginTransaction(); PopulationDAO popDAO = IsisFishDAOHelper.getPopulationDAO(tx); // il n'y a qu'une population, et elle nous interesse Population pop = popDAO.findAll().get(1); //List <Population> pop = popDAO.findAll(); //Population pop = popDAO.findByName("Anchois_long"); List<PopulationGroup> groups = pop.getPopulationGroup(); log.info("population nouv" + pop.getName()); //modif fecondité et borne des classes de taille for (PopulationGroup group : groups) { group.setReproductionRate(group.getReproductionRate() * reproductionRate); group.setMinLength(croissance[group.getId()]) ; log.info(" min length (group)"+ "(" + group +")"+ croissance[group.getId()]); group.setMaxLength(croissance[group.getId()+1]) ; log.info(" max length (group)"+ "(" + group +")"+ croissance[group.getId()+1]); } // modif frequence de ponte List<PopulationSeasonInfo> popSea = pop.getPopulationSeasonInfo(); for(PopulationSeasonInfo season : popSea){ MatrixND sfract = season.getReproductionDistribution(); for (MatrixIterator i = sfract.iterator(); i.hasNext();){ i.next(); i.setValue(i.getValue()*spawningFraction); } } // modif la capturabilité MatrixND c = pop.getCapturability(); for (MatrixIterator i = c.iterator(); i.hasNext();){ i.next(); i.setValue(i.getValue()* catchability); } // modif selectivité et facteur de standardisation GearDAO gearDAO = IsisFishDAOHelper.getGearDAO(tx); List<Gear> gears = gearDAO.findAll(); for (Gear gear : gears) { if (!"senne appat vivant".equals(gear.getName())){ Selectivity selectivity = gear.getPopulationSelectivity(pop); Equation eq = selectivity.getEquation(); eq.setContent(selectivityEquation); gear.setStandardisationFactor(gear.getStandardisationFactor()*standardisation); } } // modif l equation de mortalité String [] mortality = new String[]{ juvMortality + adultMortality}; log.info("eq mortalité ("+simNum+")= " + mortality[0]); Equation eqm = pop.getNaturalDeathRate(); log.info("a ete chercher l eq de mortalité"); String mort = (String) mortality[0]; log.info("mort = " + mort); eqm.setContent(mort); log.info("equation remplie"); // modif le coeff de ciblage MetierDAO metierDAO = IsisFishDAOHelper.getMetierDAO(tx); List<Metier> metiers = metierDAO.findAll(); for(Metier metier : metiers){ if ( !"live_bait".equals(metier.getName())){ List<MetierSeasonInfo> seasons = metier.getMetierSeasonInfo(); for(MetierSeasonInfo season : seasons){ Equation target = season.getSpeciesTargetSpecies(pop.getSpecies()).getTargetFactorEquation(); /*String [] eqt2 = eqt.getContent().split("return "); String eqt3 = eqt2[1].split(";"); Double ValActuelle = StringUtil.ArrayDouble(eq3); //ou alors avec substring mais ca parait risqué... season.getSpeciesTargetSpecies(pop.getSpecies()).setTargetFactorEquation("return "+ valActuelle[0]*targetFactor + ";"); */ String coeff=target.getContent(); coeff.replace("double mult=1;","double mult="+targetFactor+";"); target.setContent(coeff); } } } // modif le nb de jours d inactivité StrategyDAO strategyDAO = IsisFishDAOHelper.getStrategyDAO(tx) ; List<Strategy> strategies = strategyDAO.findAll(); for (Strategy strategy : strategies) { List <StrategyMonthInfo> monthInfos = strategy.getStrategyMonthInfo(); for (StrategyMonthInfo month : monthInfos) { double days = month.getMinInactivityDays()*effort+0.5; if (days < 0) days = 0; int Days = (int) days ; month.setMinInactivityDays(Days); } } 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; } }