récupérer un log depuis FonctionObjectif_Baranov ?
Encore une question pour Eric ! Dans mes logs de simulation il apparait que le Fgroup calculé est identique d'un groupe à l'autre. Pourtant les valeurs introduites dans l'équation de Baranov sont bien différentes d'un groupe à l'autre, et il y a convergence de ff (ou fu tel qu'il est nommé dans fmin) vers une valeur très faible. Le soucis est que tous les fu (sur toutes les pops et tous les groupes) prennent la même valeur à la même itération, ce que je ne m'explique pas... Je voulais donc mettre des logs à plusieurs endroits de FonctionObjectif_Baranov pour tenter de comprendre pourquoi. Le problème est que les logs que je demande dans "public double optimize(double xx) {" n'apparaissent pas dans le log de la simulation. Est-ce normal ? public class FonctionObjectif_Baranov extends FonctionObjectif { /** to use log facility, just put in your code: log.info("..."); */ private static Log log = LogFactory.getLog(FonctionObjectif_Baranov.class); protected double C, M, N; public FonctionObjectif_Baranov(double C, double M, double N) { this.C = C; this.M = M; this.N = N; log.info("C= " + C); log.info("M= " + M); log.info("N= " + N); } // add your method here public double optimize(double xx) { double ff; ff = Math.pow((C - (xx/(xx+M))*(1-Math.exp(-(xx+M)))*N),2); log.info("Cbis= " + C); log.info("Mbis= " + M); log.info("Nbis= " + N); log.info("ff= " + ff); log.info("xx= " + xx); return ff; } }
Le 14/08/2012 15:59, Loic GASCHE a écrit :
Encore une question pour Eric !
Dans mes logs de simulation il apparait que le Fgroup calculé est identique d'un groupe à l'autre.
Pourtant les valeurs introduites dans l'équation de Baranov sont bien différentes d'un groupe à l'autre, et il y a convergence de ff (ou fu tel qu'il est nommé dans fmin) vers une valeur très faible. Le soucis est que tous les fu (sur toutes les pops et tous les groupes) prennent la même valeur à la même itération, ce que je ne m'explique pas...
Je voulais donc mettre des logs à plusieurs endroits de FonctionObjectif_Baranov pour tenter de comprendre pourquoi. Le problème est que les logs que je demande dans "public double optimize(double xx) {" n'apparaissent pas dans le log de la simulation. Est-ce normal ? Ils n'apparaissent pas du tout ? Ou seulement une fois au début de la simulations ?
Je penches pour la deuxieme solution et dans ce cas, c'est la cache d'Isis qui va te gener. Ca améliore les performances en ne calculant qu'un fois une résultat pour un paramètre identique. Pour contourner le cache, tu peut rajouter un parametre TimeStep dans la méthode que tu n'utilisera pas, juste pour que le cache n'est pas d'effet:
public double optimize(TimeStep step, double xx) {
-- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 14/08/2012 16:18, Eric Chatellier a écrit :
Le 14/08/2012 15:59, Loic GASCHE a écrit :
Encore une question pour Eric !
Dans mes logs de simulation il apparait que le Fgroup calculé est identique d'un groupe à l'autre.
Pourtant les valeurs introduites dans l'équation de Baranov sont bien différentes d'un groupe à l'autre, et il y a convergence de ff (ou fu tel qu'il est nommé dans fmin) vers une valeur très faible. Le soucis est que tous les fu (sur toutes les pops et tous les groupes) prennent la même valeur à la même itération, ce que je ne m'explique pas...
Je voulais donc mettre des logs à plusieurs endroits de FonctionObjectif_Baranov pour tenter de comprendre pourquoi. Le problème est que les logs que je demande dans "public double optimize(double xx) {" n'apparaissent pas dans le log de la simulation. Est-ce normal ? Ils n'apparaissent pas du tout ? Ou seulement une fois au début de la simulations ?
Je penches pour la deuxieme solution et dans ce cas, c'est la cache d'Isis qui va te gener. Ca améliore les performances en ne calculant qu'un fois une résultat pour un paramètre identique.
Pour contourner le cache, tu peut rajouter un parametre TimeStep dans la méthode que tu n'utilisera pas, juste pour que le cache n'est pas d'effet:
public double optimize(TimeStep step, double xx) {
A priori il faut que je rajoute aussi : import fr.ifremer.isisfish.types.TimeStep; au debut ? Apparemment comme FonctionObjectif_Baranov est liée à FonctionObjectif rajouter TimeStep pose problème : C:\Users\lgasche\isis-fish-4\isis-database\scripts\FonctionObjectif_Baranov.java:40: scripts.FonctionObjectif_Baranov is not abstract and does not override abstract method optimize(double) in scripts.FonctionObjectif public class FonctionObjectif_Baranov extends FonctionObjectif { ^ 1 error
Le 14/08/2012 16:49, Loic GASCHE a écrit :
A priori il faut que je rajoute aussi : import fr.ifremer.isisfish.types.TimeStep; au debut ?
Oui.
Apparemment comme FonctionObjectif_Baranov est liée à FonctionObjectif rajouter TimeStep pose problème :
C:\Users\lgasche\isis-fish-4\isis-database\scripts\FonctionObjectif_Baranov.java:40: scripts.FonctionObjectif_Baranov is not abstract and does not override abstract method optimize(double) in scripts.FonctionObjectif public class FonctionObjectif_Baranov extends FonctionObjectif { Il faut ajouter TimeStep dans FonctionObjectif aussi, car c'est la même fonction au final.
-- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 14/08/2012 16:47, Eric Chatellier a écrit :
Le 14/08/2012 16:49, Loic GASCHE a écrit :
A priori il faut que je rajoute aussi : import fr.ifremer.isisfish.types.TimeStep; au debut ?
Oui.
Apparemment comme FonctionObjectif_Baranov est liée à FonctionObjectif rajouter TimeStep pose problème :
C:\Users\lgasche\isis-fish-4\isis-database\scripts\FonctionObjectif_Baranov.java:40: scripts.FonctionObjectif_Baranov is not abstract and does not override abstract method optimize(double) in scripts.FonctionObjectif public class FonctionObjectif_Baranov extends FonctionObjectif { Il faut ajouter TimeStep dans FonctionObjectif aussi, car c'est la même fonction au final.
Maintenant ca compile sans soucis mais l'AS s'arrête dès Janvier 0 et j'ai le message suivant : INFO|16:57:08,964|CompileHelper.java|109|loadClass|Can't load class: simulators.DefaultSimulator_F java.lang.ClassNotFoundException: simulators.DefaultSimulator_F at fr.ifremer.isisfish.aspect.AspectClassLoader.findClass(AspectClassLoader.java:92) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at fr.ifremer.isisfish.util.CompileHelper.loadClass(CompileHelper.java:107) at fr.ifremer.isisfish.datastore.JavaSourceStorage.getCodeClass(JavaSourceStorage.java:156) at fr.ifremer.isisfish.datastore.JavaSourceStorage.getNewInstance(JavaSourceStorage.java:171) at fr.ifremer.isisfish.datastore.SimulatorStorage.getNewSimulatorInstance(SimulatorStorage.java:98) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher.localSimulateSameThread(InProcessSimulatorLauncher.java:377) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher$SimThread.run(InProcessSimulatorLauncher.java:265) ERROR|16:57:09,174|InProcessSimulatorLauncher.java|433|localSimulateSameThread|Error during simulation fr.ifremer.isisfish.IsisFishException: Can't load class: simulators.DefaultSimulator_F at fr.ifremer.isisfish.datastore.JavaSourceStorage.getCodeClass(JavaSourceStorage.java:159) at fr.ifremer.isisfish.datastore.JavaSourceStorage.getNewInstance(JavaSourceStorage.java:171) at fr.ifremer.isisfish.datastore.SimulatorStorage.getNewSimulatorInstance(SimulatorStorage.java:98) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher.localSimulateSameThread(InProcessSimulatorLauncher.java:377) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher$SimThread.run(InProcessSimulatorLauncher.java:265) WARN|16:57:09,174|InProcessSimulatorLauncher.java|455|localSimulateSameThread|Can't close all transaction org.nuiton.topia.TopiaException: Ce contexte a deja ete ferme at org.nuiton.topia.framework.TopiaContextImpl.checkClosed(TopiaContextImpl.java:960) at org.nuiton.topia.framework.TopiaContextImpl.closeContext(TopiaContextImpl.java:898) at fr.ifremer.isisfish.datastore.DataStorage.closeStorage(DataStorage.java:228) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher.localSimulateSameThread(InProcessSimulatorLauncher.java:451) at fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher$SimThread.run(InProcessSimulatorLauncher.java:265) INFO|16:57:09,174|InProcessSimulatorLauncher.java|463|localSimulateSameThread|Simulation time: 3.131
Le 14/08/2012 17:05, Loic GASCHE a écrit :
INFO|16:57:08,964|CompileHelper.java|109|loadClass|Can't load class: simulators.DefaultSimulator_F java.lang.ClassNotFoundException: simulators.DefaultSimulator_F
DefaultSimulator_F ne compile plus ? -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 14/08/2012 17:32, Eric Chatellier a écrit :
Le 14/08/2012 17:05, Loic GASCHE a écrit :
INFO|16:57:08,964|CompileHelper.java|109|loadClass|Can't load class: simulators.DefaultSimulator_F java.lang.ClassNotFoundException: simulators.DefaultSimulator_F
DefaultSimulator_F ne compile plus ?
Il n'est pas content car fx et fu que l'on calcule dans fmin sont des doubles (les valeurs qu'on souhaite minimiser) : C:\Users\lgasche\isis-fish-4\isis-database\scripts\RuleUtil.java:145: optimize(fr.ifremer.isisfish.types.TimeStep,double) in scripts.FonctionObjectif cannot be applied to (double) fx= f.optimize(x); ^ C:\Users\lgasche\isis-fish-4\isis-database\scripts\RuleUtil.java:202: optimize(fr.ifremer.isisfish.types.TimeStep,double) in scripts.FonctionObjectif cannot be applied to (double) fu= f.optimize(u); ^ Note: C:\Users\lgasche\isis-fish-4\isis-database\scripts\SiMatrix.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 2 errors
Le 14/08/2012 17:43, Loic GASCHE a écrit :
Il n'est pas content car fx et fu que l'on calcule dans fmin sont des doubles (les valeurs qu'on souhaite minimiser) :
C:\Users\lgasche\isis-fish-4\isis-database\scripts\RuleUtil.java:145: optimize(fr.ifremer.isisfish.types.TimeStep,double) in scripts.FonctionObjectif cannot be applied to (double) fx= f.optimize(x); Non c'est pas ca.
Je viens de te faire ajouter un TimeStep dans optimize(TimeStep, Double) pour le cache. Donc il faut que tu l'appel avec un timestep aussi. Tu dois être dans un pas de temps, donc tu doit l'avoir. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 14/08/2012 17:40, Eric Chatellier a écrit :
Le 14/08/2012 17:43, Loic GASCHE a écrit :
Il n'est pas content car fx et fu que l'on calcule dans fmin sont des doubles (les valeurs qu'on souhaite minimiser) :
C:\Users\lgasche\isis-fish-4\isis-database\scripts\RuleUtil.java:145: optimize(fr.ifremer.isisfish.types.TimeStep,double) in scripts.FonctionObjectif cannot be applied to (double) fx= f.optimize(x); Non c'est pas ca.
Je viens de te faire ajouter un TimeStep dans optimize(TimeStep, Double) pour le cache.
Donc il faut que tu l'appel avec un timestep aussi. Tu dois être dans un pas de temps, donc tu doit l'avoir.
Heu... Maintenant ça compile, ça tourne,... Mais je n'ai toujours mes logs additionnels que pour la première population au premier mois de décembre...
Le 14/08/2012 18:00, Loic GASCHE a écrit :
Heu... Maintenant ça compile, ça tourne,... Mais je n'ai toujours mes logs additionnels que pour la première population au premier mois de décembre...
Tu doit avoir le même soucis avec RuleUtil.fmin() ? -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 14/08/2012 19:14, Eric Chatellier a écrit :
Le 14/08/2012 18:00, Loic GASCHE a écrit :
Heu... Maintenant ça compile, ça tourne,... Mais je n'ai toujours mes logs additionnels que pour la première population au premier mois de décembre...
Tu doit avoir le même soucis avec RuleUtil.fmin() ?
Dans SiMatrix j'ai : Fgroup = RuleUtil.fmin(step,0.0,2.0,1.0e-10, new FonctionObjectif_Baranov(Cgroup,Mgroup,NgroupJan)); Dans Rule Util : public static double fmin (TimeStep step, double a, double b, double tol, FonctionObjectif f) { ... fx= f.optimize(step, x); ... fu= f.optimize(step, u); ... } Dans FonctionObjectif : public abstract double optimize(TimeStep step, double x); Et dans FonctionObjectif_Baranov : public double optimize(TimeStep step, double xx) {
Le 16/08/2012 10:14, Loic GASCHE a écrit :
Dans SiMatrix j'ai :
Fgroup = RuleUtil.fmin(step,0.0,2.0,1.0e-10, new FonctionObjectif_Baranov(Cgroup,Mgroup,NgroupJan));
Dans Rule Util : Tu peux m'envoyer les scripts que je test ?
-- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 16/08/2012 14:58, Eric Chatellier a écrit :
Le 16/08/2012 10:14, Loic GASCHE a écrit :
Dans SiMatrix j'ai :
Fgroup = RuleUtil.fmin(step,0.0,2.0,1.0e-10, new FonctionObjectif_Baranov(Cgroup,Mgroup,NgroupJan));
Dans Rule Util : Tu peux m'envoyer les scripts que je test ?
Voilà les scripts, j'espère que je n'ai rien oublié !
Le 16/08/2012 15:12, Loic GASCHE a écrit :
Voilà les scripts, j'espère que je n'ai rien oublié ! C'est bien toujours le cache.
Le problème est que en plus du timestep comme paramètre bidon pour le cache, il faudrait que tu passe aussi la Population et le PopulationGroup, ca commence à faire beaucoup ! Il faudrait que Isis propose une méthode pour ne jamais mettre en cache les résultats de certaines méthodes. (il me semble que quelqu'un d'autre à déjà eu le problème). Ca ne fait ça que pour les classes qui sont dans "scripts" (pour améliorer le temps de calcul de Simatrix), voilà pourquoi tu n'avais pas le pb avant. Tu peux pour l'instant désactiver le cache dans les paramètres avancés ? Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 16/08/2012 15:31, Eric Chatellier a écrit :
Le 16/08/2012 15:12, Loic GASCHE a écrit :
Voilà les scripts, j'espère que je n'ai rien oublié ! C'est bien toujours le cache.
Le problème est que en plus du timestep comme paramètre bidon pour le cache, il faudrait que tu passe aussi la Population et le PopulationGroup, ca commence à faire beaucoup !
Il faudrait que Isis propose une méthode pour ne jamais mettre en cache les résultats de certaines méthodes. (il me semble que quelqu'un d'autre à déjà eu le problème).
Ca ne fait ça que pour les classes qui sont dans "scripts" (pour améliorer le temps de calcul de Simatrix), voilà pourquoi tu n'avais pas le pb avant.
Tu peux pour l'instant désactiver le cache dans les paramètres avancés ?
Décocher la case "Simulation Cache" ? Oui pas de problème à priori.
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Je laisse les timestep qu'on avait rajoutés dans les scripts ou c'est mieux de les enlever ?
Le 16/08/2012 15:41, Loic GASCHE a écrit :
Décocher la case "Simulation Cache" ? Oui pas de problème à priori.
Oui.
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Je laisse les timestep qu'on avait rajoutés dans les scripts ou c'est mieux de les enlever ? Laisse les pour l'instant. Je pense qu'à terme, il disparaitront quand même.
-- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 16/08/2012 15:36, Eric Chatellier a écrit :
Le 16/08/2012 15:41, Loic GASCHE a écrit :
Décocher la case "Simulation Cache" ? Oui pas de problème à priori.
Oui.
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Je laisse les timestep qu'on avait rajoutés dans les scripts ou c'est mieux de les enlever ? Laisse les pour l'instant. Je pense qu'à terme, il disparaitront quand même.
Même en désactivant le cache je n'ai mes logs que pour le premier groupe du premier mois de Décembre. Les résultats pour ce premier groupe semblent justes, mais c'est comme si les résultats suivants prenaient les mêmes paramètres au lieu de changer avec les paramètres qui leurs correspondent (et donc tous les résultats sont identiques à ceux du premier groupe)... mais impossible de le vérifier pour le moment.
Le 16/08/2012 16:21, Loic GASCHE a écrit :
Même en désactivant le cache je n'ai mes logs que pour le premier groupe du premier mois de Décembre.
Les résultats pour ce premier groupe semblent justes, mais c'est comme si les résultats suivants prenaient les mêmes paramètres au lieu de changer avec les paramètres qui leurs correspondent (et donc tous les résultats sont identiques à ceux du premier groupe)... mais impossible de le vérifier pour le moment.
C'est étrange, c'est toujours le comportement si le cache est encore présent. J'ai bien tous les logs dans mon cas. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 16/08/2012 16:23, Eric Chatellier a écrit :
Le 16/08/2012 16:21, Loic GASCHE a écrit :
Même en désactivant le cache je n'ai mes logs que pour le premier groupe du premier mois de Décembre.
Les résultats pour ce premier groupe semblent justes, mais c'est comme si les résultats suivants prenaient les mêmes paramètres au lieu de changer avec les paramètres qui leurs correspondent (et donc tous les résultats sont identiques à ceux du premier groupe)... mais impossible de le vérifier pour le moment.
C'est étrange, c'est toujours le comportement si le cache est encore présent.
J'ai bien tous les logs dans mon cas.
J'ai redémarré ISIS et relancé mon AS : j'ai tous les logs maintenant ! Ca ne peut pas être un pb comme celui que j'ai en sélectionnant le simulateur : j'ai DefaultSimulator d'affiché alors que c'est DefaultSimulator_F qui est utilisé ?
Le 16/08/2012 16:46, Loic GASCHE a écrit :
Le 16/08/2012 16:23, Eric Chatellier a écrit :
Le 16/08/2012 16:21, Loic GASCHE a écrit :
Même en désactivant le cache je n'ai mes logs que pour le premier groupe du premier mois de Décembre.
Les résultats pour ce premier groupe semblent justes, mais c'est comme si les résultats suivants prenaient les mêmes paramètres au lieu de changer avec les paramètres qui leurs correspondent (et donc tous les résultats sont identiques à ceux du premier groupe)... mais impossible de le vérifier pour le moment.
C'est étrange, c'est toujours le comportement si le cache est encore présent.
J'ai bien tous les logs dans mon cas.
J'ai redémarré ISIS et relancé mon AS : j'ai tous les logs maintenant !
Désactiver le cache à aussi résolu mon problème : j'ai maintenant des valeurs qui varient bien d'un groupe à l'autre et d'une année à l'autre. Et les résultats obtenus semblent cohérents !
Le 16/08/2012 15:31, Eric Chatellier a écrit :
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Pour l'instant, le meilleur moyen de contrer le cache est de faire l'appel de optimize en supprimant timestep et en le remplacement par:
public double optimize(Object o, double xx) { } fx= f.optimize(new Object(), x); creer un nouvel objet à chaque fois changera l'identifiant de mise en cache à chaque appel. A plus long termes, nous allons ajouter une annotation java pour dire à isis qu'une méthode ou une classe ne doit jamais être mise en cache. Par exemple: @Nocache public double optimize(double xx) { } -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 23/08/2012 10:25, Eric Chatellier a écrit :
Le 16/08/2012 15:31, Eric Chatellier a écrit :
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Pour l'instant, le meilleur moyen de contrer le cache est de faire l'appel de optimize en supprimant timestep et en le remplacement par:
public double optimize(Object o, double xx) {
}
fx= f.optimize(new Object(), x);
creer un nouvel objet à chaque fois changera l'identifiant de mise en cache à chaque appel.
Donc je peux virer le TimeStep de public static double fmin (TimeStep step, double a, double b, double tol, FonctionObjectif f) aussi ? Mais je n'ai pas besoin de faire dépendre fmin d'un "Object" comme optimize ?
A plus long termes, nous allons ajouter une annotation java pour dire à isis qu'une méthode ou une classe ne doit jamais être mise en cache. Par exemple:
@Nocache public double optimize(double xx) {
}
Le 23/08/2012 11:26, Loic GASCHE a écrit :
Le 23/08/2012 10:25, Eric Chatellier a écrit :
Le 16/08/2012 15:31, Eric Chatellier a écrit :
Je vais discuter de ca avec benjamin pour trouver la meilleure façon de faire.
Pour l'instant, le meilleur moyen de contrer le cache est de faire l'appel de optimize en supprimant timestep et en le remplacement par:
public double optimize(Object o, double xx) {
}
fx= f.optimize(new Object(), x);
creer un nouvel objet à chaque fois changera l'identifiant de mise en cache à chaque appel.
Donc je peux virer le TimeStep de public static double fmin (TimeStep step, double a, double b, double tol, FonctionObjectif f) aussi ?
Oui.
Mais je n'ai pas besoin de faire dépendre fmin d'un "Object" comme optimize ? Non, car comme il y a un new FonctionObjectif_Baranov(), c'est le même principe.
-- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
Le 23/08/2012 11:34, Eric Chatellier a écrit :
Donc je peux virer le TimeStep de public static double fmin (TimeStep step, double a, double b, double tol, FonctionObjectif f) aussi ? Oui. Mais je n'ai pas besoin de faire dépendre fmin d'un "Object" comme optimize ? Non, car comme il y a un new FonctionObjectif_Baranov(), c'est le même principe. Avec la version 4.1.1 tu peux simplement mettre @Nocache au dessus de la méthode pour empêcher la méthode d'être mise dans le cache.
Il faut aussi ajouter l'import: import fr.ifremer.isisfish.util.Nocache. -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
participants (2)
-
Eric Chatellier -
Loic GASCHE