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.io.Writer; import java.util.ArrayList; import java.util.List; import org.codelutin.math.matrix.*; import fr.ifremer.isisfish.IsisFishDAOHelper; 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.RegionStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.util.Doc; // pour pouvoir afficher une aide contextuelle (BUG#1605) /** * TailleMin.java * * Created: 30 novembre 2006 * * @author anonymous * @version $Revision: 1.1 $ * * Last update: $Date: 2007-01-24 18:25:34 $ * by : $Author: bpoussin $ */ public class ChangementParamControlablePresimu_Chirine extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(ChangementParamControlablePresimu_Chirine.class); @Doc(value="do the doc of param zone") public Zone param_zone = null; @Doc(value="do the doc of param gear") public Gear param_gear = null; @Doc(value="do the doc of param beginMonth") public Month param_beginMonth = Month.JANUARY; @Doc(value="do the doc of param endMonth") public Month param_endMonth = Month.DECEMBER; @Doc(value="do the doc of param newParamValue") public String param_newParamValue = "80"; 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 { return _("Change gear parameter value for all metier with this gear"); } /** * 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 { SiMatrix siMatrix = SiMatrix.getSiMatrix(context); Zone ZoneFermee = param_zone; Month MoisDeb = param_beginMonth; Month MoisFin= param_endMonth; String nouvelleValeurParam = param_newParamValue; Gear EnginInterdit = param_gear; log.info("nom de l'engin interdit " + EnginInterdit.getName()); FisheryRegion RegionSimu = RegionStorage.getFisheryRegion(context.getDB()); List ListeMetiers = RegionSimu.getMetier(); List SaisonFermee = Month.getMonths(MoisDeb, MoisFin); for (Metier metier : ListeMetiers) { log.info("metier examin� " + metier.getName() + " son engin " + metier.getGear().getName()); if (!metier.getGear().equals(EnginInterdit)){ log.info("l engin du m�tier n est pas concern�"); } else { log.info("l engin du m�tier est bien concern�"); if (ZoneFermee == null && Month.JANUARY.equals(MoisDeb) && Month.DECEMBER.equals(MoisFin)){ //aucun crit�re spatio-temporel il suffit donc de mettre //le param controlable � la nouvelle valeur metier.setGearParameterValue(nouvelleValeurParam); log.info("aucune spatialisation ni saisonnalit�, on passe le Param Controlable a "+nouvelleValeurParam); } else { List ListeSaisons = metier.getMetierSeasonInfo(); for (MetierSeasonInfo saisonmetier : ListeSaisons) { List saison = saisonmetier.getMonths(); int taille=0; if (ZoneFermee != null){ taille = siMatrix.nbCellInter(saisonmetier.getZone(), ZoneFermee); } else { log.info ("pas de s�lection de zone, toute la zone d'�tude est donc concern�e"); } if (ZoneFermee == null || taille!=0){ if (saison.containsAll(SaisonFermee)){ log.info ("il y a intersection de la zone metier au cours de la saison" + saison); List moisconcerne = new ArrayList(saison); moisconcerne.retainAll(SaisonFermee); MetierDAO metierDao = IsisFishDAOHelper.getMetierDAO(context.getDB()); MetierSeasonInfoDAO infoDao = IsisFishDAOHelper.getMetierSeasonInfoDAO(context.getDB()); EffortDescriptionDAO effortDao = IsisFishDAOHelper.getEffortDescriptionDAO(context.getDB()); Metier NouveauMetier = metierDao.create(); NouveauMetier.setName(metier.getName()+" Mois "+moisconcerne.get(0).getMonthNumber()+" a "+moisconcerne.get(moisconcerne.size()-1).getMonthNumber()+" ValeurParam "+nouvelleValeurParam); NouveauMetier.setGear(EnginInterdit); NouveauMetier.setGearParameterValue(nouvelleValeurParam); NouveauMetier.setComment("m�tier cr�� pendant la simu pour le changement de param�tre contr�lable"); for (MetierSeasonInfo infsais : metier.getMetierSeasonInfo()){ List sais = infsais.getMonths(); MetierSeasonInfo NouveauInfoSaison = infoDao.create(); NouveauInfoSaison.setMetier(NouveauMetier); NouveauInfoSaison.setFirstMonth(sais.get(0)); NouveauInfoSaison.setLastMonth(sais.get(sais.size()-1)); NouveauInfoSaison.setZone(infsais.getZone()); NouveauInfoSaison.setComment("cr�� durant la simulation"); NouveauMetier.addMetierSeasonInfo(NouveauInfoSaison); } //On ajoute aux strategies qui pratiquent le m�tier le nouveau m�tier List listestrategies = RegionSimu.getStrategy(); for(Strategy strategie : listestrategies){ SetOfVessels SetOfBateau = strategie.getSetOfVessels(); EffortDescription AncienEffort = SetOfBateau.getPossibleMetiers(metier); if (AncienEffort != null) { EffortDescription DescriptionEffort = effortDao.create(); DescriptionEffort.setPossibleMetiers(NouveauMetier); DescriptionEffort.setSetOfVessels(SetOfBateau); DescriptionEffort.setFishingOperation(AncienEffort.getFishingOperation()); DescriptionEffort.setFishingOperationDuration(AncienEffort.getFishingOperationDuration()); DescriptionEffort.setGearsNumberPerOperation(AncienEffort.getGearsNumberPerOperation()); DescriptionEffort.setCrewSize(AncienEffort.getCrewSize()); DescriptionEffort.setUnitCostOfFishing(AncienEffort.getUnitCostOfFishing()); DescriptionEffort.setFixedCrewSalary(AncienEffort.getFixedCrewSalary()); DescriptionEffort.setCrewShareRate(AncienEffort.getCrewShareRate()); DescriptionEffort.setCrewFoodCost(AncienEffort.getCrewFoodCost()); DescriptionEffort.setRepairAndMaintenanceGearCost(AncienEffort.getRepairAndMaintenanceGearCost()); DescriptionEffort.setLandingCosts(AncienEffort.getLandingCosts()); DescriptionEffort.setOtherRunningCost(AncienEffort.getOtherRunningCost()); SetOfBateau.addPossibleMetiers(DescriptionEffort); // on a ajout� le nouveau m�tier au set of vessels, // maintenant, on va report� l'effort du m�tier ancien // vers le nouveau pour les mois concern�s for (Month mois : Month.MONTH){ StrategyMonthInfo PropStratMois = strategie.getStrategyMonthInfo(mois); double prop = PropStratMois .getProportionMetier(metier); if (moisconcerne.contains(mois) && prop != 0){ //on cr�� un nouveau PropStrMet log.info ("la strat�gie "+strategie.getName()+" pratique bien le metier "+metier.getName()+" au mois " + mois); PropStratMois.setProportionMetier(NouveauMetier, prop); PropStratMois.setProportionMetier(metier, 0); } } } } } } } } } } // fin de la methode /* this.p = new Object(); this.p.paramRegle = this.param; //attention: cette r�gle de gestion ne fonctionne que si le changement a lieu pour toutes //les ann�es de simulation var zoneselective=this.param.getValue("Zone Tot"); //entrez le nom de la zone concern�e, non si pas de s�lection sur zone var moisDeb=this.param.getValue("janiver0"); //entrez le mois debut de fermeture var moisFin=this.param.getValue("decembre9");//entrez le mois de fin de fermeture var nouvelleValeurParam=this.param.getValue("90");//entrez la valeur du param�tre contr�lable if (zoneselective!="non") { var ZoneFermee=this.param.getValue("zone"); } var EnginInterdit=this.param.getValue("engin"); writeln("nom de l'engin interdit "+EnginInterdit.getNom()); var RegionSimu=EnginInterdit.getRegion(); var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ var metier=imetier.next(); writeln ("metier examin� "+metier.getNom()+"son engin "+metier.getEngin().getNom()); if (!metier.getEngin().equals(EnginInterdit)){ writeln("l engin du m�tier n est pas concern�"); } else { writeln("l engin du m�tier est bien concern�"); if (zoneselective==false && moisDeb==0 && moisFin==11){ //aucun crit�re spatio-temporel il suffit donc de mettre //le param controlable � la nouvelle valeur metier.setValeurParamControlable(nouvelleValeurParam); writeln("aucune spatialisation ni saisonnalit�, on passe le Param Controlable a "+nouvelleValeurParam); } else { var ListeSaisons = metier.getInfoSaison(); for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ var saisonmetier=isaisonmetier.next(); var saison=saisonmetier.getSaison(); var taille=0; if (zoneselective){ var maillefermee=ZoneFermee.getMaille(); var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); MailleMetier.retainAll(maillefermee); taille=MailleMetier.size(); } else { writeln ("pas de s�lection de zone, toute la zone d'�tude est donc concern�e"); } if (zoneselective==false || taille!=0){ if (saison.contains(SaisonFermee)){ writeln ("il y a intersection de la zone metier au cours de la saison"+saison.toString()); var moisconcerne=saison.copy().toListMois(); moisconcerne.retainAll(SaisonFermee.toListMois()); var NouveauMetier=MetierFactory.create(metier.getNom()+" Mois "+moisconcerne.get(0).getNumMois()+" a "+moisconcerne.get(moisconcerne.size()-1).getNumMois()+" ValeurParam "+nouvelleValeurParam, RegionSimu, EnginInterdit,nouvelleValeurParam, "m�tier cr�� pendant la simu pour le changement de param�tre contr�lable"); for (var iinfsais=metier.getInfoSaison().iterator();iinfsais.hasNext();){ var infsais=iinfsais.next(); var sais=infsais.getSaison(); var NouveauInfoSaison=InfoSaisonMetierFactory.create(NouveauMetier, sais, infsais.getSecteur(), "cr�� durant la simulation") NouveauMetier.addInfoSaison(NouveauInfoSaison); } //On ajoute aux strategies qui pratiquent le m�tier le nouveau m�tier var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); for(var i=0; i