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.nuiton.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.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.nuiton.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.nuiton.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import scripts.ResultName; import java.io.*; import java.util.*; import org.nuiton.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 *partage TQC entre frqncqis et espqgnols * Created: 7 septembre 2006 * * @author anonymous * @version $Revision: 1.3 $ * * Last update: $Date: 2007/01/24 18:25:34 $ * by : $Author: bpoussin $ */ /** * */ public class TACfix_Es_Anchois extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(TACfix_Es_Anchois.class); public Population param_pop = null ; public Date param_beginDate = new Date(6); public Date param_endDate = new Date(119); public Month param_beginMonth = Month.JULY; public Month param_endMonth = Month.JUNE; /** TAC in tonne */ public double param_allocCountries = 0.5; public double param_TAC = 33000000; protected double SSBmay = 0; protected String [] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP, ResultName.MATRIX_BIOMASS, }; /** * @return the necessaryResult */ public String[] getNecessaryResult() { return this.necessaryResult; } public String getDescription() { return _("TAC fix ou nul si biomasse < 21000t et partage Fr/Es , context contient TACesp et catchEsp in kg "); } /** * Appelà * 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)) { return false; } else if(date.after(param_endDate)) { return false; } else { int ny = date.getYear() ; boolean firstSemester = date.getMonth().before(param_beginMonth); ResultStorage matResult = context.getSimulationStorage().getResultStorage(); SiMatrix siMatrix = SiMatrix.getSiMatrix(context); //year in which to consider biomass in may ? int year = 0; if(firstSemester & ny > 0) year = ny - 1; else year = ny ; // Biomass in may for (Date dat = new Date(0); dat.before(date); dat = dat.next()) { if (dat.getYear() == year & dat.getMonth().equals(Month.JUNE)){ MatrixND matB = matResult.getMatrix(dat, param_pop, ResultName.MATRIX_BIOMASS); SSBmay = matB.sumAll(); } } double TACvalue = param_TAC; System.out.println("SSBmay : " + SSBmay); System.out.println("tac avant la biom "+ TACvalue); /* fermeture si SSB < 21000T*/ if(SSBmay < 21000000) { System.out.println("la biom est inf a 21000t"); TACvalue = 0 ; } System.out.println("tac apres la biom "+ TACvalue); System.out.println("paramTacInKg_esp : "+TACvalue*param_allocCountries); context.setValue("TACesp",TACvalue * param_allocCountries); // Quantit pechee entre juillet et juin double CatchEspTot = 0; List strategies = siMatrix.getStrategies(new Date(0)); for (Date dat = new Date(0); dat.before(date); dat = dat.next()) { if( (dat.getYear() == year & dat.getMonth().after(param_endMonth)) || (firstSemester & dat.getYear() == ny) ){ MatrixND mat = matResult.getMatrix(dat, param_pop, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); // pour les espagnols int comp = 0; for(Strategy str : strategies){ if("Espagnols".equals(str.getName())){ MatrixND Esp = mat.copy().getSubMatrix(0,comp,1); Esp = Esp.sumOverDim(1); // sum metiers Esp = Esp.sumOverDim(2); // sum groups Esp = Esp.sumOverDim(3); // sum zones Esp = Esp.reduce(); double CatchEsp = Esp.getValue(0); CatchEspTot += CatchEsp; }// if esp comp += 1; }//for strategy }//if year }//for date System.out.println("capture espagnole : "+ CatchEspTot); context.setValue("CatchEsp",CatchEspTot); if (CatchEspTot >= TACvalue * param_allocCountries) { result = true ; System.out.println("CAPTURE ESPAGNOLE DEPASSEE"); } //}//if ts } 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 { TargetSpecies ts = metier.getMetierSeasonInfo(date.getMonth()).getSpeciesTargetSpecies(param_pop.getSpecies()); if(ts != null && ts.getPrimaryCatch()) { // recupere tous les metiers qui ont l'espece en capture principale =>metiers vises //récupere toutes les stratégies pratiquant le métier et pour lesquelles la proportion !=0 SiMatrix siMatrix = SiMatrix.getSiMatrix(context); Set strs = new HashSet(); for (Strategy str : siMatrix.getStrategies(date)) { double prop = str.getStrategyMonthInfo(date.getMonth()).getProportionMetier(metier); if (str.getName().equals("Espagnols")){ if (prop != 0) { strs.add(str); } } } for (Strategy str : strs){ StrategyMonthInfo smi = str.getStrategyMonthInfo(date.getMonth()); MetierMonitor metierMon = context.getMetierMonitor(); MatrixND mat = metierMon.getOrCreateNoActivity(date, ResultName.MATRIX_NO_ACTIVITY, siMatrix.getStrategies(date), siMatrix.getMetiers(date)); mat.setValue(str, metier, smi.getProportionMetier(metier)); smi.setProportionMetier(metier, 0); } } } /** * 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 { } }