passage de valeurs d'une règle à l'autre ? context ?
Bonjour les lutins (et les autres), J'ai les deux règles suivantes : - une pour soustraire des captures "autres" venant d'une flottille non représentée dans ISIS à l'abondance de poissons de la simu en cours. - une appliquant un TAC à ces mêmes poissons. L'idée est de prendre en compte les captures "autres" pour déterminer si le TAC est atteint ou non. Pour cela je voulais passer chaque mois la valeur des captures "autres" dans le context pour pouvoir la récupérer avec l'autre règle afin de vérifier si le TAC a été atteint. J'ai essayé plusieurs façons de faire différentes (en m'inspirant des HCR déjà créées où on utilise des setValue() et getValue() et qui marchent sans problème), mais j'ai systématiquement un NullPointerException à la ligne de la règle de TAC où je fais le getValue() de la valeur exportée par l'autre règle. Comme ça fait un moment que je n'ai plus utilisé le context il y a peut-être un aspect que j'ai oublié, en tout cas je sèche donc si quelqu'un a une solution je suis preneur ! Loïc
Le 19/03/2015 09:41, Loic GASCHE a écrit :
Bonjour les lutins (et les autres),
J'ai les deux règles suivantes : - une pour soustraire des captures "autres" venant d'une flottille non représentée dans ISIS à l'abondance de poissons de la simu en cours. - une appliquant un TAC à ces mêmes poissons.
L'idée est de prendre en compte les captures "autres" pour déterminer si le TAC est atteint ou non.
Pour cela je voulais passer chaque mois la valeur des captures "autres" dans le context pour pouvoir la récupérer avec l'autre règle afin de vérifier si le TAC a été atteint.
J'ai essayé plusieurs façons de faire différentes (en m'inspirant des HCR déjà créées où on utilise des setValue() et getValue() et qui marchent sans problème), mais j'ai systématiquement un NullPointerException à la ligne de la règle de TAC où je fais le getValue() de la valeur exportée par l'autre règle.
Peux importe l'ordre des règles, les conditions de toutes les regles sont evaluées avant les preAction/postAction. Donc, comme tu fais le getValue() dans la condition et le setValue() en postAction, c'est pour ca que ca doit être toujours null. -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
Oui mais si je fais le getValue() pour la valeur du mois (timestep) précédent ça devrait marcher (je crois que c'est ce que j'ai codé dans la règle) ? Ou alors la valeur de captures du Timestep précédent est-elle virée du context quand on change de TimeStep (sachant que les variables due j'exporte sont bien nommées par timestep) ? Le 19/03/2015 10:33, Eric Chatellier a écrit :
Le 19/03/2015 09:41, Loic GASCHE a écrit :
Bonjour les lutins (et les autres),
J'ai les deux règles suivantes : - une pour soustraire des captures "autres" venant d'une flottille non représentée dans ISIS à l'abondance de poissons de la simu en cours. - une appliquant un TAC à ces mêmes poissons.
L'idée est de prendre en compte les captures "autres" pour déterminer si le TAC est atteint ou non.
Pour cela je voulais passer chaque mois la valeur des captures "autres" dans le context pour pouvoir la récupérer avec l'autre règle afin de vérifier si le TAC a été atteint.
J'ai essayé plusieurs façons de faire différentes (en m'inspirant des HCR déjà créées où on utilise des setValue() et getValue() et qui marchent sans problème), mais j'ai systématiquement un NullPointerException à la ligne de la règle de TAC où je fais le getValue() de la valeur exportée par l'autre règle.
Peux importe l'ordre des règles, les conditions de toutes les regles sont evaluées avant les preAction/postAction.
Donc, comme tu fais le getValue() dans la condition et le setValue() en postAction, c'est pour ca que ca doit être toujours null.
-- Loïc Gasche Doctorant Unité Ecologie et Modèles pour l'Halieutique (EMH) IFREMER - Centre de Nantes
int stepMin = step.getYear() * 12; // Janvier de l'annee courante for (int s = stepMin; s < step.getStep(); s++) Donc normalement je ne fais pas de getValue sur le pas de temps courant. Le 19/03/2015 11:08, Loic GASCHE a écrit :
Oui mais si je fais le getValue() pour la valeur du mois (timestep) précédent ça devrait marcher (je crois que c'est ce que j'ai codé dans la règle) ?
Ou alors la valeur de captures du Timestep précédent est-elle virée du context quand on change de TimeStep (sachant que les variables due j'exporte sont bien nommées par timestep) ?
Le 19/03/2015 10:33, Eric Chatellier a écrit :
Le 19/03/2015 09:41, Loic GASCHE a écrit :
Bonjour les lutins (et les autres),
J'ai les deux règles suivantes : - une pour soustraire des captures "autres" venant d'une flottille non représentée dans ISIS à l'abondance de poissons de la simu en cours. - une appliquant un TAC à ces mêmes poissons.
L'idée est de prendre en compte les captures "autres" pour déterminer si le TAC est atteint ou non.
Pour cela je voulais passer chaque mois la valeur des captures "autres" dans le context pour pouvoir la récupérer avec l'autre règle afin de vérifier si le TAC a été atteint.
J'ai essayé plusieurs façons de faire différentes (en m'inspirant des HCR déjà créées où on utilise des setValue() et getValue() et qui marchent sans problème), mais j'ai systématiquement un NullPointerException à la ligne de la règle de TAC où je fais le getValue() de la valeur exportée par l'autre règle.
Peux importe l'ordre des règles, les conditions de toutes les regles sont evaluées avant les preAction/postAction.
Donc, comme tu fais le getValue() dans la condition et le setValue() en postAction, c'est pour ca que ca doit être toujours null.
-- Loïc Gasche Doctorant Unité Ecologie et Modèles pour l'Halieutique (EMH) IFREMER - Centre de Nantes
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ? context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() Le 19 mars 2015 11:13, Loic GASCHE <Loic.Gasche@ifremer.fr> a écrit :
int stepMin = step.getYear() * 12; // Janvier de l'annee courante
for (int s = stepMin; s < step.getStep(); s++)
Donc normalement je ne fais pas de getValue sur le pas de temps courant.
Le 19/03/2015 11:08, Loic GASCHE a écrit :
Oui mais si je fais le getValue() pour la valeur du mois (timestep)
précédent ça devrait marcher (je crois que c'est ce que j'ai codé dans la règle) ?
Ou alors la valeur de captures du Timestep précédent est-elle virée du context quand on change de TimeStep (sachant que les variables due j'exporte sont bien nommées par timestep) ?
Le 19/03/2015 10:33, Eric Chatellier a écrit :
Le 19/03/2015 09:41, Loic GASCHE a écrit :
Bonjour les lutins (et les autres),
J'ai les deux règles suivantes : - une pour soustraire des captures "autres" venant d'une flottille non représentée dans ISIS à l'abondance de poissons de la simu en cours. - une appliquant un TAC à ces mêmes poissons.
L'idée est de prendre en compte les captures "autres" pour déterminer si le TAC est atteint ou non.
Pour cela je voulais passer chaque mois la valeur des captures "autres" dans le context pour pouvoir la récupérer avec l'autre règle afin de vérifier si le TAC a été atteint.
J'ai essayé plusieurs façons de faire différentes (en m'inspirant des HCR déjà créées où on utilise des setValue() et getValue() et qui marchent sans problème), mais j'ai systématiquement un NullPointerException à la ligne de la règle de TAC où je fais le getValue() de la valeur exportée par l'autre règle.
Peux importe l'ordre des règles, les conditions de toutes les regles sont evaluées avant les preAction/postAction.
Donc, comme tu fais le getValue() dans la condition et le setValue() en postAction, c'est pour ca que ca doit être toujours null.
-- Loïc Gasche Doctorant Unité Ecologie et Modèles pour l'Halieutique (EMH) IFREMER - Centre de Nantes _______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
Le 19/03/2015 12:28, Sigrid Lehuta a écrit :
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ?
context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() J'y crois pas trop non plus parce que Java va automatiquement appele .toString() sur s quand même.
-- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
Le 19/03/2015 12:33, Eric Chatellier a écrit :
Le 19/03/2015 12:28, Sigrid Lehuta a écrit :
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ?
context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() J'y crois pas trop non plus parce que Java va automatiquement appele .toString() sur s quand même. Bon, bah en fait maintenant j'y crois :D
Parce que le code n'est pas équivalent. step.toString() doit mettre "janvier 0" Alors que dans l'autre code, "s" n'est pas un timeStep mais un simple "int" donc, là il met vraiment 0. Il faudrait modifier le code pour que le nom du parametre soit le même des deux cotés. -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
Ah oui en effet c'est possible... je vais exporter un step.getStep() alors vu que ça rend un int. En tout cas si c'est ça je me serai bien arraché les cheveux pour rien ! Merci Eric, je vais vérifier si ça marche en corrigeant le code ! Le 19/03/2015 16:04, Eric Chatellier a écrit :
Le 19/03/2015 12:33, Eric Chatellier a écrit :
Le 19/03/2015 12:28, Sigrid Lehuta a écrit :
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ?
context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() J'y crois pas trop non plus parce que Java va automatiquement appele .toString() sur s quand même. Bon, bah en fait maintenant j'y crois :D
Parce que le code n'est pas équivalent.
step.toString() doit mettre "janvier 0"
Alors que dans l'autre code, "s" n'est pas un timeStep mais un simple "int" donc, là il met vraiment 0.
Il faudrait modifier le code pour que le nom du parametre soit le même des deux cotés.
Ca m'a débloqué, par contre je rencontre un problème similaire dans une autre règle. J'ai deux règles de TAC de merlu, une pour la période 2010, 2014 et une pour la période suivante où une HCR s'applique. Dans les deux règles je charge la "même" valeur : double catchPreviousStep = (Double) context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep()); qui me sert dans un if() pour savoir si je fais un calcul ou pas. totOtherCatchStep est exporté pour chaque pop et step par la règle CapturesLongLInersNetters qui permet d'avoir les captures "autres". Aucun problème pour récupérer catchPreviousStep dans la règle TAC de la période 2010-2014, mais NullPointerException quand je la récupère dans la règle TAC de l'HCR. Encore une fois c'est probablement très bête mais je sèche... Loïc Le 19/03/2015 16:30, Loic GASCHE a écrit :
Ah oui en effet c'est possible... je vais exporter un step.getStep() alors vu que ça rend un int.
En tout cas si c'est ça je me serai bien arraché les cheveux pour rien !
Merci Eric, je vais vérifier si ça marche en corrigeant le code !
Le 19/03/2015 16:04, Eric Chatellier a écrit :
Le 19/03/2015 12:33, Eric Chatellier a écrit :
Le 19/03/2015 12:28, Sigrid Lehuta a écrit :
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ?
context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() J'y crois pas trop non plus parce que Java va automatiquement appele .toString() sur s quand même. Bon, bah en fait maintenant j'y crois :D
Parce que le code n'est pas équivalent.
step.toString() doit mettre "janvier 0"
Alors que dans l'autre code, "s" n'est pas un timeStep mais un simple "int" donc, là il met vraiment 0.
Il faudrait modifier le code pour que le nom du parametre soit le même des deux cotés.
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
-- Loïc Gasche Doctorant Unité Ecologie et Modèles pour l'Halieutique (EMH) IFREMER - Centre de Nantes
Voici le log d'une simulation sur 8 ans où le PB apparait (après la cinquième année, avant ça marche : utilisation de la règle 2010-2014). S'il te faut un debug dis-le moi, je referai tourner la simu. Le 20/03/2015 11:07, Loic GASCHE a écrit :
Ca m'a débloqué, par contre je rencontre un problème similaire dans une autre règle.
J'ai deux règles de TAC de merlu, une pour la période 2010, 2014 et une pour la période suivante où une HCR s'applique.
Dans les deux règles je charge la "même" valeur :
double catchPreviousStep = (Double) context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep());
qui me sert dans un if() pour savoir si je fais un calcul ou pas.
totOtherCatchStep est exporté pour chaque pop et step par la règle CapturesLongLInersNetters qui permet d'avoir les captures "autres".
Aucun problème pour récupérer catchPreviousStep dans la règle TAC de la période 2010-2014, mais NullPointerException quand je la récupère dans la règle TAC de l'HCR.
Encore une fois c'est probablement très bête mais je sèche...
Loïc
Le 19/03/2015 16:30, Loic GASCHE a écrit :
Ah oui en effet c'est possible... je vais exporter un step.getStep() alors vu que ça rend un int.
En tout cas si c'est ça je me serai bien arraché les cheveux pour rien !
Merci Eric, je vais vérifier si ça marche en corrigeant le code !
Le 19/03/2015 16:04, Eric Chatellier a écrit :
Le 19/03/2015 12:33, Eric Chatellier a écrit :
Le 19/03/2015 12:28, Sigrid Lehuta a écrit :
(j y crois pas trop mais) est ce que ca vient du s et pas s.toString() ?
context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + s); comparé à context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.toString() J'y crois pas trop non plus parce que Java va automatiquement appele .toString() sur s quand même. Bon, bah en fait maintenant j'y crois :D
Parce que le code n'est pas équivalent.
step.toString() doit mettre "janvier 0"
Alors que dans l'autre code, "s" n'est pas un timeStep mais un simple "int" donc, là il met vraiment 0.
Il faudrait modifier le code pour que le nom du parametre soit le même des deux cotés.
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
Le 20/03/2015 14:31, Loic GASCHE a écrit :
Voici le log d'une simulation sur 8 ans où le PB apparait (après la cinquième année, avant ça marche : utilisation de la règle 2010-2014).
Je n'arrive pas a vérifier si context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep(), totOtherCatchStep); est réellement fait car c'est le seul cas où il n'y a pas de log. -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
totOtherCatchStep est récupéré correctement par la règle de TAC 2010-2014 (la valeur des captures "autres" s'incrémente de la bonne valeur à tous les pas de temps pour cette période); donc à priori totOtherCatchStep est bien exporté (ou alors j'ai loupé un épisode ?). De plus avant il y avait un log, et je l'ai enlevé car justement la valeur semblait être exportée sans problème. Pour moi la question est pourquoi la règle TAC 2010-2014 arrive à le récupérer alors que la règle TAC HCR n'y arrive pas. Le 20/03/2015 17:47, Eric Chatellier a écrit :
Le 20/03/2015 14:31, Loic GASCHE a écrit :
Voici le log d'une simulation sur 8 ans où le PB apparait (après la cinquième année, avant ça marche : utilisation de la règle 2010-2014).
Je n'arrive pas a vérifier si context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep(), totOtherCatchStep); est réellement fait car c'est le seul cas où il n'y a pas de log.
J'ai refait tourner une simu avec plus de logs, les voici. Le 20/03/2015 17:51, Loic GASCHE a écrit :
totOtherCatchStep est récupéré correctement par la règle de TAC 2010-2014 (la valeur des captures "autres" s'incrémente de la bonne valeur à tous les pas de temps pour cette période); donc à priori totOtherCatchStep est bien exporté (ou alors j'ai loupé un épisode ?).
De plus avant il y avait un log, et je l'ai enlevé car justement la valeur semblait être exportée sans problème.
Pour moi la question est pourquoi la règle TAC 2010-2014 arrive à le récupérer alors que la règle TAC HCR n'y arrive pas.
Le 20/03/2015 17:47, Eric Chatellier a écrit :
Le 20/03/2015 14:31, Loic GASCHE a écrit :
Voici le log d'une simulation sur 8 ans où le PB apparait (après la cinquième année, avant ça marche : utilisation de la règle 2010-2014).
Je n'arrive pas a vérifier si context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep(), totOtherCatchStep); est réellement fait car c'est le seul cas où il n'y a pas de log.
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
-- Loïc Gasche Doctorant Unité Ecologie et Modèles pour l'Halieutique (EMH) IFREMER - Centre de Nantes
Le 20/03/2015 18:41, Loic GASCHE a écrit :
J'ai refait tourner une simu avec plus de logs, les voici.
Le code de test devrait ressembler à ca: log.info("getValue;" + "totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep()); double catchPreviousStep = (Double) context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep()); er log.info("setValue;" + "totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep() + ";" + totOtherCatchStep); context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep(), totOtherCatchStep); -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
j'espere que ce coup là ça va Le 20/03/2015 18:54, Eric Chatellier a écrit :
Le 20/03/2015 18:41, Loic GASCHE a écrit :
J'ai refait tourner une simu avec plus de logs, les voici.
Le code de test devrait ressembler à ca: log.info("getValue;" + "totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep()); double catchPreviousStep = (Double) context.getValue("totOtherCatchStep_" + param_population.getName() + "_" + step.previous().getStep());
er log.info("setValue;" + "totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep() + ";" + totOtherCatchStep); context.setValue("totOtherCatchStep_" + param_Population.getName() + "_" + step.getStep(), totOtherCatchStep);
Le 20/03/2015 19:15, Loic GASCHE a écrit :
j'espere que ce coup là ça va A priori, ca plante sur: tacInTons = (Double) context.getValue("TAC_" + param_population.getName() + "_HCR"); en janvier 5
C'est pas la dessus plutot le probleme ? -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
Je vais continuer à creuser là dessus, merci Eric ! Eric Chatellier <chatellier@codelutin.com> a écrit :
j'espere que ce coup là ça va A priori, ca plante sur: tacInTons = (Double) context.getValue("TAC_" +
Le 20/03/2015 19:15, Loic GASCHE a écrit : param_population.getName() + "_HCR"); en janvier 5
C'est pas la dessus plutot le probleme ?
-- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
Le 19/03/2015 11:13, Loic GASCHE a écrit :
int stepMin = step.getYear() * 12; // Janvier de l'annee courante
for (int s = stepMin; s < step.getStep(); s++)
Donc normalement je ne fais pas de getValue sur le pas de temps courant. Ca plante en Janvier 0 ?
Tu aurais un debug.txt ? -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
En fait ça ne plante pas mais ça me met des WARN et un message d'erreur "can't evaluate condition" ... "NullPOinterException". Le fait que je n'arrive pas à charger ma valeur de captures fait que je ne peux pas déterminer si oui ou non mon TAC est atteint, du coup j'ai l'impression que la simu tourne mais que la règle TAC ne s'applique pas. Si j'avais ce WARN en Janvier je comprendrais, mais il apparait à tous les pas de temps. Ou alors peut-être que l'erreur n'a rien à voir avec la récupération des captures depuis le context() et que je cherche au mauvais endroit... J'ai refait tourner une simu, voici le debug, le log etles fichiers d'info. Le 19/03/2015 12:34, Eric Chatellier a écrit :
Le 19/03/2015 11:13, Loic GASCHE a écrit :
int stepMin = step.getYear() * 12; // Janvier de l'annee courante
for (int s = stepMin; s< step.getStep(); s++)
Donc normalement je ne fais pas de getValue sur le pas de temps courant. Ca plante en Janvier 0 ?
Tu aurais un debug.txt ?
participants (4)
-
Eric Chatellier -
lgasche@ifremer.fr -
Loic GASCHE -
Sigrid Lehuta