package rules; import java.util.ArrayList; import java.util.List; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.SiMatrix; import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.entities.EffortDescription; import fr.ifremer.isisfish.entities.EffortDescriptionDAO; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.FisheryRegion; import fr.ifremer.isisfish.entities.Gear; import fr.ifremer.isisfish.entities.Metier; import fr.ifremer.isisfish.entities.MetierDAO; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Species; import fr.ifremer.isisfish.entities.MetierSeasonInfo; import fr.ifremer.isisfish.entities.MetierSeasonInfoDAO; import fr.ifremer.isisfish.entities.SetOfVessels; import fr.ifremer.isisfish.entities.Strategy; import fr.ifremer.isisfish.entities.StrategyMonthInfo; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.util.Doc; import org.nuiton.math.matrix.*; import org.nuiton.math.matrix.MatrixND; import org.nuiton.math.matrix.*; import org.nuiton.util.*; import org.nuiton.topia.*; import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.simulator.MetierMonitor; import org.nuiton.util.FileUtil; /** * effortObs_MultiSp * * Created: 26 aout 2008 * * @author anonymous * @version $Revision: 1.2 $ * * Last update: $Date: 2013-06-12 08:59:38 $ * by : $Author: 2SY- Sigrid $ */ public class Distri_Rec_variable extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(Distri_Rec_variable.class); @Doc(value= "simulation starting year compared to estimation starting year (0:2015;1:2016;2:2017)") public int param_startDate = 0; public String [] 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() throws Exception { return ("Modif distribution trimestrielle du recrutement chqaque annee"); } /** * Appel * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(SimulationContext context) throws Exception { // reccuperation des metiers et strategies SiMatrix siMatrix = SiMatrix.getSiMatrix(context); TimeStep date = new TimeStep(0); }// fin de 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, TimeStep step, Metier metier) throws Exception { return (step.getYear()<(3-param_startDate)); // le script ne s'applique que si on est en 2015/2016/2017 } /** * Si la condition est vrai alors cette action est execute avant le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ // Booleen permettant que ne boucler que sur un seul metier dans la preaction : boolean first = true; public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { if (first){ // on passe dans preaction pour la premiere fois System.out.println("Oui, preaction : "); int y = context.getSimulationControl().getStep().getYear(); //moyenne des trois ann��es double RecT1=0.17; double RecT2=0.41; double RecT3=0.32; double RecT4=0.09; if(y == 0){ RecT1 = 0.22 ; RecT2 = 0.44 ; RecT3 = 0.04 ; RecT4 = 0.3 ; } else { if(y == 1){ RecT1 = 0.17 ; RecT2 = 0.61 ; RecT3 = 0.21 ; RecT4 = 0.01 ; } else { if(y == 2) { RecT1 = 0.43 ; RecT2 = 0.014 ; RecT3 = 0.095 ; RecT4 = 0.46 ; } } } System.out.println("Distribution recrutement : " + RecT1 + RecT2 + RecT3 + RecT4 + " - annee " + y); List pop = context.getSimulationStorage().getParameter().getPopulations() ; for(Population p : pop){ if(p.getName().equals("Hake")){ double[] values = { RecT1/3 , RecT1/3 , RecT1/3 , RecT2/3 , RecT2/3 , RecT2/3 , RecT3/3 , RecT3/3 , RecT3/3 , RecT4/3 , RecT4/3 , RecT4/3} ; MatrixND RecDistri = MatrixFactory.getInstance().create(values, new int[] {12}); p.setRecruitmentDistribution(RecDistri) ; System.out.println("Distribution du recrutement :"+ RecDistri); System.out.println("Distribution du recrutement :"+ p.getRecruitmentDistribution()); }} first = false; }// fin de first= true if (log.isDebugEnabled()) { log.debug("fin Effort Action avant"); } }// fin de pre action public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { first = true ; } }