Changements v 4.4

Cette page détaille les changements majeurs introduits dans la version 4.4.

Recrutement

Avant, la version 4.4, il n'était pas possible de contrôler la façon dont le recrutement se faisait. De même il n'était pas prévu d'implémenter directement une relation stock-recrutement. Celle-ci pouvait être simulée via une paramétrisation astucieuse de l'équation de reproduction.

La version 4.4 ajoute une nouvelle équation de recrutement, dans l'onglet recrutement d'une population permettant de redéfinir la façon dont le recrutement peut s'effectuer. A présent, on considère que

  • l'équation de reproduction sert à décrire la ponte. Le résultat est une matrice 1D (result [ZoneRepro]) contenant le nombre d'oeufs pondus dans chaque zone de reproduction à chaque mois de repro.

Si aucune équation de recrutement n'est implémentée (défaut:"return 0;"), le processus de recrutement par défaut suppose :

  • l'application à ces oeufs de la mortalité du group "null" durant toute la période précédant le recrutement,
  • le recrutement se fait dans les zones de recrutement telles que définies par la matrice de correspondance des zones de repro-recrutement (onglet zones)
  • aux mois définis par le temps entre repro et recrutement et l'étalement du recrutement (Même fonctionnement qu'avant).
  • l'équation de recrutement sert à
    • modifier ce fonctionnement par défaut
    • implémenter un recrutement sans passer par un calcul du nombre d'oeufs (equation de repro : "return 0;")

La signature complète de cette équation est la suivante:

public double compute(SimulationContext context, TimeStep step,
          Population pop, ReproductionDataMap reproductions, MatrixND result) throws Exception {

}

L’exécution de cette équation permet de modifier la matrice result avec les autres paramètres de l’équation. Elle est appelée à chaque pas de temps de recrutement c'est à dire à chaque pas de temps correspondant à un mois de reproduction + le temps entre repro et recrutement + etalement de recrutement.

