Matrice catchPerStrategy fausse et qui change en fonction du groupe étudié
Bonjour, Dans notre tentative de script de calcul de F, nous avions rajouté le bout de code suivant pour faire en sorte que catchPerStrategy soit bien recalculé tous les ans et pas juste ressorti du cache à chaque fois. MatrixND catchPerStrategy = null; for (TimeStep loopstep = new TimeStep(step.getYear() * 12); !loopstep.equals(step); loopstep=loopstep.next()){ // On fait cette boucle pour contourner les aspects de cache qui font que les résultats ne sont pas récupérés //s'ils ont déjà été calculés une fois (même s'ils ont changé depuis) MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP); //log.info("catchPerStrategyTemp = " + catchPerStrategyTemp + "Year=" + step.getYear()); if (catchPerStrategy == null){ catchPerStrategy = catchPerStrategyTemp; } else { catchPerStrategy = catchPerStrategy.add(catchPerStrategyTemp); // Pour avoir la somme des captures sur les 12 mois } } Ce code se trouve au début de la boucle sur les groupes d'âge de la population sur laquelle on travaille. Ce ne semble pas nécessaire à priori puisque la matrice contient normalement les résultats pour tous les groupes d'âge, et on extrait juste les captures pour le groupe sur lequel on est entrain de boucler. Mais si on sort ce code de la boucle sur les groupes ça ne compile plus... Le problème est que les captures données par catchPerStrategy ne correspondent d'aucune manière à celles données par matrixCatchPerStrategyMetPerZonePop, alors que ce sont les résultats de cette matrice par an qu'on veut... Encore plus étrange, si on regarde les logs de la simulation, on voit que le contenu de catchPerStrategy change à chaque fois que l'on boucle sur un groupe différent, alors que ces résultats ne devraient changer que d'année en année, ce que je n'arrive pas à expliquer (le code rajouté ne prend nulle part le groupe d'âge en paramètre). Voilà, je ne comprends pas trop d'où peut venir l'erreur. Help ? Loïc
Le 17/04/2012 11:41, Loic GASCHE a écrit :
Bonjour,
Ce code se trouve au début de la boucle sur les groupes d'âge de la population sur laquelle on travaille. Ce ne semble pas nécessaire à priori puisque la matrice contient normalement les résultats pour tous les groupes d'âge, et on extrait juste les captures pour le groupe sur lequel on est entrain de boucler. Mais si on sort ce code de la boucle sur les groupes ça ne compile plus...
Le problème est que les captures données par catchPerStrategy ne correspondent d'aucune manière à celles données par matrixCatchPerStrategyMetPerZonePop, alors que ce sont les résultats de cette matrice par an qu'on veut...
Je ne comprend pas ce que tu veux dire. matrixCatchPerStrategyMetPerZonePop est structurée en Strategy, Metier, Group, Zone donc son contenu dépend forcement des groupes.
Encore plus étrange, si on regarde les logs de la simulation, on voit que le contenu de catchPerStrategy change à chaque fois que l'on boucle sur un groupe différent, alors que ces résultats ne devraient changer que d'année en année, ce que je n'arrive pas à expliquer (le code rajouté ne prend nulle part le groupe d'âge en paramètre).
Tu en fait quoi de la matrice ensuite ? Tu ne la somme plus sur les Strategy, Metier, Zone et un mat.get(group) pour recuperer la valeur pour la zone ? -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 17/04/2012 14:15, Eric Chatellier a écrit :
Le 17/04/2012 11:41, Loic GASCHE a écrit :
Bonjour,
Ce code se trouve au début de la boucle sur les groupes d'âge de la population sur laquelle on travaille. Ce ne semble pas nécessaire à priori puisque la matrice contient normalement les résultats pour tous les groupes d'âge, et on extrait juste les captures pour le groupe sur lequel on est entrain de boucler. Mais si on sort ce code de la boucle sur les groupes ça ne compile plus...
Le problème est que les captures données par catchPerStrategy ne correspondent d'aucune manière à celles données par matrixCatchPerStrategyMetPerZonePop, alors que ce sont les résultats de cette matrice par an qu'on veut...
Je ne comprend pas ce que tu veux dire. matrixCatchPerStrategyMetPerZonePop est structurée en Strategy, Metier, Group, Zone donc son contenu dépend forcement des groupes.
Ben oui mais elle contient tous les groupes d'un coup, donc je ne vois pas l'utilité de boucler sur les groupes
Encore plus étrange, si on regarde les logs de la simulation, on voit que le contenu de catchPerStrategy change à chaque fois que l'on boucle sur un groupe différent, alors que ces résultats ne devraient changer que d'année en année, ce que je n'arrive pas à expliquer (le code rajouté ne prend nulle part le groupe d'âge en paramètre).
Tu en fait quoi de la matrice ensuite ? Tu ne la somme plus sur les Strategy, Metier, Zone et un mat.get(group) pour recuperer la valeur pour la zone ?
Exactement
Le 18/04/2012 12:04, Loic GASCHE a écrit :
Le 17/04/2012 14:15, Eric Chatellier a écrit :
Le 17/04/2012 11:41, Loic GASCHE a écrit :
Bonjour,
Ce code se trouve au début de la boucle sur les groupes d'âge de la population sur laquelle on travaille. Ce ne semble pas nécessaire à priori puisque la matrice contient normalement les résultats pour tous les groupes d'âge, et on extrait juste les captures pour le groupe sur lequel on est entrain de boucler. Mais si on sort ce code de la boucle sur les groupes ça ne compile plus...
Le problème est que les captures données par catchPerStrategy ne correspondent d'aucune manière à celles données par matrixCatchPerStrategyMetPerZonePop, alors que ce sont les résultats de cette matrice par an qu'on veut...
Je ne comprend pas ce que tu veux dire. matrixCatchPerStrategyMetPerZonePop est structurée en Strategy, Metier, Group, Zone donc son contenu dépend forcement des groupes.
Ben oui mais elle contient tous les groupes d'un coup, donc je ne vois pas l'utilité de boucler sur les groupes
Encore plus étrange, si on regarde les logs de la simulation, on voit que le contenu de catchPerStrategy change à chaque fois que l'on boucle sur un groupe différent, alors que ces résultats ne devraient changer que d'année en année, ce que je n'arrive pas à expliquer (le code rajouté ne prend nulle part le groupe d'âge en paramètre).
Tu en fait quoi de la matrice ensuite ? Tu ne la somme plus sur les Strategy, Metier, Zone et un mat.get(group) pour recuperer la valeur pour la zone ?
Exactement
Pas si exactement que ça en fait après une lecture attentive de ce que tu as écrit : - Oui la matrice est toujours sommée sur les Stratégies, Métiers et Zones : catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone - Et après il y a bien le mat.get(group) : Cgroup = catchPerStrategy.getValue(group);
Le 18/04/2012 13:45, Loic GASCHE a écrit :
Pas si exactement que ça en fait après une lecture attentive de ce que tu as écrit : - Oui la matrice est toujours sommée sur les Stratégies, Métiers et Zones : catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone
- Et après il y a bien le mat.get(group) : Cgroup = catchPerStrategy.getValue(group);
C'est pas ce que tu veux ? Les captures par groupes car tu calcul le Ftot par groupe ? Tu peux téléphoner sinon ? parce que je comprend pas trop :) : 02.40.50.29.28 -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 18/04/2012 13:51, Eric Chatellier a écrit :
Le 18/04/2012 13:45, Loic GASCHE a écrit :
Pas si exactement que ça en fait après une lecture attentive de ce que tu as écrit : - Oui la matrice est toujours sommée sur les Stratégies, Métiers et Zones : catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone
- Et après il y a bien le mat.get(group) : Cgroup = catchPerStrategy.getValue(group);
C'est pas ce que tu veux ? Les captures par groupes car tu calcul le Ftot par groupe ?
Tu peux téléphoner sinon ? parce que je comprend pas trop :) : 02.40.50.29.28
Voilà la base et les deux scripts. Dans Base ISIS il y a les .csv des valeurs initiales qui vont avec la base et la base elle-même. L'algorithme d'optimisation est différent de celui d'origine mais normalement les résultats sont les mêmes (et de toute façon pour le moment ça ne marche pas).
Le 18/04/2012 14:15, Loic GASCHE a écrit :
Le 18/04/2012 13:51, Eric Chatellier a écrit :
Le 18/04/2012 13:45, Loic GASCHE a écrit :
Pas si exactement que ça en fait après une lecture attentive de ce que tu as écrit : - Oui la matrice est toujours sommée sur les Stratégies, Métiers et Zones : catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone
- Et après il y a bien le mat.get(group) : Cgroup = catchPerStrategy.getValue(group);
C'est pas ce que tu veux ? Les captures par groupes car tu calcul le Ftot par groupe ?
Tu peux téléphoner sinon ? parce que je comprend pas trop :) : 02.40.50.29.28
Voilà la base et les deux scripts. Dans Base ISIS il y a les .csv des valeurs initiales qui vont avec la base et la base elle-même. L'algorithme d'optimisation est différent de celui d'origine mais normalement les résultats sont les mêmes (et de toute façon pour le moment ça ne marche pas).
Stephanie m'a fait remarquer que dans la règle de gestion TAC il y a déjà utilisation d'une méthode qui permet d'avoir les captures totales sur l'année, ce qui nous éviterait d'avoir à faire la boucle avec des loopstep. double catchTons = RuleUtil.getTotalCatchTons(context, param_species, step); Le problème c'est qu'à priori on aurait les captures totales alors que nous il nous les faut par groupe. Mais bon il y a peut-être possibilité de lui faire calculer les captures par groupe ?
Le 18/04/2012 15:23, Loic GASCHE a écrit :
Stephanie m'a fait remarquer que dans la règle de gestion TAC il y a déjà utilisation d'une méthode qui permet d'avoir les captures totales sur l'année, ce qui nous éviterait d'avoir à faire la boucle avec des loopstep.
double catchTons = RuleUtil.getTotalCatchTons(context, param_species, step);
Le problème c'est qu'à priori on aurait les captures totales alors que nous il nous les faut par groupe. Mais bon il y a peut-être possibilité de lui faire calculer les captures par groupe ?
Et par ans. A priori, il fait la même chose que nous, mais différement. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 18/04/2012 15:29, Eric Chatellier a écrit :
Le 18/04/2012 15:23, Loic GASCHE a écrit :
Stephanie m'a fait remarquer que dans la règle de gestion TAC il y a déjà utilisation d'une méthode qui permet d'avoir les captures totales sur l'année, ce qui nous éviterait d'avoir à faire la boucle avec des loopstep.
double catchTons = RuleUtil.getTotalCatchTons(context, param_species, step);
Le problème c'est qu'à priori on aurait les captures totales alors que nous il nous les faut par groupe. Mais bon il y a peut-être possibilité de lui faire calculer les captures par groupe ?
Et par ans.
A priori, il fait la même chose que nous, mais différement.
Tu as trouvé où ce qu'il fait ? J'ai cherché brièvement dans les APIs mais je n'ai pas trouvé...
Le 18/04/2012 15:33, Loic GASCHE a écrit :
Tu as trouvé où ce qu'il fait ? J'ai cherché brièvement dans les APIs mais je n'ai pas trouvé...
C'est dans les scripts, a coté du SiMatrix. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 18/04/2012 14:15, Loic GASCHE a écrit :
Voilà la base et les deux scripts. Dans Base ISIS il y a les .csv des valeurs initiales qui vont avec la base et la base elle-même. L'algorithme d'optimisation est différent de celui d'origine mais normalement les résultats sont les mêmes (et de toute façon pour le moment ça ne marche pas).
J'ai corrigé le script, il y avait 2 erreur assez compliquées a trouver. La boucle pour recuperer les captures sur une année ne prenait pas en compte le mois de décembre. J'ai remplacé la condition d'arret par : loopstep.beforeOrEquals(step) Seconde grosse erreur: catchPerStrategy = catchPerStrategyTemp.clone(); Avant on recuperais le résultat en cache, et on fesait la somme directement dessus, et donc, on modifiait les résultats en les lisant :( (dans le cache, pas dans la base de données). Donc il faut en faire une copie avec le .clone() Et avec ca, c'est cohérent avec les résultats. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 18/04/2012 15:58, Eric Chatellier a écrit :
Le 18/04/2012 14:15, Loic GASCHE a écrit :
Voilà la base et les deux scripts. Dans Base ISIS il y a les .csv des valeurs initiales qui vont avec la base et la base elle-même. L'algorithme d'optimisation est différent de celui d'origine mais normalement les résultats sont les mêmes (et de toute façon pour le moment ça ne marche pas).
J'ai corrigé le script, il y avait 2 erreur assez compliquées a trouver.
La boucle pour recuperer les captures sur une année ne prenait pas en compte le mois de décembre. J'ai remplacé la condition d'arret par : loopstep.beforeOrEquals(step)
Seconde grosse erreur: catchPerStrategy = catchPerStrategyTemp.clone();
Avant on recuperais le résultat en cache, et on fesait la somme directement dessus, et donc, on modifiait les résultats en les lisant :( (dans le cache, pas dans la base de données). Donc il faut en faire une copie avec le .clone()
Et avec ca, c'est cohérent avec les résultats.
En effet je n'étais pas près de trouver... Merci !
participants (2)
-
Eric Chatellier -
Loic GASCHE