mais ds si matrix on a pas de context...Comme le dit le titre :dans SiMatrix je veux accéder a la valeur d'une variable d'une population (onglet variables), son petit nom est "FonCatch". je sais le faire ds une regle avec context.get(pop).getAsDouble("FonCatch")Si ca n'est pas possible comme ca, voici ce que je veux faire :la mortalité par peche par groupe est calculée sur les captures ou sur les debarquements selon l'espece. J'ai donc crée la variable FonCatch qui vaut 1 si F est calculee sur les captures et 0 sinon. et je veux que la methode fishingMortalityPerGroup en tienne compte. Cf dessous.Pouvez vous proposer autre chose si ca ne va pas?Merci !
public MatrixND fishingMortalityPerGroup(TimeStep step, Population pop, ResultStorage resManager) throws TopiaException {
double Fgroup = 0;
double Cgroup = 0;
double Mgroup = 0;
double NgroupJan = 0;
List<Population> populations = Collections.singletonList(pop);
List<PopulationGroup> groups = pop.getPopulationGroup();
MatrixND tfgMatrix = MatrixFactory.getInstance().create(
ResultName.MATRIX_FISHING_MORTALITY_PER_GROUP,
new List[]{populations, groups}, // On travaille sur les pops ET les groupes
new String[]{n("Population"), n("Group")});
for (PopulationGroup group : groups) {
if (step.getMonth() == Month.DECEMBER) {
MatrixND catchPerStrategy = null;
for (TimeStep loopstep = new TimeStep(step.getYear() * 12); loopstep.beforeOrEquals(step); loopstep=loopstep.next()) {
// On fait cette boucle pour contourner les aspects de cache qui font que les resultats ne sont pas recuperes
//s'ils ont deja ete calcules une fois (meme s'ils ont change depuis)
// beforeOrEquals sert a bien prendre Decembre aussi
if(context.get(pop).getAsDouble("FonCatch") == null || context.get(pop).getAsDouble("FonCatch") == 1){
MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP);
}else {
MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_LANDING_PER_MET);
}
if (catchPerStrategy == null) {
catchPerStrategy = catchPerStrategyTemp.clone();
// On clone la matrice car si on fait les operations sur celle contenue dans le cache on la modifie et donc on recupere des resultats faux.
} else {
catchPerStrategy = catchPerStrategy.add(catchPerStrategyTemp); // Pour avoir la somme des captures sur les 12 mois
}
}
//log.info("catchPerStrategy = " + catchPerStrategy);
catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy
catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier
catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone : une pop peut avoir plusieurs zonespop dans ISIS
List semgroup = catchPerStrategy.getSemantic(2);
catchPerStrategy = catchPerStrategy.reduce(); // Enleve les dimensions de taille 1
catchPerStrategy.setSemantic(0, semgroup); // Ne plait pas a Eric
Cgroup = catchPerStrategy.getValue(group);
//log.info("Cgroup = " + Cgroup + "Year=" + step.getYear());
//log.info("catchPerStrategy = " + catchPerStrategy + "Year=" + step.getYear());
MatrixND naturalDeathRatePop = pop.getNaturalDeathRateMatrix();
naturalDeathRatePop = naturalDeathRatePop.meanOverDim(1); // moyenne sur Zone
naturalDeathRatePop = naturalDeathRatePop.reduce(); // Enleve les dimensions de taille 1
Mgroup = naturalDeathRatePop.getValue(group);
//log.info("Mgroup= " + Mgroup + "Year=" + step.getYear());
MatrixND abundancePopJan = resManager.getMatrix(new TimeStep(12*step.getYear()), pop, ResultName.MATRIX_ABUNDANCE_BEGIN_MONTH); // Le timestep 0 correspond a janvier de la premiere annee et les annees sont numerotees a partir de zero
abundancePopJan = abundancePopJan.sumOverDim(1); // somme sur Zone
abundancePopJan = abundancePopJan.reduce();
NgroupJan = abundancePopJan.getValue(group);
//log.info("NgroupJan = " + NgroupJan + "Year=" + step.getYear());
ObjectiveFunction f = new ObjectiveFunctionBaranov(Cgroup, Mgroup, NgroupJan);
Fgroup = MinimisationUtil.fmin(0.0,2.0,1.0e-10, f); // step ??
//log.info("Fgroup = " + Fgroup);
tfgMatrix.setValue(pop, group, Fgroup); // Bien faire attention a l'endroit ou on met cette etape (quelle boucle) ?
} else {
//Fgroup = 0; // Ce n'est plus une valeur unique mais une matrice, est-ce que cette notation peut fonctionner ?
tfgMatrix.setValue(pop, group, 0); // Bien faire attention a l'endroit ou on met cette etape (quelle boucle) ?
}
}
//log.info("tfgMatrix = " + tfgMatrix);
//log.info("tfg.DimensionNames = " + Arrays.toString(tfgMatrix.getDimensionNames()));
//log.info("tfg.Semantics = " + Arrays.toString(tfgMatrix.getSemantics()));
return tfgMatrix;
}