re-Salut ! J ai eu un probleme d interaction entre regles de gestion Dans l interface de lancement de simu quand j ajoute d abord la regle LiveBait puis la regle RecruAnchois tout se passe bien en apparence mais si je mets RecruAnchois puis LiveBait, les resultats sont differents : les valeurs des effectifs de la classe 0 sont bien modifiées par recru mais apparement remodifies par LiveBait alors que LiveBait ne concerne ni les age 0 ni les zones et pas de temps ou les modifs sont observees ! On ne parvient pas à comprendre pourquoi Peux tu jeter un oeil ? merci Sigrid -- 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 rules; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.math.matrix.*; import scripts.ResultName; import scripts.RuleUtil; import scripts.SiMatrix; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.PopulationMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import org.codelutin.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import scripts.ResultName; import java.io.*; import java.util.*; import org.codelutin.math.matrix.*; 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.SimulationParameter; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * TAC.java * * Created: 7 septembre 2006 * * @author anonymous <anonymous@labs.libre-entreprise.org> * @version $Revision: 1.3 $ * * Last update: $Date: 2007/01/24 18:25:34 $ * by : $Author: bpoussin $ */ /** * TAC peut-etre utilisé pour les différents TAC, en proportion des effectifs * et/ou avec survie ou non. * * <li>Pour utiliser le tac proportionnel, il faut mettre dans le parametre propTac * une valeur > 0, le TAC sera alors recalculé a chaque mois de janvier. * <li>Pour utiliser la survie il faut mettre dans le paramètre propSurvie * une valeur > 0, automatiquement les suvie seront ajouté aux effectifs * */ public class LiveBait extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(LiveBait.class); public Population param_pop = null; public Gear param_gear = null; public Date param_beginDate = new Date(0); public Date param_endDate = new Date(35); public Month param_beginMonth = Month.JUNE; public Month param_endMonth = Month.OCTOBER; /** TAC in tonne */ public double param_tacInTons = 428; protected String [] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET, }; /** * @return the necessaryResult */ public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ public String getDescription() { return _("limite les captures d'appat vivant a 4T par navire par mois soit 428t par mois."); } /** * 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(SimulationContext context) throws Exception { } /** * La condition qui doit etre vrai pour faire les actions * @param simulation La simulation pour lequel on utilise cette regle * @return vrai si on souhaite que les actions soit faites */ public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { boolean result = false; if(date.before(param_beginDate)) { result = false; } else if(date.after(param_endDate)) { result = false; } else if (param_gear != null && !param_gear.equals(metier.getGear())) { return false; } else if (date.getMonth().before(param_beginMonth)) { return false; } else if (date.getMonth().after(param_endMonth)) { return false; } else { result = true; //log.info("condition remplie"); } return result; } /** * Si la condition est vrai alors cette action est executée avant le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { ResultStorage result = context.getSimulationStorage().getResultStorage(); MatrixND L2 = result.getMatrix( date,param_pop, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET); //MatrixND L3 = L2.getSubMatrix(0,date,1).copy(); //reccupe captures du mois en cours //log.info("dim de L2: "+ Arrays.toString(L2.getDim())); MatrixND L = L2.getSubMatrix(1,metier,1).copy(); // reccupere captures poids du metier live bait L = L.sumOverDim(0);// sum sur les strategies //log.info("dim de L: "+ Arrays.toString(L.getDim())); L= L.reduce(); for(MatrixIterator i=L2.iterator(); i.next();){ //log.info("L2 est egale a " + i.getValue()); } MatrixND Ctot = L.copy(); Ctot = Ctot.sumOverDim(1); Ctot = Ctot.reduce(); log.info("dim de Ctot" + " " + Arrays.toString(Ctot.getDim())); Ctot = Ctot.sumOverDim(0); double CatchTot = Ctot.getValue(0); //log.info("dim de Ctot" + " " + Arrays.toString(Ctot.getDim())); //log.info("Valeur de CatchTot = " + CatchTot); L = L.reduce(); //log.info("dim de L: "+ Arrays.toString(L.getDim())); if (CatchTot > 428000){ //log.info("capture dépassée"); PopulationMonitor popMon = context.getPopulationMonitor(); MatrixND eff = popMon.getN(param_pop); //log.info("date" + date); //on réajoute les survivants aux effectifs for (MatrixIterator i=L.iterator(); i.next();){ Object [] sem = i.getSemanticsCoordinates(); PopulationGroup group = (PopulationGroup)sem[0]; Zone zone = (Zone) sem[1]; double prop = i.getValue()* (1-((param_tacInTons*1000)/CatchTot)) / group.getMeanWeight(); //log.info("valeur de prop =" + prop + "eff avant" + eff.getValue(sem[0],sem[1])); //log.info("Zone" + sem[1]); eff.setValue(sem[0],sem[1],eff.getValue(sem[0],sem[1]) + prop); //log.info("eff apres = " + eff.getValue(sem[0],sem[1]) ); } } } } package rules; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import java.io.Writer; import org.codelutin.math.matrix.*; import org.codelutin.topia.TopiaContext; import org.codelutin.util.StringUtil; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.PopulationMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * RecrutementAnchois.java * * Created: 20 avril 2007 * * @author <> * @version $Revision: 1.26 $ * * Last update: $Date: 2007/03/09 14:10:40 $ * by : $Author: bpoussin $ */ public class RecruAnchois extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(RecruAnchois.class); public double param_recrut2001 = 459e7; public double param_recrut2002 = 391e7; public double param_recrut2003 = 7367e6; public double [] recru = 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 la regle. * @return L'aide ou la description de la regle */ public String getDescription() throws Exception { // TODO return _("implémentation du recrutement chaque année en post-action"); } /** * 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(SimulationContext context) throws Exception { // remarque on pourrait aussi avoir un seul parametre de regle // par exemple param_recru_depuis_1998 = "0;0;0;0;0;0;0;0"; // on ferait alors // recru = StringUtil.toArrayDouble(param_recru_depuis_1998.split(";")); recru = new double[]{ param_recrut2001, param_recrut2002, param_recrut2003, }; } /** * La condition qui doit etre vrai pour faire les actions * @param simulation La simulation pour lequel on utilise cette regle * @return vrai si on souhaite que les actions soit faites */ public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { boolean result = false; if (date.getYear() <3){ if (date.getMonth().equals(Month.APRIL) ||date.getMonth().equals(Month.MAY) ||date.getMonth().equals(Month.JUNE) ||date.getMonth().equals(Month.JULY) ||date.getMonth().equals(Month.AUGUST)){ result = true; }} return result; } public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { TopiaContext db = context.getDB(); PopulationDAO popDao = IsisFishDAOHelper.getPopulationDAO(db); Population pop = popDao.findByName("Anchois_long"); PopulationGroup group0 = pop.getPopulationGroup().get(0); ZoneDAO zoneDao = IsisFishDAOHelper.getZoneDAO(db); Zone zone1 = zoneDao.findByName("SudGolfe"); int year = date.getYear(); MatrixND matN = context.getPopulationMonitor().getN(pop); double coeffR = 0; /*les coeff dependent du plus ou moins bon recrutement et de la mortalité ceux de 2001 à 2003 sont plutot faibles on prend donc les coefficients donnés une annee de simulation avec les effectifs de 2001 la mortalité utilisee est MregPareto*/ if (date.getMonth().equals(Month.APRIL)) { coeffR = 0.111; }else if (date.getMonth().equals(Month.MAY)) { coeffR = 0.272 ; }else if (date.getMonth().equals(Month.JUNE)) { coeffR = 0.317; }else if (date.getMonth().equals(Month.JULY)) { coeffR = 0.226 ; }else if (date.getMonth().equals(Month.AUGUST)) { coeffR = 0.0745; } double R = recru[year]*coeffR; matN.setValue(group0, zone1, R); } }