Author: smahevas Date: 2012-09-06 12:41:07 +0200 (Thu, 06 Sep 2012) New Revision: 14 Url: http://forge.codelutin.com/repositories/revision/isis-fish-community/14 Log: nouveau script Added: trunk/rules/Ogive_de_Tri_Merlu.java Added: trunk/rules/Ogive_de_Tri_Merlu.java =================================================================== --- trunk/rules/Ogive_de_Tri_Merlu.java (rev 0) +++ trunk/rules/Ogive_de_Tri_Merlu.java 2012-09-06 10:41:07 UTC (rev 14) @@ -0,0 +1,196 @@ +package rules; + +import static org.nuiton.i18n.I18n._; + +import java.util.List; +import java.util.ArrayList; +import java.util.Iterator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixIterator; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.math.matrix.*; +import scripts.ResultName; +import scripts.SiMatrix; + +import fr.ifremer.isisfish.simulator.MetierMonitor; +import fr.ifremer.isisfish.simulator.SimulationContext; +import fr.ifremer.isisfish.types.TimeStep; +import fr.ifremer.isisfish.types.Month; +import fr.ifremer.isisfish.entities.*; +import fr.ifremer.isisfish.rule.AbstractRule; +import scripts.ResultName; +import scripts.SiMatrix; +import fr.ifremer.isisfish.entities.Metier; +import fr.ifremer.isisfish.entities.Population; +import fr.ifremer.isisfish.entities.PopulationGroup; +import fr.ifremer.isisfish.entities.Species; +import fr.ifremer.isisfish.entities.TargetSpecies; +import fr.ifremer.isisfish.simulator.PopulationMonitor; +import fr.ifremer.isisfish.simulator.SimulationContext; +import fr.ifremer.isisfish.simulator.ResultManager; +import fr.ifremer.isisfish.util.Doc; + +/** + * Cette methode remplace aussi TailleMin pour le Merlu dans PecherieGdG + * inspire de TailleMIN + * Created: 30 novembre 2006 + * + * @author anonymous <anonymous@labs.libre-entreprise.org> + * @version $Revision: 1.1 $ + * + * Last update: $Date: 2012 08_28 $ + * by : $Stephanie Mahevas$ + */ +public class Ogive_de_Tri_Merlu extends AbstractRule { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Log log = LogFactory.getLog(Ogive_de_Tri_Merlu.class); + + @Doc(value = "Begin step") + public TimeStep param_beginStep = new TimeStep(0); + + @Doc(value = "End step") + public TimeStep param_endStep = new TimeStep(119); + + @Doc(value = "Affected species") + public Species param_species = null; + + @Doc(value = "param_Retention_L50") + public double param_Retention_L50 = 29.4307; + + @Doc(value = "param_Retention_slope") + public double param_Retention_slope = 2.02485; + + @Doc(value = "param_TailleMin") + public double param_TailleMin = 27; + + @Doc(value = "Proportion de survie") + public double param_propSurvie = 0; + + boolean affectation = true; + + public String[] necessaryResult = { + // put here all necessary result for this rule + // example: + // ResultName.MATRIX_BIOMASS, + // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, + }; + + @Override + 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 + */ + @Override + public String getDescription() throws Exception { + return _("rejet des captures de merlu selon une sigmoide avec prop de survie selon Metier - pecherie Merlu-Langoustine GdG"); + } + + /** + * des valeurs + * + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void init(SimulationContext context) throws Exception { + } + + + /** + * La condition qui doit etre vrai pour faire les actions + * + * @param context La simulation pour lequel on utilise cette regle + * @return vrai si on souhaite que les actions soit faites + */ + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + + boolean result = true; + if (step.before(param_beginStep)) { + result = false; + } else if (step.after(param_endStep)) { + result = false; + } + + + log.info("fin de condition OgiveTri:" + result); + return result; + + // fin + } + + /** + * Si la condition est vrai alors cette action est execut + * temps de la simulation. + * + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + // nothing + affectation = true; + } + + /** + * Si la condition est vrai alors cette action est execut + * temps de la simulation. + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + + // Application de l'ogive de tri sur les captures + // la matrice de captures a une dimension metier - donc a cette etape, toutes + // les captures de tous les metiers sont connues + // Ne doit pas s'appliquer pour chaque metier de la boucle mais une seule fois! + // affectation est mis àtrue àla fin de la boucle sur les pop + + if (affectation) { + log.info("deb de affecterCaptureRejetSelonOgive"); + + PopulationMonitor popMon = context.getPopulationMonitor(); + + for (Population pop : param_species.getPopulation()) { + MatrixND discard = popMon.getCatch(pop).copy(); + MatrixND eff = popMon.getN(pop); + + for (MatrixIterator i = discard.iterator(); i.next();) { + Object[] coordonnees = i.getSemanticsCoordinates(); + PopulationGroup group = (PopulationGroup) coordonnees[2]; + + if (metier.getName().equals("metier lang simp Sud")||metier.getName().equals("metier lang simp Nord")||metier.getName().equals("metier lang simple")||metier.getName().equals("metier lang jum Nord")||metier.getName().equals("metier lang jum Sud")||metier.getName().equals("metier lang jum")) { + + double propTrie = 1 / (1 + Math.exp(-(group.getLength() - param_Retention_L50)/ param_Retention_slope)); + double propRejet = 1 - propTrie; + log.info("REJETS" + propRejet); + double value = i.getValue() * propRejet; + log.info("VALUE" + value); + i.setValue(value); + + }else if (group.getLength() >= param_TailleMin) { + i.setValue(0); // initialise discard si pas de rejet (ie taille>=TailleMin et pas metierLangoustine) + } + if (param_propSurvie >0) { + //ajout de la survie aux effectifs + eff.setValue(coordonnees[2], coordonnees[3], + eff.getValue(coordonnees[2], + coordonnees[3]) + i.getValue() * + param_propSurvie); + } + } + discard.setName(ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP); + popMon.addDiscard(step, pop, discard); + } + affectation = true; // pour ne pas refaire l'affectation au prochain metier + } + } +}
participants (1)
-
smahevas@users.forge.codelutin.com