Bonjour, une amélioration au script de CantonnementSsReport qui provoquait un bug sur ma base ligne 214 : ajout d un test pour savoir si le metier en cours appartient a la strategie testée évite le bug : L'objet passé en argument n'a pas été retrouve ou la dimension donnée ne convient pas dans info.getProportionMetier(metier); Sigrid -- Sigrid LEHUTA ~ ><> ~ Ecologie et Modèles pour l'Halieutique IFREMer, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 package rules; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import scripts.SiMatrix; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.codelutin.math.matrix.*; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.MetierMonitor; 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; /** * CantonnementSsReport.java * * Created: * * @author * @version $Revision: * * Last update: $02/10/07 * by : $Author: bpoussin et sigrid *correction de la regle precedante (qui fermait entierement la zone mztier si elle chevauchait la zone de fermeture) * et modification tel que l effort de la zone fermee ne soit pas reporté */ /** * Remplace aussi Cantonnement Engin */ public class CantonnementSsReport extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(CantonnementSsReport.class); public Zone param_zone = null; public Gear param_gear = null; //public boolean param_enginSelective = true; public Date param_beginDate = new Date(0); public Date param_endDate = new Date(119); public Month param_beginMonth = Month.JANUARY; public Month param_endMonth = Month.JANUARY; public String [] necessaryResult = { // put here all necessary result for this rule // example: // ResultName.MATRIX_BIOMASS, // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, ResultName.MATRIX_NO_ACTIVITY, }; 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 { return _("Cantonnement: can be used to Cantonnement with gear if you put gear in parameter; by default effort in the closed area is not reported"); } /** * 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 { if(date.before(param_beginDate)) { return false; } else if(date.after(param_endDate)) { return false; } if (date.getMonth().before(param_beginMonth)) { return false; } else if (date.getMonth().after(param_endMonth)) { return false; } if (param_gear != null && !param_gear.equals(metier.getGear())) { return false; } List<Cell> cellMetiers = metier.getMetierSeasonInfo(date.getMonth()).getCells(); List<Cell> cells = param_zone.getCell(); cellMetiers.retainAll(cells); boolean result = !Collections.disjoint(cellMetiers, cells); if (result && log.isInfoEnabled()) { log.info("Cantonnement condition true"); } return result; /* writeln("condition fermeture zone"); var mois = p.date.getMois().getNumMois(); writeln("mois:"+mois); if(p.moisDeb>mois || p.moisFin<mois) return false; writeln("on est dans l'espace des mois possible"); //on est dans l'espace des mois possible if(p.date.before(p.dateDeb)) return false; if(p.date.after(p.dateFin)) return false; var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille(); // s'il y a une intersection avec la zone ferme, alors la regle s'applique mailleMetier.retainAll(p.mailles); var result = mailleMetier.size() != 0; if(result) writeln("===== Fermeture Zone s'applique ======"); 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 { log.info("PréAction for métier: " + metier); MetierMonitor metierMon = context.getMetierMonitor(); MetierSeasonInfo infoMetier = metier.getMetierSeasonInfo(date.getMonth()); List<Cell> cellMetiers = infoMetier.getCells(); List<Cell> cells = param_zone.getCell(); cellMetiers.removeAll(cells); //on garde en memoire le nb initial de cellule pechees int totOriginalSize = cellMetiers.size(); log.info("size tot : " + totOriginalSize); if (cellMetiers.size() != 0) { ZoneDAO dao = IsisFishDAOHelper.getZoneDAO(context.getDB()); // // Create new empty zone for cantonnement // String name = "ZoneCantonnement-" + metier.getName()+ "-" + date.getDate(); // verifie que la zone metier n est pas deja modifiee par un autre cantonnement Zone zoneCantonnement = dao.findByName(name); int cpt=0; while (zoneCantonnement != null) { cpt++; zoneCantonnement = dao.findByName(name + "-" + cpt); } zoneCantonnement = dao.create(); if (cpt > 0) { name += "-" + cpt; } zoneCantonnement.setName(name); // // Remove prohibited zone and add not prohibited cell to zoneCantonnement //If effort must not be reported on the remaining cells of metier : //compute the ratio of old metier area size / new metier area size to reduce effort proportionnally // Collection<Zone> zoneMetiers = infoMetier.getZone(); for (Iterator<Zone> i=zoneMetiers.iterator(); i.hasNext();) { Zone zone = i.next(); // copy list cell to not modify original zone List<Cell> tmpCells = new ArrayList<Cell>(zone.getCell()); tmpCells.removeAll(param_zone.getCell()); int tmpSize = tmpCells.size(); //supprime les anciennes zones metier et ajoute les cellules autorisees a une nouvelle zone "zoneCantonnement" i.remove(); zoneCantonnement.addAllCell(tmpCells); } ArrayList<Zone> newZone = new ArrayList<Zone>(); newZone.add(zoneCantonnement); infoMetier.setZone(newZone); int remainingSize = newZone.size(); SiMatrix siMatrix = SiMatrix.getSiMatrix(context); List<Strategy> strategies = siMatrix.getStrategies(date); // modifie la prop d effort alloué au metier ciblé proportionnellement a l espace restant for(Strategy str : strategies){ log.info("Strategie : "+ str.getName()); if (str.getSetOfVessels().getPossibleMetiers().contains(metier)){ log.info("Strategy "+str.getName()+" contains metier "+metier.getName()); StrategyMonthInfo info = str.getStrategyMonthInfo(date.getMonth()); double prop = info.getProportionMetier(metier); log.info("prop : "+ prop); double newprop = prop*remainingSize/totOriginalSize; log.info("newprop : "+ newprop); info.setProportionMetier(metier, newprop); }} } else { // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement // alors metier devient metier-nonactivite SiMatrix siMatrix = SiMatrix.getSiMatrix(context); MatrixND noActivity = metierMon.getOrCreateNoActivity(date, ResultName.MATRIX_NO_ACTIVITY, siMatrix.getStrategies(date), siMatrix.getMetiers(date)); metierMon.addforbiddenMetier(metier); List<Strategy> strategies = siMatrix.getStrategies(date); for(Strategy str : strategies){ StrategyMonthInfo info = str.getStrategyMonthInfo(date.getMonth()); double prop = info.getProportionMetier(metier); if (prop != 0){ noActivity.setValue(str , metier, prop); info.setProportionMetier(metier, 0); } } } // fin de preAction /* writeln("Cantonnement zone Action avant metier:"+p.metier); writeln("Les mailles fermees sont:"+p.mailles); var zoneMetier = p.metier.getSecteurMois(p.date.getMois()); var mailleMetier = zoneMetier.getMaille().copy(); mailleMetier.removeAll(p.mailles); writeln("inter maille:"+mailleMetier.size()); // test pour savoir si toute la zone de pratique du metier // (reunion de toutes les zones metiers de metier a date) // est totalement incluse dans la zone Cantonnement if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement //creation du nouveau secteur de metier //on vérifie si le secteur a pas déjà été modifié par une autre règle afin de ne pas avoir de problème d'ID var ListeSecteur=MetaSecteurFactory.findAllByKey("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(),p.metier.getRegion()); if (ListeSecteur.size()!=0){ var secteurResult = MetaSecteurFactory.create(zoneMetier.getNom()+"Modif", p.metier.getRegion(), "Secteur creer durant la simulation."); } else{ var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation."); } writeln("nouveau secteur cree:"+secteurResult); var zonesMetier = zoneMetier.getAllSecteur(); writeln("zonesMetier:"+zonesMetier); writeln("zonesMetier.size:"+zonesMetier.size()); for(var i=0; i<zonesMetier.size(); i++){ var zonemet = zonesMetier.get(i); writeln("zonemet:"+zonemet); // intersection entre la zeme zone metier a date et zone de Cantonnement var listemailleszonemetier = zonemet.getMaille().copy(); var nbMailleZoneMetier = listemailleszonemetier.size(); writeln("maille metier:"+listemailleszonemetier); writeln("maille Cantonnement:"+p.mailles); listemailleszonemetier.removeAll(p.mailles); if(0==listemailleszonemetier.size()){ //si completement inclus on le supprime //donc on ne le met pas dans le nouveau writeln("on supprime la zone"+zonemet); } else if (listemailleszonemetier.size() != nbMailleZoneMetier) { // si la zone metier n'est pas totalement incluse dans zone de Cantonnement // on reduit la zeme zone metier de cette intersection // pas de modif de la matrice de proportion strmet writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier); var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation."); simpleSecteur.addAllMaille(listemailleszonemetier); secteurResult.addSecteur(simpleSecteur); writeln("apres addSecteur"); }else { //sinon on le met dans le nouveau writeln("On remet tel quelle la zone:"+zonemet); secteurResult.addSecteur(zonemet); } }// fin du for sur les zone metier de la zone de pratique du metier writeln("Zone metier avant"+zoneMetier.getMaille()); writeln("Zone metier apres"+secteurResult); writeln("Zone metier apres"+secteurResult.getMaille()); p.metier.setSecteurMois(secteurResult, p.date.getMois()); } else { writeln("Toute la zone metier est ferme"); // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement // alors metier devient metier-nonactivite //on regarde si la matrice nonActivite a été crée, sinon on la crée var matNonActivite=nonActivite.get(p.date); var nonactivite=matNonActivite!=null; if (!nonactivite){ matNonActivite=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) ,new Array("Strategies", "Metiers")); nonActivite.put(p.date,matNonActivite); } //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0 MetiersInterdits.put(new Packages.java.lang.String(p.metier.getNom()),true); var listestrategies=StrategyFactory.findAllByRegion(p.metier.getRegion()); for(var i=0; i<listestrategies.size(); i++){ var SetOfBateau=listestrategies.get(i).getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(p.metier) ){ var InfoMois=listestrategies.get(i).getStrategyMonthInfo(p.date.getMois()); if (InfoMois.getProportionMetier(p.metier)!=0){ matNonActivite.setValue(listestrategies.get(i),p.metier,InfoMois.getProportionMetier(p.metier)); InfoMois.setProportionMetier(p.metier,new Packages.java.lang.Float(0)); } } } }// fin du else passage a metier-nonactivite writeln("fin Cantonnement zone action avant"); return p.gestionMetier; */ } /** * 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 { // nothing } }