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
}
}