Author: echatellier Date: 2015-09-29 17:25:33 +0200 (Tue, 29 Sep 2015) New Revision: 4300 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4300 Log: ref #6194 : refactoring using recruitmentInput map Added: trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInput.java trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInputMap.java Removed: trunk/src/main/java/fr/ifremer/isisfish/types/ReproductionDataMap.java Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java trunk/src/main/java/fr/ifremer/isisfish/equation/PopulationRecruitmentEquation.java trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java trunk/src/main/xmi/isis-fish.zargo Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java 2015-09-29 15:23:33 UTC (rev 4299) +++ trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -53,8 +53,8 @@ import fr.ifremer.isisfish.equation.PopulationRecruitmentEquation; import fr.ifremer.isisfish.equation.PopulationReproductionEquation; import fr.ifremer.isisfish.equation.PopulationReproductionRateEquation; -import fr.ifremer.isisfish.types.ReproductionDataMap; import fr.ifremer.isisfish.types.Month; +import fr.ifremer.isisfish.types.RecruitmentInputMap; import fr.ifremer.isisfish.types.TimeStep; /** @@ -764,7 +764,7 @@ } @Override - public MatrixND getRecruitmentMatrix(TimeStep step, Population pop, ReproductionDataMap abundanceAndRepros, + public MatrixND getRecruitmentMatrix(TimeStep step, Population pop, RecruitmentInputMap recruitmentInputs, MatrixND result) { try { @@ -772,7 +772,7 @@ Equation e = pop.getRecruitmentEquation(); // l'equation doit mettre les resultats dans la matrice result - e.evaluate("step", step, "pop", pop, "aboundanceAndRepros", abundanceAndRepros, + e.evaluate("step", step, "pop", pop, "recruitmentInputs", recruitmentInputs, "result", result); } catch (Exception eee) { Modified: trunk/src/main/java/fr/ifremer/isisfish/equation/PopulationRecruitmentEquation.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/equation/PopulationRecruitmentEquation.java 2015-09-29 15:23:33 UTC (rev 4299) +++ trunk/src/main/java/fr/ifremer/isisfish/equation/PopulationRecruitmentEquation.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -29,7 +29,7 @@ import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.ReproductionDataMap; +import fr.ifremer.isisfish.types.RecruitmentInputMap; import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.ArgTypes; import fr.ifremer.isisfish.util.Args; @@ -48,20 +48,20 @@ * @param context simulation context * @param step current time step * @param pop population pour lequel on souhaite la matrice de recrutement - * @param reproductions les abundances, biomasses et reproduction correspondant au recrutement courant + * @param recruitmentInputs les abundances, biomasses et reproduction correspondant au recrutement courant * @param result la matrice resultat que l'equation doit remplir, il s'agit * d'une matrice groupes/zones * @return la valeur retournée n'est pas utilisée, par exemple 'return 0;' convient. * @throws Exception */ - @Args({"context", "step", "pop", "reproductions", "result"}) + @Args({"context", "step", "pop", "recruitmentInputs", "result"}) @ArgTypes({ "fr.ifremer.isisfish.simulator.SimulationContext", "fr.ifremer.isisfish.types.TimeStep", "fr.ifremer.isisfish.entities.Population", - "fr.ifremer.isisfish.types.ReproductionDataMap", + "fr.ifremer.isisfish.types.RecruitmentInputMap", "org.nuiton.math.matrix.MatrixND"}) public double compute(SimulationContext context, TimeStep step, - Population pop, ReproductionDataMap reproductions, MatrixND result) throws Exception; + Population pop, RecruitmentInputMap recruitmentInputs, MatrixND result) throws Exception; } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2015-09-29 15:23:33 UTC (rev 4299) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -25,9 +25,9 @@ package fr.ifremer.isisfish.simulator; -import fr.ifremer.isisfish.IsisFishRuntimeException; - +import java.util.AbstractMap; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,19 +38,18 @@ import org.nuiton.math.matrix.MatrixIterator; import org.nuiton.math.matrix.MatrixND; +import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.PopulationSeasonInfo; import fr.ifremer.isisfish.entities.Species; import fr.ifremer.isisfish.entities.Zone; +import fr.ifremer.isisfish.types.Month; +import fr.ifremer.isisfish.types.RecruitmentInput; +import fr.ifremer.isisfish.types.RecruitmentInputMap; import fr.ifremer.isisfish.types.ReproductionData; -import fr.ifremer.isisfish.types.ReproductionDataMap; import fr.ifremer.isisfish.types.TimeStep; -import fr.ifremer.isisfish.types.Month; -import java.util.AbstractMap; -import java.util.Collections; - /** * Classe permettant le suivi des populations de la simulation. * <p> @@ -183,10 +182,21 @@ * @return the reproduction */ public MatrixND getReproduction(TimeStep step, Population pop) { - return this.reproductions.get(pop).get(step).getRepro(); + return getReproductionData(step, pop).getRepro(); } /** + * Return reproduction data. + * + * @param step step + * @param pop population + * @return the reproductionData + */ + public ReproductionData getReproductionData(TimeStep step, Population pop) { + return this.reproductions.get(pop).get(step); + } + + /** * Set new reproduction. * * @param step step @@ -234,8 +244,8 @@ * Une autre facon de faire est de supprimer les repro == 0 car normalement * toute la repro doit etre utilisé au bout d'un certain temps * - * @param step - * @param pop + * @param step step + * @param pop population * @return population recruitment */ public MatrixND getRecruitment(TimeStep step, Population pop) { @@ -247,7 +257,8 @@ new List[] { pop.getPopulationGroup(), pop.getPopulationZone() }); - ReproductionDataMap reproductionDataMap = new ReproductionDataMap(); + RecruitmentInputMap recruitmentInputMap = null; + PopulationSeasonInfo foundReproductionSeasonInfo = null; // pour chaque for (int e = 0; e < etalement; e++) { @@ -254,12 +265,60 @@ // recuperation de la reproduction stucture en zone repro TimeStep t = new TimeStep(step.getStep() - e - pop.getMonthGapBetweenReproRecrutement()); - + ReproductionData reproductionData = reproductions.get(pop).get(t); + // si une repro existe pour le mois + if (reproductionData != null) { - if (reproductionData != null) { // si une repro existe pour le mois - - reproductionDataMap.put(t, reproductionData); + // on ne doit fournir des datas que si une saison de reproduction existe + // en fonction du gap et de l'etalement + Month reproMonth = t.getMonth(); + PopulationSeasonInfo reproductionSeasonInfo = pop.getPopulationSeasonInfo(reproMonth); + if (reproductionSeasonInfo != null && reproductionSeasonInfo.isReproduction() && foundReproductionSeasonInfo == null) { + foundReproductionSeasonInfo = reproductionSeasonInfo; + + int monthCount = foundReproductionSeasonInfo.getMonths().size(); + recruitmentInputMap = new RecruitmentInputMap(monthCount); + int pos = reproductionSeasonInfo.getMonths().indexOf(reproMonth); + + // on remplit toutes les données relativement à la position où la reproduction a été trouvée + // exemple: si on trouve la reproduction directement sur le mois m = 2 + // on remplit la données (0) avec t + 2 + // on remplit la données (1) avec t + 1 + // on remplit la données (2) avec t + // exemple 2: si m = 1 + // on remplit la données (0) avec t + 1 + // on remplit la données (1) avec t + // on remplit la données (2) avec t - 1 + // exemple 3: si m = 0 (directement sur le premier mois) + // on remplit la données (0) avec t + // on remplit la données (1) avec t - 1 + // on remplit la données (2) avec t - 2 + for (int p = 0; p < monthCount; p++) { + TimeStep t2 = new TimeStep(t.getStep() - p + pos); + ReproductionData reproductionData2 = reproductions.get(pop).get(t2); + RecruitmentInput recruitmentInput2 = reproductionData2 != null ? new RecruitmentInput(reproductionData2) : new RecruitmentInput(); + // recruitmentInput2#recuitementContribution must be null + // this is the key "null information here" + // on remplit les case passées (-) + recruitmentInputMap.put(p, recruitmentInput2); + } + } + + // pour les mois suivants (la map est forcement remplie on ajuste seulement la contribution) + if (foundReproductionSeasonInfo != null) { + int pos = foundReproductionSeasonInfo.getMonths().indexOf(reproMonth); + + if (pos != -1) { + // si pos == -1 c'est que l'etalement + gap est au dela de la période de repro + // mais comme on a trouvé une periode de repro avant, on donne quand même + // les données avec recuitementContribution à nul + RecruitmentInput recruitmentInput = recruitmentInputMap.get(pos); + Double contribution = matEtalement.getValue(e); + recruitmentInput.setRecuitementContribution(contribution); + } + } + MatrixND repro = reproductionData.getRepro(); // on fait la correspondance entre les zones repro et @@ -335,7 +394,9 @@ } // calcul recrutement par l'equation - result = pop.getRecruitmentMatrix(step, pop, reproductionDataMap, result); + if (recruitmentInputMap != null) { + result = pop.getRecruitmentMatrix(step, pop, recruitmentInputMap, result); + } return result; } @@ -342,7 +403,7 @@ /** * @param pop population - * @param catchPerStrategyMet + * @param catchPerStrategyMet */ public void holdCatch(Population pop, MatrixND catchPerStrategyMet) { catchs.put(pop, catchPerStrategyMet); Added: trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInput.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInput.java (rev 0) +++ trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInput.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -0,0 +1,76 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2015 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package fr.ifremer.isisfish.types; + +/** + * Data used to compute recruitement equation. + * + * Contains: + * <ul> + * <li>Aboundance (for related month)</li> + * <li>Biomass (for related month)</li> + * <li>Repro (for related month)</li> + * <li>recuitementContribution (can be null if outside recruitemnent period)</li> + * </ul> + * + * @author Eric Chatellier + * @since 4.4.0.0 + */ +public class RecruitmentInput extends ReproductionData { + + /** + * RecuitementContribution (can be {@code null} if outside recruitement period). + */ + protected Double recuitementContribution; + + public RecruitmentInput() { + super(null, null, null); + } + + public RecruitmentInput(ReproductionData data) { + super(data.getAboundance(), + data.getBiomass(), + data.getRepro()); + + } + + /** + * RecuitementContribution + * + * @return recuitementContribution (can be {@code null} if outside recruitement period). + */ + public Double getRecuitementContribution() { + return recuitementContribution; + } + + /** + * Set RecuitementContribution + * + * @param recuitementContribution recuitementContribution (can be {@code null} if outside recruitement period). + */ + public void setRecuitementContribution(Double recuitementContribution) { + this.recuitementContribution = recuitementContribution; + } +} Property changes on: trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInput.java ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision HeadURL \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInputMap.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInputMap.java (rev 0) +++ trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInputMap.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -0,0 +1,46 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2015 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package fr.ifremer.isisfish.types; + +import java.util.HashMap; + +/** + * Map instance to use a simplier object in model. + * + * @since 4.4.0.0 + */ +public class RecruitmentInputMap extends HashMap<Integer, RecruitmentInput> { + + /** serialVersionUID. */ + private static final long serialVersionUID = 2765995771062359295L; + + public RecruitmentInputMap() { + super(); + } + + public RecruitmentInputMap(int initialCapacity) { + super(initialCapacity); + } +} Property changes on: trunk/src/main/java/fr/ifremer/isisfish/types/RecruitmentInputMap.java ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision HeadURL \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Deleted: trunk/src/main/java/fr/ifremer/isisfish/types/ReproductionDataMap.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/types/ReproductionDataMap.java 2015-09-29 15:23:33 UTC (rev 4299) +++ trunk/src/main/java/fr/ifremer/isisfish/types/ReproductionDataMap.java 2015-09-29 15:25:33 UTC (rev 4300) @@ -1,39 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2015 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ -package fr.ifremer.isisfish.types; - -import java.util.HashMap; - -/** - * Map instance to use a sinplier object in model. - * - * @since 4.4.0.0 - */ -public class ReproductionDataMap extends HashMap<TimeStep, ReproductionData> { - - /** serialVersionUID. */ - private static final long serialVersionUID = 2765995771062359295L; - -} Modified: trunk/src/main/xmi/isis-fish.zargo =================================================================== (Binary files differ)