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 *partagé entre francais et espagnols * 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_Fr_Anchois extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(TACfix_Fr_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; public double param_SSBmay = 0; /** TAC in tonne */ public double param_TAC = 33000.0;//13200; public double param_allocCountries = 0.4; 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; } /** * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ public String getDescription() { return _("TAC en fonction de biomasse et partage Fr/Es"); } /** * 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 { System.out.println("est ce qu il passe dans le init ?"); } /** * 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); System.out.println("firstSemester :" + firstSemester); 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 ; // computing proportionnal TAC value : // Biomass in may //System.out.println("matrixBiomass : " + matB); 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); param_SSBmay = matB.sumAll(); } } System.out.println("SSBmay : " + param_SSBmay); /*fermeture si SSB < 21000*/ if(param_SSBmay < 21000000) { param_TAC = 0 ; } System.out.println("paramTacInTonn : "+param_TAC); double CatchFraTot = 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); int comp = 0; for(Strategy str : strategies){ if(!"Espagnols".equals(str.getName())){ MatrixND Fra1 = mat.copy().getSubMatrix(0,comp,1); //Fra1 = Fra1.sumOverDim(0); // sum strategy Fra1 = Fra1.sumOverDim(1); // sum metiers Fra1 = Fra1.sumOverDim(2); // sum groups Fra1 = Fra1.sumOverDim(3); // sum zones Fra1 = Fra1.reduce(); double CatchFra1 = Fra1.getValue(0); CatchFraTot += CatchFra1 ; } comp += 1; } } } System.out.println("CaptureFrancaise : "+ CatchFraTot); if (CatchFraTot >= param_TAC * param_allocCountries * 1000){ result = true ; System.out.println("CAPTURE FRANCAISE DEPASSEE"); } } 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 //context.getMetierMonitor().addforbiddenMetier(metier); //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 { } }