Attention: la matrice result n'est pas vide. Par défaut, elle contient déjà les données de recrutement tel qu'ISIS-Fish le calcule par défaut (voir PopulationMonitor#getRecruitment pour plus d'infos). Cela signifie qu'elle contient donc des données cohérentes même si l’équation de recrutement est vide.

Détail des paramètres

context: SimulationContext
Context de simulation
pop: Population
population
reproductions: ReproductionDataMap
Cette structure est specifique à l'equation de recrutement. C'est une map qui contient certaines données telles qu'elles étaient au moment de la période de reproduction, et en particulier la reproduction. Donc pour chaque pas de temps de la période de reproduction (identifiés par des entiers, 0 pour le premier mois de la saison de repro, 1 pour le deuxieme etc.),

cette map contient un objet :

recruitmentInput: RecruitmentInput
qui contient lui meme les matrices d'abondance, de biomasse et le resultat de l'equation de repro à ce pas de temps.
result: MatrixND
La matrice de résultat à modifier, et qui contient le recrutement par défaut (repro * mortalité * migration dans les zones de ponte et étalement dans le temps).

Exemple pour reproductions: Si la période de reproduction s'étale de Janvier à Mars et le delta entre la période de reproduction et de recrutement de 8 moins, avec un étalement du recrutement sur 2 mois (contribution "p" : 70% le premier mois, 30% le second), la Map reproductions contiendra respectivement:

  • en septembre:
    • janvier (indice 0) : ReproductionData (avec reproduction en janvier, p=0.7)
  • en octobre:
    • janvier (indice 0): ReproductionData (avec reproduction en janvier, p=0.3)
    • février (indice 1): ReproductionData (avec reproduction en février, p=0.7)
  • en décembre:
    • février (indice 1): ReproductionData (avec reproduction en février, p=0.3)
    • mars (indice 2): ReproductionData (avec reproduction en mars, p=0.7)
  • en janvier :
    • mars (indice 2): ReproductionData (avec reproduction en mars, p=0.3)

Des exemples de scripts sont disponibles sur la page de dépot de scripts/equations.

Dans le simulateur

L’équation de recrutement est appelée depuis le simulateur (DefaultSimulator). Vous pouvez donc vérifier le moment auquel elle est appelée pendant l’exécution de la simulation. En particulier, elle est appelée après les migrations de populations.

Résultats

Le fonctionnement des résultats a été modifié pour permettre d'ajouter plus facilement des résultats sans modifier le fichier ResultName.java.

Les résultats ont maintenant chacun leur script dans le dossier resultinfos. Chaque résultat à un nom dans le champs static NAME qui correspond à l'ancien nom dans le fichier ResultName.java.

Exemple:

public class MatrixAbundance extends AbstractResultInfo {

  public static final String NAME = MatrixAbundance.class.getSimpleName();

  @Override
  public String getDescription() {
      return "do the doc of Result MatrixAbundance";
  }
}

Le code MatrixAbundance.class.getSimpleName() est equivalent à la chaîne de caractère "MatrixAbundance", donc le nom du script, sauf exception, ce nom ne doit pas être modifié.

Les anciens scripts utilisant encore ResultName.MATRIX_ABUNDANCE continueront de fonctionner, mais IsisFish signalera que ce code est déprécié et qu'il est préférable de le remplacer pour qu'il soit compatible avec les futures versions. Pour utiliser le nouveau code, il faudra le remplacer par MATRIX_ABUNDANCE.NAME.

Export

Les exports ont été amélioré pour pouvoir être effectués durant la simulation. Auparavant, les exports étaient effectués à la fin de la simulation, et si celle-ci échouait, les exports n'étaient pas disponibles.

Pour rappel, dans ISIS-Fish 4.3, un export se défini de la façon suivante:

public class Abundances implements Export {

  public void export(SimulationStorage simulation, Writer out) throws Exception {
      for (Population pop : simulation.getParameter().getPopulations()) {
          MatrixND mat = simulation.getResultStorage().getMatrix(pop, MatrixAbundance.NAME);
          for (MatrixIterator i = mat.iterator(); i.hasNext();) {
              i.next();
              Object[] sems = i.getSemanticsCoordinates();
              TimeStep step = (TimeStep) sems[0];
              PopulationGroup group = (PopulationGroup) sems[1];
              Zone zone = (Zone) sems[2];

              double val = i.getValue();
              out.write(pop.getName() + ";" + group.getId() + ";" + zone.getName() + ";" + step.getStep() + ";" + val + "\n");
          }
      }
  }
}

Cet export étend l'interface Export et implémente une unique méthode export appelée à la fin de la simualtion.

Cet export peut toujours se définir ainsi dans la version 4.4, mais il est aussi possible de l'implémenter d'une autre façon:

public class Abundances implements ExportStep {

  @Override
  public void export(SimulationStorage simulation, TimeStep step, Writer out) throws Exception {
      for (Population pop : simulation.getParameter().getPopulations()) {
          MatrixND mat = simulation.getResultStorage().getMatrix(step, pop, MatrixAbundance.NAME);
          for (MatrixIterator i = mat.iterator(); i.hasNext();) {
              i.next();
              Object[] sems = i.getSemanticsCoordinates();
              PopulationGroup group = (PopulationGroup) sems[1];
              Zone zone = (Zone) sems[2];

              double val = i.getValue();
              out.write(pop.getName() + ";" + group.getId() + ";" + zone.getName() + ";" + step.getStep() + ";" + val + "\n");
          }
      }
  }

  @Override
  public void exportEnd(SimulationStorage simulation, Writer out) throws Exception {

  }
}

Ces nouveaux exports étendent une nouvelle interface ExportStep et doivent implémenter deux nouvelles méthodes:

  • export: appelée à la fin de chaque pas de temps
  • exportEnd: appelée à la fin de la simulation

Script d'export

Les scripts d'export du dépôt "officiel" ont été migrés et utilise maintenant le fonctionnement par pas de temps pour être exportés durant la simulation.

Ce changement a aussi été l'occasion d'effectuer d'autre changements aux scripts d'export:

  • déplacement de la colonne step en première position
  • ajout d'entêtes au fichier csv

Les scripts du dépôt "communauté" n'ont pas encore été migré mais continueront de fonctionner.

Mortalité par pêche "autres"

Une equation de mortalité par pêche "autres" a été ajoutée dans l'onglet "Stocks". Elle permet de spécifier une mortalité due à des flottilles non explicitement modélisées. La structure est identique à celle de l'equation de mortalité naturelle (par groupe et potentiellement par zone). L'equation est appelée chaque fois que l'equation de mortalité naturelle est appelée et leurs résultats additionnés. La mortalité par pêche calculée par ISIS ne reflète toujours que les captures explicites d'ISIS; néanmoins son calcul tient compte de la mortalité par pêche des autres (inclue dans Z).

Et beaucoup d'autre bugs...

De nombreux autre bugs ont été corrigés. Plus de détail sur cette page : http://forge.codelutin.com/versions/645.