En fait dans les beaucoup d'applis, s'il n'y a pas de règle de gestion active (et que je ne dis pas de bêtise), il suffirait de calculer les fishing mortality en première année. Si dans les équations de sélectivité et ciblage, la date et le simulationcontext ne sont pas utilisés pour la pop considérée (pour le savoir, recherche de substring dans l'équation), la mortalité par pêche est la même qu'en première année au même mois. Même chose pour survivalrate et catchrate sauf qu'il faut en plus vérifier pour l'équation de mortalité naturelle, auquel cas tu récupères ceux de première année au même mois. Tout ça ne marche bien entendu pas si une règle de gestion est active. Stéphanie et Dominique, vous confirmez? A+ Hilaire Benjamin POUSSIN a écrit :
On Fri, 22 Jun 2007 16:26:00 +0200 Stephanie MAHEVAS <Stephanie.Mahevas@ifremer.fr> wrote:
Benjamin
le probleme vient bien du nombre d'appel de fishingMortality. Les optimisations d'Hilaire permettent d'eviter plus de 2 millions de d'appels pour la base langoustine et 1 million pour la base Anchois. Mais je pense que l'on peut encore ameliorer ca.
Pour l'instant, a chaque date, pour chaque (pop,group,zone), pour chaque str*metier, on appelle (dans catchRatePerStrategyMet) (nbstr*nbmetier +1) fois fishingMortality pour le calcul de fishingMortality et celui de totalFishingMortality. Ne pourrait-on pas faire le calcul de fishingMortality pour l'ensemble des (str,metier) à l'exterieur de la methode catchRatePerStrategyMet, les mettre dans une matrice matrixFishingMortalityStrMet et passer cette matrice en argument de catchRatePerStrategyMet. Dans la methode catchRatePerStrategyMet, on aurait alors la fishingMortality du str et metier courants et il faudrait sommer sur les elements de la matrice matrixFishingMortalityStrMet pour avoir totalFishingMortality ?
peux-tu confimer et le faire?
Je l'ai fait et conclusion, ca n'apporte rien en temps :(. Par contre il y a tout de meme 2 points positifs: - le cache est moins utilisé donc ca laisse plus de place en memoire pour d'autres calcules - le probleme est bien externalisé. Un appel directe depuis le simulateur a la methode qui prend du temps.
Donc y'a plus ka trouver comme reduire ce nombre d'appel, bien sur si c possible :(.
autre besoin, pourrait-on sauvegarder ce total fishingMortality par date*group*zone? (on manquait d'exports!!!!)
Oui, bien sur :), mais je sauve plutot toutes la matrice.
Je ne suis pas sur de commiter cette nouvelle version de script tout de suite, vu que ca n'ameliore pas :(
Pour les currieux voici le code de la methode appeler une seul fois, mais qui prend tres longtemps, car elle appelle fishingMortality
--------------------------8<------------------------------- public MatrixND matrixFishingMortality(Date date, Population pop) throws TopiaException, IsisFishException { List<Strategy> strategies = getStrategies(date); List<Metier> metiers = getMetiers(date); List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone();
MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_FISHING_MORTALITY, new List[]{strategies, metiers, groups, zones}, new String[]{n_("Strategies"), n_("Metiers"), n_("Groups"), n_("Zones")}); for (int s=0; s < strategies.size(); s++) { Strategy str = strategies.get(s); metiers = getMetiers(str, date); for (int m=0; m < metiers.size(); m++) { Metier metier = metiers.get(m); for (int z=0; z < zones.size(); z++) { Zone zone = zones.get(z); double effort = effortPerZonePop(str,metier,date,zone); if (effort > 0){ for (int g=0; g < groups.size(); g++) { PopulationGroup group = groups.get(g); double value = fishingMortality(str, metier, date, group, zone, effort); result.setValue(str, metier, group, zone, value); } } else { for (int g=0; g < groups.size(); g++) { PopulationGroup group = groups.get(g); result.setValue(str, metier, group, zone, 0); } } } } } return result; } ---------------------------8<----------------------------------------
-- Benjamin -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com () campagne du ruban ascii http://www.codelutin.com /\ pour les mails en ascii
------------------------------------------------------------------------
_______________________________________________ Isis-fish-devel mailing list Isis-fish-devel@lists.labs.libre-entreprise.org http://lists.labs.libre-entreprise.org/mailman/listinfo/isis-fish-devel
-- Hilaire Drouineau IFREMER, département EMH Centre de Nantes - BP 21105 - 44311 Nantes Cedex 3 tel : +33 (0)2 40 37 42 12 - fax : +33 (0)2 40 37 40 75 email : hilaire.drouineau@ifremer.fr - web : http://www.ifremer.fr/emh **********************************************************************