Author: bpoussin Date: 2014-04-10 17:42:42 +0200 (Thu, 10 Apr 2014) New Revision: 3944 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/3944 Log: only one discard per step Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2014-04-09 15:47:18 UTC (rev 3943) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2014-04-10 15:42:42 UTC (rev 3944) @@ -25,6 +25,7 @@ package fr.ifremer.isisfish.simulator; +import fr.ifremer.isisfish.IsisFishRuntimeException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -43,6 +44,7 @@ import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; +import java.util.AbstractMap; import java.util.Collections; /** @@ -73,7 +75,7 @@ /** reproduction key: <date, pop> value:<MatrixND> */ protected Map<Population, Map<TimeStep, MatrixND>> reproductions = new HashMap<Population, Map<TimeStep, MatrixND>>(); /** discard key: <date, pop> value:<MatrixND> */ - protected Map<Population, Map<TimeStep, MatrixND>> discards = new HashMap<Population, Map<TimeStep, MatrixND>>(); + protected Map<Population, Map.Entry<TimeStep, MatrixND>> discards = new HashMap<Population, Map.Entry<TimeStep, MatrixND>>(); /** catch per population, only last catch is remaining */ protected Map<Population, MatrixND> catchs = new HashMap<Population, MatrixND>(); /** catch per population, only last catch is remaining */ @@ -97,7 +99,6 @@ .unmodifiableList(new ArrayList<Population>(pops)); for (Population pop : this.pops) { reproductions.put(pop, new HashMap<TimeStep, MatrixND>()); - discards.put(pop, new HashMap<TimeStep, MatrixND>()); } } @@ -395,12 +396,21 @@ * @return le discard */ public MatrixND getDiscard(TimeStep step, Population pop) { - MatrixND result = discards.get(pop).get(step); + checkStep(step, "You can only get discard for current step simulation, for old discard you must use ResultStorage"); + + MatrixND result = null; + // seul le discard de l'annee en cours est disponible, sinon on doit + // aller le chercher dans les resultats + Map.Entry<TimeStep, MatrixND> discard = discards.get(pop); + if (discard != null && discard.getValue().equals(step)) { + result = discard.getValue(); + } return result; } /** * Set discard. + * Only work for current step simulation * * Force discard at date for population. * @@ -409,33 +419,37 @@ * @param discard le discard */ public void setDiscard(TimeStep step, Population pop, MatrixND discard) { - Map<TimeStep, MatrixND> oneDiscard = discards.get(pop); - synchronized (oneDiscard) { - // meme si discards.get(pop) != null - // replace toujours le précédent - MatrixND tmp = discard.copy(); - discards.get(pop).put(step, tmp); - } + checkStep(step, "You can only change discard for current step simulation"); + // meme si discards.get(pop) != null + // replace toujours le précédent + MatrixND tmp = discard.copy(); + discards.put(pop, new AbstractMap.SimpleEntry<TimeStep, MatrixND>(step, tmp)); } /** - * FIXME: discards n'est jamais vider, on le conserve pour toutes les annees - * il serait bon de faire un peu le menage de temps en temps. + * Only work for current step simulation * * @param step * @param pop * @param discard */ public void addDiscard(TimeStep step, Population pop, MatrixND discard) { - Map<TimeStep, MatrixND> oneDiscard = discards.get(pop); - synchronized (oneDiscard) { - MatrixND tmp = oneDiscard.get(step); - if (tmp == null) { - tmp = discard.copy(); - discards.get(pop).put(step, tmp); - } else { - tmp.add(discard); - } + checkStep(step, "You can only add discard for current step simulation"); + + MatrixND oneDiscard = getDiscard(step, pop); + if (oneDiscard == null) { + oneDiscard = discard.copy(); + } else { + oneDiscard.add(discard); } + setDiscard(step, pop, oneDiscard); } + + public void checkStep(TimeStep step, String msg) { + SimulationContext sim = SimulationContext.get(); + TimeStep simStep = sim.getSimulationControl().getStep(); + if (!step.equals(simStep )) { + throw new IsisFishRuntimeException(msg); + } + } }