Author: chatellier Date: 2011-07-08 14:22:36 +0000 (Fri, 08 Jul 2011) New Revision: 3441 Log: Fix isis test database Added: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRDOptimal.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRExpandGrid.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java isis-fish/trunk/src/test/resources/test-database/simulationplans/ isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java Removed: isis-fish/trunk/src/test/resources/test-database/analyseplans/ isis-fish/trunk/src/test/resources/test-database/sensitivity/ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java Modified: isis-fish/trunk/src/test/resources/test-database/exports/Abundances.java isis-fish/trunk/src/test/resources/test-database/exports/Biomasses.java isis-fish/trunk/src/test/resources/test-database/exports/CapturesNombre.java isis-fish/trunk/src/test/resources/test-database/exports/CapturesPoids.java isis-fish/trunk/src/test/resources/test-database/exports/CellsDefinition.java isis-fish/trunk/src/test/resources/test-database/exports/EffortsMetier.java isis-fish/trunk/src/test/resources/test-database/exports/MetierZone.java isis-fish/trunk/src/test/resources/test-database/exports/NonActivite.java isis-fish/trunk/src/test/resources/test-database/exports/OwnerMargin.java isis-fish/trunk/src/test/resources/test-database/exports/RegionDefinition.java isis-fish/trunk/src/test/resources/test-database/exports/RejetsNombre.java isis-fish/trunk/src/test/resources/test-database/exports/RejetsPoids.java isis-fish/trunk/src/test/resources/test-database/exports/VesselMargin.java isis-fish/trunk/src/test/resources/test-database/exports/ZonesDefinition.java isis-fish/trunk/src/test/resources/test-database/rules/Cantonnement.java isis-fish/trunk/src/test/resources/test-database/rules/CantonnementPreSimu.java isis-fish/trunk/src/test/resources/test-database/rules/ChangementParamControlablePresimu.java isis-fish/trunk/src/test/resources/test-database/rules/EffortReduction.java isis-fish/trunk/src/test/resources/test-database/rules/GraviteVPUE1.java isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEngin.java isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEnginPreSimu.java isis-fish/trunk/src/test/resources/test-database/rules/TACpoids.java isis-fish/trunk/src/test/resources/test-database/rules/TailleMin.java isis-fish/trunk/src/test/resources/test-database/rules/TotalClosure.java isis-fish/trunk/src/test/resources/test-database/scripts/GravityModel.java isis-fish/trunk/src/test/resources/test-database/scripts/ResultName.java isis-fish/trunk/src/test/resources/test-database/scripts/RuleUtil.java isis-fish/trunk/src/test/resources/test-database/scripts/SiMatrix.java isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassReferenceY9.java isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeReferenceY12.java isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeY6.java isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassY3.java isis-fish/trunk/src/test/resources/test-database/simulators/DefaultSimulator.java Modified: isis-fish/trunk/src/test/resources/test-database/exports/Abundances.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/Abundances.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/Abundances.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -36,7 +33,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -58,75 +55,41 @@ protected String [] necessaryResult = { ResultName.MATRIX_ABUNDANCE }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "Abondances"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Exporte les abondances en nombre tableau avec des lignes pop;id;zone;date;nombre."); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { for (Population pop : simulation.getParameter().getPopulations()) { MatrixND mat = simulation.getResultStorage().getMatrix(pop, ResultName.MATRIX_ABUNDANCE); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; PopulationGroup group = (PopulationGroup)sems[1]; Zone zone = (Zone)sems[2]; - + double val = i.getValue(); - out.write(pop.getName() +";"+ group.getId() +";"+ zone.getName() +";"+ date.getDate() +";"+ val +"\n"); + out.write(pop.getName() +";"+ group.getId() +";"+ zone.getName() +";"+ step.getStep() +";"+ val +"\n"); } } -/* -writeln("debut export abondances"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - -var Parametre=sim.getParametre(); -var Populations=Parametre.getPopulations(); -var PDate=Packages.fr.ifremer.nodb.Date; - -var result=""; - -var finsimu=resultats.getLastDate().getDate(); - -for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - writeln("population "+pop.getNom()); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - - var matrice=resultats.getMatrix(date,pop, "Abondance"); - var BadZones=matrice.getSemantics(1); - var Zones = new Packages.java.util.ArrayList(BadZones); - var BadClasses=matrice.getSemantics(0); - var Classes=new Packages.java.util.ArrayList(BadClasses); - for(var iz=Zones.iterator(); iz.hasNext();){ - var z=iz.next(); - for(var ic=Classes.iterator(); ic.hasNext();){ - var c = ic.next(); - result+=pop.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+matrice.getValue(c,z)+"\n"; - } - } - } -} -writeln("fin export abondances"); - -return ""+result; -*/ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/Biomasses.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/Biomasses.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/Biomasses.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -59,75 +56,41 @@ protected String [] necessaryResult = { ResultName.MATRIX_BIOMASS }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "Biomasses"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Exporte les biomasses tableau avec des lignes pop;id;zone;date;nombre"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { for (Population pop : simulation.getParameter().getPopulations()) { MatrixND mat = simulation.getResultStorage().getMatrix(pop, ResultName.MATRIX_BIOMASS); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; PopulationGroup group = (PopulationGroup)sems[1]; Zone zone = (Zone)sems[2]; double val = i.getValue(); - out.write(pop.getName() +";"+ group.getId() +";"+ zone.getName() +";"+ date.getDate() +";"+ val +"\n"); + out.write(pop.getName() +";"+ group.getId() +";"+ zone.getName() +";"+ step.getStep() +";"+ val +"\n"); } } - - - /* -var Parametre=sim.getParametre(); -var Populations=Parametre.getPopulations(); -var PDate=Packages.fr.ifremer.nodb.Date; -var finsimu=resultats.getLastDate().getDate(); - - -var result=""; -writeln("debut export biomasse"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - - -for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date,pop, "matriceBiomass"); - var BadZones=matrice.getSemantics(1); - var Zones = new Packages.java.util.ArrayList(BadZones); - var BadClasses=matrice.getSemantics(0); - var Classes=new Packages.java.util.ArrayList(BadClasses); - for(var iz=Zones.iterator(); iz.hasNext();){ - var z=iz.next(); - for(var ic=Classes.iterator(); ic.hasNext();){ - var c = ic.next(); - result+=pop.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+matrice.getValue(c,z)+"\n"; - } - } - } -} -writeln("fin export biomasse"); - -return ""+result; -*/ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/CapturesNombre.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/CapturesNombre.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/CapturesNombre.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -40,7 +37,7 @@ import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; /** * CapturesNombre.java @@ -59,30 +56,35 @@ protected String[] necessaryResult = { ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "CapturesNombre"; } + @Override public String getExtensionFilename() { return ".csv"; } + @Override public String getDescription() { return _("Export les captures en nombre de la simulation. tableau pop;metier;id;zone;nombre"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); for (Population pop : simulation.getParameter().getPopulations()) { - for (Date date = new Date(0); !date.after(lastDate); date = date + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step .next()) { - MatrixND mat = simulation.getResultStorage().getMatrix(date, + MatrixND mat = simulation.getResultStorage().getMatrix(step, pop, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP); if (mat != null) { // can be null if simulation is stopped before last year simulation mat = mat.sumOverDim(0); //sum on strategy @@ -96,50 +98,10 @@ double val = i.getValue(); out.write(pop.getName() + ";" + metier.getName() + ";" + group.getId() + ";" + zone.getName() + ";" - + date.getDate() + ";" + val + "\n"); + + step.getStep() + ";" + val + "\n"); } } } } - /* - var Parametre=sim.getParametre(); - var Populations=Parametre.getPopulations(); - var PDate=Packages.fr.ifremer.nodb.Date; - - var capture=0.0; - var result=""; - - writeln("debut de export captures nombre"); - var dateexport=new Packages.java.util.Date(); - var formatteur= new Packages.java.text.SimpleDateFormat(); - writeln("heure de debut: "+formatteur.format(dateexport)); - var finsimu=resultats.getLastDate().getDate(); - - for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date,pop, "matriceCatchPerStrategyMet"); - var temp=matrice.sumOverDim(0); - writeln("on a la matrice"); - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var c=coordonnees[2]; - var z=coordonnees[3]; - capture=iiterateur.getValue(); - result+=pop.getNom()+";"+metier.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+capture+"\n"; - } - } - } - - writeln("fin de CapturesNombre"); - - - - return ""+result; - - */ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/CapturesPoids.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/CapturesPoids.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/CapturesPoids.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -40,7 +37,7 @@ import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; /** * CapturesPoids.java @@ -59,30 +56,35 @@ protected String[] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "CapturesPoids"; } + @Override public String getExtensionFilename() { return ".csv"; } + @Override public String getDescription() { return _("Export les captures en poids de la simulation. tableau pop;metier;id;zone;nombre"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); for (Population pop : simulation.getParameter().getPopulations()) { - for (Date date = new Date(0); !date.after(lastDate); date = date + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step .next()) { - MatrixND mat = simulation.getResultStorage().getMatrix(date, + MatrixND mat = simulation.getResultStorage().getMatrix(step, pop, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); if (mat != null) { // can be null if simulation is stopped before last year simulation mat = mat.sumOverDim(0); //sum on strategy @@ -96,46 +98,10 @@ double val = i.getValue(); out.write(pop.getName() + ";" + metier.getName() + ";" + group.getId() + ";" + zone.getName() + ";" - + date.getDate() + ";" + val + "\n"); + + step.getStep() + ";" + val + "\n"); } } } } - /* - var Parametre=sim.getParametre(); - var Populations=Parametre.getPopulations(); - var PDate=Packages.fr.ifremer.nodb.Date; - - var capture=0.0; - var result=""; - writeln("debut de export captures poids"); - var dateexport=new Packages.java.util.Date(); - var formatteur= new Packages.java.text.SimpleDateFormat(); - writeln("heure de debut: "+formatteur.format(dateexport)); - var finsimu=resultats.getLastDate().getDate(); - - for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date,pop, "matriceCatchWeightPerStrategyMet"); - var temp=matrice.sumOverDim(0); - writeln("on a la matrice"); - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var c=coordonnees[2]; - var z=coordonnees[3]; - capture=iiterateur.getValue(); - result+=pop.getNom()+";"+metier.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+capture+"\n"; - } - } - } - - writeln("fin de CapturesPoids"); - return ""+result; - - */ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/CellsDefinition.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/CellsDefinition.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/CellsDefinition.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -60,22 +57,27 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "MailleDefinition"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Export cell's position(longitute/latitute)"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { TopiaContext tx = simulation.getStorage().beginTransaction(); List<Cell> cells = SimulationStorage.getFisheryRegion(tx).getCell(); @@ -86,5 +88,4 @@ tx.closeContext(); } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/EffortsMetier.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/EffortsMetier.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/EffortsMetier.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -59,63 +56,39 @@ protected String [] necessaryResult = { ResultName.MATRIX_EFFORT_PER_STRATEGY_MET }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "EffortsMetier"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("retourne un tableau strategie;metier;date;effort"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { MatrixND mat = simulation.getResultStorage().getMatrix(ResultName.MATRIX_EFFORT_PER_STRATEGY_MET); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; Strategy str = (Strategy)sems[1]; Metier metier = (Metier)sems[2]; double val = i.getValue(); - out.write(str.getName() +";"+ metier.getName() +";"+ date.getDate() +";"+ val +"\n"); - } -/* -var PDate=Packages.fr.ifremer.nodb.Date; -writeln("debut de export effort"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - -var result=""; - -var finsimu=resultats.getLastDate().getDate(); - -for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date, "matriceEffortPerStrategyMet"); - writeln("on a la matrice"); - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var strat=coordonnees[0]; - capture=iiterateur.getValue(); - result+=strat.getName()+";"+metier.getNom()+";"+idate+";"+capture+"\n"; - } -} - -writeln("fin de EffortMetier"); -return ""+result; - -*/ + out.write(str.getName() +";"+ metier.getName() +";"+ step.getStep() +";"+ val +"\n"); + } } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/MetierZone.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/MetierZone.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/MetierZone.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -35,7 +32,7 @@ import scripts.ResultName; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -58,38 +55,42 @@ ResultName.MATRIX_METIER_ZONE, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "MetierZone"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Export zone used by metier during simulation"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); - for (Date date = new Date(0); !date.after(lastDate); date = date.next() ) { - MatrixND mat = simulation.getResultStorage().getMatrix(date, ResultName.MATRIX_METIER_ZONE); + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step.next() ) { + MatrixND mat = simulation.getResultStorage().getMatrix(step, ResultName.MATRIX_METIER_ZONE); if (mat != null) { // can be null if simulation is stopped before last year simulation for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); if (i.getValue() == 1) { Object metier = i.getSemanticsCoordinates()[0]; Object zone = i.getSemanticsCoordinates()[1]; - out.write(metier + ";" + zone + ";" + date.getDate() + "\n"); + out.write(metier + ";" + zone + ";" + step.getStep() + "\n"); } } } } } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/NonActivite.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/NonActivite.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/NonActivite.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,9 +34,8 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.datastore.ResultStorage; /** * NonActivite.java @@ -60,65 +56,39 @@ protected String [] necessaryResult = { ResultName.MATRIX_NO_ACTIVITY }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "NonActivite"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("retourne un tableau strategie;metier;date;proportion"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { MatrixND mat = simulation.getResultStorage().getMatrix(ResultName.MATRIX_NO_ACTIVITY); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; Strategy str = (Strategy)sems[1]; Metier metier = (Metier)sems[2]; double val = i.getValue(); - out.write(str.getName() +";"+ metier.getName() +";"+ date.getDate() +";"+ val +"\n"); + out.write(str.getName() +";"+ metier.getName() +";"+ step.getStep() +";"+ val +"\n"); } -/* -var PDate=Packages.fr.ifremer.nodb.Date; -writeln("debut de export nonActivite"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - -var result=""; - -var finsimu=resultats.getLastDate().getDate(); - -for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date, "nonActivite"); - if (matrice==null){ - matrice=MatrixFactory.create(resultats.getMatrix(new PDate(0),"nonActivite")); - matrice.mults(0); - } - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var strat=coordonnees[0]; - capture=iiterateur.getValue(); - result+=strat.getName()+";"+metier.getNom()+";"+idate+";"+capture+"\n"; - } -} - -writeln("fin de nonActivite"); -return ""+result; -*/ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/OwnerMargin.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/OwnerMargin.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/OwnerMargin.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -59,60 +56,38 @@ protected String [] necessaryResult = { ResultName.MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "PatronProfit"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Exporte les profits du patrons, retourne un tableau strategy;date;value"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { MatrixND mat = simulation.getResultStorage().getMatrix(ResultName.MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; Strategy str = (Strategy)sems[1]; double val = i.getValue(); - out.write(str.getName() +";"+ date.getDate() +";"+ val +"\n"); + out.write(str.getName() +";"+ step.getStep() +";"+ val +"\n"); } -/* -var Parametre=sim.getParametre(); -var PDate=Packages.fr.ifremer.nodb.Date; -var finsimu=resultats.getLastDate().getDate(); - - -var result=""; -writeln("debut export ownermargin"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - - -for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date, "matriceOwnerMarginOverVariableCostsPerStrategyPerVessel"); - for(var iiterateur=matrice.iterator(); iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var str=coordonnees[0]; - result+=str.getName()+";"+idate+";"+iiterateur.getValue()+"\n"; - } -} -writeln("fin export ownermargin"); - -return ""+result; -*/ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/RegionDefinition.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/RegionDefinition.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/RegionDefinition.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -59,22 +56,27 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "RegionDefinition"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Export region description"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { // NomRegion LatituteMin LatitudeMax LongitudeMin LongitudeMax PasLatitude PasLongitude TopiaContext tx = simulation.getStorage().beginTransaction(); @@ -91,5 +93,4 @@ tx.closeContext(); } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/RejetsNombre.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/RejetsNombre.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/RejetsNombre.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -40,7 +37,7 @@ import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; /** * RejetsNombre.java @@ -59,30 +56,35 @@ protected String[] necessaryResult = { ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "RejetsNombre"; } + @Override public String getExtensionFilename() { return ".csv"; } + @Override public String getDescription() { return _("Export les rejets en nombre de la simulation. tableau pop;metier;id;zone;date;nombre"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); for (Population pop : simulation.getParameter().getPopulations()) { - for (Date date = new Date(0); !date.after(lastDate); date = date + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step .next()) { - MatrixND mat = simulation.getResultStorage().getMatrix(date, + MatrixND mat = simulation.getResultStorage().getMatrix(step, pop, ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP); if (mat != null) { // can be null if simulation is stopped before last year simulation mat = mat.sumOverDim(0); //sum on strategy @@ -96,49 +98,10 @@ double val = i.getValue(); out.write(pop.getName() + ";" + metier.getName() + ";" + group.getId() + ";" + zone.getName() + ";" - + date.getDate() + ";" + val + "\n"); + + step.getStep() + ";" + val + "\n"); } } } } - /* - var Parametre=sim.getParametre(); - var Populations=Parametre.getPopulations(); - var PDate=Packages.fr.ifremer.nodb.Date; - - var capture=0.0; - var result=""; - writeln("debut de export rejets nombre"); - var dateexport=new Packages.java.util.Date(); - var formatteur= new Packages.java.text.SimpleDateFormat(); - writeln("heure de debut: "+formatteur.format(dateexport)); - var finsimu=resultats.getLastDate().getDate(); - - for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date,pop ,"Rejet par metier"); - if (matrice==null){ - matrice=MatrixFactory.create(resultats.getMatrix(new PDate(0),pop ,"Rejet par metier")); - matrice.mults(0); - } - var temp=matrice.sumOverDim(0); - writeln("on a la matrice"); - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var c=coordonnees[2]; - var z=coordonnees[3]; - capture=iiterateur.getValue(); - result+=pop.getNom()+";"+metier.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+capture+"\n"; - } - } - } - - writeln("fin de RejetsNombre"); - return ""+result; - */ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/RejetsPoids.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/RejetsPoids.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/RejetsPoids.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -40,7 +37,7 @@ import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; /** * RejetsPoids.java @@ -61,30 +58,35 @@ }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "RejetsPoids"; } + @Override public String getExtensionFilename() { return ".csv"; } + @Override public String getDescription() { return _("Export les rejets en poids de la simulation. tableau pop;metier;id;zone;date;nombre"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); for (Population pop : simulation.getParameter().getPopulations()) { - for (Date date = new Date(0); !date.after(lastDate); date = date + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step .next()) { - MatrixND mat = simulation.getResultStorage().getMatrix(date, + MatrixND mat = simulation.getResultStorage().getMatrix(step, pop, ResultName.MATRIX_DISCARDS_WEIGHT_PER_STR_MET_PER_ZONE_POP); if (mat != null) { // can be null if simulation is stopped before last year simulation mat = mat.sumOverDim(0); //sum on strategy @@ -98,48 +100,10 @@ double val = i.getValue(); out.write(pop.getName() + ";" + metier.getName() + ";" + group.getId() + ";" + zone.getName() + ";" - + date.getDate() + ";" + val + "\n"); + + step.getStep() + ";" + val + "\n"); } } } } - /* - var Parametre=sim.getParametre(); - var Populations=Parametre.getPopulations(); - var PDate=Packages.fr.ifremer.nodb.Date; - - var capture=0.0; - var result=""; - writeln("debut de export rejets poids"); - var dateexport=new Packages.java.util.Date(); - var formatteur= new Packages.java.text.SimpleDateFormat(); - writeln("heure de debut: "+formatteur.format(dateexport)); - var finsimu=resultats.getLastDate().getDate(); - - for (var ipop=Populations.iterator();ipop.hasNext();){ - var pop=ipop.next(); - for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date, pop, "Rejet par metier"); - if (matrice==null){ - matrice=MatrixFactory.create(resultats.getMatrix(new PDate(0),pop ,"Rejet par metier")); - matrice.mults(0); - } - var temp=matrice.sumOverDim(0); - for (var iiterateur=temp.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var metier=coordonnees[1]; - var c=coordonnees[2]; - var z=coordonnees[3]; - capture=iiterateur.getValue()*c.getPoidsMoyen(); - result+=pop.getNom()+";"+metier.getNom()+";"+c.getId()+";"+z.getNom()+";"+idate+";"+capture+"\n"; - } - } - } - - writeln("fin de RejetsPoids"); - return ""+result; - */ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/VesselMargin.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/VesselMargin.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/VesselMargin.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -59,60 +56,38 @@ protected String [] necessaryResult = { ResultName.MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL }; - + + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "BateauProfit"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("cvs out strategy;date;value"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { MatrixND mat = simulation.getResultStorage().getMatrix(ResultName.MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL); for (MatrixIterator i=mat.iterator(); i.hasNext();) { i.next(); Object [] sems = i.getSemanticsCoordinates(); - Date date = (Date)sems[0]; + TimeStep step = (TimeStep)sems[0]; Strategy str = (Strategy)sems[1]; double val = i.getValue(); - out.write(str.getName() +";"+ date.getDate() +";"+ val +"\n"); + out.write(str.getName() +";"+ step.getStep() +";"+ val +"\n"); } - /* -var Parametre=sim.getParametre(); -var PDate=Packages.fr.ifremer.nodb.Date; -var finsimu=resultats.getLastDate().getDate(); - - -var result=""; -writeln("debut export vesselmargin"); -var dateexport=new Packages.java.util.Date(); -var formatteur= new Packages.java.text.SimpleDateFormat(); -writeln("heure de debut: "+formatteur.format(dateexport)); - - -for (var idate=0;idate<=finsimu;idate++){ - var date=new PDate(idate); - var matrice=resultats.getMatrix(date, "matriceVesselMarginOverVariableCostsPerStrategyPerVessel"); - for(var iiterateur=matrice.iterator(); iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var str=coordonnees[0]; - result+=str.getName()+";"+idate+";"+iiterateur.getValue()+"\n"; - } -} -writeln("fin export vesselmargin"); - -return ""+result; -*/ } - } Modified: isis-fish/trunk/src/test/resources/test-database/exports/ZonesDefinition.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/exports/ZonesDefinition.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/exports/ZonesDefinition.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -35,7 +32,7 @@ import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.datastore.SimulationStorage; /** @@ -61,37 +58,41 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } + @Override public String getExportFilename() { return "ZonesDefinition"; } - + + @Override public String getExtensionFilename() { return ".csv"; } - + + @Override public String getDescription() { return _("Export cell's zone constitution"); } + @Override public void export(SimulationStorage simulation, Writer out) throws Exception { TopiaContext tx = simulation.getStorage().beginTransaction(); List<Zone> zones = SimulationStorage.getFisheryRegion(tx).getZone(); - Date lastDate = simulation.getResultStorage().getLastDate(); + TimeStep lastStep = simulation.getResultStorage().getLastStep(); - for (Date date = new Date(0); !date.after(lastDate); date = date.next() ) { + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step.next() ) { for (Zone zone : zones) { for (Cell cell : zone.getCell()) { - out.write(zone + ";" + cell + ";" + date.getDate() + "\n"); + out.write(zone + ";" + cell + ";" + step.getStep() + "\n"); } } } tx.closeContext(); } - } Modified: isis-fish/trunk/src/test/resources/test-database/rules/Cantonnement.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/Cantonnement.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/Cantonnement.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -43,7 +40,7 @@ import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; @@ -74,10 +71,10 @@ public Zone param_zone = null; @Doc(value="Engin concernés") public Gear param_gear = null; - @Doc(value="Begin date") - public Date param_beginDate = new Date(0); - @Doc(value="End date") - public Date param_endDate = new Date(119); + @Doc(value="Begin step") + public TimeStep param_beginStep = new TimeStep(0); + @Doc(value="End step") + public TimeStep param_endStep = new TimeStep(119); @Doc(value="Begin month") public Month param_beginMonth = Month.JANUARY; @Doc(value="End month") @@ -91,6 +88,7 @@ ResultName.MATRIX_NO_ACTIVITY, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -99,6 +97,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { // fermeture saisiniere de zone qui peut être réduite à un engin // et a certaines années de la simulation @@ -110,25 +109,30 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { } /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { - if(date.before(param_beginDate)) { + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { + if (step.before(param_beginStep)) { return false; - } else if(date.after(param_endDate)) { - return false; + } else if(step.after(param_endStep)) { + return false; } - if (date.getMonth().before(param_beginMonth)) { + if (step.getMonth().before(param_beginMonth)) { return false; - } else if (date.getMonth().after(param_endMonth)) { + } else if (step.getMonth().after(param_endMonth)) { return false; } if (param_gear != null && !param_gear.equals(metier.getGear())) { @@ -136,7 +140,7 @@ } - List<Cell> cellMetiers = metier.getMetierSeasonInfo(date.getMonth()).getCells(); + List<Cell> cellMetiers = metier.getMetierSeasonInfo(step.getMonth()).getCells(); List<Cell> cells = param_zone.getCell(); cellMetiers.retainAll(cells); @@ -147,41 +151,21 @@ } return result; -/* -writeln("condition fermeture zone"); -var mois = p.date.getMois().getNumMois(); -writeln("mois:"+mois); -if(p.moisDeb>mois || p.moisFin<mois) - return false; -writeln("on est dans l'espace des mois possible"); -//on est dans l'espace des mois possible -if(p.date.before(p.dateDeb)) - return false; -if(p.date.after(p.dateFin)) - return false; - - -var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille(); - -// s'il y a une intersection avec la zone ferme, alors la regle s'applique -mailleMetier.retainAll(p.mailles); -var result = mailleMetier.size() != 0; - -if(result) - writeln("===== Fermeture Zone s'applique ======"); -return result; -*/ } /** - * Si la condition est vrai alors cette action est executée avant le pas + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { MetierMonitor metierMon = context.getMetierMonitor(); - MetierSeasonInfo infoMetier = metier.getMetierSeasonInfo(date.getMonth()); + MetierSeasonInfo infoMetier = metier.getMetierSeasonInfo(step.getMonth()); List<Cell> cellMetiers = infoMetier.getCells(); List<Cell> cells = param_zone.getCell(); @@ -194,7 +178,7 @@ // // Create new empty zone for cantonnement // - String name = "ZoneCantonnement-" + metier.getName()+ "-" + date.getDate(); + String name = "ZoneCantonnement-" + metier.getName()+ "-" + step.getStep(); Zone zoneCantonnement = dao.findByName(name); int cpt=0; while (zoneCantonnement != null) { @@ -211,7 +195,7 @@ // Remove prohibited zone and add not prohibited cell to zoneCantonnement // Collection<Zone> zoneMetiers = infoMetier.getZone(); - for (Iterator<Zone> i=zoneMetiers.iterator(); i.hasNext();) { + for (Iterator<Zone> i = zoneMetiers.iterator(); i.hasNext();) { Zone zone = i.next(); // copy list cell to not modify original zone List<Cell> tmpCells = new ArrayList<Cell>(zone.getCell()); @@ -220,7 +204,7 @@ zoneCantonnement.addAllCell(tmpCells); i.remove(); } - ArrayList<Zone> newZone = new ArrayList<Zone>(); + List<Zone> newZone = new ArrayList<Zone>(); newZone.add(zoneCantonnement); infoMetier.setZone(newZone); } else { @@ -228,15 +212,15 @@ // alors metier devient metier-nonactivite SiMatrix siMatrix = SiMatrix.getSiMatrix(context); - MatrixND noActivity = metierMon.getOrCreateNoActivity(date, + MatrixND noActivity = metierMon.getOrCreateNoActivity(step, ResultName.MATRIX_NO_ACTIVITY, - siMatrix.getStrategies(date), - siMatrix.getMetiers(date)); + siMatrix.getStrategies(step), + siMatrix.getMetiers(step)); metierMon.addforbiddenMetier(metier); - List<Strategy> strategies = siMatrix.getStrategies(date); + List<Strategy> strategies = siMatrix.getStrategies(step); for(Strategy str : strategies){ - StrategyMonthInfo info = str.getStrategyMonthInfo(date.getMonth()); + StrategyMonthInfo info = str.getStrategyMonthInfo(step.getMonth()); double prop = info.getProportionMetier(metier); if (prop != 0){ noActivity.setValue(str , metier, prop); @@ -244,112 +228,19 @@ } } } - // fin de preAction - -/* -writeln("Cantonnement zone Action avant metier:"+p.metier); -writeln("Les mailles fermees sont:"+p.mailles); - -var zoneMetier = p.metier.getSecteurMois(p.date.getMois()); -var mailleMetier = zoneMetier.getMaille().copy(); -mailleMetier.removeAll(p.mailles); -writeln("inter maille:"+mailleMetier.size()); -// test pour savoir si toute la zone de pratique du metier -// (reunion de toutes les zones metiers de metier a date) -// est totalement incluse dans la zone Cantonnement -if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition - // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement - - //creation du nouveau secteur de metier - //on vérifie si le secteur a pas déjà été modifié par une autre règle afin de ne pas avoir de problème d'ID - var ListeSecteur=MetaSecteurFactory.findAllByKey("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(),p.metier.getRegion()); - if (ListeSecteur.size()!=0){ - var secteurResult = MetaSecteurFactory.create(zoneMetier.getNom()+"Modif", p.metier.getRegion(), "Secteur creer durant la simulation."); - } - else{ - var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation."); - } - writeln("nouveau secteur cree:"+secteurResult); - var zonesMetier = zoneMetier.getAllSecteur(); - writeln("zonesMetier:"+zonesMetier); - writeln("zonesMetier.size:"+zonesMetier.size()); - - for(var i=0; i<zonesMetier.size(); i++){ - var zonemet = zonesMetier.get(i); - writeln("zonemet:"+zonemet); - // intersection entre la zeme zone metier a date et zone de Cantonnement - var listemailleszonemetier = zonemet.getMaille().copy(); - var nbMailleZoneMetier = listemailleszonemetier.size(); - writeln("maille metier:"+listemailleszonemetier); - writeln("maille Cantonnement:"+p.mailles); - listemailleszonemetier.removeAll(p.mailles); - if(0==listemailleszonemetier.size()){ - //si completement inclus on le supprime - //donc on ne le met pas dans le nouveau - writeln("on supprime la zone"+zonemet); + // fin de preAction } - else if (listemailleszonemetier.size() != nbMailleZoneMetier) { - // si la zone metier n'est pas totalement incluse dans zone de Cantonnement - // on reduit la zeme zone metier de cette intersection - // pas de modif de la matrice de proportion strmet - writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier); - var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation."); - simpleSecteur.addAllMaille(listemailleszonemetier); - secteurResult.addSecteur(simpleSecteur); - writeln("apres addSecteur"); - }else { - //sinon on le met dans le nouveau - writeln("On remet tel quelle la zone:"+zonemet); - secteurResult.addSecteur(zonemet); - } - }// fin du for sur les zone metier de la zone de pratique du metier - writeln("Zone metier avant"+zoneMetier.getMaille()); - writeln("Zone metier apres"+secteurResult); - writeln("Zone metier apres"+secteurResult.getMaille()); - p.metier.setSecteurMois(secteurResult, p.date.getMois()); -} -else { - writeln("Toute la zone metier est ferme"); - // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement - // alors metier devient metier-nonactivite - - //on regarde si la matrice nonActivite a été crée, sinon on la crée - var matNonActivite=nonActivite.get(p.date); - var nonactivite=matNonActivite!=null; - if (!nonactivite){ - matNonActivite=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - nonActivite.put(p.date,matNonActivite); - } - - //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0 - MetiersInterdits.put(new Packages.java.lang.String(p.metier.getNom()),true); - var listestrategies=StrategyFactory.findAllByRegion(p.metier.getRegion()); - - for(var i=0; i<listestrategies.size(); i++){ - var SetOfBateau=listestrategies.get(i).getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - - if (MetiersPosibles.contains(p.metier) ){ - var InfoMois=listestrategies.get(i).getStrategyMonthInfo(p.date.getMois()); - if (InfoMois.getProportionMetier(p.metier)!=0){ - matNonActivite.setValue(listestrategies.get(i),p.metier,InfoMois.getProportionMetier(p.metier)); - InfoMois.setProportionMetier(p.metier,new Packages.java.lang.Float(0)); - } - } - } -}// fin du else passage a metier-nonactivite -writeln("fin Cantonnement zone action avant"); -return p.gestionMetier; -*/ - } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // nothing } Modified: isis-fish/trunk/src/test/resources/test-database/rules/CantonnementPreSimu.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/CantonnementPreSimu.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/CantonnementPreSimu.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -43,7 +40,7 @@ import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.entities.*; @@ -87,6 +84,7 @@ ResultName.MATRIX_NO_ACTIVITY, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -95,6 +93,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { return _("Cantonnement: can be used to Cantonnement with gear if you put gear in parameter"); } @@ -138,14 +137,13 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { SiMatrix siMatrix = SiMatrix.getSiMatrix(context); -// MetierDAO metierDao = IsisFishDAOHelper.getMetierDAO(context.getDB()); ZoneDAO zoneDao = IsisFishDAOHelper.getZoneDAO(context.getDB()); MetierSeasonInfoDAO metierSeasonInfoDao = IsisFishDAOHelper.getMetierSeasonInfoDAO(context.getDB()); -// List<Metier> metiers = metierDao.findAll(); List<Month> SaisonFermee = Month.getMonths(param_beginMonth, param_endMonth); List<Cell> maillefermee = param_zone.getCell(); @@ -153,9 +151,7 @@ List<Strategy> listestrategies= region.getStrategy(); List<Metier> metiers = region.getMetier(); -// var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); - for (Metier metier : metiers) { log.info("metier examiné " + metier.getName()); if (param_gear != null && !metier.getGear().equals(param_gear)){ @@ -232,8 +228,6 @@ reportNonActivite(context, listestrategies, metiers, metier, chomageMonth); } else { //on commence par crée les nouvelles saisons -// var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois()); -// var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); saisonmetier.setLastMonth(param_beginMonth.previous()); //on crée un nouveau infoSaisonMetier MetierSeasonInfo NouvelInfoSaison= metierSeasonInfoDao.create(); @@ -284,9 +278,6 @@ } else { //on commence par crée les nouvelles saisons -// var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); -// var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); -// var NouvelleSaison3=new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois().getNumMois()); // saisonmetier.setFirstMonth(param_beginMonth.previous()); //on crée un nouveau infoSaisonMetier @@ -318,420 +309,65 @@ } } - /* - this.p = new Object(); - this.p.paramRegle = this.param; - this.p.tableNonActivite=new Packages.java.util.HashMap(); - this.p.affectNonActivite=false; - - - var enginselectif=this.param.getValue("EnginSelective");//entrez le nom de l'engin fermée ou non si pas de sélection sur engin - var moisDeb=this.param.getValue("moisDeb"); //entrez le mois debut de fermeture - var moisFin=this.param.getValue("moisFin");//entrez le mois de fin de fermeture - - - - var ZoneFermee=this.param.getValue("zone"); - writeln("bla"); - if (enginselectif) {var EnginInterdit=this.param.getValue("engin");} else {var EnginInterdit=MetierFactory.findByNom("nonActivite").getEngin();} - var RegionSimu=ZoneFermee.getRegion(); - var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); - var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); - var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); - var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); - - - - for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ - var metier=imetier.next(); - writeln ("metier examiné "+metier.getNom()); - if ((!metier.getEngin().equals(EnginInterdit)) && enginselectif){ - writeln("l engin du métier n est pas concerné"); - } - else { - writeln("l engin du métier est bien concerné"); - var ListeSaisons = metier.getInfoSaison(); - for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ - var saisonmetier=isaisonmetier.next(); - var maillefermee=ZoneFermee.getMaille(); - var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); - MailleMetier.retainAll(maillefermee); - - if (MailleMetier.size()!=0){ - MailleMetier=saisonmetier.getSecteur().getMaille().copy(); - var saison=saisonmetier.getSaison(); - if (saison.contains(SaisonFermee)){ - writeln("il y a bien intersection entre la zone métier et le cantonnement pour la saison "+saison.toString()); -// calcule de la zone restante: - var ToutFerme=false; - var DebInclus=saison.contains(MoisDeb); - var FinInclus=saison.contains(MoisFin); - MailleMetier.removeAll(maillefermee); - writeln("inter maille:"+MailleMetier.size()); - // test pour savoir si toute la zone de pratique du metier - // (reunion de toutes les zones metiers de metier a date) - // est totalement incluse dans la zone Cantonnement - - if (MailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition - // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement - - ToutFerme=false; - - //creation du nouveau secteur de metier - //on vérifie si le secteur a pas déjà été modifié par une autre règle afin de ne pas avoir de problème d'ID - var ListeSecteur=MetaSecteurFactory.findAllByKey("MetaCantonnement-"+metier.getNom()+saison.toString(), RegionSimu); - if (ListeSecteur.size()!=0){ - var secteurResult = MetaSecteurFactory.create(saisonmetier.getSecteur().getNom()+"Modif", RegionSimu, "Secteur créé durant la simulation."); - } - else{ - var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+metier.getNom()+saison.toString(),RegionSimu, "Secteur créé durant la simulation."); - } - - writeln("nouveau secteur cree:"+secteurResult); - var zonesMetier = saisonmetier.getSecteur().getAllSecteur(); - writeln("zonesMetier:"+zonesMetier); - writeln("zonesMetier.size:"+zonesMetier.size()); - - for(var i=0; i<zonesMetier.size(); i++){ - var zonemet = zonesMetier.get(i); - writeln("zonemet:"+zonemet); - // intersection entre la zeme zone metier a date et zone de Cantonnement - var listemailleszonemetier = zonemet.getMaille().copy(); - var nbMailleZoneMetier = listemailleszonemetier.size(); - writeln("maille metier:"+listemailleszonemetier); - writeln("maille Cantonnement:"+maillefermee); - listemailleszonemetier.removeAll(maillefermee); - if(0==listemailleszonemetier.size()){ - //si completement inclus on le supprime - //donc on ne le met pas dans le nouveau - writeln("on supprime la zone"+zonemet); - } - else if (listemailleszonemetier.size() != nbMailleZoneMetier) { - // si la zone metier n'est pas totalement incluse dans zone de Cantonnement - // on reduit la zeme zone metier de cette intersection - // pas de modif de la matrice de proportion strmet - writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier); - var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+metier.getNom()+"-"+zonemet+saison.toString(), RegionSimu, "Secteur creer durant la simulation."); - simpleSecteur.addAllMaille(listemailleszonemetier); - secteurResult.addSecteur(simpleSecteur); - writeln("apres addSecteur"); - } - else { - //sinon on le met dans le nouveau - writeln("On remet tel quelle la zone:"+zonemet); - secteurResult.addSecteur(zonemet); - } - }// fin du for sur les zone metier de la zone de pratique du metier - } - - else { - var secteurResult=saisonmetier.getSecteur().getAllSecteur(); - writeln("Toute la zone metier est ferme"); - ToutFerme=true; - } - -// 1er cas: la saison métier est identique (ou totalement incluse dans la saison fermée, dans ce cas là, on change juste -// le secteur - if (SaisonFermee.toListMois().containsAll(saison.toListMois())){ - writeln("toute la saison metier est incluse dans la saison de fermeture"); - //si tout est fermé, on met le metier au chômage - - if (ToutFerme==true){ - writeln ("toute la zone est fermée, le metier passe donc à chômage pour cette saison"); - var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); - var ListeMois=saison.toListMois(); - for(var i=0; i<listestrategies.size(); i++){ - var SetOfBateau=listestrategies.get(i).getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - if (MetiersPosibles.contains(metier)){ - for (imois=ListeMois.iterator();imois.hasNext();){ - var mois=imois.next(); - var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); - //this.p.tableNonActivite=Regle_action_lib.reportNonActivite(this.p.tableNonActivite, listestrategies.get(i), metier, mois, InfoMois.getProportionMetier(metier)); - - - -writeln("debut reportNonActivite"); -//on regarde si on a déjà une entrée pour le mois courant -var matNonActiviteMois=table.get(mois); -var nonactivite=matNonActiviteMois!=null; - -if (!nonactivite){ - matNonActiviteMois=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - table.put(mois,matNonActiviteMois); -} - -matNonActiviteMois.setValue(strategie,metier,proportion); -writeln("fin reportNonActivite"); - - - - InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0)); - MetiersInterditsPresimu.put(new Chaine(metier.getNom()+"-"+mois.getNumMois()),true); - } - } - } - } - else { - writeln("tout n'est pas fermée, le secteur de pêche devient "+secteurResult); - var ListeMois=SaisonFermee.toListMois(); - for (imois=ListeMois.iterator();imois.hasNext();){ - mois=imois.next(); - metier.setSecteurMois(secteurResult, mois); - } - } - } - -// 2ème cas de figure: moisDeb est inclus mais pas moisFin (ou alors c'est le dernier mois) - else if (DebInclus && ((!FinInclus) || moisFin==saison.getLastMois().getNumMois())){ - writeln ("il y a intersection de la saison de fermeture avec la saison métier de "+moisDeb+" à "+saison.getLastMois().getNumMois()); - //si tout est fermé on met les proportions à 0 pour les mois fermes - if (ToutFerme==true){ - writeln ("toute la zone métier est fermée"); - var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); - var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois()); - writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage"); - for(var i=0; i<listestrategies.size(); i++){ - var SetOfBateau=listestrategies.get(i).getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - if (MetiersPosibles.contains(metier)){ - for (imois=ListeMois.iterator();imois.hasNext();){ - var mois=imois.next(); - var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); - //this.p.tableNonActivite=Regle_action_lib.reportNonActivite(this.p.tableNonActivite, listestrategies.get(i), metier, mois, InfoMois.getProportionMetier(metier)); - - - -writeln("debut reportNonActivite"); -//on regarde si on a déjà une entrée pour le mois courant -var matNonActiviteMois=table.get(mois); -var nonactivite=matNonActiviteMois!=null; - -if (!nonactivite){ - matNonActiviteMois=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - table.put(mois,matNonActiviteMois); -} - -matNonActiviteMois.setValue(strategie,metier,proportion); -writeln("fin reportNonActivite"); - - - - - InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0)); - MetiersInterditsPresimu.put(new Chaine(metier.getNom()+"-"+mois.getNumMois()),true); - } - } - } - } - else { - //on commence par crée les nouvelles saisons - var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois()); - var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); - saisonmetier.setSaison(NouvelleSaison1); - //on crée un nouveau infoSaisonMetier - var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison crée pendant la simulation") ; - metier.addInfoSaison(NouvelInfoSaison); - writeln ("de "+saison.getFirstMois().getNumMois()+" à "+moisDeb-1+" le metier peche en "+saisonmetier.getSecteur()); - writeln ("de "+moisDeb+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+secteurResult); - } - } -// 3ème cas de figure: moisFin est inclus mais pas moisDeb (ou alors il est égal au premier mois) - else if (((!DebInclus) || moisDeb==saison.getFirstMois().getNumMois()) && FinInclus){ - writeln ("il y a intersection de la saison de fermeture avec la saison métier de "+moisDeb+" à "+saison.getLastMois().getNumMois()); - //si tout est fermé on met les proportions à 0 pour les mois fermes - if (ToutFerme==true){ - writeln ("toute la zone est fermee"); - var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); - var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois()); - writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage"); - for(var i=0; i<listestrategies.size(); i++){ - var SetOfBateau=listestrategies.get(i).getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - if (MetiersPosibles.contains(metier) ){ - for (imois=ListeMois.iterator();imois.hasNext();){ - var mois=imois.next(); - var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); - //this.p.tableNonActivite=Regle_action_lib.reportNonActivite(this.p.tableNonActivite, listestrategies.get(i), metier, mois, InfoMois.getProportionMetier(metier)); - - -writeln("debut reportNonActivite"); -//on regarde si on a déjà une entrée pour le mois courant -var matNonActiviteMois=table.get(mois); -var nonactivite=matNonActiviteMois!=null; - -if (!nonactivite){ - matNonActiviteMois=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - table.put(mois,matNonActiviteMois); -} - -matNonActiviteMois.setValue(strategie,metier,proportion); -writeln("fin reportNonActivite"); - - - - - InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0)); - MetiersInterditsPresimu.put(new Chaine(metier.getNom()+"-"+mois.getNumMois()),true); - } - } - } - } - else { - //on commence par crée les nouvelles saisons - var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisFin); - var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois.getNumMois()); - saisonmetier.setSaison(NouvelleSaison2); - //on crée un nouveau infoSaisonMetier - var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison1, secteurResult, "saison crée pendant la simulation") ; - metier.addInfoSaison(NouvelInfoSaison); - writeln ("de "+saison.getFirstMois().getNumMois()+" à "+moisFin+" le metier peche en "+secteurResult); - writeln ("de "+moisFin+1+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur()); - } - } - -// dernier cas de figure: les deux sont inclus et sont différents des bornes - else { - //si tout est fermé on met les proportions à 0 pour les mois fermes - if (ToutFerme==true){ - writeln("toute la zone métier est fermée"); - var listestrategies=StrategyFactory.findAllByRegion(metier.getRegion()); - var ListeMois=SaisonFermee.toListMois(); - writeln("le métier passe à chômage de "+moisDeb+" à "+moidFin); - for(var i=0; i<listestrategies.size(); i++){ - var SetOfBateau=listestrategies.get(i).getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - if (MetiersPosibles.contains(metier) ){ - for (imois=ListeMois.iterator();imois.hasNext();){ - var mois=imois.next(); - var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); - //this.p.tableNonActivite=Regle_action_lib.reportNonActivite(this.p.tableNonActivite, listestrategies.get(i), metier, mois, InfoMois.getProportionMetier(metier)); - - -writeln("debut reportNonActivite"); -//on regarde si on a déjà une entrée pour le mois courant -var matNonActiviteMois=table.get(mois); -var nonactivite=matNonActiviteMois!=null; - -if (!nonactivite){ - matNonActiviteMois=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - table.put(mois,matNonActiviteMois); -} - -matNonActiviteMois.setValue(strategie,metier,proportion); -writeln("fin reportNonActivite"); - - - - InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0)); - MetiersInterditsPresimu.put(new Chaine(metier.getNom()+"-"+mois.getNumMois()),true); - } - } - } - } - else { - //on commence par crée les nouvelles saisons - var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); - var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); - var NouvelleSaison3=new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois().getNumMois()); - saisonmetier.setSaison(NouvelleSaison1); - //on crée 2 nouveau infoSaisonMetier - var NouvelInfoSaison2=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison crée pendant la simulation") ; - var NouvelInfoSaison3=InfoSaisonMetierFactory.create(metier, NouvelleSaison3, saisonmetier.getSecteur(), "saison crée pendant la simulation") ; - metier.addInfoSaison(NouvelInfoSaison2); - metier.addInfoSaison(NouvelInfoSaison3); - writeln ("de "+saison.getFirstMois().getNumMois()+" à "+(moisDeb-1)+" le metier peche en "+saisonmetier.getSecteur()); - writeln ("de "+moisDeb+" à "+moisFin+" le metier peche en "+secteurResult); - writeln ("de "+(moisFin+1)+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur()); - } - } - } - } - } - } - } - */ + } /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { boolean result = false; - MatrixND mat = tableNonActivite.get(date.getMonth()); + MatrixND mat = tableNonActivite.get(step.getMonth()); if (mat != null && affectNonActivite == false) { result = true; } return result; // fin - - /* - var mat=p.tableNonActivite.get(p.date.getMois()); - writeln(p.affectNonActivite); - if(oldValue != undefined) - return oldValue; - else if (mat!=null && p.affectNonActivite==false){ - return true; - } - else {return false;} - */ } /** - * Si la condition est vrai alors cette action est executée avant le pas + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // on ne doit le faire qu'une seul fois quelque soit le nombre de metier affectNonActivite=true; - MatrixND mat = tableNonActivite.get(date.getMonth()); + MatrixND mat = tableNonActivite.get(step.getMonth()); MetierMonitor metierMon = context.getMetierMonitor(); - MatrixND noActivity = metierMon.getNoActivity(date); + MatrixND noActivity = metierMon.getNoActivity(step); if (noActivity == null){ - metierMon.setNoActivity(date, mat.copy()); + metierMon.setNoActivity(step, mat.copy()); } else{ noActivity = noActivity.add(mat); } - - /* - p.affectNonActivite=true; -var mat=p.tableNonActivite.get(p.date.getMois()); -var matNonActivite=nonActivite.get(p.date); -var nonactivite=matNonActivite!=null; -if (!nonactivite){ - nonActivite.put(p.date,mat); -} -else{ - matNonActivite=matNonActivite.add(mat); -} -return p.gestionMetier; - - */ } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { affectNonActivite = false; - - /* - p.affectNonActivite=false; -return p.gestionMetier; - */ } } Modified: isis-fish/trunk/src/test/resources/test-database/rules/ChangementParamControlablePresimu.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/ChangementParamControlablePresimu.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/ChangementParamControlablePresimu.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -49,7 +46,7 @@ import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.util.Doc; @@ -87,6 +84,7 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -95,6 +93,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { return _("Change gear parameter value for all metier with this gear"); } @@ -104,6 +103,7 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { SiMatrix siMatrix = SiMatrix.getSiMatrix(context); @@ -214,137 +214,45 @@ // fin de la methode - /* -this.p = new Object(); -this.p.paramRegle = this.param; - - -//attention: cette règle de gestion ne fonctionne que si le changement a lieu pour toutes -//les années de simulation - - -var zoneselective=this.param.getValue("ZoneSelective"); //entrez le nom de la zone concernée, non si pas de sélection sur zone -var moisDeb=this.param.getValue("moisDeb"); //entrez le mois debut de fermeture -var moisFin=this.param.getValue("moisFin");//entrez le mois de fin de fermeture -var nouvelleValeurParam=this.param.getValue("nouvelleValeurParam");//entrez la valeur du paramètre contrôlable - - -if (zoneselective!="non") { - var ZoneFermee=this.param.getValue("zone"); -} -var EnginInterdit=this.param.getValue("engin"); -writeln("nom de l'engin interdit "+EnginInterdit.getNom()); -var RegionSimu=EnginInterdit.getRegion(); -var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); -var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); -var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); -var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); - - - - -for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ - var metier=imetier.next(); - writeln ("metier examiné "+metier.getNom()+"son engin "+metier.getEngin().getNom()); - if (!metier.getEngin().equals(EnginInterdit)){ - writeln("l engin du métier n est pas concerné"); + } - else { - writeln("l engin du métier est bien concerné"); - if (zoneselective==false && moisDeb==0 && moisFin==11){ - //aucun critère spatio-temporel il suffit donc de mettre - //le param controlable à la nouvelle valeur - metier.setValeurParamControlable(nouvelleValeurParam); - writeln("aucune spatialisation ni saisonnalité, on passe le Param Controlable a "+nouvelleValeurParam); - } - else { - var ListeSaisons = metier.getInfoSaison(); - for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ - var saisonmetier=isaisonmetier.next(); - var saison=saisonmetier.getSaison(); - var taille=0; - if (zoneselective){ - var maillefermee=ZoneFermee.getMaille(); - var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); - MailleMetier.retainAll(maillefermee); - taille=MailleMetier.size(); - } - else { - writeln ("pas de sélection de zone, toute la zone d'étude est donc concernée"); - } - if (zoneselective==false || taille!=0){ - if (saison.contains(SaisonFermee)){ - writeln ("il y a intersection de la zone metier au cours de la saison"+saison.toString()); - var moisconcerne=saison.copy().toListMois(); - moisconcerne.retainAll(SaisonFermee.toListMois()); - var NouveauMetier=MetierFactory.create(metier.getNom()+" Mois "+moisconcerne.get(0).getNumMois()+" a "+moisconcerne.get(moisconcerne.size()-1).getNumMois()+" ValeurParam "+nouvelleValeurParam, RegionSimu, EnginInterdit,nouvelleValeurParam, "métier créé pendant la simu pour le changement de paramètre contrôlable"); - for (var iinfsais=metier.getInfoSaison().iterator();iinfsais.hasNext();){ - var infsais=iinfsais.next(); - var sais=infsais.getSaison(); - var NouveauInfoSaison=InfoSaisonMetierFactory.create(NouveauMetier, sais, infsais.getSecteur(), "créé durant la simulation") - NouveauMetier.addInfoSaison(NouveauInfoSaison); - } - - //On ajoute aux strategies qui pratiquent le métier le nouveau métier - var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); - for(var i=0; i<listestrategies.size(); i++){ - var strategie=listestrategies.get(i); - var SetOfBateau=strategie.getSetOfVessels(); - var MetiersPosibles=SetOfBateau.getMetiers(); - if (MetiersPosibles.contains(metier)){ - var AncienEffort=SetOfBateau.getEffort(metier); - var DescriptionEffort=EffortDescriptionFactory.create(NouveauMetier, SetOfBateau, AncienEffort.getFishingOperation(), AncienEffort.getFishingOperationDuration(), AncienEffort.getGearsNumberPerOperation(), AncienEffort.getCrewSize(), AncienEffort.getUnitCostOfFishing(), AncienEffort.getFixedCrewSalary(), AncienEffort.getCrewShareRate(), AncienEffort.getCrewFoodCost(), AncienEffort.getRepairAndMaintenanceGearCost(), AncienEffort.getLandingCosts(), AncienEffort.getOtherRunningCosts(), "effort description créé durant la simulation"); - - SetOfBateau.addPossibleMetiers(DescriptionEffort); - - //on a ajouté le nouveau métier au set of vessels, maintenant, on va reporté l'effort du métier ancien vers le nouveau pour les mois concernés - for (var intmois=0; intmois<=11;intmois++){ - var mois=new Packages.fr.ifremer.nodb.Mois(intmois); - var PropStratMois=strategie.getStrategyMonthInfo(mois); - var NouveauStrMet=PropStrMetFactory.create(PropStratMois, NouveauMetier, 0, "créé durant la simulation"); - PropStratMois.addPropStrMet(NouveauStrMet); - if (moisconcerne.contains(mois) && PropStratMois.getProportionMetier(metier)!=0){ - //on créé un nouveau PropStrMet - writeln ("la stratégie "+strategie.getName()+" pratique bien le metier "+metier.getNom()+" au mois "+mois.getNumMois()); - PropStratMois.setProportionMetier(NouveauMetier,new Packages.java.lang.Float(PropStratMois.getProportionMetier(metier))); - PropStratMois.setProportionMetier(metier,new Packages.java.lang.Float(0)); - } - } - } - } - } - } - } - } - } -} - */ - } /** * La condition qui doit etre vrai pour faire les actions. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { return false; } /** - * Si la condition est vrai alors cette action est executée avant le pas. + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // nothing } /** - * Si la condition est vrai alors cette action est executée apres le pas. + * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // nothing } Modified: isis-fish/trunk/src/test/resources/test-database/rules/EffortReduction.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/EffortReduction.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/EffortReduction.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -22,142 +19,146 @@ * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ -package rules; - -import static org.nuiton.i18n.I18n._; - -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import scripts.SiMatrix; -import fr.ifremer.isisfish.entities.Metier; -import fr.ifremer.isisfish.entities.Strategy; -import fr.ifremer.isisfish.rule.AbstractRule; -import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; -import fr.ifremer.isisfish.util.Doc; - -/** - * EffortReduction.java - * - * Created: 3 septembre 2008 - * - * @author anonymous <anonymous at labs.libre-entreprise.org> - * @version $Revision$ - */ -public class EffortReduction extends AbstractRule { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory.getLog(EffortReduction.class); - - @Doc("Begin date") - public Date param_beginDate = new Date(0); - @Doc("End date") - public Date param_endDate = new Date(59); - - @Doc("Pourcentage de reduction d effort applique.") - public double param_PercentReduction = 0.5; - - boolean first = true; - - protected String[] necessaryResult = {}; - - /** - * @return the necessaryResult - */ - public String[] getNecessaryResult() { - return this.necessaryResult; - } - - /** - * Permet d'afficher a l'utilisateur une aide sur la regle. - * @return L'aide ou la description de la regle - */ - public String getDescription() { - return _("Reduce monthly effort of each strategy of the percent indicated"); - } - - /** - * Appele au demarrage de la simulation, cette methode permet d'initialiser - * des valeurs. - * @param context La simulation pour lequel on utilise cette regle - */ - public void init(SimulationContext context) throws Exception { - } - - /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle - * @return vrai si on souhaite que les actions soit faites - */ - public boolean condition(SimulationContext context, Date date, Metier metier) - throws Exception { - - boolean result = true; - if (date.before(param_beginDate)) { - result = false; - } else if (date.after(param_endDate)) { - result = false; - } - if (result) - System.out.println("condition vraie"); - return result; - } - - /** - * Si la condition est vrai alors cette action est executee avant le pas - * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle - */ - public void preAction(SimulationContext context, Date date, Metier metier) - throws Exception { - // shinte la boucle metier - if (first) { - first = false; - SiMatrix siMatrix = SiMatrix.getSiMatrix(context); - List<Strategy> strs = siMatrix.getStrategies(date); - for (Strategy str : strs) { - System.out.println("strategy evaluee : " + str.getName()); - - /* Dans un premiere temps tant que l inactivit? est un entier on utilise - * la proportion du nombre de bateaux de la strategie pour reduire l effort - * ce qu on ferait aussi pour une mesure de reduction du nombre de bateaux mais - * comme actuellement on ne tient pas compte de l economie... ca revient au meme - * En fait passer par l inactivit? n est pas la meilleure facon de modifier - * l effort le mieux serait d agir sur un autre coeff qui est multipli? a - * l effort (Fstd ou ciblage) car comme ca le code serait generique mais on - * ne verrait pas que l effort nominal est modifi?... - */ - - double propOld = str.getProportionSetOfVessels(); - double newProp = propOld * (1 - param_PercentReduction); - str.setProportionSetOfVessels(newProp); - - /* int Inact = str.getStrategyMonthInfo(date.getMonth()).getMinInactivityDays(); - System.out.println("inactivity old = "+ Inact); - int nbDays = date.getMonth().getNumbersOfDays(); - System.out.println("nbDays = "+nbDays); - double newInact = nbDays-((nbDays-Inact)*(1-param_PercentReduction)); - System.out.println("newInact = "+newInact); - int ni = (int) newInact ; - System.out.println("ni = "+ ni); - str.getStrategyMonthInfo(date.getMonth()).setMinInactivityDays(ni); - System.out.println("setMinInactivityDays : " + str.getStrategyMonthInfo(date.getMonth()).getMinInactivityDays()); - */ - } - } - } - - /** - * Si la condition est vrai alors cette action est executee apres le pas - * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle - */ - public void postAction(SimulationContext context, Date date, Metier metier) - throws Exception { - first = true; - } - -} +package rules; + +import static org.nuiton.i18n.I18n._; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import scripts.SiMatrix; +import fr.ifremer.isisfish.entities.Metier; +import fr.ifremer.isisfish.entities.Strategy; +import fr.ifremer.isisfish.rule.AbstractRule; +import fr.ifremer.isisfish.simulator.SimulationContext; +import fr.ifremer.isisfish.types.TimeStep; +import fr.ifremer.isisfish.util.Doc; + +/** + * EffortReduction.java + * + * Created: 3 septembre 2008 + * + * @author anonymous <anonymous at labs.libre-entreprise.org> + * @version $Revision$ + */ +public class EffortReduction extends AbstractRule { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Log log = LogFactory.getLog(EffortReduction.class); + + @Doc("Begin step") + public TimeStep param_beginStep = new TimeStep(0); + @Doc("End step") + public TimeStep param_endStep = new TimeStep(59); + + @Doc("Pourcentage de reduction d effort applique.") + public double param_PercentReduction = 0.5; + + boolean first = true; + + protected String[] necessaryResult = {}; + + /** + * @return the necessaryResult + */ + @Override + public String[] getNecessaryResult() { + return this.necessaryResult; + } + + /** + * Permet d'afficher a l'utilisateur une aide sur la regle. + * @return L'aide ou la description de la regle + */ + @Override + public String getDescription() { + return _("Reduce monthly effort of each strategy of the percent indicated"); + } + + /** + * Appele au demarrage de la simulation, cette methode permet d'initialiser + * des valeurs. + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void init(SimulationContext context) throws Exception { + } + + /** + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + * @return vrai si on souhaite que les actions soit faites + */ + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + + boolean result = true; + if (step.before(param_beginStep)) { + result = false; + } else if (step.after(param_endStep)) { + result = false; + } + if (result) { + log.info("condition vraie"); + } + return result; + } + + /** + * Si la condition est vrai alors cette action est executee avant le pas + * de temps de la simulation. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + */ + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + // shinte la boucle metier + if (first) { + first = false; + SiMatrix siMatrix = SiMatrix.getSiMatrix(context); + List<Strategy> strs = siMatrix.getStrategies(step); + for (Strategy str : strs) { + log.info("strategy evaluee : " + str.getName()); + + /* Dans un premiere temps tant que l inactivité est un entier on utilise + * la proportion du nombre de bateaux de la strategie pour reduire l effort + * ce qu on ferait aussi pour une mesure de reduction du nombre de bateaux mais + * comme actuellement on ne tient pas compte de l economie... ca revient au meme + * En fait passer par l inactivité n est pas la meilleure facon de modifier + * l effort le mieux serait d agir sur un autre coeff qui est multiplié a + * l effort (Fstd ou ciblage) car comme ca le code serait generique mais on + * ne verrait pas que l effort nominal est modifié... + */ + + double propOld = str.getProportionSetOfVessels(); + double newProp = propOld * (1 - param_PercentReduction); + str.setProportionSetOfVessels(newProp); + } + } + } + + /** + * Si la condition est vrai alors cette action est executée apres le pas + * de temps de la simulation. + * + * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + */ + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + first = true; + } + +} Modified: isis-fish/trunk/src/test/resources/test-database/rules/GraviteVPUE1.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/GraviteVPUE1.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/GraviteVPUE1.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -39,7 +36,7 @@ import org.nuiton.math.matrix.*; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; @@ -79,6 +76,7 @@ }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -87,6 +85,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { return _("Calcule les proportion par métier chaque mois en fonction de la VPUE du métier l'année précédante"); /*"HYPOTHESES GRAVITE" @@ -104,6 +103,7 @@ * function used to initialise MatrixND to NaN double */ private MapFunction nanFunction = new MapFunction() { + @Override public double apply(double value) { return Double.NaN; } @@ -114,11 +114,12 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { - Date date = new Date(0); + TimeStep step = new TimeStep(0); - List<Strategy> strs = SiMatrix.getSiMatrix(context).getStrategies(date); - List<Metier> metiers = SiMatrix.getSiMatrix(context).getMetiers(date); + List<Strategy> strs = SiMatrix.getSiMatrix(context).getStrategies(step); + List<Metier> metiers = SiMatrix.getSiMatrix(context).getMetiers(step); List<Month> months = Arrays.asList(Month.MONTH); SommePropInitial = MatrixFactory.getInstance().create( @@ -133,7 +134,7 @@ for (Strategy str : strs) { List<Metier> strMetiers = SiMatrix.getSiMatrix(context).getMetiers( - str, date); + str, step); List<StrategyMonthInfo> infos = str.getStrategyMonthInfo(); for (StrategyMonthInfo info : infos) { double somme = 0; @@ -149,36 +150,43 @@ } /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { // Il faut etre au moins au deuxieme pas de temps. - return date.getYear() > 0; + return step.getYear() > 0; } // Booleen permettant que ne boucler que sur un seul metier dans la preaction : boolean first = true; /** - * Si la condition est vrai alors cette action est executée avant le pas + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { if (log.isDebugEnabled()) { - log.debug("first = " + first + "date:" + date); + log.debug("first = " + first + "step:" + step); } - System.out.println("first = " + first - + " ,on passe dans la preaction ?"); + //log.info("first = " + first + " ,on passe dans la preaction ?"); if (first) { // on passe dans preaction pour la premiere fois - System.out.println("Oui, preaction : "); + //log.info("Oui, preaction : "); List<Strategy> strs = SiMatrix.getSiMatrix(context).getStrategies( - date); + step); //List<Population> populations = SiMatrix.getSiMatrix(context) // .getPopulations(date); ResultStorage resultmanager = context.getSimulationStorage() @@ -188,19 +196,17 @@ //Calcul de l effort nominal par strategy met MatrixND EffortNominalPerStrMet = null; - EffortNominalPerStrMet = resultmanager.getMatrix(date - .previousYear(), + EffortNominalPerStrMet = resultmanager.getMatrix(step.previousYear(), ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET); - System.out.println("EffortNominalPerStrMet calculee " - + EffortNominalPerStrMet); + //System.out.println("EffortNominalPerStrMet calculee " + // + EffortNominalPerStrMet); //on commence par creer une matrice de valeurs (somme sur ttes les especes capturees) par strategie met MatrixND GrossValuePerStrMet = null; - GrossValuePerStrMet = resultmanager.getMatrix(date.previousYear(), + GrossValuePerStrMet = resultmanager.getMatrix(step.previousYear(), ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET); - System.out.println("GrossValuePerStrMet calculee " - + GrossValuePerStrMet); + //System.out.println("GrossValuePerStrMet calculee " + GrossValuePerStrMet); //ajouter pour tous les métiers les valeurs liées qux autres espèces calculées par modele lineaire @@ -208,12 +214,9 @@ valuePerUnitOfEffort.map(nanFunction); //réinitialisation avant calcul pour date for (Strategy str : strs) { - System.out - .println("INFO: Boucle creation valuePerUnitEffort : " - + str.getName()); - // log.info("Boucle creation catchperuniteffort : "+ str.getName()); - StrategyMonthInfo smi = str.getStrategyMonthInfo(date - .getMonth()); + //log.info("INFO: Boucle creation valuePerUnitEffort : " + str.getName()); + // log.info("Boucle creation catchperuniteffort : "+ str.getName()); + StrategyMonthInfo smi = str.getStrategyMonthInfo(step.getMonth()); Collection<EffortDescription> strMet = str.getSetOfVessels() .getPossibleMetiers(); //SiMatrix.getSiMatrix(context).getMetiers(str, date); @@ -223,8 +226,8 @@ double somme = 0;//initialisation de la somme des VPUE des metiers de la strategie for (EffortDescription ed : strMet) { Metier strMetier = ed.getPossibleMetiers(); - System.out.println("Pour str=" + str.getName() - + " et metier=" + strMetier.getName()); + //log.info("Pour str=" + str.getName() + // + " et metier=" + strMetier.getName()); double effort = EffortNominalPerStrMet.getValue(str, strMetier); // on teste effort pour le calcul des VPUE @@ -236,55 +239,54 @@ //on recupere la capture tot double value = GrossValuePerStrMet.getValue(str, strMetier); - System.out.println("DEBUG: value : " + value); - System.out.println("DEBUG: effort : " + effort); + //log.debug("DEBUG: value : " + value); + //log.debug("DEBUG: effort : " + effort); double vpue = value / effort; valuePerUnitOfEffort.setValue(str, strMetier, vpue); - System.out.println("value/effort= " + vpue); + //log.info("value/effort= " + vpue); somme += value / effort; } else if ((effort == 0) & (smi.getProportionMetier(strMetier) == 0)) {// n'a jamais pêche avec ce metier valuePerUnitOfEffort.setValue(str, strMetier, 0); - System.out.println("n'a jamais pêche avec ce metier"); + //log.info("n'a jamais pêche avec ce metier"); } else {// n'a pas peche au mois, annee -1, mais avait une prop d'effort non nul a l'annee=0 testCondition = true;// ie somme est incomplète mais pas grave car on mettra PropInitiale à tous les metiers - System.out.println("n'a pas peche au mois, annee -1, mais avait une prop d'effort non nul a l'annee=0"); + //log.info("n'a pas peche au mois, annee -1, mais avait une prop d'effort non nul a l'annee=0"); } } - System.out.println("testCondition pour str" + str.getName() - + ":" + testCondition); + //log.info("testCondition pour str" + str.getName() + // + ":" + testCondition); // A partir des VPUE stockees dans valuePerUnitOfEffort, on calcule la gravité double newProp = 0; - System.out - .println("A partir des VPUE stockees dans valuePerUnitOfEffort, on calcule la gravité"); + //log.info("A partir des VPUE stockees dans valuePerUnitOfEffort, on calcule la gravité"); if (!testCondition) { double SommeVPUEstrat = somme; - System.out.println("SommeVPUEstrat=" + SommeVPUEstrat); + //System.out.println("SommeVPUEstrat=" + SommeVPUEstrat); for (EffortDescription ed : strMet) { Metier strMetier = ed.getPossibleMetiers(); - System.out.println("PropStrInitiale(metier=" - + strMetier.getName() + ")" - + smi.getProportionMetier(strMetier)); - System.out.println("SommePropInitial.getValue(str, date.getMonth()=" - + SommePropInitial.getValue(str, date - .getMonth())); - System.out.println("valuePerUnitOfEffort.getValue(str, strMetier)" - + valuePerUnitOfEffort.getValue(str, - strMetier)); + //System.out.println("PropStrInitiale(metier=" + // + strMetier.getName() + ")" + // + smi.getProportionMetier(strMetier)); + //System.out.println("SommePropInitial.getValue(str, date.getMonth()=" + // + SommePropInitial.getValue(str, date + // .getMonth())); + //System.out.println("valuePerUnitOfEffort.getValue(str, strMetier)" + // + valuePerUnitOfEffort.getValue(str, + // strMetier)); if (SommeVPUEstrat == 0) { newProp = 0; } else { - newProp = SommePropInitial.getValue(str, date + newProp = SommePropInitial.getValue(str, step .getMonth()) * valuePerUnitOfEffort.getValue(str, strMetier) / SommeVPUEstrat; } - System.out.println("newProp(metier=" - + strMetier.getName() + ")" + newProp); + //System.out.println("newProp(metier=" + // + strMetier.getName() + ")" + newProp); smi.setProportionMetier(strMetier, newProp); - System.out.println("PropStrNouvelle(metier=" - + strMetier.getName() + ")" - + smi.getProportionMetier(strMetier)); + //System.out.println("PropStrNouvelle(metier=" + // + strMetier.getName() + ")" + // + smi.getProportionMetier(strMetier)); } } // else ie on met propInitiale dans PropStr(str,annee,mois) @@ -306,9 +308,13 @@ /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { first = true; } Modified: isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEngin.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEngin.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEngin.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -40,7 +37,7 @@ import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; @@ -66,9 +63,9 @@ @Doc(value="Prohibited gear") public Gear param_gear = null; @Doc(value="Begin date") - public Date param_beginDate = new Date(0); + public TimeStep param_beginStep = new TimeStep(0); @Doc(value="End date") - public Date param_endDate = new Date(119); + public TimeStep param_endStep = new TimeStep(119); @Doc(value="Begin month") public Month param_beginMonth = Month.JANUARY; @Doc(value="do the doc of param endMonth") @@ -81,6 +78,7 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -89,6 +87,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { // interdiction des metiers utilisant cet engin return _("Prohibited gear"); @@ -99,28 +98,33 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { // nothing } /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { log.info("condition fermeture zone"); boolean result = true; - Month mois = date.getMonth(); + Month mois = step.getMonth(); log.info("mois:" + mois); - if(!(param_beginMonth.getMonthNumber()<=mois.getMonthNumber() - && mois.getMonthNumber()<=param_endMonth.getMonthNumber())) { + if (!(param_beginMonth.getMonthNumber() <= mois.getMonthNumber() + && mois.getMonthNumber() <= param_endMonth.getMonthNumber())) { result = false; } else { log.info("on est dans l'espace des mois possible"); - if(date.before(param_beginDate)) { + if (step.before(param_beginStep)) { result = false; - } else if(date.after(param_endDate)) { + } else if (step.after(param_endStep)) { result = false; } else if (!metier.getGear().equals(param_gear)) { result = false; @@ -129,34 +133,18 @@ return result; // fin condition - - /* -writeln("condition fermeture zone"); -var result=true; -var mois = p.date.getMois().getNumMois(); -writeln("mois:"+mois); -if(!(p.moisDeb<=mois && mois<=p.moisFin)) - return false; -writeln("on est dans l'espace des mois possible"); -//on est dans l'espace des mois possible -if(p.date.before(p.dateDeb)) - return false; -if(p.date.after(p.dateFin)) - return false; -if (!p.metier.getEngin().equals(p.engin)) - return false; - - -return result; -*/ } /** - * Si la condition est vrai alors cette action est executée avant le pas + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { log.info("le metier vise par l'interdiction : " + metier); MetierMonitor metierMon = context.getMetierMonitor(); @@ -164,18 +152,18 @@ // récupère toutes les stratégies pratiquant le métier et pour lesquelles la proportion !=0 SiMatrix siMatrix = SiMatrix.getSiMatrix(context); - List<Strategy> strs = siMatrix.getStrategies(date); + List<Strategy> strs = siMatrix.getStrategies(step); List<Strategy> ListeStrat = new ArrayList<Strategy>(); for (Strategy str : strs) { - double prop = str.getStrategyMonthInfo(date.getMonth()).getProportionMetier(metier); + double prop = str.getStrategyMonthInfo(step.getMonth()).getProportionMetier(metier); if (prop != 0) { ListeStrat.add(str); } } for (Strategy Strat : ListeStrat) { - StrategyMonthInfo StratMonthInfo = Strat.getStrategyMonthInfo(date.getMonth()); + StrategyMonthInfo StratMonthInfo = Strat.getStrategyMonthInfo(step.getMonth()); // 1er cas:l'effort est reporte sur un metier de la meme strategie, // n'ayant pas l'espece comme capture principale et pechant avec le meme engin @@ -184,12 +172,12 @@ // on verifie que les metiers sont bien pratiques au mois courant, // qu'ils n'ont pas le meme engin et qu'ils ne sont pas // interdits par ailleurs - for (Iterator<EffortDescription> effort = MetiersPossibles.iterator(); effort.hasNext();) { + for (Iterator<EffortDescription> effort = MetiersPossibles.iterator();effort.hasNext();) { Metier met = effort.next().getPossibleMetiers(); if (StratMonthInfo.getProportionMetier(met) == 0 || met.getGear().equals(metier.getGear()) || met.getName().equalsIgnoreCase("nonActivite") - || metierMon.isForbidden(metier, date.getMonth())){ + || metierMon.isForbidden(metier, step.getMonth())){ effort.remove(); } } @@ -209,91 +197,29 @@ } // s'il n'y a pas de metier alternatif, on passe a nonActivite else { - MatrixND matNonActivite = metierMon.getOrCreateNoActivity(date, + MatrixND matNonActivite = metierMon.getOrCreateNoActivity(step, ResultName.MATRIX_NO_ACTIVITY, - siMatrix.getStrategies(date), - siMatrix.getMetiers(date)); - matNonActivite.setValue(Strat, metier, StratMonthInfo.getProportionMetier(metier)); + siMatrix.getStrategies(step), + siMatrix.getMetiers(step)); + matNonActivite.setValue(Strat, metier, + StratMonthInfo.getProportionMetier(metier)); StratMonthInfo.setProportionMetier(metier,0); } } // fin methode - - /* -var Chaine=Packages.java.lang.String; -writeln("Action avant"); -var metier=p.metier; -writeln("le metier vise par l'interdiction : "+metier); - - -MetiersInterdits.put(new Chaine(p.metier.getNom(),true)); -//récupère toutes les stratégies pratiquant le métier et pour lesquelles la proportion !=0 -var ListeStrat=new Packages.org.nuiton.dbobject.DBCollection(StrategyFactory); -var Vessels=SetOfVesselsFactory.findAllByRegion(p.metier.getRegion()); -for (var ves=0; ves<Vessels.size();ves++){ - if (Vessels.get(ves).getMetiers().contains(p.metier)){ - var listestrattemp=StrategyFactory.findAllBySetOfVessels(Vessels.get(ves)).copy(); - for (var strat=0;strat<listestrattemp.size();strat++){ - var proportion=listestrattemp.get(strat).getStrategyMonthInfo(p.date.getMois()).getProportionMetier(p.metier) //on recupere la proportion d'effort attribue au metier - if (proportion!=0){ - listestrattemp.removeAll(ListeStrat); - ListeStrat.addAll(listestrattemp);//permet d'obtenir une liste sans doublon - } - } - } -} - - - -for (iStrat=ListeStrat.iterator();iStrat.hasNext();){ - var Strat=iStrat.next(); - var StratMonthInfo=Strat.getStrategyMonthInfo(p.date.getMois()); - //1er cas:l'effort est reporte sur un metier de la meme strategie, n'ayant pas l'espece comme capture principale et pechant avec le meme engin - var MetiersPossibles=Strat.getSetOfVessels().getMetiers().copy(); - - //on verifie que les metiers sont bien pratiques au mois courant, qu'ils n'ont pas le meme ont le meme engin et qu'ils ne sont pas interdits par ailleurs - for (var imet=MetiersPossibles.iterator();imet.hasNext();){ - var met=imet.next(); - if (StratMonthInfo.getProportionMetier(met)==0 || met.getEngin().equals(p.metier.getEngin()) || met.getNom()=="nonActivite" || MetiersInterdits.containsKey(new Chaine(met.getNom())) || MetiersInterditsPresimu.containsKey(new Chaine(met.getNom()+"-"+p.date.getMois().getNumMois()))){ - MetiersPossibles.remove(met); - } - } - - //on repartit maintenant l'effort entre les differents metiers possibles dans la meme strategie si un metier possible existe bien - if (MetiersPossibles.size()!=0){ - var NbMetier=MetiersPossibles.size(); - for (imet=MetiersPossibles.iterator();imet.hasNext();){ - met=imet.next(); - var NouvelleProportion=StratMonthInfo.getProportionMetier(met)+(StratMonthInfo.getProportionMetier(p.metier)/NbMetier); - StratMonthInfo.setProportionMetier(met, new Packages.java.lang.Float(NouvelleProportion)) - } - StratMonthInfo.setProportionMetier(p.metier, new Packages.java.lang.Float(0)) //le metier vise a alors une proportion nulle - } -//s'il n'y a pas de metier alternatif, on passe a nonActivite - else{ - var matNonActivite=nonActivite.get(p.date); - var nonactivite=matNonActivite!=null; - if (!nonactivite){ - matNonActivite=MatrixFactory.create("nonActivite",new Array(SiMatrice.getListStrategies(),SiMatrice.getListMetiers()) - ,new Array("Strategies", "Metiers")); - nonActivite.put(p.date,matNonActivite); - } - - matNonActivite.setValue(Strat,p.metier,InfoMois.getProportionMetier(p.metier)); - StratMonthInfo.setProportionMetier(p.metier,new Packages.java.lang.Float(0)); - } -} -return p.gestionMetier; -*/ } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // nothing } Modified: isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEnginPreSimu.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEnginPreSimu.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/InterdictionEnginPreSimu.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -42,7 +39,7 @@ import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; @@ -83,6 +80,7 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -91,6 +89,7 @@ * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { return _("Prohibited gear"); } @@ -100,6 +99,7 @@ * des valeurs * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { MetierMonitor metierMon = context.getMetierMonitor(); @@ -175,148 +175,64 @@ } // fin methode - - /* -this.param = param; - -//construction de p -this.p = new Object(); -this.p.paramRegle = this.param; -this.p.tableNonActivite=new Packages.java.util.HashMap(); -this.p.affectNonActivite=false; - -//attention: cette règle de gestion ne fonctionne que si le changement a lieu pour toutes -//les années de simulation - - -var moisDeb=this.param.getValue("moisDeb"); //entrez le mois debut de fermeture -var moisFin=this.param.getValue("moisFin");//entrez le mois de fin de fermeture -var EnginInterdit=this.param.getValue("engin"); - -writeln("nom de l'engin interdit "+EnginInterdit.getNom()); -var RegionSimu=EnginInterdit.getRegion(); -var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); - -for (var imetier=ListeMetiers.iterator();imetier.hasNext();){ - var metier=imetier.next(); - if (metier.getEngin().equals(EnginInterdit)){ - //récupère toutes les stratégies pratiquant le métier et pour lesquelles la proportion !=0 - var ListeStrat=SiMatrice.getListStrategies(); - for (iStrat=ListeStrat.iterator();iStrat.hasNext();){ - var Strat=iStrat.next(); - var vessels=Strat.getSetOfVessels(); - if (vessels.getMetiers().contains(metier)){ - for (var imois=moisDeb; imois<=moisFin;imois++){ - var mois=new Packages.fr.ifremer.nodb.Mois(imois); - var StratMonthInfo=Strat.getStrategyMonthInfo(mois); - MetiersInterditsPresimu.put(new Chaine(metier.getNom()+"-"+mois.getNumMois()),true); - //1er cas:l'effort est reporte sur un metier de la meme strategie, n'ayant pas l'espece comme capture principale et pechant avec le meme engin - var MetiersPossibles=Strat.getSetOfVessels().getMetiers().copy(); - var MetiersPossibles2=Strat.getSetOfVessels().getMetiers().copy(); - //on verifie que les metiers sont bien pratiques au mois courant, qu'ils n'ont pas le meme ont le meme engin et qu'ils ne sont pas interdits par ailleurs - for (var imet=MetiersPossibles2.iterator();imet.hasNext();){ - var met=imet.next(); - if (StratMonthInfo.getProportionMetier(met)==0 || met.getEngin().equals(metier.getEngin()) || met.getNom()=="nonActivite" || MetiersInterditsPresimu.containsKey(new Chaine(met.getNom()+"-"+mois.getNumMois()))){ - MetiersPossibles.remove(met); - } - } - - //on repartit maintenant l'effort entre les differents metiers possibles dans la meme strategie si un metier possible existe bien - if (MetiersPossibles.size()!=0){ - var NbMetier=MetiersPossibles.size(); - for (imet=MetiersPossibles.iterator();imet.hasNext();){ - met=imet.next(); - var NouvelleProportion=StratMonthInfo.getProportionMetier(met)+(StratMonthInfo.getProportionMetier(metier)/NbMetier); - StratMonthInfo.setProportionMetier(met, new Packages.java.lang.Float(NouvelleProportion)) - } - StratMonthInfo.setProportionMetier(metier, new Packages.java.lang.Float(0)) //le metier vise a alors une proportion nulle - } - //s'il n'y a pas de metier alternatif, on passe e nonActivite - else{ - p.tableNonActivite=Regle_action_lib.reportNonActivite(p.tableNonActivite, Strat, metier, mois, StratMonthInfo.getProportionMetier(metier)); - StratMonthInfo.setProportionMetier(metier,new Packages.java.lang.Float(0)); - } - } - } - } } -} - */ - } + /** - * La condition qui doit etre vrai pour faire les actions - * @param context La simulation pour lequel on utilise cette regle + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { boolean result = false; - MatrixND mat = tableNonActivite.get(date.getMonth()); + MatrixND mat = tableNonActivite.get(step.getMonth()); if (mat != null && affectNonActivite == false) { result = true; } return result; // fin - - /* -var mat=p.tableNonActivite.get(p.date.getMois()); -writeln(p.affectNonActivite); -if(oldValue != undefined) - return oldValue; -else if (mat!=null && p.affectNonActivite==false){ - return true; -} -else {return false;} -*/ } /** - * Si la condition est vrai alors cette action est executée avant le pas + * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // on ne doit le faire qu'une seul fois quelque soit le nombre de metier affectNonActivite=true; - MatrixND mat = tableNonActivite.get(date.getMonth()); + MatrixND mat = tableNonActivite.get(step.getMonth()); MetierMonitor metierMon = context.getMetierMonitor(); - MatrixND noActivity = metierMon.getNoActivity(date); + MatrixND noActivity = metierMon.getNoActivity(step); if (noActivity == null) { - metierMon.setNoActivity(date, mat.copy()); + metierMon.setNoActivity(step, mat.copy()); } else { noActivity = noActivity.add(mat); } // fin - - /* -p.affectNonActivite=true; -var mat=p.tableNonActivite.get(p.date.getMois()); -var matNonActivite=nonActivite.get(p.date); -var nonactivite=matNonActivite!=null; -if (!nonactivite){ - nonActivite.put(p.date,mat); -} -else{ - matNonActivite=matNonActivite.add(mat); -} -return p.gestionMetier; -*/ } /** * Si la condition est vrai alors cette action est executée apres le pas * de temps de la simulation. + * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { affectNonActivite = false; - - /* - p.affectNonActivite=false; -return p.gestionMetier; - */ } } Modified: isis-fish/trunk/src/test/resources/test-database/rules/TACpoids.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/TACpoids.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/TACpoids.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -49,7 +46,7 @@ import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.PopulationMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.util.Doc; @@ -78,9 +75,9 @@ @Doc("Affected species") public Species param_species = null; @Doc("Debin date") - public Date param_beginDate = new Date(0); + public TimeStep param_beginStep = new TimeStep(0); @Doc("End date") - public Date param_endDate = new Date(90); + public TimeStep param_endStep = new TimeStep(90); @Doc("Proportion de survie") public double param_propSurvie = 0; @Doc("Proportionnal TAC") @@ -102,6 +99,7 @@ /** * @return the necessaryResult */ + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -111,6 +109,7 @@ * * @return L'aide ou la description de la regle */ + @Override public String getDescription() { return _("TAC weight in tons.\nIf you want survival discard use propSurvie other than 0.\nIf you wish TAC computed as a proportion of the biomass use propTac other than 0."); } @@ -121,16 +120,20 @@ * * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { } /** - * La condition qui doit etre vrai pour faire les actions + * La condition qui doit etre vrai pour faire les actions. * - * @param context La simulation pour lequel on utilise cette regle + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { log.info("test si TAC atteint"); @@ -139,22 +142,22 @@ param_species.getTopiaId()); // on fait le calcul du tac si necessaire - if (param_propTac > 0 && date.getMonth().equals(Month.JANUARY)) { + if (param_propTac > 0 && step.getMonth().equals(Month.JANUARY)) { PopulationMonitor popMon = context.getPopulationMonitor(); param_tacInTons = popMon.getBiomass(param_species) * param_propTac; } boolean result = false; - if (date.before(param_beginDate)) { + if (step.before(param_beginStep)) { result = false; - } else if (date.after(param_endDate)) { + } else if (step.after(param_endStep)) { result = false; } else { - TargetSpecies ts = metier.getMetierSeasonInfo(date.getMonth()) + TargetSpecies ts = metier.getMetierSeasonInfo(step.getMonth()) .getSpeciesTargetSpecies(param_species); if (ts != null) { double catchTons = RuleUtil.getTotalCatchTons(context, - param_species, date); + param_species, step); log.info("[TAC] catchTons = " + catchTons + " >= param_tacInTons:" + param_tacInTons); if (catchTons >= param_tacInTons) { @@ -166,34 +169,33 @@ } /** - * Si la condition est vrai alors cette action est executee avant le pas de - * temps de la simulation. + * Si la condition est vrai alors cette action est executee avant le pas + * de temps de la simulation. * - * @param context La simulation pour lequel on utilise cette regle + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { affectation = false; log.info("[TAC] preAction for: " + metier); log.info(" TAC atteint [TAC] preAction for: " + metier); - TargetSpecies ts = metier.getMetierSeasonInfo(date.getMonth()) + TargetSpecies ts = metier.getMetierSeasonInfo(step.getMonth()) .getSpeciesTargetSpecies(param_species); if (ts != null && ts.getPrimaryCatch()) { // recupere tous les metiers qui ont l'espece en capture principale =>metiers vises // aimedMetiers ne fonctionne pas je ne sais pas pourquoi ! mais au final forbiddenMetier aura le meme effet - /*List<Metier> aimedMetiers = context.getDB().find("select distinct(metierSeasonInfo.metier) " + - "from fr.ifremer.isisfish.entities.TargetSpecies" + - "where species=? and primaryCatch=true", param_species); - - log.info("aimed Metier: " + aimedMetiers);*/ + context.getMetierMonitor().addforbiddenMetier(metier); //recupere toutes les strategies pratiquant le metier et pour lesquelles la proportion !=0 SiMatrix siMatrix = SiMatrix.getSiMatrix(context); Set<Strategy> strs = new HashSet<Strategy>(); - for (Strategy str : siMatrix.getStrategies(date)) { - double prop = str.getStrategyMonthInfo(date.getMonth()) + for (Strategy str : siMatrix.getStrategies(step)) { + double prop = str.getStrategyMonthInfo(step.getMonth()) .getProportionMetier(metier); if (prop != 0) { strs.add(str); @@ -201,7 +203,7 @@ } for (Strategy str : strs) { - StrategyMonthInfo smi = str.getStrategyMonthInfo(date + StrategyMonthInfo smi = str.getStrategyMonthInfo(step .getMonth()); // 1er cas de figure: l'effort est reporte sur un metier de la @@ -274,10 +276,10 @@ // sinon on met tout dans le metier nonActivite MetierMonitor metierMon = context.getMetierMonitor(); - MatrixND mat = metierMon.getOrCreateNoActivity(date, + MatrixND mat = metierMon.getOrCreateNoActivity(step, ResultName.MATRIX_NO_ACTIVITY, siMatrix - .getStrategies(date), siMatrix - .getMetiers(date)); + .getStrategies(step), siMatrix + .getMetiers(step)); mat.setValue(str, metier, smi.getProportionMetier(metier)); smi.getProportionMetier().setValue(metier, 0); @@ -287,17 +289,20 @@ } /** - * Si la condition est vrai alors cette action est executee apres le pas de - * temps de la simulation. + * Si la condition est vrai alors cette action est executée apres le pas + * de temps de la simulation. * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { ResultStorage resultmanager = context.getSimulationStorage() .getResultStorage(); log.info("[TAC] postAction for: " + metier); - TargetSpecies ts = metier.getMetierSeasonInfo(date.getMonth()) + TargetSpecies ts = metier.getMetierSeasonInfo(step.getMonth()) .getSpeciesTargetSpecies(param_species); if (ts != null) { if (!affectation) { @@ -320,7 +325,7 @@ // forcement de la regle taille minimale or si le tac est // atteint, tout va dorenavent dans les rejets et on mais // TOUTES les captures dans les rejets - MatrixND discard = popMon.getDiscard(date, pop); + MatrixND discard = popMon.getDiscard(step, pop); log.info("discard : " + discard); if (discard != null) { discard.mults(0); @@ -329,11 +334,11 @@ discard = popMon.getCatch(pop).copy(); // ca ne doit pas pouvoir marcher car MATRIX_DISCARDS_PER_STR_MET est de dimension pop groupe str met - et discard n'a plus la dimension pop discard.setName(ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP); - popMon.addDiscard(date, pop, discard); + popMon.addDiscard(step, pop, discard); log.info("[TAC] add discard for " + pop + ": " + discard); // ne manquerait-il pas - resultmanager.addResult(date, pop, discard); + resultmanager.addResult(step, pop, discard); if (param_propSurvie > 0) { MatrixND eff = popMon.getN(pop); //on réajoute les survivants aux effectifs Modified: isis-fish/trunk/src/test/resources/test-database/rules/TailleMin.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/TailleMin.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/TailleMin.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -44,7 +41,7 @@ import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.PopulationMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; /** @@ -63,17 +60,21 @@ /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(TailleMin.class); - @Doc(value = "Begin date") - public Date param_beginDate = new Date(0); + @Doc(value = "Begin step") + public TimeStep param_beginStep = new TimeStep(0); + @Doc(value = "End date") - public Date param_endDate = new Date(119); + public TimeStep param_endStep = new TimeStep(119); + @Doc(value = "Affected species") public Species param_species = null; + @Doc(value = "Taille minimale") public double param_TailleMin = 27; + @Doc(value = "Proportion de survie") public double param_propSurvie = 0; - + public String[] necessaryResult = { // put here all necessary result for this rule // example: @@ -81,6 +82,7 @@ // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; + @Override public String[] getNecessaryResult() { return this.necessaryResult; } @@ -90,8 +92,11 @@ * * @return L'aide ou la description de la regle */ + @Override public String getDescription() throws Exception { - return _(""); + return _("Tous les poissons dont la taille est inférieure à TailleMin" + + " ne seront pas capturés. Ils sont placés en rejets et rejetés" + + " suivant la proportion de survie."); } /** @@ -100,6 +105,7 @@ * * @param context La simulation pour lequel on utilise cette regle */ + @Override public void init(SimulationContext context) throws Exception { } @@ -110,81 +116,76 @@ * @param metier * @return */ - private boolean isCaptureDate(Date date, Species species, Metier metier) { - MetierSeasonInfo info = metier.getMetierSeasonInfo(date.getMonth()); + private boolean isCaptureDate(TimeStep step, Species species, Metier metier) { + MetierSeasonInfo info = metier.getMetierSeasonInfo(step.getMonth()); TargetSpecies target = info.getSpeciesTargetSpecies(species); - boolean result = target != null; + boolean result; + if (target != null) { + result = true; + } else { + result = false; + } + return result; } /** - * La condition qui doit etre vrai pour faire les actions + * La condition qui doit etre vrai pour faire les actions. * - * @param context La simulation pour lequel on utilise cette regle + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné * @return vrai si on souhaite que les actions soit faites */ - public boolean condition(SimulationContext context, Date date, Metier metier) + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { log.info("Recherche si la taille Minimale s'applique"); boolean result = true; - if (date.before(param_beginDate)) { + if (step.before(param_beginStep)) { result = false; - } else if (date.after(param_endDate)) { + } else if (step.after(param_endStep)) { result = false; - } else if (isCaptureDate(date, param_species, metier) != true) { + } else if (isCaptureDate(step, param_species, metier) != true) { result = false; } log.info("fin de condition TailleMin:" + result); return result; - - // fin - - /* - - writeln("Recherche si la taille Minimale s'applique (oldValue="+oldValue); - var metier=p.metier; - var result = true; - if(oldValue != undefined) - result = oldValue; - else if (Regle_libUtil.isCaptureDate(p.date,p.metapop, metier)!=true) - result=false; - else if(p.date.before(p.dateDeb)) - result = false; - else if(p.date.after(p.dateFin)) - result = false; - - writeln("fin de condition TailleMin:"+result); - return result; - */ } /** - * Si la condition est vrai alors cette action est executée avant le pas de - * temps de la simulation. + * Si la condition est vrai alors cette action est executee avant le pas + * de temps de la simulation. * - * @param context La simulation pour lequel on utilise cette regle + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void preAction(SimulationContext context, Date date, Metier metier) + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // nothing } /** - * Si la condition est vrai alors cette action est executée apres le pas de - * temps de la simulation. + * Si la condition est vrai alors cette action est executée apres le pas + * de temps de la simulation. * * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné */ - public void postAction(SimulationContext context, Date date, Metier metier) + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { - log.info("*$*$*$* TailleMin.actionApres:" + date + " metapop:" - + param_species + " metier:" + metier); + log.info("*$*$*$* TailleMin.actionApres:" + step + " metapop:" + + param_species + " metier:" + metier); - if (isCaptureDate(date, param_species, metier)) { - log - .info("*$*$*$* ok affecte capture infÃ?rieure Ã? TailleMin au rejet"); + if (isCaptureDate(step, param_species, metier)) { + log.info( + "*$*$*$* ok affecte capture infÃ?rieure Ã? TailleMin au rejet"); // ATTENTION // les captures pour cette metapop ne sont plus du qu'au metier pour qui // l'espece est secondaire: elles sont affectees aux rejets @@ -197,29 +198,30 @@ PopulationMonitor popMon = context.getPopulationMonitor(); SiMatrix siMatrix = SiMatrix.getSiMatrix(context); - List<Population> pops = siMatrix.getPopulations(date); + List<Population> pops = siMatrix.getPopulations(step); for (Population pop : pops) { if (pop.getSpecies().equals(param_species)) { - if (popMon.getDiscard(date, pop) == null) { + if (popMon.getDiscard(step, pop) == null) { MatrixND discard = popMon.getCatch(pop).copy(); MatrixND eff = popMon.getN(pop); for (MatrixIterator i = discard.iterator(); i.next();) { Object[] coordonnees = i.getSemanticsCoordinates(); - PopulationGroup group = (PopulationGroup) coordonnees[2]; + PopulationGroup group = + (PopulationGroup) coordonnees[2]; if (group.getLength() >= param_TailleMin) { i.setValue(0); } else if (param_propSurvie > 0) { eff.setValue(coordonnees[2], coordonnees[3], eff.getValue(coordonnees[2], - coordonnees[3]) - + i.getValue() - * param_propSurvie); + coordonnees[3]) + i.getValue() * + param_propSurvie); } } - discard.setName(ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP); - popMon.addDiscard(date, pop, discard); + discard.setName( + ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP); + popMon.addDiscard(step, pop, discard); } } } @@ -228,64 +230,5 @@ //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire } - - // fin - - /* - - - - writeln("*$*$*$* TailleMin.actionApres:"+p.date+" metapop:"+p.metapop+" metier:"+p.metier); - if(Regle_libUtil.isCaptureDate(p.date,p.metapop, p.metier)){ - writeln("*$*$*$* ok affecte capture infÃ?rieure Ã? TailleMin au rejet"); - // ATTENTION - // les captures pour cette metapop ne sont plus du qu'au metier pour qui - // l'espece est secondaire: elles sont affectees aux rejets - - //pb : ne se fait pas par metier - //il faut une matrice pour chaques pas de temps qui stocke les rejets - //par metier, par metapop et par classes d'age (comme pour les captures) - ////// - writeln("deb de affecterCaptureREJETTailleMin"); - var suivi = null; - - //recherche du suivi pour les pop qui ont une certaine meta pop - for(var i=0; i< suiviePop.size(); i++){ - if(suiviePop.get(i).getPop().getMetaPopulation().equals(metapop)){ - suivi = suiviePop.get(i); - var populations=suivi.getPop(); - - //si on a pas deja creer le rejet on le cree et on en fait un resultat - var matRejet = suivi.getRejet(date); - if (matRejet==null){ - var matRejetBis = MatrixFactory.create(suivi.getCapture()); - var eff=suivi.getN(); - //on encapsule les objets des 4 dimensions de la matrice capture - for (var iiterateur=matRejetBis.iterator();iiterateur.next();){ - var coordonnees=iiterateur.getSemanticsCoordinates(); - var classe=coordonnees[2]; - if (classe.getLongueur()>=TailleMin){ - iiterateur.setValue(0); - } - else if (param_propSurvie > 0) { - eff.setValue(coordonnees[2],coordonnees[3],eff.getValue(coordonnees[2],coordonnees[3])+iiterateur.getValue()*proportion); - } - } - matRejetBis.setName("Rejet par metier"); - suivi.addRejet(date,matRejetBis); - } - } - } - - - writeln("fin de affecterCaptureRejetTailleMin"); - - - //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire - } - - return p.gestionMetier; - */ } - } Modified: isis-fish/trunk/src/test/resources/test-database/rules/TotalClosure.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/rules/TotalClosure.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/rules/TotalClosure.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -22,122 +19,134 @@ * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ -package rules; - -import static org.nuiton.i18n.I18n._; - -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.math.matrix.MatrixND; - -import scripts.ResultName; -import scripts.SiMatrix; -import fr.ifremer.isisfish.entities.Metier; -import fr.ifremer.isisfish.entities.Strategy; -import fr.ifremer.isisfish.entities.StrategyMonthInfo; -import fr.ifremer.isisfish.rule.AbstractRule; -import fr.ifremer.isisfish.simulator.MetierMonitor; -import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; -import fr.ifremer.isisfish.types.Month; - -/** - * Remplace aussi Cantonnement Engin. - * - * Created: 29 aout 2007 - * @author sigrid - * @version $Revision$ - */ -public class TotalClosure extends AbstractRule { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory.getLog(TotalClosure.class); - - public Date param_beginDate = new Date(100); - public Date param_endDate = new Date(119); - public Month param_beginMonth = Month.JANUARY; - public Month param_endMonth = Month.JANUARY; - - public String[] necessaryResult = { - ResultName.MATRIX_NO_ACTIVITY - }; - - public String[] getNecessaryResult() { - return this.necessaryResult; - } - - public String getDescription() throws Exception { - return _("Total closure of the fishery"); - } - - /** - * Appelé au démarrage de la simulation, cette methode permet d'initialiser des valeurs. - * @param context La simulation pour lequel on utilise cette regle - */ - public void init(SimulationContext context) throws Exception { - } - - /** - * La condition qui doit etre vrai pour faire les actions. - * @param context La simulation pour lequel on utilise cette regle - * @return vrai si on souhaite que les actions soit faites - */ - public boolean condition(SimulationContext context, Date date, Metier metier) - throws Exception { - boolean result = true; - if (date.before(param_beginDate)) { - result = false; - } else if (date.after(param_endDate)) { - result = false; - } - - if (date.getMonth().before(param_beginMonth)) { - result = false; - } else if (date.getMonth().after(param_endMonth)) { - result = false; - } - return result; - } - - /** - * Si la condition est vrai alors cette action est executee avant le pas - * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle - */ - public void preAction(SimulationContext context, Date date, Metier metier) - throws Exception { - MetierMonitor metierMon = context.getMetierMonitor(); - - //MetierSeasonInfo infoMetier = metier.getMetierSeasonInfo(date - // .getMonth()); - - SiMatrix siMatrix = SiMatrix.getSiMatrix(context); - MatrixND noActivity = metierMon.getOrCreateNoActivity(date, - ResultName.MATRIX_NO_ACTIVITY, siMatrix.getStrategies(date), - siMatrix.getMetiers(date)); - metierMon.addforbiddenMetier(metier); - List<Strategy> strategies = siMatrix.getStrategies(date); - - for (Strategy str : strategies) { - StrategyMonthInfo info = str.getStrategyMonthInfo(date.getMonth()); - double prop = info.getProportionMetier(metier); - if (prop != 0) { - noActivity.setValue(str, metier, prop); - info.setProportionMetier(metier, 0); - } - } - } - - /** - * Si la condition est vrai alors cette action est executee apres le pas - * de temps de la simulation. - * @param context La simulation pour lequel on utilise cette regle - */ - public void postAction(SimulationContext context, Date date, Metier metier) - throws Exception { - // nothing - } - -} +package rules; + +import static org.nuiton.i18n.I18n._; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; + +import scripts.ResultName; +import scripts.SiMatrix; +import fr.ifremer.isisfish.entities.Metier; +import fr.ifremer.isisfish.entities.Strategy; +import fr.ifremer.isisfish.entities.StrategyMonthInfo; +import fr.ifremer.isisfish.rule.AbstractRule; +import fr.ifremer.isisfish.simulator.MetierMonitor; +import fr.ifremer.isisfish.simulator.SimulationContext; +import fr.ifremer.isisfish.types.TimeStep; +import fr.ifremer.isisfish.types.Month; + +/** + * Remplace aussi Cantonnement Engin. + * + * Created: 29 aout 2007 + * @author sigrid + * @version $Revision$ + */ +public class TotalClosure extends AbstractRule { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Log log = LogFactory.getLog(TotalClosure.class); + + public TimeStep param_beginStep = new TimeStep(100); + public TimeStep param_endStep = new TimeStep(119); + public Month param_beginMonth = Month.JANUARY; + public Month param_endMonth = Month.JANUARY; + + public String[] necessaryResult = { + ResultName.MATRIX_NO_ACTIVITY + }; + + @Override + public String[] getNecessaryResult() { + return this.necessaryResult; + } + + @Override + public String getDescription() throws Exception { + return _("Total closure of the fishery"); + } + + /** + * Appelé au démarrage de la simulation, cette methode permet d'initialiser des valeurs. + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void init(SimulationContext context) throws Exception { + } + + /** + * La condition qui doit etre vrai pour faire les actions. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + * @return vrai si on souhaite que les actions soit faites + */ + @Override + public boolean condition(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + boolean result = true; + if (step.before(param_beginStep)) { + result = false; + } else if (step.after(param_endStep)) { + result = false; + } + + if (step.getMonth().before(param_beginMonth)) { + result = false; + } else if (step.getMonth().after(param_endMonth)) { + result = false; + } + return result; + } + + /** + * Si la condition est vrai alors cette action est executee avant le pas + * de temps de la simulation. + * + * @param context la simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + */ + @Override + public void preAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + MetierMonitor metierMon = context.getMetierMonitor(); + + SiMatrix siMatrix = SiMatrix.getSiMatrix(context); + MatrixND noActivity = metierMon.getOrCreateNoActivity(step, + ResultName.MATRIX_NO_ACTIVITY, siMatrix.getStrategies(step), + siMatrix.getMetiers(step)); + metierMon.addforbiddenMetier(metier); + List<Strategy> strategies = siMatrix.getStrategies(step); + + for (Strategy str : strategies) { + StrategyMonthInfo info = str.getStrategyMonthInfo(step.getMonth()); + double prop = info.getProportionMetier(metier); + if (prop != 0) { + noActivity.setValue(str, metier, prop); + info.setProportionMetier(metier, 0); + } + } + } + + /** + * Si la condition est vrai alors cette action est executée apres le pas + * de temps de la simulation. + * + * @param context La simulation pour lequel on utilise cette regle + * @param step le pas de temps courant + * @param metier le metier concerné + */ + @Override + public void postAction(SimulationContext context, TimeStep step, Metier metier) + throws Exception { + // nothing + } + +} Modified: isis-fish/trunk/src/test/resources/test-database/scripts/GravityModel.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/scripts/GravityModel.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/scripts/GravityModel.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, Cédric Pineau, Benjamin Poussin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -47,7 +44,7 @@ import fr.ifremer.isisfish.entities.Strategy; import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.types.TimeUnit; @@ -107,10 +104,10 @@ // MatrixFishingTimePerMonthPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixFishingTimePerMonthPerVessel(Date date) + public MatrixND matrixFishingTimePerMonthPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_FISHING_TIME_PER_MONTH_PER_VESSEL, @@ -119,10 +116,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = fishingTimePerMonthPerVessel(str, metier, date); + double value = fishingTimePerMonthPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -137,13 +134,13 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double fishingTimePerMonthPerVessel(Strategy str, Metier metier, - Date date) { - Month month = date.getMonth(); - double timePerTrip = siMatrix.fishingTimePerTrip(str, metier, date); + TimeStep step) { + Month month = step.getMonth(); + double timePerTrip = siMatrix.fishingTimePerTrip(str, metier, step); double nbTrip = str.getStrategyMonthInfo(month).getNumberOfTrips(); return timePerTrip * nbTrip; } @@ -152,10 +149,10 @@ // matrixFuelCostsOfTravelPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixFuelCostsOfTravelPerVessel(Date date) + public MatrixND matrixFuelCostsOfTravelPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_FUEL_COSTS_OF_TRAVEL_PER_VESSEL, @@ -164,10 +161,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = fuelCostsOfTravelPerVessel(str, metier, date); + double value = fuelCostsOfTravelPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -182,12 +179,12 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double fuelCostsOfTravelPerVessel(Strategy str, Metier metier, - Date date) { - Month month = date.getMonth(); + TimeStep step) { + Month month = step.getMonth(); double nbTrip = str.getStrategyMonthInfo(month).getNumberOfTrips(); Collection<Zone> zone = metier.getMetierSeasonInfo(month).getZone(); @@ -204,10 +201,10 @@ // matrixCostsOfFishingPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixCostsOfFishingPerVessel(Date date) + public MatrixND matrixCostsOfFishingPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_COSTS_OF_FISHING_PER_VESSEL, @@ -216,10 +213,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = costsOfFishingPerVessel(str, metier, date); + double value = costsOfFishingPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -235,12 +232,12 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double costsOfFishingPerVessel(Strategy str, Metier metier, - Date date) { - double fishingTime = fishingTimePerMonthPerVessel(str, metier, date); + TimeStep step) { + double fishingTime = fishingTimePerMonthPerVessel(str, metier, step); EffortDescription effort = str.getSetOfVessels().getPossibleMetiers( metier); @@ -259,9 +256,9 @@ // matrixFuelCostsPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixFuelCostsPerVessel(Date date) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + public MatrixND matrixFuelCostsPerVessel(TimeStep step) throws TopiaException { + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_FUEL_COSTS_PER_VESSEL, @@ -270,10 +267,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = fuelCostsPerVessel(str, metier, date); + double value = fuelCostsPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -288,12 +285,12 @@ * * @param str * @param metier - * @param date + * @param step * @return */ - private double fuelCostsPerVessel(Strategy str, Metier metier, Date date) { - double fuelCosts = fuelCostsOfTravelPerVessel(str, metier, date); - double costsOfFishing = costsOfFishingPerVessel(str, metier, date); + private double fuelCostsPerVessel(Strategy str, Metier metier, TimeStep step) { + double fuelCosts = fuelCostsOfTravelPerVessel(str, metier, step); + double costsOfFishing = costsOfFishingPerVessel(str, metier, step); return fuelCosts + costsOfFishing; } @@ -302,10 +299,10 @@ // matrixRepairAndMaintenanceGearCostsPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixRepairAndMaintenanceGearCostsPerVessel(Date date) + public MatrixND matrixRepairAndMaintenanceGearCostsPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_REPAIR_AND_MAINTENANCE_GEAR_COSTS_PER_VESSEL, @@ -314,18 +311,18 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = repairAndMaintenanceGearCostsPerVessel(str, - metier, date); + metier, step); result.setValue(str, metier, value); } } // for(Strategy str : strategies){ - // metiers = siMatrix.getMetiers(str, date); + // metiers = siMatrix.getMetiers(str, step); // for(Metier metier : metiers) { - // double value = repairAndMaintenanceGearCostsPerVessel(str, metier, date); + // double value = repairAndMaintenanceGearCostsPerVessel(str, metier, step); // result.setValue(str, metier, value); // } // } @@ -341,12 +338,12 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double repairAndMaintenanceGearCostsPerVessel(Strategy str, - Metier metier, Date date) { - double fishingTime = fishingTimePerMonthPerVessel(str, metier, date); + Metier metier, TimeStep step) { + double fishingTime = fishingTimePerMonthPerVessel(str, metier, step); EffortDescription effort = str.getSetOfVessels().getPossibleMetiers( metier); @@ -363,10 +360,10 @@ // matrixOtherRunningCostsPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixOtherRunningCostsPerVessel(Date date) + public MatrixND matrixOtherRunningCostsPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_OTHER_RUNNING_COSTS_PER_VESSEL, @@ -375,10 +372,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = otherRunningCostsPerVessel(str, metier, date); + double value = otherRunningCostsPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -394,12 +391,12 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double otherRunningCostsPerVessel(Strategy str, Metier metier, - Date date) { - double fishingTime = fishingTimePerMonthPerVessel(str, metier, date); + TimeStep step) { + double fishingTime = fishingTimePerMonthPerVessel(str, metier, step); EffortDescription effort = str.getSetOfVessels().getPossibleMetiers( metier); @@ -416,10 +413,10 @@ // matrixSharedNotFixedCostsPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixSharedNotFixedCostsPerVessel(Date date) + public MatrixND matrixSharedNotFixedCostsPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_SHARED_NOT_FIXED_COSTS_PER_VESSEL, @@ -428,10 +425,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = sharedNotFixedCostsPerVessel(str, metier, date); + double value = sharedNotFixedCostsPerVessel(str, metier, step); result.setValue(str, metier, value); } } @@ -446,14 +443,14 @@ * * @param str * @param metier - * @param date + * @param step * @return */ private double sharedNotFixedCostsPerVessel(Strategy str, Metier metier, - Date date) { - double fuelCostsPerVessel = fuelCostsPerVessel(str, metier, date); + TimeStep step) { + double fuelCostsPerVessel = fuelCostsPerVessel(str, metier, step); double otherRunningCostsPerVessel = otherRunningCostsPerVessel(str, - metier, date); + metier, step); return fuelCostsPerVessel + otherRunningCostsPerVessel; } @@ -462,11 +459,11 @@ // matrixGrossValueOfLandingsPerSpeciesPerStrategyMet ////////////////////////////////////////////////////////////////////// - public MatrixND matrixGrossValueOfLandingsPerSpeciesPerStrategyMet(Date date) + public MatrixND matrixGrossValueOfLandingsPerSpeciesPerStrategyMet(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); - List<Population> pops = siMatrix.getPopulations(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); + List<Population> pops = siMatrix.getPopulations(step); MatrixND result = MatrixFactory .getInstance() @@ -480,11 +477,11 @@ Population pop = pops.get(p); for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = grossValueOfLandingsPerSpeciesPerStrategyMet( - str, metier, pop, date); + str, metier, pop, step); result.setValue(str, metier, pop, value); } } @@ -506,11 +503,11 @@ * @param str * @param metier * @param pop - * @param date + * @param step * @return */ private double grossValueOfLandingsPerSpeciesPerStrategyMet(Strategy str, - Metier metier, Population pop, Date date) { + Metier metier, Population pop, TimeStep step) { List<PopulationGroup> groups = pop.getPopulationGroup(); double result = 0; for (PopulationGroup group : groups) { @@ -518,9 +515,9 @@ Collection<Zone> zones = pop.getPopulationZone(); for (Zone zone : zones) { double catchWeight = getCatchWeightPerStrMetPerZonePop(str, - metier, group, zone, date); + metier, group, zone, step); double discardsWeight = getDiscardsWeightPerStrMet(str, metier, - group, zone, date); + group, zone, step); // FIXME demander/verifier que ce le bon calcule result += price * (catchWeight - discardsWeight); } @@ -533,12 +530,12 @@ * @param metier * @param group * @param zone - * @param date + * @param step * @return */ private double getCatchWeightPerStrMetPerZonePop(Strategy str, - Metier metier, PopulationGroup group, Zone zone, Date date) { - MatrixND mat = resultManager.getMatrix(date, group.getPopulation(), + Metier metier, PopulationGroup group, Zone zone, TimeStep step) { + MatrixND mat = resultManager.getMatrix(step, group.getPopulation(), ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); double result = 0; if (mat != null) { @@ -552,12 +549,12 @@ * @param metier * @param group * @param zone - * @param date + * @param step * @return */ private double getDiscardsWeightPerStrMet(Strategy str, Metier metier, - PopulationGroup group, Zone zone, Date date) { - MatrixND mat = resultManager.getMatrix(date, group.getPopulation(), + PopulationGroup group, Zone zone, TimeStep step) { + MatrixND mat = resultManager.getMatrix(step, group.getPopulation(), ResultName.MATRIX_DISCARDS_WEIGHT_PER_STR_MET_PER_ZONE_POP); double result = 0; if (mat != null) { @@ -570,10 +567,10 @@ // matrixGrossValueOfLandingsPerStrategyMet ////////////////////////////////////////////////////////////////////// - public MatrixND matrixGrossValueOfLandingsPerStrategyMet(Date date) + public MatrixND matrixGrossValueOfLandingsPerStrategyMet(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET, @@ -582,11 +579,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = grossValueOfLandingsPerStrategyMet(str, metier, - date); + step); result.setValue(str, metier, value); } } @@ -597,18 +594,18 @@ /** * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double grossValueOfLandingsPerStrategyMet(Strategy str, - Metier metier, Date date) throws TopiaException { - List<Population> pops = siMatrix.getPopulations(date); + Metier metier, TimeStep step) throws TopiaException { + List<Population> pops = siMatrix.getPopulations(step); double result = 0; for (int i = 0; i < pops.size(); i++) { Population pop = (Population) pops.get(i); result += grossValueOfLandingsPerSpeciesPerStrategyMet(str, metier, - pop, date); + pop, step); } return result; } @@ -617,10 +614,10 @@ // matrixGrossValueOfLandingsPerStrategyMetPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixGrossValueOfLandingsPerStrategyMetPerVessel(Date date) + public MatrixND matrixGrossValueOfLandingsPerStrategyMetPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory .getInstance() @@ -631,11 +628,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = grossValueOfLandingsPerStrategyMetPerVessel(str, - metier, date); + metier, step); result.setValue(str, metier, value); } } @@ -650,20 +647,20 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double grossValueOfLandingsPerStrategyMetPerVessel(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { double grossValueOfLandingsPerStrategyMet = grossValueOfLandingsPerStrategyMet( - str, metier, date); + str, metier, step); // FIXME verifier que c bien cette donn?e qu'il faut utiliser dans le doc: PropNbVessels(str, sov) double proportionSetOfVessels = str.getProportionSetOfVessels(); double numberOfVessels = str.getSetOfVessels().getNumberOfVessels(); double grossValueOfLandingsOtherSpeciesPerStrategyMet = grossValueOfLandingsOtherSpeciesPerStrategyMet( - str, metier, date); + str, metier, step); return (grossValueOfLandingsPerStrategyMet + grossValueOfLandingsOtherSpeciesPerStrategyMet) / (proportionSetOfVessels * numberOfVessels); @@ -673,10 +670,10 @@ // matrixNetValueOfLandingsPerStrategyMet ////////////////////////////////////////////////////////////////////// - public MatrixND matrixNetValueOfLandingsPerStrategyMet(Date date) + public MatrixND matrixNetValueOfLandingsPerStrategyMet(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, @@ -685,11 +682,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = netValueOfLandingsPerStrategyMet(str, metier, - date); + step); result.setValue(str, metier, value); } } @@ -705,14 +702,14 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double netValueOfLandingsPerStrategyMet(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { double grossValue = grossValueOfLandingsPerStrategyMet(str, metier, - date); + step); EffortDescription effort = str.getSetOfVessels().getPossibleMetiers( metier); double landingCost = 1; @@ -722,7 +719,7 @@ } double grossValueOfLandingsOtherSpeciesPerStrategyMet = grossValueOfLandingsOtherSpeciesPerStrategyMet( - str, metier, date); + str, metier, step); double result = (grossValue + grossValueOfLandingsOtherSpeciesPerStrategyMet) * landingCost; @@ -730,7 +727,7 @@ } private double grossValueOfLandingsOtherSpeciesPerStrategyMet(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { // FIXME evaluer l'equation dans suivant le doc des equations return 0; } @@ -739,10 +736,10 @@ // matrixNetValueOfLandingsPerStrategyMetPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixNetValueOfLandingsPerStrategyMetPerVessel(Date date) + public MatrixND matrixNetValueOfLandingsPerStrategyMetPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory .getInstance() @@ -753,11 +750,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = netValueOfLandingsPerStrategyMetPerVessel(str, - metier, date); + metier, step); result.setValue(str, metier, value); } } @@ -773,14 +770,14 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double netValueOfLandingsPerStrategyMetPerVessel(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { double netValueOfLandingsPerStrategyMet = netValueOfLandingsPerStrategyMet( - str, metier, date); + str, metier, step); // FIXME verifier que c bien cette donnée qu'il faut utiliser dans le doc: PropNbVessels(str, sov) double proportionSetOfVessels = str.getProportionSetOfVessels(); double numberOfVessels = str.getSetOfVessels().getNumberOfVessels(); @@ -793,10 +790,10 @@ // matrixNetRenevueToSharePerStrategyMetPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixNetRenevueToSharePerStrategyMetPerVessel(Date date) + public MatrixND matrixNetRenevueToSharePerStrategyMetPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory .getInstance() @@ -807,11 +804,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = netRenevueToSharePerStrategyMetPerVessel(str, - metier, date); + metier, step); result.setValue(str, metier, value); } } @@ -828,17 +825,17 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double netRenevueToSharePerStrategyMetPerVessel(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { double netRenevueToSharePerStrategyMetPerVessel = netValueOfLandingsPerStrategyMetPerVessel( - str, metier, date); + str, metier, step); double sharedNotFixedCostsPerVessel = sharedNotFixedCostsPerVessel(str, - metier, date); - double propStr = str.getStrategyMonthInfo(date.getMonth()) + metier, step); + double propStr = str.getStrategyMonthInfo(step.getMonth()) .getProportionMetier(metier); double result = netRenevueToSharePerStrategyMetPerVessel @@ -850,10 +847,10 @@ // matrixCrewSharePerStrategyMetPerVessel ////////////////////////////////////////////////////////////////////// - public MatrixND matrixCrewSharePerStrategyMetPerVessel(Date date) + public MatrixND matrixCrewSharePerStrategyMetPerVessel(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_CREW_SHARE_PER_STRATEGY_MET_PER_VESSEL, @@ -862,11 +859,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = crewSharePerStrategyMetPerVessel(str, metier, - date); + step); result.setValue(str, metier, value); } } @@ -881,14 +878,14 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double crewSharePerStrategyMetPerVessel(Strategy str, - Metier metier, Date date) throws TopiaException { + Metier metier, TimeStep step) throws TopiaException { double netRenevueToShare = netRenevueToSharePerStrategyMetPerVessel( - str, metier, date); + str, metier, step); EffortDescription effort = str.getSetOfVessels().getPossibleMetiers( metier); @@ -906,9 +903,9 @@ ////////////////////////////////////////////////////////////////////// public MatrixND matrixOwnerMarginOverVariableCostsPerStrategyMetPerVessel( - Date date) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + TimeStep step) throws TopiaException { + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory .getInstance() @@ -919,11 +916,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = ownerMarginOverVariableCostsPerStrategyMetPerVessel( - str, metier, date); + str, metier, step); result.setValue(str, metier, value); } } @@ -941,18 +938,18 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double ownerMarginOverVariableCostsPerStrategyMetPerVessel( - Strategy str, Metier metier, Date date) throws TopiaException { + Strategy str, Metier metier, TimeStep step) throws TopiaException { double netRenevueToShare = netRenevueToSharePerStrategyMetPerVessel( - str, metier, date); - double crewShare = crewSharePerStrategyMetPerVessel(str, metier, date); + str, metier, step); + double crewShare = crewSharePerStrategyMetPerVessel(str, metier, step); double repair = repairAndMaintenanceGearCostsPerVessel(str, metier, - date); - double propStr = str.getStrategyMonthInfo(date.getMonth()) + step); + double propStr = str.getStrategyMonthInfo(step.getMonth()) .getProportionMetier(metier); return netRenevueToShare - crewShare - repair * propStr; @@ -963,9 +960,9 @@ ////////////////////////////////////////////////////////////////////// public MatrixND matrixVesselMarginOverVariableCostsPerStrategyMetPerVessel( - Date date) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); - List<Metier> metiers = siMatrix.getMetiers(date); + TimeStep step) throws TopiaException { + List<Strategy> strategies = siMatrix.getStrategies(step); + List<Metier> metiers = siMatrix.getMetiers(step); MatrixND result = MatrixFactory .getInstance() @@ -976,11 +973,11 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = siMatrix.getMetiers(str, date); + metiers = siMatrix.getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); double value = vesselMarginOverVariableCostsPerStrategyMetPerVessel( - str, metier, date); + str, metier, step); result.setValue(str, metier, value); } } @@ -997,17 +994,17 @@ * * @param str * @param metier - * @param date + * @param step * @return * @throws TopiaException */ private double vesselMarginOverVariableCostsPerStrategyMetPerVessel( - Strategy str, Metier metier, Date date) throws TopiaException { + Strategy str, Metier metier, TimeStep step) throws TopiaException { double netRenevueToShare = netRenevueToSharePerStrategyMetPerVessel( - str, metier, date); + str, metier, step); double repair = repairAndMaintenanceGearCostsPerVessel(str, metier, - date); - double propStr = str.getStrategyMonthInfo(date.getMonth()) + step); + double propStr = str.getStrategyMonthInfo(step.getMonth()) .getProportionMetier(metier); return netRenevueToShare - repair * propStr; @@ -1018,8 +1015,8 @@ ////////////////////////////////////////////////////////////////////// public MatrixND matrixOwnerMarginOverVariableCostsPerStrategyPerVessel( - Date date) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); + TimeStep step) throws TopiaException { + List<Strategy> strategies = siMatrix.getStrategies(step); MatrixND result = MatrixFactory .getInstance() @@ -1031,7 +1028,7 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); double value = ownerMarginOverVariableCostsPerStrategyPerVessel( - str, date); + str, step); result.setValue(s, value); } @@ -1045,12 +1042,12 @@ * [str,met,month] * * @param str - * @param date + * @param step * @return * @throws TopiaException */ private double ownerMarginOverVariableCostsPerStrategyPerVessel( - Strategy str, Date date) throws TopiaException { + Strategy str, TimeStep step) throws TopiaException { SetOfVessels sov = str.getSetOfVessels(); Collection<EffortDescription> efforts = sov.getPossibleMetiers(); @@ -1059,7 +1056,7 @@ for (EffortDescription effort : efforts) { Metier metier = effort.getPossibleMetiers(); result += ownerMarginOverVariableCostsPerStrategyMetPerVessel(str, - metier, date); + metier, step); } return result; } @@ -1068,9 +1065,9 @@ // matrixOwnerMarginOverVariableCostsPerStrategy ////////////////////////////////////////////////////////////////////// - public MatrixND matrixOwnerMarginOverVariableCostsPerStrategy(Date date) + public MatrixND matrixOwnerMarginOverVariableCostsPerStrategy(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); + List<Strategy> strategies = siMatrix.getStrategies(step); MatrixND result = MatrixFactory .getInstance() @@ -1081,7 +1078,7 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - double value = ownerMarginOverVariableCostsPerStrategy(str, date); + double value = ownerMarginOverVariableCostsPerStrategy(str, step); result.setValue(s, value); } @@ -1095,14 +1092,14 @@ * *[PropNbVessels(str,sov)*NbVesselsSetOfVessels(sov)] * * @param str - * @param date + * @param step * @return * @throws TopiaException */ private double ownerMarginOverVariableCostsPerStrategy(Strategy str, - Date date) throws TopiaException { + TimeStep step) throws TopiaException { double ownerMarginOverVariableCostsPerStrategyPerVessel = ownerMarginOverVariableCostsPerStrategyPerVessel( - str, date); + str, step); double proportionSetOfVessels = str.getProportionSetOfVessels(); double numberOfVessels = str.getSetOfVessels().getNumberOfVessels(); @@ -1115,8 +1112,8 @@ ////////////////////////////////////////////////////////////////////// public MatrixND matrixVesselMarginOverVariableCostsPerStrategyPerVessel( - Date date) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); + TimeStep step) throws TopiaException { + List<Strategy> strategies = siMatrix.getStrategies(step); MatrixND result = MatrixFactory .getInstance() @@ -1128,7 +1125,7 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); double value = vesselMarginOverVariableCostsPerStrategyPerVessel( - str, date); + str, step); result.setValue(s, value); } @@ -1142,12 +1139,12 @@ * [str,met,month] * * @param str - * @param date + * @param step * @return * @throws TopiaException */ private double vesselMarginOverVariableCostsPerStrategyPerVessel( - Strategy str, Date date) throws TopiaException { + Strategy str, TimeStep step) throws TopiaException { SetOfVessels sov = str.getSetOfVessels(); Collection<EffortDescription> efforts = sov.getPossibleMetiers(); @@ -1156,7 +1153,7 @@ for (EffortDescription effort : efforts) { Metier metier = effort.getPossibleMetiers(); result += vesselMarginOverVariableCostsPerStrategyMetPerVessel(str, - metier, date); + metier, step); } return result; } @@ -1165,9 +1162,9 @@ // matrixVesselMarginOverVariableCostsPerStrategy ////////////////////////////////////////////////////////////////////// - public MatrixND matrixVesselMarginOverVariableCostsPerStrategy(Date date) + public MatrixND matrixVesselMarginOverVariableCostsPerStrategy(TimeStep step) throws TopiaException { - List<Strategy> strategies = siMatrix.getStrategies(date); + List<Strategy> strategies = siMatrix.getStrategies(step); MatrixND result = MatrixFactory .getInstance() @@ -1178,7 +1175,7 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - double value = vesselMarginOverVariableCostsPerStrategy(str, date); + double value = vesselMarginOverVariableCostsPerStrategy(str, step); result.setValue(s, value); } @@ -1192,14 +1189,14 @@ * *[PropNbVessels(str,sov)*NbVesselsSetOfVessels(sov)] * * @param str - * @param date + * @param step * @return * @throws TopiaException */ private double vesselMarginOverVariableCostsPerStrategy(Strategy str, - Date date) throws TopiaException { + TimeStep step) throws TopiaException { double vesselMarginOverVariableCostsPerStrategyPerVessel = vesselMarginOverVariableCostsPerStrategyPerVessel( - str, date); + str, step); double proportionSetOfVessels = str.getProportionSetOfVessels(); double numberOfVessels = str.getSetOfVessels().getNumberOfVessels(); @@ -1214,8 +1211,8 @@ /////////////////////////////////////////////////////////////////////////// public double valuePerUnitFishingEffort(Strategy str, Metier metier, - Date date) throws TopiaException { - List<Population> pops = siMatrix.getPopulations(date); + TimeStep step) throws TopiaException { + List<Population> pops = siMatrix.getPopulations(step); double result = 0; @@ -1226,15 +1223,15 @@ double price = group.getPrice(); for (Zone zone : zones) { double catchValue = getCatchWeightPerStrMetPerZonePop(str, - metier, group, zone, date); + metier, group, zone, step); double discards = getDiscardsWeightPerStrMet(str, metier, - group, zone, date); + group, zone, step); result += price * (catchValue - discards); } } } - double effort = getEffortPerStrategyMet(str, metier, date); + double effort = getEffortPerStrategyMet(str, metier, step); if (effort == 0) { result = 0; @@ -1248,11 +1245,11 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ - public double getEffortPerStrategyMet(Strategy str, Metier metier, Date date) { - MatrixND mat = resultManager.getMatrix(date, + public double getEffortPerStrategyMet(Strategy str, Metier metier, TimeStep step) { + MatrixND mat = resultManager.getMatrix(step, ResultName.MATRIX_EFFORT_PER_STRATEGY_MET); double result = 0; if (mat != null) { @@ -1262,10 +1259,10 @@ } public double landingPerUnitFishingEffort(Strategy str, Metier metier, - Date date) throws TopiaException { - List<Population> pops = siMatrix.getPopulations(date); + TimeStep step) throws TopiaException { + List<Population> pops = siMatrix.getPopulations(step); - double effort = getEffortPerStrategyMet(str, metier, date); + double effort = getEffortPerStrategyMet(str, metier, step); double result = 0; if (effort != 0) { // s'il n'y a pas d'effort on retournera 0 @@ -1275,9 +1272,9 @@ for (PopulationGroup group : groups) { for (Zone zone : zones) { double catchValue = getCatchWeightPerStrMetPerZonePop( - str, metier, group, zone, date); + str, metier, group, zone, step); double discards = getDiscardsWeightPerStrMet(str, - metier, group, zone, date); + metier, group, zone, step); result += catchValue - discards; } } Modified: isis-fish/trunk/src/test/resources/test-database/scripts/ResultName.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/scripts/ResultName.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/scripts/ResultName.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, Cedric Pineau, Benjamin Poussin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -23,18 +20,6 @@ * #L% */ -/* * - * ResultName.java - * - * Created: 23 aout 2006 15:09:37 - * - * @author poussin - * @version $Revision: 1.10 $ - * - * Last update: $Date: 2007-07-09 19:51:34 $ - * by : $Author: bpoussin $ - */ - package scripts; import static org.nuiton.i18n.I18n.n_; @@ -57,91 +42,371 @@ * @author poussin */ public class ResultName { + + /** + * Matrix with 4 dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Metier + * Dimension 3 : Population + * Dimension 4 : Zone + */ @Doc(value = "do the doc of Result matrixDiscardsWeightPerStrMet") static final public String MATRIX_DISCARDS_WEIGHT_PER_STR_MET_PER_ZONE_POP = n_("matrixDiscardsWeightPerStrMetPerZonePop"); + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixDiscardsPerStrMet") static final public String MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP = n_("matrixDiscardsPerStrMetPerZonePop"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixLandingPerMet") static final public String MATRIX_LANDING_PER_MET = n_("matrixLandingPerMet"); + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixEffortPerStrategyMet") static final public String MATRIX_EFFORT_PER_STRATEGY_MET = n_("matrixEffortPerStrategyMet"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixEffortNominalPerStrategyMet") static final public String MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET = n_("matrixEffortNominalPerStrategyMet"); - @Doc(value = "do the doc of Result matrixStdTravelEffortPerStrategyMet") - static final public String MATRIX_STD_TRAVEL_EFFORT_PER_STRATEGY_MET = n_("matrixStdTravelEffortPerStrategyMet"); - @Doc(value = "do the doc of Result matrixEffortPerZonePop") - static final public String MATRIX_EFFORT_PER_ZONE_POP = n_("matrixEffortPerZonePop"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "Disponible uniquement avec les simulations par Zone. do the doc of Result matrixCatchRatePerStrategyMet") static final public String MATRIX_CATCH_RATE_PER_STRATEGY_MET_PER_ZONE_POP = n_("matrixCatchRatePerStrategyMet"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixCatchPerStrategyMetPerZoneMet") static final public String MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_MET = n_("matrixCatchPerStrategyMetPerZoneMet"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixCatchPerStrategyMetPerZonePop") static final public String MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP = n_("matrixCatchPerStrategyMetPerZonePop"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixCatchWeightPerStrategyMetPerZoneMet") static final public String MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_MET = n_("matrixCatchWeightPerStrategyMetPerZoneMet"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "do the doc of Result matrixCatchWeightPerStrategyMetPerZonePop") static final public String MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP = n_("matrixCatchWeightPerStrategyMetPerZonePop"); + + /** + * Matrix with five dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Group + * Dimension 5 : Zone + */ @Doc(value = "Disponible uniquement avec les simulations par Zone. do the doc of Result matrixFishingMortality") static final public String MATRIX_FISHING_MORTALITY = n_("matrixFishingMortality"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Group (semantics : Dimension 1) + * Dimension 3 : Zone (semantics : Dimension 2) + */ @Doc(value = "do the doc of Result matrixAbundance") static final public String MATRIX_ABUNDANCE = n_("matrixAbundance"); - @Doc(value = "do the doc of Result matrixBiomass") + + /** + * Matrix with three dimensions + * Dimension 1 : Date + * Dimension 2 : Group + * Dimension 3 : Zone + */ + @Doc(value = "do the doc of Result matrixAbundanceBeginMonth") static final public String MATRIX_ABUNDANCE_BEGIN_MONTH = n_("matrixAbundanceBeginMonth"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Group + * Dimension 3 : Zone + */ @Doc(value = "do the doc of Result matrixBiomass") static final public String MATRIX_BIOMASS = n_("matrixBiomass"); - @Doc(value = "do the doc of Result matrixBiomass") + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Group + * Dimension 3 : Zone + */ + @Doc(value = "do the doc of Result matrixBiomassBeginMonth") static final public String MATRIX_BIOMASS_BEGIN_MONTH = n_("matrixBiomassBeginMonth"); + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixFishingTimePerMonthPerVessel") static final public String MATRIX_FISHING_TIME_PER_MONTH_PER_VESSEL = n_("matrixFishingTimePerMonthPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixFuelCostsOfTravelPerVessel") static final public String MATRIX_FUEL_COSTS_OF_TRAVEL_PER_VESSEL = n_("matrixFuelCostsOfTravelPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixCostsOfFishingPerVessel") static final public String MATRIX_COSTS_OF_FISHING_PER_VESSEL = n_("matrixCostsOfFishingPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixFuelCostsPerVessel") static final public String MATRIX_FUEL_COSTS_PER_VESSEL = n_("matrixFuelCostsPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixRepairAndMaintenanceGearCostsPerVessel") static final public String MATRIX_REPAIR_AND_MAINTENANCE_GEAR_COSTS_PER_VESSEL = n_("matrixRepairAndMaintenanceGearCostsPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixOtherRunningCostsPerVessel") static final public String MATRIX_OTHER_RUNNING_COSTS_PER_VESSEL = n_("matrixOtherRunningCostsPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixSharedNotFixedCostsPerVessel") static final public String MATRIX_SHARED_NOT_FIXED_COSTS_PER_VESSEL = n_("matrixSharedNotFixedCostsPerVessel"); - // static final public String MATRIX_SHARED_FIXED_COSTS_PER_VESSEL_PER_MET = n_("matrixSharedFixedCostsPerVesselPerMet"); + + /** + * Matrix with four dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * Dimension 4 : Population + */ @Doc(value = "do the doc of Result matrixGrossValueOfLandingsPerSpeciesPerStrategyMet") static final public String MATRIX_GROSS_VALUE_OF_LANDINGS_PER_SPECIES_PER_STRATEGY_MET = n_("matrixGrossValueOfLandingsPerSpeciesPerStrategyMet"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixGrossValueOfLandingsPerStrategyMet") static final public String MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET = n_("matrixGrossValueOfLandingsPerStrategyMet"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + * + * Matrix calculated in the non generic Rule : GraviteVPUE1LangEtGrossValueOtherSpeciesECOMOD + */ @Doc(value = "do the doc of Result matrixGrossValueOfLandingsOtherSpeciesPerStrategyMet") static final public String MATRIX_GROSS_VALUE_OF_LANDINGS_OTHER_SPECIES_PER_STRATEGY_MET = n_("matrixGrossValueOfLandingsOtherSpeciesPerStrategyMet"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixGrossValueOfLandingsPerStrategyMetPerVessel") static final public String MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET_PER_VESSEL = n_("matrixGrossValueOfLandingsPerStrategyMetPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixNetValueOfLandingsPerStrategyMet") static final public String MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET = n_("matrixNetValueOfLandingsPerStrategyMet"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixNetValueOfLandingsPerStrategyMetPerVessel") static final public String MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET_PER_VESSEL = n_("matrixNetValueOfLandingsPerStrategyMetPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixNetRenevueToSharePerStrategyMetPerVessel") static final public String MATRIX_NET_RENEVUE_TO_SHARE_PER_STRATEGY_MET_PER_VESSEL = n_("matrixNetRenevueToSharePerStrategyMetPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixCrewSharePerStrategyPerVessel") static final public String MATRIX_CREW_SHARE_PER_STRATEGY_MET_PER_VESSEL = n_("matrixCrewSharePerStrategyPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixOwnerMarginOverVariableCostsPerStrategyMetPerVessel") static final public String MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_MET_PER_VESSEL = n_("matrixOwnerMarginOverVariableCostsPerStrategyMetPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixVesselMarginOverVariableCostsPerStrategyMetPerVessel") static final public String MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_MET_PER_VESSEL = n_("matrixVesselMarginOverVariableCostsPerStrategyMetPerVessel"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixOwnerMarginOverVariableCostsPerStrategyPerVessel") static final public String MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL = n_("matrixOwnerMarginOverVariableCostsPerStrategyPerVessel"); + + /** + * Matrix with two dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + */ @Doc(value = "do the doc of Result matrixOwnerMarginOverVariableCostsPerStrategy") static final public String MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY = n_("matrixOwnerMarginOverVariableCostsPerStrategy"); + + /** + * Matrix with two dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + */ @Doc(value = "do the doc of Result matrixVesselMarginOverVariableCostsPerStrategyPerVessel") static final public String MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL = n_("matrixVesselMarginOverVariableCostsPerStrategyPerVessel"); + + /** + * Matrix with two dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + */ @Doc(value = "do the doc of Result matrixVesselMarginOverVariableCostsPerStrategy") static final public String MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY = n_("matrixVesselMarginOverVariableCostsPerStrategy"); + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Strategy + * Dimension 3 : Metier + */ @Doc(value = "do the doc of Result matrixNoActivity") static final public String MATRIX_NO_ACTIVITY = n_("matrixNoActivity"); + + /** + * Matrix with three dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Metier + * Dimension 3 : Zone + */ @Doc(value = "do the doc of Result matrixMetierZone") static final public String MATRIX_METIER_ZONE = n_("matrixMetierZone"); + + /** + * Matrix with two dimensions + * Dimension 1 : TimeStep + * Dimension 2 : Group + */ @Doc(value = "do the doc of Result matrixPrice") static final public String MATRIX_PRICE = n_("matrixPrice"); } Modified: isis-fish/trunk/src/test/resources/test-database/scripts/RuleUtil.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/scripts/RuleUtil.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/scripts/RuleUtil.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -35,7 +32,7 @@ import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.Species; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; /** * RuleUtil. @@ -60,7 +57,7 @@ * passe seulement pour que le cache ne retourne pas toujours la meme valeur * @return total catch in tons */ - public static double getTotalCatchTons(SimulationContext context, Species species, Date date) { + public static double getTotalCatchTons(SimulationContext context, Species species, TimeStep step) { double result = 0; for (Population pop : species.getPopulation()) { MatrixND mat = context.getPopulationMonitor().getHoldCatch(pop); Modified: isis-fish/trunk/src/test/resources/test-database/scripts/SiMatrix.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/scripts/SiMatrix.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/scripts/SiMatrix.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, Benjamin Poussin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -58,7 +55,7 @@ import fr.ifremer.isisfish.entities.Zone; import fr.ifremer.isisfish.entities.ZoneDAO; import fr.ifremer.isisfish.simulator.SimulationContext; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; /** @@ -67,15 +64,15 @@ * Created: 21 aout 2006 15:53:01 * * @author poussin - * @version $Revision: 1 $ + * @version $Revision: 1.18 $ * - * Last update: $Date: 2009-10-19 14:25:49 +0200 (lun., 19 oct. 2009) $ + * Last update: $Date: 2007-11-02 17:53:20 $ * by : $Author: bpoussin $ */ public class SiMatrix { /** to use log facility, just put in your code: log.info("..."); */ - private Log log = LogFactory.getLog(SiMatrix.class); + static private Log log = LogFactory.getLog(SiMatrix.class); protected SimulationContext context = null; protected TopiaContext db = null; @@ -121,7 +118,7 @@ * @return * @throws TopiaException */ - public List<Zone> getZones(Date date) throws TopiaException { + public List<Zone> getZones(TimeStep step) throws TopiaException { ZoneDAO dao = IsisFishDAOHelper.getZoneDAO(db); List<Zone> result = dao.findAll(); return result; @@ -131,7 +128,7 @@ * @return * @throws TopiaException */ - public List<Population> getPopulations(Date date) throws TopiaException { + public List<Population> getPopulations(TimeStep step) throws TopiaException { List<Population> populations = new ArrayList<Population>(); for (Population pop : context.getSimulationStorage().getParameter() .getPopulations()) { @@ -145,7 +142,7 @@ * @return * @throws TopiaException */ - public List<Strategy> getStrategies(Date date) throws TopiaException { + public List<Strategy> getStrategies(TimeStep step) throws TopiaException { // if (strategies == null) { List<Strategy> strategies = new ArrayList<Strategy>(); for (Strategy str : context.getSimulationStorage().getParameter() @@ -157,11 +154,11 @@ return strategies; } - public List<Metier> getMetiers(Date date) throws TopiaException { + public List<Metier> getMetiers(TimeStep step) throws TopiaException { // if (metiers == null) { List<Metier> metiers = new ArrayList<Metier>(); HashSet<Metier> tmp = new HashSet<Metier>(); - for (Strategy str : getStrategies(date)) { + for (Strategy str : getStrategies(step)) { SetOfVessels sov = str.getSetOfVessels(); for (EffortDescription effort : sov.getPossibleMetiers()) { Metier metier = effort.getPossibleMetiers(); @@ -175,15 +172,15 @@ } /** - * Retourne les metiers pratiques par une Strategie a une date donnee Un + * Retourne les metiers pratiques par une Strategie a une step donnee Un * metier est pratique si le PropStrMet est different de 0 * * @param str - * @param date + * @param step * @return */ - public List<Metier> getMetiers(Strategy str, Date date) { - StrategyMonthInfo info = str.getStrategyMonthInfo(date.getMonth()); + public List<Metier> getMetiers(Strategy str, TimeStep step) { + StrategyMonthInfo info = str.getStrategyMonthInfo(step.getMonth()); MatrixND props = info.getProportionMetier(); List<Metier> result = new ArrayList<Metier>(); @@ -200,17 +197,17 @@ /** * Retourne la matrix Metier x Zone qui correspond au zone utilise par un - * metier pour une date donnee. Si la valeur de la matrice est 1 alors la + * metier pour une step donnee. Si la valeur de la matrice est 1 alors la * zone est utilise par le metier, si elle vaut 0 alors elle n'est pas * utilisee. * - * @param date + * @param step * @return * @throws TopiaException */ - public MatrixND getMetierZone(Date date) throws TopiaException { - List<Metier> metiers = getMetiers(date); - List<Zone> zones = getZones(date); + public MatrixND getMetierZone(TimeStep step) throws TopiaException { + List<Metier> metiers = getMetiers(step); + List<Zone> zones = getZones(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_METIER_ZONE, new List[] { metiers, zones }, @@ -218,7 +215,7 @@ for (Metier metier : metiers) { Collection<Zone> zoneMetier = metier.getMetierSeasonInfo( - date.getMonth()).getZone(); + step.getMonth()).getZone(); for (Zone zone : zoneMetier) { result.setValue(metier, zone, 1); } @@ -226,7 +223,7 @@ return result; } - public MatrixND matrixPrice(Date date, Population pop) { + public MatrixND matrixPrice(TimeStep step, Population pop) { List<PopulationGroup> groups = pop.getPopulationGroup(); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_PRICE, new List[] { groups }, @@ -246,7 +243,7 @@ // /////////////////////////////////////////////////////////////////////////// - public MatrixND matrixCatchWeightPerStrategyMetPerZoneMet(Date date, + public MatrixND matrixCatchWeightPerStrategyMetPerZoneMet(TimeStep step, Population pop, MatrixND matrixCatchPerStrategyMetPerZoneMet) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); @@ -264,23 +261,23 @@ } public MatrixND matrixCatchPerStrategyMetPerZoneMet(MatrixND N, - Population pop, Date date) throws TopiaException, IsisFishException { + Population pop, TimeStep step) throws TopiaException, IsisFishException { MatrixND matrixFishingMortalityPerCell = matrixFishingMortalityPerCell( - date, pop); + step, pop); MatrixND matrixCatchRatePerStrategyMetPerCell = matrixCatchRatePerStrategyMetPerCell( - pop, date, matrixFishingMortalityPerCell); + pop, step, matrixFishingMortalityPerCell); MatrixND matrixCatchPerStrategyMetPerCell = matrixCatchPerStrategyMetPerCell( - N, pop, date, matrixCatchRatePerStrategyMetPerCell); + N, pop, step, matrixCatchRatePerStrategyMetPerCell); - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); List<PopulationGroup> groups = (List<PopulationGroup>)matrixCatchPerStrategyMetPerCell - .getSemantics(2); - List<Zone> zones = getZones(date); + .getSemantic(2); + List<Zone> zones = getZones(step); Set<Cell> cellPops = new HashSet(matrixCatchPerStrategyMetPerCell - .getSemantics(4)); + .getSemantic(4)); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_MET, @@ -298,7 +295,7 @@ PopulationGroup group = groups.get(g); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - MetierSeasonInfo infoMet = metier.getMetierSeasonInfo(date + MetierSeasonInfo infoMet = metier.getMetierSeasonInfo(step .getMonth()); Collection<Zone> zoneMet = infoMet.getZone(); for (Zone z : zoneMet) { @@ -323,13 +320,13 @@ } public MatrixND matrixCatchPerStrategyMetPerZonePop(MatrixND N, - Population pop, Date date) throws TopiaException, IsisFishException { + Population pop, TimeStep step) throws TopiaException, IsisFishException { MatrixND matrixFishingMortalityPerCell = matrixFishingMortalityPerCell( - date, pop); + step, pop); MatrixND matrixCatchRatePerStrategyMetPerCell = matrixCatchRatePerStrategyMetPerCell( - pop, date, matrixFishingMortalityPerCell); + pop, step, matrixFishingMortalityPerCell); MatrixND matrixCatchPerStrategyMetPerCell = matrixCatchPerStrategyMetPerCell( - N, pop, date, matrixCatchRatePerStrategyMetPerCell); + N, pop, step, matrixCatchRatePerStrategyMetPerCell); // on somme sur les cellules MatrixND result = matrixCatchPerStrategyMetPerCell.sumOverDim(4); @@ -339,7 +336,7 @@ return result; } - public MatrixND matrixCatchWeightPerStrategyMetPerZonePop(Date date, + public MatrixND matrixCatchWeightPerStrategyMetPerZonePop(TimeStep step, Population pop, MatrixND matrixCatchPerStrategyMetPerZonePop) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); @@ -363,20 +360,20 @@ * * @param N l'abondance sous forme de matrice 2D [class x zone] * @param pop - * @param date + * @param step * @param matrixCatchRatePerStrategyMet * @return * @throws TopiaException * @throws IsisFishException */ public MatrixND matrixCatchPerStrategyMetPerZone(MatrixND N, - Population pop, Date date, MatrixND matrixCatchRatePerStrategyMet) + Population pop, TimeStep step, MatrixND matrixCatchRatePerStrategyMet) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); // on le passe en argument ce qui evite de le calculer 2 fois - // MatrixND matrixCatchRatePerStrategyMet = matrixCatchRatePerStrategyMet(pop, date); + // MatrixND matrixCatchRatePerStrategyMet = matrixCatchRatePerStrategyMet(pop, step); MatrixND result = matrixCatchRatePerStrategyMet.copy(); result.setName(ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP); @@ -396,17 +393,17 @@ * Strategy x Metier x Classe x zonePop ] * * @param pop - * @param date + * @param step * @param matrixFishingMortality * @return * @throws TopiaException * @throws IsisFishException */ public MatrixND matrixCatchRatePerStrategyMetPerZone(Population pop, - Date date, MatrixND matrixFishingMortality) throws TopiaException, + TimeStep step, MatrixND matrixFishingMortality) throws TopiaException, IsisFishException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); @@ -419,17 +416,17 @@ // Optimisation Hilaire for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = getMetiers(str, date); + metiers = getMetiers(str, step); 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); + double effort = effortPerZonePop(str, metier, step, zone); if (effort > 0) { for (int g = 0; g < groups.size(); g++) { PopulationGroup group = groups.get(g); double value = catchRatePerStrategyMet(str, metier, - date, group, zone, matrixFishingMortality); + step, group, zone, matrixFishingMortality); result.setValue(str, metier, group, zone, value); } } @@ -442,18 +439,18 @@ /** * @param str * @param metier - * @param date + * @param step * @param zone * @return */ - private double effortPerZonePop(Strategy str, Metier metier, Date date, + private double effortPerZonePop(Strategy str, Metier metier, TimeStep step, Zone zonePop) { - Month month = date.getMonth(); + Month month = step.getMonth(); Collection<Zone> zoneMet = metier.getMetierSeasonInfo(month).getZone(); double inter = nbCellInter(zoneMet, zonePop); double effortPerStrategyPerCell = effortPerStrategyPerCell(str, metier, - date); + step); if (log.isDebugEnabled()) { log.debug(" strategy=" + str + " metier=" + metier + " inter=" @@ -467,10 +464,10 @@ // Optimisation Hilaire private double catchRatePerStrategyMet(Strategy str, Metier metier, - Date date, PopulationGroup group, Zone zone, + TimeStep step, PopulationGroup group, Zone zone, MatrixND matrixFishingMortality) throws TopiaException, IsisFishException { - double totalFishingMortality = totalFishingMortality(date, + double totalFishingMortality = totalFishingMortality(step, matrixFishingMortality).getValue(group, zone); if (totalFishingMortality == 0) { @@ -483,7 +480,7 @@ double fishingMortality = matrixFishingMortality.getValue(str, metier, group, zone); - double totalCatchRate = totalCatchRate(date, group, zone, + double totalCatchRate = totalCatchRate(step, group, zone, totalFishingMortality); if (log.isDebugEnabled()) { @@ -498,14 +495,14 @@ } /** - * @param date + * @param step * @param group * @param zone * @param totalFishingMortality * @return * @throws TopiaException */ - private double totalCatchRate(Date date, PopulationGroup group, Zone zone, + private double totalCatchRate(TimeStep step, PopulationGroup group, Zone zone, double totalFishingMortality) throws TopiaException { double M = group.getNaturalDeathRate(zone) / Month.NUMBER_OF_MONTH; if (M == 0) { @@ -528,13 +525,13 @@ * Returne une matrice de mortalite group x zone, donc somme sur str et * metier * - * @param date + * @param step * @param matrixFishingMortality * @param group * @param zone * @return */ - private MatrixND totalFishingMortality(Date date, + private MatrixND totalFishingMortality(TimeStep step, MatrixND matrixFishingMortality) { MatrixND result = matrixFishingMortality.sumOverDim(0); result = result.sumOverDim(1); @@ -546,15 +543,15 @@ * Matrice fishing mortality dim [ Strategy x Metier x Classe x zonePop ] * * @param pop - * @param date + * @param step * @return * @throws TopiaException * @throws IsisFishException */ - public MatrixND matrixFishingMortality(Date date, Population pop) + public MatrixND matrixFishingMortality(TimeStep step, Population pop) throws TopiaException, IsisFishException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); @@ -565,7 +562,7 @@ new String[] { n_("Strategies"), n_("Metiers"), n_("Groups"), n_("Zones") }); - Month month = date.getMonth(); + Month month = step.getMonth(); PopulationSeasonInfo infoPop = pop.getPopulationSeasonInfo(month); for (int g = 0; g < groups.size(); g++) { @@ -600,7 +597,7 @@ for (int z = 0; z < zones.size(); z++) { Zone zone = zones.get(z); double effort = effortPerZonePop(str, - metier, date, zone); + metier, step, zone); if (effort > 0) { // put value only if <> 0 double value = coeff * capturability * ciblage @@ -625,20 +622,20 @@ * @param N * l'abondance sous forme de matrice 2D [class x zone] * @param pop - * @param date + * @param step * @return * @throws TopiaException * @throws IsisFishException */ private MatrixND matrixCatchPerStrategyMetPerCell(MatrixND N, - Population pop, Date date, + Population pop, TimeStep step, MatrixND matrixCatchRatePerStrategyMetPerCell) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); // on le passe en argument ce qui evite de le calculer 2 fois - // MatrixND matrixCatchRatePerStrategyMet = matrixCatchRatePerStrategyMet(pop, date); + // MatrixND matrixCatchRatePerStrategyMet = matrixCatchRatePerStrategyMet(pop, step); MatrixND result = matrixCatchRatePerStrategyMetPerCell.copy(); result.setName("matrixCatchPerStrategyMetPerCell"); @@ -657,16 +654,16 @@ * Matrice des captures en poids dim [ Strategy x Metier x Classe x zonePop ] * * @param pop - * @param date + * @param step * @return * @throws TopiaException * @throws IsisFishException */ private MatrixND matrixCatchRatePerStrategyMetPerCell(Population pop, - Date date, MatrixND matrixFishingMortalityPerCell) + TimeStep step, MatrixND matrixFishingMortalityPerCell) throws TopiaException, IsisFishException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); List<Cell> cells = getCells(zones); @@ -685,7 +682,7 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = getMetiers(str, date); + metiers = getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); for (int z = 0; z < zones.size(); z++) { @@ -699,7 +696,7 @@ for (int g = 0; g < groups.size(); g++) { PopulationGroup group = groups.get(g); double value = catchRatePerStrategyMetPerCell( - str, metier, date, group, zone, cell, + str, metier, step, group, zone, cell, matrixFishingMortalityPerCell); result.setValue(new Object[] { str, metier, group, zone, cell }, value); @@ -720,7 +717,7 @@ * * @param str * @param metier - * @param date + * @param step * @param group * @param zone * @param cell @@ -730,12 +727,12 @@ * @throws IsisFishException */ private double catchRatePerStrategyMetPerCell(Strategy str, Metier metier, - Date date, PopulationGroup group, Zone zone, Cell cell, + TimeStep step, PopulationGroup group, Zone zone, Cell cell, MatrixND matrixFishingMortalityPerCell) throws TopiaException, IsisFishException { MatrixND totalFishingMortalityPerCell = totalFishingMortalityPerCell( - date, matrixFishingMortalityPerCell); + step, matrixFishingMortalityPerCell); double totalFishingMortality = totalFishingMortalityPerCell.getValue( group, zone, cell); @@ -749,7 +746,7 @@ double fishingMortalityPerCell = matrixFishingMortalityPerCell .getValue(new Object[] { str, metier, group, zone, cell }); - double totalCatchRatePerCell = totalCatchRatePerCell(date, group, zone, + double totalCatchRatePerCell = totalCatchRatePerCell(step, group, zone, totalFishingMortality); if (log.isDebugEnabled()) { @@ -764,14 +761,14 @@ } /** - * @param date + * @param step * @param group * @param zone * @param totalFishingMortality * @return * @throws TopiaException */ - private double totalCatchRatePerCell(Date date, PopulationGroup group, + private double totalCatchRatePerCell(TimeStep step, PopulationGroup group, Zone zone, double totalFishingMortalityPerCell) throws TopiaException { double M = group.getNaturalDeathRate(zone) / Month.NUMBER_OF_MONTH; @@ -795,13 +792,13 @@ * Returne une matrice de mortalite group x zone, donc somme sur str et * metier * - * @param date + * @param step * @param matrixFishingMortality * @param group * @param zone * @return */ - private MatrixND totalFishingMortalityPerCell(Date date, + private MatrixND totalFishingMortalityPerCell(TimeStep step, MatrixND matrixFishingMortalityPerCell) { MatrixND result = matrixFishingMortalityPerCell.sumOverDim(0); result = result.sumOverDim(1); @@ -816,15 +813,15 @@ * Nouvelle implantation suite a demande Steph et Sigrid: 20080208 (NouvellesEquationsfev2008ParCelluleAvecAlgo.odt) * * @param pop - * @param date + * @param step * @return * @throws TopiaException * @throws IsisFishException */ - public MatrixND matrixFishingMortalityPerCell(Date date, Population pop) + public MatrixND matrixFishingMortalityPerCell(TimeStep step, Population pop) throws TopiaException, IsisFishException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); List<Cell> cells = getCells(zones); @@ -836,7 +833,7 @@ new String[] { n_("Strategies"), n_("Metiers"), n_("Groups"), n_("Zones"), n_("Cells") }); - Month month = date.getMonth(); + Month month = step.getMonth(); PopulationSeasonInfo infoPop = pop.getPopulationSeasonInfo(month); for (int g = 0; g < groups.size(); g++) { @@ -868,7 +865,7 @@ Strategy str = strategies.get(s); // l'effort d'une cellule du metier double effort = effortPerStrategyPerCell( - str, metier, date); + str, metier, step); if (effort > 0) { // put value only if <> 0 for (int z = 0; z < zones.size(); z++) { Zone zone = zones.get(z); @@ -900,12 +897,12 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ private double effortPerStrategyPerCell(Strategy str, Metier metier, - Date date) { - Month month = date.getMonth(); + TimeStep step) { + Month month = step.getMonth(); //StrategyMonthInfo smi = str.getStrategyMonthInfo(month); Collection<Zone> zones = metier.getMetierSeasonInfo(month).getZone(); double nbCell = getCells(zones).size(); @@ -920,7 +917,7 @@ return 0; } - double effortPerStrategy = effortPerStrategyMet(str, metier, date); + double effortPerStrategy = effortPerStrategyMet(str, metier, step); if (log.isDebugEnabled()) { log.debug(" strategy=" + str + " metier=" + metier + " nbCell=" @@ -935,17 +932,17 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ - private double effortNominalPerStrategyMet(Strategy str, Metier metier, Date date) { - Month month = date.getMonth(); + private double effortNominalPerStrategyMet(Strategy str, Metier metier, TimeStep step) { + Month month = step.getMonth(); StrategyMonthInfo smi = str.getStrategyMonthInfo(month); double propSetOfVessels = str.getProportionSetOfVessels(); int nbOfVessels = str.getSetOfVessels().getNumberOfVessels(); double propStrMet = smi.getProportionMetier(metier); - double effortNominalPerVessel = effortNominalPerStrategyPerVessel(str, metier, date); + double effortNominalPerVessel = effortNominalPerStrategyPerVessel(str, metier, step); if(log.isDebugEnabled()) { log.debug( @@ -966,14 +963,14 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ - private double effortNominalPerStrategyPerVessel(Strategy str, Metier metier, Date date) { - Month month = date.getMonth(); + private double effortNominalPerStrategyPerVessel(Strategy str, Metier metier, TimeStep step) { + Month month = step.getMonth(); StrategyMonthInfo smi = str.getStrategyMonthInfo(month); double nbTrips = smi.getNumberOfTrips(); - double fishingTime = fishingTimePerTrip(str, metier, date); + double fishingTime = fishingTimePerTrip(str, metier, step); if(log.isDebugEnabled()) { @@ -995,17 +992,17 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ - private double effortPerStrategyMet(Strategy str, Metier metier, Date date) { - Month month = date.getMonth(); + private double effortPerStrategyMet(Strategy str, Metier metier, TimeStep step) { + Month month = step.getMonth(); StrategyMonthInfo smi = str.getStrategyMonthInfo(month); double propSetOfVessels = str.getProportionSetOfVessels(); int nbOfVessels = str.getSetOfVessels().getNumberOfVessels(); double propStrMet = smi.getProportionMetier(metier); - double effortPerVessel = effortPerStrategyPerVessel(str, metier, date); + double effortPerVessel = effortPerStrategyPerVessel(str, metier, step); if (log.isDebugEnabled()) { log.debug(" strategy=" + str + " metier=" + metier @@ -1023,16 +1020,16 @@ /** * @param str * @param metier - * @param date + * @param step * @return */ private double effortPerStrategyPerVessel(Strategy str, Metier metier, - Date date) { - Month month = date.getMonth(); + TimeStep step) { + Month month = step.getMonth(); StrategyMonthInfo smi = str.getStrategyMonthInfo(month); double nbTrips = smi.getNumberOfTrips(); - double fishingTime = fishingTimePerTrip(str, metier, date); - double stdEffortPerHour = stdEffortPerHour(date, str.getSetOfVessels(), + double fishingTime = fishingTimePerTrip(str, metier, step); + double stdEffortPerHour = stdEffortPerHour(step, str.getSetOfVessels(), metier); if (log.isDebugEnabled()) { @@ -1051,11 +1048,11 @@ * * @param str * @param metier - * @param date + * @param step * @return */ - protected double fishingTimePerTrip(Strategy str, Metier metier, Date date) { - Month month = date.getMonth(); + protected double fishingTimePerTrip(Strategy str, Metier metier, TimeStep step) { + Month month = step.getMonth(); StrategyMonthInfo smi = str.getStrategyMonthInfo(month); Collection<Zone> zone = metier.getMetierSeasonInfo(month).getZone(); @@ -1190,12 +1187,12 @@ * @param metier * @return */ - private double stdEffortPerHour(Date date, SetOfVessels sov, Metier metier) { + private double stdEffortPerHour(TimeStep step, SetOfVessels sov, Metier metier) { double result = 0; EffortDescription ed = sov.getPossibleMetiers(metier); if (ed != null) { double fstd = metier.getGear().getStandardisationFactor(); - double etp = sov.getTechnicalEfficiency(date, metier); + double etp = sov.getTechnicalEfficiency(metier); double val = fstd * etp * ed.getFishingOperation() * ed.getGearsNumberPerOperation(); result = val; @@ -1242,13 +1239,13 @@ /** * @param N * @param pop - * @param date + * @param step * @return * @throws IsisFishException * @throws TopiaException */ private MatrixND matrixAbundancePerCell(MatrixND N, Population pop, - Date date, MatrixND matrixFishingMortality) throws TopiaException, + TimeStep step, MatrixND matrixFishingMortality) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); @@ -1267,7 +1264,7 @@ List<Cell> cells = zone.getCell(); for (int c = 0; c < cells.size(); c++) { Cell cell = cells.get(c); - double value = survivalRatePerCell(date, group, zone, cell, + double value = survivalRatePerCell(step, group, zone, cell, matrixFishingMortality); double n = N.getValue(g, z) / zone.sizeCell(); value *= n; @@ -1284,18 +1281,18 @@ * * @param N * @param pop - * @param date + * @param step * @return * @throws IsisFishException * @throws TopiaException */ - public MatrixND matrixAbundance(MatrixND N, Population pop, Date date) + public MatrixND matrixAbundance(MatrixND N, Population pop, TimeStep step) throws TopiaException, IsisFishException { MatrixND matrixFishingMortalityPerCell = matrixFishingMortalityPerCell( - date, pop); + step, pop); - MatrixND result = matrixAbundancePerCell(N, pop, date, + MatrixND result = matrixAbundancePerCell(N, pop, step, matrixFishingMortalityPerCell); result = result.sumOverDim(2); result = result.reduceDims(2); @@ -1309,13 +1306,13 @@ * * @param N * @param pop - * @param date + * @param step * @param matrixFishingMortality * @return * @throws IsisFishException * @throws TopiaException */ - public MatrixND matrixAbundance(MatrixND N, Population pop, Date date, + public MatrixND matrixAbundance(MatrixND N, Population pop, TimeStep step, MatrixND matrixFishingMortality) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); @@ -1329,7 +1326,7 @@ PopulationGroup group = groups.get(g); for (int z = 0; z < zones.size(); z++) { Zone zone = zones.get(z); - double value = survivalRatePerZone(date, group, zone, + double value = survivalRatePerZone(step, group, zone, matrixFishingMortality); double n = N.getValue(g, z); value *= n; @@ -1346,12 +1343,12 @@ * * @param N * @param pop - * @param date + * @param step * @return * @throws IsisFishException * @throws TopiaException */ - public MatrixND matrixAbundanceSsF(MatrixND N, Population pop, Date date) + public MatrixND matrixAbundanceSsF(MatrixND N, Population pop, TimeStep step) throws TopiaException, IsisFishException { List<PopulationGroup> groups = pop.getPopulationGroup(); List<Zone> zones = pop.getPopulationZone(); @@ -1378,18 +1375,18 @@ } /** - * @param date + * @param step * @param group * @param zone * @return * @throws IsisFishException * @throws TopiaException */ - private double survivalRatePerZone(Date date, PopulationGroup group, + private double survivalRatePerZone(TimeStep step, PopulationGroup group, Zone zone, MatrixND matrixFishingMortality) throws TopiaException, IsisFishException { - double F = totalFishingMortality(date, matrixFishingMortality) - .getValue(group, zone); //totalFishingMortality(date, group, zone); // rem perf: totalFishingMortality a deja ete calcul? + double F = totalFishingMortality(step, matrixFishingMortality) + .getValue(group, zone); //totalFishingMortality(step, group, zone); // rem perf: totalFishingMortality a deja ete calcul? double M = group.getNaturalDeathRate(zone) / (double) Month.NUMBER_OF_MONTH; double result = Math.exp(-(F + M)); @@ -1398,19 +1395,19 @@ } /** - * @param date + * @param step * @param group * @param zone * @return * @throws IsisFishException * @throws TopiaException */ - private double survivalRatePerCell(Date date, PopulationGroup group, + private double survivalRatePerCell(TimeStep step, PopulationGroup group, Zone zone, Cell cell, MatrixND matrixFishingMortalityPerCell) throws TopiaException, IsisFishException { - double F = totalFishingMortalityPerCell(date, - matrixFishingMortalityPerCell).getValue(group, zone, cell); //totalFishingMortality(date, group, zone); // rem perf: totalFishingMortality a deja ete calcul? + double F = totalFishingMortalityPerCell(step, + matrixFishingMortalityPerCell).getValue(group, zone, cell); //totalFishingMortality(step, group, zone); // rem perf: totalFishingMortality a deja ete calcul? double M = group.getNaturalDeathRate(zone) / (double) Month.NUMBER_OF_MONTH; double result = (double) Math.exp(-(F + M)); @@ -1427,12 +1424,12 @@ /** * @param N * @param pop - * @param date + * @param step * @return */ - public MatrixND matrixBiomass(MatrixND N, Population pop, Date date) { - List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantics(0); - List<Zone> zones = (List<Zone>)N.getSemantics(1); + public MatrixND matrixBiomass(MatrixND N, Population pop, TimeStep step) { + List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantic(0); + List<Zone> zones = (List<Zone>)N.getSemantic(1); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_BIOMASS, new List[] { groups, zones }, @@ -1453,9 +1450,9 @@ } public MatrixND matrixBiomassBeginMonth(MatrixND N, Population pop, - Date date) { - List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantics(0); - List<Zone> zones = (List<Zone>)N.getSemantics(1); + TimeStep step) { + List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantic(0); + List<Zone> zones = (List<Zone>)N.getSemantic(1); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_BIOMASS_BEGIN_MONTH, new List[] { groups, zones }, @@ -1475,9 +1472,9 @@ } public MatrixND matrixAbondanceBeginMonth(MatrixND N, Population pop, - Date date) { - List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantics(0); - List<Zone> zones = (List<Zone>)N.getSemantics(1); + TimeStep step) { + List<PopulationGroup> groups = (List<PopulationGroup>)N.getSemantic(0); + List<Zone> zones = (List<Zone>)N.getSemantic(1); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_ABUNDANCE_BEGIN_MONTH, new List[] { groups, zones }, @@ -1501,13 +1498,13 @@ /////////////////////////////////////////////////////////////////////////// /** - * @param date + * @param step * @return * @throws TopiaException */ - public MatrixND matrixEffortPerStrategyMet(Date date) throws TopiaException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + public MatrixND matrixEffortPerStrategyMet(TimeStep step) throws TopiaException { + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_EFFORT_PER_STRATEGY_MET, @@ -1516,10 +1513,10 @@ for (int s = 0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = getMetiers(str, date); + metiers = getMetiers(str, step); for (int m = 0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = effortPerStrategyMet(str, metier, date); + double value = effortPerStrategyMet(str, metier, step); result.setValue(str, metier, value); } } @@ -1537,12 +1534,12 @@ * * * @param pop - * @param date + * @param step * @param matrixDiscardPerStrategyMetPerZonePop * @return */ public MatrixND matrixDiscardWeightPerStrategyMetPerZonePop(Population pop, - Date date, MatrixND matrixDiscardPerStrategyMetPerZonePop) { + TimeStep step, MatrixND matrixDiscardPerStrategyMetPerZonePop) { List<PopulationGroup> groups = pop.getPopulationGroup(); MatrixND result = matrixDiscardPerStrategyMetPerZonePop.copy(); @@ -1562,10 +1559,10 @@ // // /////////////////////////////////////////////////////////////////////////// - public MatrixND matrixEffortNominalPerStrategyMet(Date date) throws TopiaException { + public MatrixND matrixEffortNominalPerStrategyMet(TimeStep step) throws TopiaException { - List<Strategy> strategies = getStrategies(date); - List<Metier> metiers = getMetiers(date); + List<Strategy> strategies = getStrategies(step); + List<Metier> metiers = getMetiers(step); MatrixND result = MatrixFactory.getInstance().create( ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET, @@ -1574,10 +1571,10 @@ for (int s=0; s < strategies.size(); s++) { Strategy str = strategies.get(s); - metiers = getMetiers(str, date); + metiers = getMetiers(str, step); for (int m=0; m < metiers.size(); m++) { Metier metier = metiers.get(m); - double value = effortNominalPerStrategyMet(str, metier, date); + double value = effortNominalPerStrategyMet(str, metier, step); result.setValue(str, metier, value); } } Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorJavaExpandGrid.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,630 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RProxy; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of ExpandGrid method using Java - * - * @author jcouteau - * @version $Revision$ - * - */ -public class SensitivityCalculatorJavaExpandGrid extends - AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory - .getLog(SensitivityCalculatorJavaExpandGrid.class); - - @Doc("Interaction order") - public int param_order = 2; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return false; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) - throws SensitivityException { - - setIsisFactorsR(plan, outputdirectory); - - int k = 1; //number of sensitivity scenarios (initialization) - int factorNumber = plan.getFactors().size(); //number of factors - List<Factor<?, ?>> factors = plan.getFactors(); //list of factors - - for (int i = 0; i < factorNumber; i++) { - if (factors.get(i).getDomain() instanceof ContinuousDomain) { - if (((ContinuousDomain) factors.get(i).getDomain()) - .getCardinality() != 0) { - k = k - * ((ContinuousDomain) factors.get(i).getDomain()) - .getCardinality(); - } - } else if (factors.get(i).getDomain() instanceof DiscreteDomain) { - if (((DiscreteDomain) factors.get(i).getDomain()).getValues() - .size() != 0) { - k = k - * ((DiscreteDomain) factors.get(i).getDomain()) - .getValues().size(); - } - } - } - - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - for (int i = 0; i < k; i++) { - int result = 0; //used for the euclidian division - int rest = i; //used for the euclidian division - Scenario experimentScenario = new Scenario(); - for (int j = 0; j < factorNumber; j++) { - Factor factor = factors.get(j); - if (factor.getDomain() instanceof ContinuousDomain) { - Double max = ((ContinuousDomain) factor.getDomain()) - .getMaxBound(); - Double min = ((ContinuousDomain) factor.getDomain()) - .getMinBound(); - int card = ((ContinuousDomain) factor.getDomain()) - .getCardinality(); - result = (int) Math.floor(rest / card); - rest = rest - (card * result); - - Double value = min + ((max - min) / (card - 1) * rest); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(value); - } else { - factor.setValueForIdentifier(value); - } - } - if (factor.getDomain() instanceof DiscreteDomain) { - int card = ((DiscreteDomain) factor.getDomain()) - .getValues().size(); - result = (int) Math.floor(rest / card); - rest = rest - (card * result); - factor.setValueForIdentifier(rest); - } - rest = result; - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - - } - thisExperiment.setScenarios(thisExperimentScenarios); - - thisExperimentScenarios = thisExperiment.getScenarios(); - - /* - * Call R to save the data for result analysis - */ - int scenariosNumber = thisExperimentScenarios.size(); - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - String dataframe = "data<-data.frame("; - - //Create the factors vectors and the dataframe instruction - for (int j = 0; j < factorNumber; j++) { - Factor factor = thisExperimentScenarios.get(0).getFactors() - .get(j); - if (factor.getDomain() instanceof EquationContinuousDomain) { - - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < scenariosNumber; i++) { - if (i < (scenariosNumber - 1)) { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < scenariosNumber; i++) { - if (i < (scenariosNumber - 1)) { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < scenariosNumber; i++) { - if (i < (scenariosNumber - 1)) { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue() - + ","; - } else { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } - - if (j < factorNumber - 1) { - dataframe = dataframe - + factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "),"; - } else { - dataframe += factor.getName().replaceAll(" ", "") - + "=factor(" + factor.getName().replaceAll(" ", "") - + "))"; - } - - } - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - // Creating the factors vector. - String rInstruction = "factornames<-c("; - for (int i = 0; i < factorNumber; i++) { - if (i != (factorNumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R : " + rInstruction); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the data.frame object for the second run in a .expandgrid file - engine.voidEval("write.csv(data,file=\".expandgrid.csv\")"); - log - .info("Message sent to R : write.csv(data,file=\".expandgrid\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R : " - + "dput(factornames,file=\".factornames\")"); - - //Create the isis.factor.distribution - log.info("Message sent to R : " - + "isis.factor.distribution<-c(0.0)"); - engine.voidEval("isis.factor.distribution<-c(0.0)"); - - //Create isis.MethodExp - log - .info("Message sent to R : " - + "isis.MethodExp<-list(isis.factor,isis.factor.distribution,call_méthode=\"isis-fish-externeR\")"); - engine - .voidEval("isis.MethodExp<-list(isis.factor,isis.factor.distribution,call_méthode=\"isis-fish-externeR\")"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - //Create isis.Simule - log.info("Message sent to R : " + "isis.simule<-data.frame(data)"); - engine.voidEval("isis.simule<-data.frame(data)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - return thisExperiment; - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) throws SensitivityException { - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - //Get back the scenarios - engine.voidEval("factors<-read.csv(\".expandgrid.csv\")"); - log - .info("Message sent to R : factors<-read.csv(\".expandgrid.csv\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Get back the factors number - int factorNumber = ((Double) engine.eval("length(factors)-1")) - .intValue(); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < simulationStorages.size(); l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - - //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors," + name - + "=" + name + ")"; - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - //Call aov() - String aovCall = "aovresult<-aov(" + name + "~("; - for (int j = 0; j < factorNumber; j++) { - log.info("Message sent to R : " + "names(factors)[" - + (j + 2) + "]"); - - if (j < (factorNumber - 1)) { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + "+"; - } else { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + ")"; - if(param_order>1){ - aovCall+="^" + param_order + ",data=dataforaov)"; - }else{ - aovCall+=",data=dataforaov)"; - } - } - } - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - - /*Export the results - *Export format is csv, data separated by ',' - *Results Export name is sensitivityExportName_Results.csv - *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv - */ - - //Compute Sum of Squares and Sensitivity indices - engine.voidEval("SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - log.info("Message sent to R : SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - engine - .voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - log - .info("Message sent to R : names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - log.info("Message sent to R : IndSensibilite<-SoS/sum(SoS)"); - - //Create a data.frame to export sensitivity important results in one file. - engine.voidEval("exportsensitivity=data.frame(SoS[1:" - + factorNumber + "],IndSensibilite[1:" + factorNumber - + "])"); - log - .info("Message sent to R : exportsensitivity=data.frame(SoS[1:" - + factorNumber - + "],IndSensibilite[1:" - + factorNumber + "])"); - engine - .voidEval("names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - log - .info("Message sent to R : names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - engine.voidEval("row.names(exportsensitivity)<-factornames"); - log.info("Message sent to R : " - + "row.names(exportsensitivity)<-factornames"); - - //Set dataforaov names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dataforaov)<-resultsnames"); - log.info("Message sent to R : " - + "names(dataforaov)<-resultsnames"); - - /*Set the export directory - *Export directory is the first simulation export directory. - */ - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Save the results with the scenarios. - engine.voidEval("write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - - //Save the sensitivity indices - engine.voidEval("write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - //FIXME export through java to enable export when using Rserve (when distant Rserve). - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall - + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - - log - .info("Message sent to R : " - + "attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - } - - @Override - public String getDescription() { - return "Implementation of Expand Grid method using Java"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorJavaExpandGrid.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorJavaExpandGrid.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,386 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.export.SensitivityExport; +import fr.ifremer.isisfish.simulator.sensitivity.*; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RProxy; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.util.Doc; + +/** + * Implementation of ExpandGrid method using Java + * + * @author jcouteau + * @version $Revision$ + * + */ +public class SensitivityCalculatorJavaExpandGrid extends + AbstractSensitivityAnalysis { + + @Doc("Interaction order") + public int param_order = 2; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return false; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputDirectory); + + int k = 1; //number of sensitivity scenarios (initialization) + int factorNumber = plan.getFactors().size(); //number of factors + List<Factor> factors = plan.getFactors(); //list of factors + + for (int i = 0; i < factorNumber; i++) { + Domain domain = factors.get(i).getDomain(); + + //calculate the number of scenarios + if (domain instanceof ContinuousDomain) { + ContinuousDomain contDomain = (ContinuousDomain)domain; + if (contDomain.getCardinality() != 0) { + k = k * contDomain.getCardinality(); + } + } else if (domain instanceof DiscreteDomain) { + DiscreteDomain discreteDomain = (DiscreteDomain)domain; + if (discreteDomain.getValues().size() != 0) { + k = k * discreteDomain.getValues().size(); + } + } + } + + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + for (int i = 0; i < k; i++) { + int result = 0; //used for the euclidian division + int rest = i; //used for the euclidian division + Scenario experimentScenario = new Scenario(); + for (int j = 0; j < factorNumber; j++) { + Factor factor = factors.get(j); + Domain domain = factor.getDomain(); + if (domain instanceof ContinuousDomain) { + ContinuousDomain continuousDomain = (ContinuousDomain)domain; + Double max = continuousDomain.getCalculatorMaxBound(); + Double min = continuousDomain.getCalculatorMinBound(); + int card = continuousDomain.getCardinality(); + + //Do the euclidian division + result = (int) Math.floor(rest / card); + rest = rest - (card * result); + + //Calculate the value of the factor + Double value = min + ((max - min) / (card - 1) * rest); + if ((domain instanceof MatrixContinuousDomain) + || (domain instanceof EquationContinuousDomain)) { + factor.setValueForIdentifier(value); + } else { + factor.setValueForIdentifier(value); + } + } + if (factor.getDomain() instanceof DiscreteDomain) { + DiscreteDomain discreteDomain = (DiscreteDomain)domain; + int card = discreteDomain.getValues().size(); + + //Do the euclidian division + result = (int) Math.floor(rest / card); + rest = rest - (card * result); + + //Select the value of the factor + factor.setValueForIdentifier(rest); + } + rest = result; + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + + } + thisExperiment.setScenarios(thisExperimentScenarios); + + thisExperimentScenarios = thisExperiment.getScenarios(); + + /* + * Call R to save the data for result analysis + */ + int scenariosNumber = thisExperimentScenarios.size(); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + String dataframe = "data<-data.frame("; + + //Create the factors vectors and the dataframe instruction + for (int j = 0; j < factorNumber; j++) { + + Factor factor = factors.get(j); + String factorName = factor.getName().replaceAll(" ", ""); + + //String vector = "factor" + j + "<-c("; + String vector = factorName + "<-c("; + for (int i = 0; i < scenariosNumber; i++) { + Scenario scenario = thisExperimentScenarios.get(i); + List<Factor> newFactors = scenario.getFactors(); + Factor factor1 = newFactors.get(j); + + if (i < (scenariosNumber - 1)) { + vector += factor1.getDisplayedValue() + ","; + } else { + vector += factor1.getDisplayedValue(); + } + + } + vector = vector + ")"; + engine.voidEval(vector); + + if (j < factorNumber - 1) { + dataframe += factorName + "=factor(" + factorName + "),"; + } else { + dataframe += factorName + "=factor(" + factorName + "))"; + } + + } + engine.voidEval(dataframe); + + // Creating the factors vector. + String rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + if (i != (factorNumber - 1)) { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\","; + } else { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\""; + } + } + + rInstruction += ")"; + + engine.voidEval(rInstruction); + + //Create the isis.factor.distribution + engine.voidEval("isis.factor.distribution<-c(0.0)"); + + //Create isis.MethodExp + engine.voidEval("isis.MethodExp<-list(" + + "isis.factors," + + "isis.factor.distribution," + + "call_method=\"isis-fish-externeR\")"); + + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + //Create isis.Simule + engine.voidEval("isis.simule<-data.frame(data)"); + + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't generate scenarios", e); + } + + return thisExperiment; + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputdirectory) throws SensitivityException { + + SimulationStorage firstStorage = simulationStorages.get(0); + String simulationName = firstStorage.getName().replaceAll("-", ""); + SimulationParameter param = firstStorage.getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + //Get back the factors number + int factorNumber = (Integer)engine.eval("dim(data)[2]"); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String name = sensitivityExport.getExportFilename(); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + name + ")"); + + //Create the dataforaov data.frame + String dataframe = "dataforaov<-data.frame(data," + + name + "=" + name + ")"; + engine.voidEval(dataframe); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~("; + for (int j = 0; j < factorNumber; j++) { + if (j < (factorNumber - 1)) { + aovCall = aovCall + + engine.eval("names(data)[" + (j + 1) + "]") + + "+"; + } else { + aovCall = aovCall + + engine.eval("names(data)[" + (j + 1) + "]") + + ")"; + if(param_order>1){ + aovCall+="^" + param_order + ",data=dataforaov)"; + }else{ + aovCall+=",data=dataforaov)"; + } + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + + //Set dataforaov names + engine.voidEval("resultsnames<-c(" + + "factornames," + + "\"Result\")"); + engine.voidEval("names(dataforaov)<-resultsnames"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputdirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + param.getSensitivityExport().get(k).getExportFilename() + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + param.getSensitivityExport().get(k).getExportFilename() + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "call_method=\"" + aovCall + "\"," + + "\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-" + + "isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine, simulationName); + + // Save Isis R session + engine.saveRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of Expand Grid method using Java"; + } + +} Added: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRDOptimal.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRDOptimal.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRDOptimal.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,398 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.export.SensitivityExport; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.*; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.util.Doc; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; +import org.nuiton.j2r.types.RDataFrame; + +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * User: couteau + * Date: 14 janv. 2010 + * Time: 11:58:09 + */ +public class SensitivityCalculatorRDOptimal + extends AbstractSensitivityAnalysis { + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + @Doc("Order") + public int param_order=1; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return false; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + + setIsisFactorsR(plan, outputDirectory); + + //extract the factors from the design plan + List<Factor> factors = plan.getFactors(); + int factorsNb = factors.size(); + + try { + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.voidEval("library(AlgDesign)"); + + //Create a list of the factors under the form factor1=factor1,... + String factorsNames = ""; + + //Create a list of the factors under the form factor1,factor2,... + String factorNames = ""; + + //Create a list of the factors under the form factor1+factor2+... + String factorPlus=""; + + //create the factors vectors + for (Factor factor : factors) { + //The factor values vector + String factorName = factor.getName().replaceAll(" ", ""); + factorsNames += factorName + "=" + factorName + ","; + factorNames += factorName + ","; + factorPlus += factorName + "+"; + + String vector = factorName + "<-c("; + + Domain domain = factor.getDomain(); + + if (domain instanceof ContinuousDomain) { + ContinuousDomain contDomain = (ContinuousDomain) domain; + int card = contDomain.getCardinality(); + Double min = contDomain.getCalculatorMinBound(); + Double max = contDomain.getCalculatorMaxBound(); + + for (int i = 0; i < card; i++) { + //add the ith value + vector += (min + (i * (max - min) / (card - 1))) + ","; + } + } else { + Map<Object, Object> values = ((DiscreteDomain) domain).getValues(); + int nbValues = values.size(); + for (int i = 0; i < nbValues; i++) { + vector += "as.integer(" + i + "),"; + } + } + + vector = vector.substring(0, vector.length() - 1); + + vector += ")"; + + engine.voidEval(vector); + + + } + + factorsNames = factorsNames.substring(0,factorsNames.length()-1); + factorNames = factorNames.substring(0,factorNames.length()-1); + factorPlus = factorPlus.substring(0,factorPlus.length()-1); + + + //X<-expand.grid(vector=???,weight=???) + String expandGrid = "expandgrid<-expand.grid(%s)"; + + + + String rCall = String.format(expandGrid,factorsNames); + + engine.voidEval(rCall); + + if (param_order ==1 ){ + rCall = "x<-optFederov(~(%s),data=expandgrid, " + + "approximate =FALSE, center=F, criterion = \"D\"," + + "nRepeats=10)"; + } else { + rCall = "x<-optFederov(~(%s)^"+param_order+",data=expandgrid, " + + "approximate =FALSE, center=F, criterion = \"D\"," + + "nRepeats=10)"; + } + + rCall = String.format(rCall,factorPlus); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + engine.voidEval("runif(1)"); + + engine.voidEval(rCall); + + engine.eval("expPlan<-as.data.frame(x$design)"); + RDataFrame dataFrame = (RDataFrame)engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + int nbExperiments = (Integer)engine.eval("dim(x$design)[1]"); + + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorsNb; i++) { + Factor factor = factors.get(i); + factor.setValueForIdentifier(dataFrame.get(i, j)); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + + String factorDistribution = "isis.factor.distribution<-data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + String distribution = ""; + String parameters = ""; + + for (int i = 0; i < factorsNb; i++) { + Domain domain = factors.get(i).getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + } + if (domain instanceof ContinuousDomain){ + ContinuousDomain contDomain = (ContinuousDomain)domain; + distribution += "\"qunif\""; + parameters += "\"[" + contDomain.getMinBound() + + ";" + contDomain.getMaxBound() + + "]\""; + } else { + DiscreteDomain discDomain = (DiscreteDomain)domain; + distribution += "\"discrete\""; + parameters+="\"["; + Map<Object, Object> values = discDomain.getValues(); + int count=0; + Collection<Object> collecValues = values.values(); + for (Object value:collecValues){ + if (count!=0){ + parameters += ","; + } + parameters += value; + count++; + } + parameters+="]\""; + } + } + engine.voidEval(String.format(factorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-\"" + rCall + "\""); + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("isis.simule<-x$design"); + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + + } catch (RException eee) { + throw new SensitivityException("Can't generate scenarios", eee); + } + + return thisExperiment; + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + try { + + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Get back the factors number + int factorNumber = (Integer)engine.eval("dim(x$design)[2]"); + + SimulationParameter param = simulationStorages.get(0).getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + SimulationStorage firstStorage = simulationStorages.get(0); + + String firstStorageName = firstStorage.getName().replaceAll("-", ""); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String name = sensitivityExport.getExportFilename(); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + name + ")"); + + //Create the dataforaov data.frame + String dataFrame = "dataforaov<-data.frame(x$design," + + name + "=" + name + ")"; + engine.voidEval(dataFrame); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~("; + for (int j = 0; j < factorNumber; j++) { + if (j < (factorNumber - 1)) { + aovCall = aovCall + + engine.eval("names(x$design)[" + (j + 1) + "]") + + "+"; + } else { + aovCall = aovCall + + engine.eval("names(x$design)[" + (j + 1) + "]") + + ")"; + if(param_order>1){ + aovCall+="^" + param_order + ",data=dataforaov)"; + }else{ + aovCall+=",data=dataforaov)"; + } + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + +//Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + + //Set dataforaov names + engine.voidEval("resultsnames<-c(names(x$design),\"Result\")"); + engine.voidEval("names(dataforaov)<-resultsnames"); + + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputDirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + param.getSensitivityExport().get(k) + + .getExportFilename() + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + param.getSensitivityExport().get(k) + .getExportFilename() + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "\"call_method\"=\"" + aovCall + "\"," + + "\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + firstStorageName + "." + name)); + + } + + //Rename R objects for saving purpose + + renameObjects(engine, firstStorageName); + + //Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of D optimal method method using R, needs" + + "AlgDesign package to work"; + } +} Property changes on: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRDOptimal.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRExpandGrid.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRExpandGrid.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRExpandGrid.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,368 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.export.SensitivityExport; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.*; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.util.Doc; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; +import org.nuiton.j2r.types.RDataFrame; + +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * User: couteau + * Date: 6 janv. 2010 + * Time: 14:31:09 + */ +public class SensitivityCalculatorRExpandGrid + extends AbstractSensitivityAnalysis { + + @Doc("Interaction order") + public int param_order = 2; + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return false; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + + setIsisFactorsR(plan, outputDirectory); + + //extract the factors from the design plan + List<Factor> factors = plan.getFactors(); + int factorsNb = factors.size(); + + try { + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Create a list of the factors under the form factor1=factor1,... + String factorsNames = ""; + + //Create a list of the factors under the form factor1,factor2,... + String factorNames = ""; + + //create the factors vectors + for (Factor factor : factors) { + //The factor values vector + String factorName = factor.getName().replaceAll(" ", ""); + factorsNames += factorName + "=" + factorName + ","; + factorNames += factorName + ","; + String vector = factorName + "<-c("; + + Domain domain = factor.getDomain(); + + if (domain instanceof ContinuousDomain) { + ContinuousDomain contDomain = (ContinuousDomain) domain; + int card = contDomain.getCardinality(); + Double min = contDomain.getCalculatorMinBound(); + Double max = contDomain.getCalculatorMaxBound(); + + for (int i = 0; i < card; i++) { + //add the ith value + vector += (min + (i * (max - min) / (card - 1))) + ","; + } + } + + if (domain instanceof DiscreteDomain) { + Map<Object, Object> values = ((DiscreteDomain) domain).getValues(); + int nbValues = values.size(); + for (int i = 0; i < nbValues; i++) { + vector += "as.integer(" + i + "),"; + } + } + + vector = vector.substring(0, vector.length() - 1); + + vector += ")"; + + engine.voidEval(vector); + + + } + + factorsNames = factorsNames.substring(0,factorsNames.length()-1); + factorNames = factorNames.substring(0,factorNames.length()-1); + + + //X<-expand.grid(vector=???,weight=???) + String expandGrid = "x<-expand.grid(%s)"; + + String rCall = String.format(expandGrid,factorsNames); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + engine.voidEval(rCall); + + engine.eval("expPlan<-as.data.frame(x)"); + RDataFrame dataFrame = (RDataFrame)engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + int nbExperiments = (Integer)engine.eval("dim(x)[1]"); + + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorsNb; i++) { + Factor factor = factors.get(i); + factor.setValueForIdentifier(dataFrame.get(i, j)); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + + String factorDistribution = "isis.factor.distribution<-data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + String distribution = ""; + String parameters = ""; + + for (int i = 0; i < factorsNb; i++) { + Domain domain = factors.get(i).getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + } + if (domain instanceof ContinuousDomain){ + ContinuousDomain contDomain = (ContinuousDomain)domain; + distribution += "\"qunif\""; + parameters += "\"[" + contDomain.getMinBound() + + ";" + contDomain.getMaxBound() + + "]\""; + } else { + DiscreteDomain discDomain = (DiscreteDomain)domain; + distribution += "\"discrete\""; + parameters+="\"["; + Map<Object, Object> values = discDomain.getValues(); + int count=0; + Collection<Object> collecValues = values.values(); + for (Object value:collecValues){ + if (count!=0){ + parameters += ","; + } + parameters += value; + count++; + } + parameters+="]\""; + } + } + engine.voidEval(String.format(factorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-\"" + + String.format(expandGrid,factorsNames) + "\""); + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("isis.simule<-x"); + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + + } catch (RException eee) { + throw new SensitivityException("Can't generate scenarios", eee); + } + + return thisExperiment; + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + try { + + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Get back the factors number + int factorNumber = (Integer)engine.eval("dim(x)[2]"); + + SimulationParameter param = simulationStorages.get(0).getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + SimulationStorage firstStorage = simulationStorages.get(0); + + String firstStorageName = firstStorage.getName().replaceAll("-", ""); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String name = sensitivityExport.getExportFilename(); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + name + ")"); + + //Create the dataforaov data.frame + String dataFrame = "dataforaov<-data.frame(x," + + name + "=" + name + ")"; + engine.voidEval(dataFrame); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~("; + for (int j = 0; j < factorNumber; j++) { + if (j < (factorNumber - 1)) { + aovCall = aovCall + + engine.eval("names(x)[" + (j + 1) + "]") + + "+"; + } else { + aovCall = aovCall + + engine.eval("names(x)[" + (j + 1) + "]") + + ")"; + if(param_order>1){ + aovCall+="^" + param_order + ",data=dataforaov)"; + }else{ + aovCall+=",data=dataforaov)"; + } + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputDirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + param.getSensitivityExport().get(k) + + .getExportFilename() + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + param.getSensitivityExport().get(k) + .getExportFilename() + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "\"call_method\"=\"" + aovCall + "\"," + + "\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + firstStorageName + "." + name)); + + } + + //Rename R objects for saving purpose + + renameObjects(engine, firstStorageName); + + //Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of Expand Grid method using R"; + } +} Property changes on: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRExpandGrid.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRFast.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,616 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; -import java.util.Vector; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RException; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; -import org.rosuda.JRI.REXP; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of Fast method using R. - * - * @author jcouteau - * @version $Revision$ - * - * Last update : $Date$ By : - * $Author: jcouteau $ - */ -public class SensitivityCalculatorRFast extends AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory - .getLog(SensitivityCalculatorRFast.class); - - @Doc("an integer giving the sample size, i.e. the length of the discretization of the s-space (see Cukier et al.). (default=20)") - public int param_n = 20; - - @Doc("an integer specifying the interference parameter, i.e. the number of harmonics to sum in the Fourier series decomposition (see Cukier et al.). (default=6)") - public int param_M = 6; - - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - //public int[] param_omega; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - setIsisFactorsR(plan, outputdirectory); - - double[] dataframe = new double[0]; - int nbExperiments = 0; - int factorNumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factorNumber; i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - "Error", JOptionPane.ERROR_MESSAGE); - return null; - } - } - String rInstruction = "a<-fast99(model=NULL,factors=%s, n=%s, M=%s, q = \"qunif\", q.arg=list(min=0,max=1))"; - String rCall = String.format(rInstruction, factors.size(), param_n, - param_M); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Load sensitivity package into R (if package already loaded, - // nothing happens. - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R" + "library(sensitivity)"); - - // Run sensitivity analysis - engine.voidEval(rCall); - log.info("Message sent to R" + rCall); - - // Creating the factors vector. - rInstruction = "factornames<-c("; - for (int i = 0; i < factorNumber; i++) { - if (i != (factorNumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R" + rInstruction); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R" + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the fast99 object for the second run in a .fast99 file - engine.voidEval("dput(a,file=\".fast99\")"); - log.info("Message sent to R" + "dput(a,file=\".fast99\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R" - + "dput(factornames,file=\".factornames\")"); - - // Get back experiment plan - - Vector<REXP> dataframeVector = (Vector<REXP>) engine.eval("a$X"); - dataframe = new double[dataframeVector.size() - * dataframeVector.get(0).asDoubleArray().length]; - for (int i = 0; i < dataframeVector.size(); i++) { - for (int j = 0; j < dataframeVector.get(0).asDoubleArray().length; j++) { - if (String.valueOf( - dataframeVector.get(i).asDoubleArray()[j]) - .toString().equals("NaN")) { - log - .error("Wrong parameters for the fast method, non-numeric values were generated"); - JOptionPane - .showMessageDialog( - null, - "The parameters for this method need to be changed, non-numeric values where generated (you may want to increase the n parameter)", - "Error", JOptionPane.ERROR_MESSAGE); - return null; - } - dataframe[i * dataframeVector.get(0).asDoubleArray().length - + j] = dataframeVector.get(i).asDoubleArray()[j]; - } - } - - log.info("Message sent to R" + "a$X"); - - if (log.isDebugEnabled()) { - log.debug("rInstruction = " + rInstruction); - } - - nbExperiments = dataframe.length / factorNumber; - - String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; - - // Creating the vectors. - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; - parameters += ","; - factorNames += ","; - } - - distribution += "\"qunif\""; - parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() - + ";" + ((ContinuousDomain) domain).getMaxBound() - + "]\""; - factorNames += "\"" + factors.get(i).getName() + "\""; - } - - log.info("Message sent to R : " - + String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - - log.info("Message sent to R : " + "call<-a$call"); - engine.voidEval("call<-a$call"); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " + "isis.simule<-data.frame(a$X)"); - engine.voidEval("isis.simule<-data.frame(a$X)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - } catch (RException eee) { - eee.printStackTrace(); - throw new RuntimeException("R evaluation failed", eee); - // Error while retrieving scenario - } - - // Transform the result from R in a matrix - MatrixND fast = MatrixFactory.getInstance().create(dataframe, - new int[] { factorNumber, nbExperiments }); - - // Setting up the scenarios. - for (int j = 0; j < nbExperiments; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factorNumber; i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(fast - .getValue(new int[] { i, j })); - } else { - Double value = (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor.getDomain()) - .getMaxBound() - (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound()) - * fast.getValue(new int[] { i, j }); - factor.setValueForIdentifier(value); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - return thisExperiment; - - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) { - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Call R - // Load sensitivity package into R (if package already loaded, - // nothing happens. - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R : " + "library(sensitivity)"); - - //Set the working directory (for import and exports) - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the morris object for the second run in a .morris file - engine.voidEval("a<-dget(\".fast99\")"); - log.info("Message sent to R : " + "a<-dget(\".fast99\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - /*int scenariosNumber = sensitivityScenarios.getScenarios().size();*/ - int scenariosNumber = (Integer) engine.eval("length(a$X[,1])"); - log.info("Message sent to R : " + "length(a$X[,1])"); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < scenariosNumber; l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "attr(isis.simule,\"call\")<-isis.MethodExp$call"); - engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Compute results - engine.voidEval("tell(a,y=" + name + ")"); - log.info("Message sent to R : " + "tell(a,y=" + name + ")"); - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - - //setting isis.methodAnalyse attributes - log - .info("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - - //Create the data.frame of scenarios and results for export purpose - engine.voidEval("dfresults=data.frame(a$X,results)"); - log.info("Message sent to R : " - + "dfresults=data.frame(a$X,results)"); - - //Set working directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Set V names - engine.voidEval("names(a$V)<-factornames"); - log.info("Message sent to R : " + "names(a$V)<-factornames"); - - //Export V - engine.voidEval("write.csv(a$V,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_V.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$V,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_V.csv\")"); - - //Set D1 names - engine.voidEval("names(a$D1)<-factornames"); - log.info("Message sent to R : " + "names(a$D1)<-factornames"); - - //Export D1 - engine.voidEval("write.csv(a$D1,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_D1.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$D1,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_D1.csv\")"); - - //Set Dt names - engine.voidEval("names(a$Dt)<-factornames"); - log.info("Message sent to R : " + "names(a$Dt)<-factornames"); - - //Export Dt - engine.voidEval("write.csv(a$Dt,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Dt.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$Dt,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Dt.csv\")"); - //Set dfresults names - engine.voidEval("resultsnames<-c(factornames,\"Result\")"); - log.info("Message sent to R : " - + "resultsnames<-c(factornames,\"Result\")"); - engine.voidEval("names(dfresults)<-resultsnames"); - log.info("Message sent to R : " - + "names(dfresults)<-resultsnames"); - - //Export results - engine.voidEval("write.csv(dfresults,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : " - + "write.csv(results,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - //FIXME export through java to enable export when using Rserve - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public String getDescription() { - return "Implementation of FAST method using R"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRFast.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFast.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,351 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.simulator.sensitivity.*; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.export.SensitivityExport; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.util.Doc; +import org.nuiton.j2r.types.RDataFrame; + +/** + * Implementation of Fast method using R. + * + * @author jcouteau + * @version $Revision$ + * + * Last update : $Date$ By : + * $Author: jcouteau $ + */ +public class SensitivityCalculatorRFast extends AbstractSensitivityAnalysis { + + @Doc("an integer giving the sample size, i.e. the length of the " + + "discretization of the s-space (see Cukier et al.). (default=20)") + public int param_n = 20; + + @Doc("an integer specifying the interference parameter, i.e. the number " + + "of harmonics to sum in the Fourier series decomposition (see Cukier et " + + "al.). (default=6)") + public int param_M = 6; + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputDirectory); + + RDataFrame dataFrame; + int nbExperiments; + int factorNumber = plan.getFactors().size(); + List<Factor> factors = plan.getFactors(); + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + //Test all factors, if one is discrete, return null + for (int i = 0; i < factorNumber; i++) { + if (factors.get(i).getDomain() instanceof DiscreteDomain) { + throw new SensitivityException(factors.get(i).getName() + + " has a discrete domain, this is not acceptable for fast " + + "method."); + } + } + String rInstruction = "a<-fast99(" + + "model=NULL," + + "factors=%s, " + + "n=%s, " + + "M=%s, " + + "q = \"qunif\", " + + "q.arg=list(min=0,max=1))"; + String rCall = String.format(rInstruction, factors.size(), param_n, + param_M); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + try { + + REngine engine = new RProxy(); + + engine.clearSession(); + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + + // Run sensitivity analysis + engine.voidEval(rCall); + + // Creating the factors vector. + rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + String factorName = factors.get(i).getName(); + if (i != (factorNumber - 1)) { + rInstruction += "\"" + factorName + "\","; + } else { + rInstruction += "\"" + factorName + "\""; + } + } + + rInstruction += ")"; + + engine.voidEval(rInstruction); + + // Get back experiment plan + dataFrame = (RDataFrame) engine.eval("a$X"); + dataFrame.setVariable("a$X"); + + nbExperiments = (Integer)engine.eval("dim(a$X)[1]"); + + String factorDistribution = "isis.factor.distribution<-data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + // Creating the vectors. + String distribution = ""; + String parameters = ""; + String factorNames = ""; + + for (int i = 0; i < factorNumber; i++) { + Factor factor = factors.get(i); + ContinuousDomain domain = (ContinuousDomain) factor.getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + factorNames += ","; + } + + distribution += "\"qunif\""; + parameters += "\"[" + domain.getMinBound() + ";" + + domain.getMaxBound() + "]\""; + factorNames += "\"" + factor.getName() + "\""; + } + engine.voidEval(String.format(factorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-a$call"); + + + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + + engine.voidEval("attr(isis.MethodExp,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + + engine.voidEval("isis.simule<-data.frame(a$X)"); + + engine.voidEval("attr(isis.simule,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Setting up the scenarios. + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = plan.getFactors().get(i); + Domain domain = factor.getDomain(); + if ((domain instanceof MatrixContinuousDomain) + || (domain instanceof EquationContinuousDomain)) { + factor.setValueForIdentifier((Double)dataFrame.get(i,j)); + } else { + ContinuousDomain continuousDomain = (ContinuousDomain)domain; + Double min = continuousDomain.getCalculatorMinBound(); + Double max = continuousDomain.getCalculatorMaxBound(); + Double dFValue = (Double)dataFrame.get(i,j); + Double value = min + (max - min) * dFValue; + factor.setValueForIdentifier(value); + } + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + } catch (RException eee) { + throw new SensitivityException("Can't generate scenarios", eee); + } + return thisExperiment; + + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + SimulationStorage storage = simulationStorages.get(0); + String simulationName = storage.getName().replaceAll("-", ""); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.setwd(outputDirectory); + + // Call R + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + + SimulationParameter param = simulationStorages.get(0).getParameter(); + + int sensitivityNumber = param.getSensitivityExport().size(); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); + + for (int k = 0; k < sensitivityNumber; k++) { + + // Creates the R expression to import results in R + String name = param.getSensitivityExport().get(k) + .getExportFilename(); + + //Compute results + engine.voidEval("tell(a,y=" + name + ")"); + + engine.voidEval("names(a$V)<-factornames"); + engine.voidEval("names(a$X)<-factornames"); + engine.voidEval("names(a$D1)<-factornames"); + engine.voidEval("names(a$Dt)<-factornames"); + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "call_method=\"tell(a,y=" + name + ")" + "\"," + + "\"analysis_result\"=a)"); + + //setting isis.methodAnalyse attributes + engine.voidEval("attr(isis.methodAnalyse,\"nomModel\")<-" + + "\"isis-fish-externe-R\")"); + + //Create the data.frame of scenarios and results for export purpose + engine.voidEval("dfresults<-data.frame(a$X,a$y)"); + + //Set working directory + engine.setwd(outputDirectory); + + //Export V + engine.voidEval("write.csv(a$V,\"" + name + "_V.csv\")"); + + //Export D1 + engine.voidEval("write.csv(a$D1,\"" + name + "_D1.csv\")"); + + //Export Dt + engine.voidEval("write.csv(a$Dt,\"" + name + "_Dt.csv\")"); + //Set dfresults names + engine.voidEval("resultsnames<-c(factornames,\"Result\")"); + engine.voidEval("names(dfresults)<-resultsnames"); + + //Export results + engine.voidEval("write.csv(dfresults,\"" + name + + "_Results.csv\")"); + //FIXME export through java to enable export when using Rserve + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse" + + "<-isis.methodAnalyse"; + + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine, simulationName); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + } + + @Override + public String getDescription() { + return "Implementation of FAST method using R (needs the sensitivity " + + "package to work)"; + } + +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRFrF2.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,532 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RException; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of FrF2 method using R. - * - * @author jcouteau - * @version $Revision$ - * - * Last update : $Date$ By : - * $Author: chatellier $ - */ -public class SensitivityCalculatorRFrF2 extends AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory - .getLog(SensitivityCalculatorRFrF2.class); - - @Doc("is the arabic numeral for the requested resolution of the design( 3 <= resolution <= 5). (if resolution=3, model = sum(Xi), if resolution = 4 or 5, model = sum(Xi)+sum(XiXj)") - public int param_resolution; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - double[] dataframe = new double[0]; - int nbExperiments = 0; - int factorNumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factorNumber; i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - return null; - } - } - - REngine engine = new RProxy(); - - try { - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - engine.voidEval("library(FrF2)"); - log.info("Message sent to R : " + "library(FrF2)"); - - //Set the working directory (for import and exports) - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - String rInstruction = "a<-FrF2(nfactors=" + factorNumber - + ",resolution=" + param_resolution + ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R : " + rInstruction); - - // Export the FrF2 object for the second run in a .FrF2 file - engine.voidEval("dput(a,file=\".FrF2\")"); - log.info("Message sent to R" + "dput(a,file=\".FrF2\")"); - - // Get back experiment plan - dataframe = (double[]) engine.eval("a$desnum"); - /*Vector<REXP> dataframeVector = (Vector<REXP>) engine.eval("a$X"); - dataframe = new double[dataframeVector.size() - * dataframeVector.get(0).asDoubleArray().length]; - for (int i = 0; i < dataframeVector.size(); i++) { - for (int j = 0; j < dataframeVector.get(0).asDoubleArray().length; j++) { - dataframe[i * dataframeVector.get(0).asDoubleArray().length - + j] = dataframeVector.get(i).asDoubleArray()[j]; - } - }*/ - log.info("Message sent to R : " + "a$desnum"); - - // Creating the factors vector. - rInstruction = "factornames<-c("; - for (int i = 0; i < factorNumber; i++) { - if (i != (factorNumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R : " + rInstruction); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R : " - + "dput(factornames,file=\".factornames\")"); - - } catch (RException e) { - e.printStackTrace(); - } - - nbExperiments = dataframe.length / factorNumber; - - // Transform the result from R in a matrix - MatrixND frf2 = MatrixFactory.getInstance().create(dataframe, - new int[] { factorNumber, nbExperiments }); - - // Setting up the scenarios. - for (int j = 0; j < nbExperiments; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factorNumber; i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - if (frf2.getValue(new int[] { i, j }) == -1) { - factor.setValueForIdentifier(0); - } - - if (frf2.getValue(new int[] { i, j }) == 1) { - factor.setValueForIdentifier(1); - } - } else { - if (frf2.getValue(new int[] { i, j }) == -1) { - factor.setValueForIdentifier(((ContinuousDomain) factor - .getDomain()).getMinBound()); - } - - if (frf2.getValue(new int[] { i, j }) == 1) { - factor.setValueForIdentifier(((ContinuousDomain) factor - .getDomain()).getMaxBound()); - } - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - try { - //Create the factors vectors - for (int j = 0; j < factorNumber; j++) { - Factor factor = thisExperimentScenarios.get(0).getFactors() - .get(j); - if (factor.getDomain() instanceof EquationContinuousDomain) { - - String vector = "factor" + j + "<-c("; - for (int i = 0; i < nbExperiments; i++) { - if (i < (nbExperiments - 1)) { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - String vector = "factor" + j + "<-c("; - for (int i = 0; i < nbExperiments; i++) { - if (i < (nbExperiments - 1)) { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else { - String vector = "factor" + j + "<-c("; - for (int i = 0; i < nbExperiments; i++) { - if (i < (nbExperiments - 1)) { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue() - + ","; - } else { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } - } - - //Create the data data.frame from the factors - String data = "data<-data.frame("; - for (int j = 0; j < factorNumber; j++) { - if (j < factorNumber - 1) { - data = data + "factor" + j + "=factor(factor" + j + "),"; - } else { - data = data + "factor" + j + "=factor(factor" + j + "))"; - } - - } - engine.voidEval(data); - log.info("Message sent to R : " + data); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the scenario matrix for the second run in a .FrF2.csv file - engine.voidEval("write.csv(data,file=\".FrF2.csv\")"); - log.info("Message sent to R : " - + "write.csv(data,file=\".FrF2.csv\")"); - - engine.terminate(); - - } catch (RException e) { - e.printStackTrace(); - } - return thisExperiment; - - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) { - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - engine.voidEval("library(FrF2)"); - log.info("Message sent to R : " + "library(FrF2)"); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Get back the FrF2 object - engine.voidEval("a<-dget(\".FrF2\")"); - log.info("Message sent to R : a<-dget(\".FrF2\")"); - - //Get back the scenarios - engine.voidEval("factors<-read.csv(\".FrF2.csv\")"); - log - .info("Message sent to R : factors<-read.csv(\".FrF2.csv\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Get back the factors number - int factorNumber = ((Double) engine.eval("length(factors)-1")) - .intValue(); - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < simulationStorages.size(); l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors,result=result)"; - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - //get back the resolution - int resolution = (Integer) engine.eval("res.catlg(a$catentry)"); - log.info("Message sent to R : " + "res.catlg(a$catentry)"); - - String aovCall; - - switch (resolution) { - case 3: - //Call aov() - aovCall = "aovresult<-aov(result~"; - for (int j = 0; j < factorNumber; j++) { - if (j < (factorNumber - 1)) { - aovCall = aovCall + "factor" + j + "+"; - } else { - aovCall = aovCall + "factor" + j - + ",data=dataforaov)"; - } - } - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - break; - case 4: - aovCall = "aovresult<-aov(result~"; - for (int j = 0; j < factorNumber; j++) { - aovCall = aovCall + "factor" + j + "+"; - } - for (int i = 0; i < factorNumber; i++) { - for (int j = 0; j < factorNumber; j++) { - if (i < j) { - aovCall = aovCall + "factor" + i + "*factor" - + j + "+"; - } - } - } - aovCall = aovCall.substring(0, aovCall.length() - 1); - aovCall = aovCall + ",data=dataforaov)"; - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - break; - case 5: - aovCall = "aovresult<-aov(result~"; - for (int j = 0; j < factorNumber; j++) { - aovCall = aovCall + "factor" + j + "+"; - } - for (int i = 0; i < factorNumber; i++) { - for (int j = 0; j < factorNumber; j++) { - if (i < j) { - aovCall = aovCall + "factor" + i + "*factor" - + j + "+"; - } - } - } - aovCall = aovCall.substring(0, aovCall.length() - 1); - aovCall = aovCall + ",data=dataforaov)"; - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - break; - default: - log.info("This resolution is not managed"); - break; - } - - /*Export the results - *Export format is csv, data separated by ',' - *Results Export name is sensitivityExportName_Results.csv - *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv - */ - - //Compute Sum of Squares and Sensitivity indices - engine.voidEval("SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - log.info("Message sent to R : SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - engine - .voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - log - .info("Message sent to R : names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - log.info("Message sent to R : IndSensibilite<-SoS/sum(SoS)"); - - //Create a data.frame to export sensitivity important results in one file. - engine.voidEval("exportsensitivity=data.frame(SoS[1:" - + factorNumber + "],IndSensibilite[1:" + factorNumber - + "])"); - log - .info("Message sent to R : exportsensitivity=data.frame(SoS[1:" - + factorNumber - + "],IndSensibilite[1:" - + factorNumber + "])"); - engine - .voidEval("names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - log - .info("Message sent to R : names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - - engine.voidEval("row.names(exportsensitivity)<-factornames"); - log.info("Message sent to R : " - + "row.names(exportsensitivity)<-factornames"); - - /*Set the export directory - *Export directory is the first simulation export directory. - */ - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Set dataforaov names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dataforaov)<-resultsnames"); - log.info("Message sent to R : " - + "names(dataforaov)<-resultsnames"); - - //Save the results with the scenarios. - engine.voidEval("write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - - //Save the sensitivity indices - engine.voidEval("write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - //FIXME export through java to enable export when using Rserve (when distant Rserve). - engine.terminate(); - } - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - } - - @Override - public String getDescription() { - return "Implementation of FrF2 method method using R, at least 4 factors need to be declared"; - } -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRFrF2.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRFrF2.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,389 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; +import org.nuiton.math.matrix.MatrixFactory; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.util.FileUtil; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.util.Doc; + +/** + * Implementation of FrF2 method using R. + * + * @author jcouteau + * @version $Revision$ + * + * Last update : $Date$ By : + * $Author: chatellier $ + */ +public class SensitivityCalculatorRFrF2 extends AbstractSensitivityAnalysis { + + //TODO jcouteau 20110607 need to use new ethods on REngine instead of coding R sentences by hand. + + /** to use log facility, just put in your code: log.info("..."); */ + private static Log log = LogFactory + .getLog(SensitivityCalculatorRFrF2.class); + + @Doc("is the arabic numeral for the requested resolution of the design( 3 <= resolution <= 5). (if resolution=3, model = sum(Xi), if resolution = 4 or 5, model = sum(Xi)+sum(XiXj)") + public int param_resolution; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) + throws SensitivityException { + + double[] dataframe; + int nbExperiments; + int factorNumber = plan.getFactors().size(); + List<Factor> factors = plan.getFactors(); + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + testNoDiscrete(factors); + + try { + REngine engine = new RProxy(); + + //Clear session + engine.voidEval("rm(list=ls())"); + + engine.voidEval("library(FrF2)"); + + //Set the working directory (for import and exports) + engine.voidEval("setwd(\"" + + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") + + "\")"); + + String rInstruction = "a<-FrF2(nfactors=" + factorNumber + + ",resolution=" + param_resolution + ")"; + + engine.voidEval(rInstruction); + + // Export the FrF2 object for the second run in a .FrF2 file + engine.voidEval("dput(a,file=\".FrF2\")"); + + // Get back experiment plan + dataframe = (double[]) engine.eval("a$desnum"); + + // Creating the factors vector. + rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + if (i != (factorNumber - 1)) { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\","; + } else { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\""; + } + } + + rInstruction += ")"; + + engine.voidEval(rInstruction); + + // Export the factornames object for the second run in a .factornames file + engine.voidEval("dput(factornames,file=\".factornames\")"); + + + nbExperiments = dataframe.length / factorNumber; + + // Transform the result from R in a matrix + MatrixND frf2 = MatrixFactory.getInstance().create(dataframe, + new int[] { factorNumber, nbExperiments }); + + // Setting up the scenarios. + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = plan.getFactors().get(i); + + if (frf2.getValue(new int[]{i, j}) == -1) { + factor.setValueForIdentifier(0); + } else if (frf2.getValue(new int[]{i, j}) == 1) { + factor.setValueForIdentifier(1); + } + + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + //Create the factors vectors + for (int j = 0; j < factorNumber; j++) { + Factor factor = thisExperimentScenarios.get(0).getFactors() + .get(j); + + String vector = "factor" + j + "<-c("; + for (int i = 0; i < nbExperiments; i++) { + if (i < (nbExperiments - 1)) { + vector = vector + factor.getDisplayedValue() + ","; + } else { + vector = vector + factor.getDisplayedValue(); + } + + } + vector = vector + ")"; + engine.voidEval(vector); + } + + //Create the data data.frame from the factors + String data = "data<-data.frame("; + for (int j = 0; j < factorNumber; j++) { + if (j < factorNumber - 1) { + data = data + "factor" + j + "=factor(factor" + j + "),"; + } else { + data = data + "factor" + j + "=factor(factor" + j + "))"; + } + + } + engine.voidEval(data); + + // Set output directory + engine.voidEval("setwd(\"" + + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") + + "\")"); + + // Export the scenario matrix for the second run in a .FrF2.csv file + engine.voidEval("write.csv(data,file=\".FrF2.csv\")"); + + engine.terminate(); + + } catch (RException e) { + throw new SensitivityException("Can't generate scenarios", e); + } + return thisExperiment; + + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputdirectory) throws SensitivityException { + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.voidEval("rm(list=ls())"); + + SimulationParameter param = simulationStorages.get(0) + .getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + for (int k = 0; k < sensitivityNumber; k++) { + + engine.voidEval("library(FrF2)"); + + // Set output directory + engine.voidEval("setwd(\"" + + outputdirectory.getAbsolutePath().replaceAll("\\\\", + "/") + "\")"); + + //Get back the FrF2 object + engine.voidEval("a<-dget(\".FrF2\")"); + + //Get back the scenarios + engine.voidEval("factors<-read.csv(\".FrF2.csv\")"); + + // Get the factornames object in the .factornames file + engine.voidEval("factornames<-dget(\".factornames\")"); + + //Get back the factors number + int factorNumber = ((Double) engine.eval("length(factors)-1")) + .intValue(); + + // Creates the R expression to import results in R + String name = param.getSensitivityExport().get(k) + .getExportFilename(); + String rInstruction = name + "<-c("; + for (int l = 0; l < simulationStorages.size(); l++) { + File importFile = new File(simulationStorages.get(l) + .getDirectory().toString() + + File.separator + + SimulationStorage.RESULT_EXPORT_DIRECTORY, param + .getSensitivityExport().get(k).getExportFilename() + + param.getSensitivityExport().get(k) + .getExtensionFilename()); + String simulResult = FileUtil.readAsString(importFile); + double simulationResult = Double.valueOf(simulResult); + if (l < simulationStorages.size() - 1) { + rInstruction = rInstruction + simulationResult + ","; + } else { + rInstruction = rInstruction + simulationResult; + } + } + rInstruction = rInstruction + ")"; + + // Send the simulation results + engine.voidEval(rInstruction); + + //Create the dataforaov data.frame + String dataframe = "dataforaov<-data.frame(factors,result=result)"; + engine.voidEval(dataframe); + + //get back the resolution + int resolution = (Integer) engine.eval("res.catlg(a$catentry)"); + + String aovCall; + + switch (resolution) { + case 3: + //Call aov() + aovCall = "aovresult<-aov(result~"; + for (int j = 0; j < factorNumber; j++) { + if (j < (factorNumber - 1)) { + aovCall = aovCall + "factor" + j + "+"; + } else { + aovCall = aovCall + "factor" + j + + ",data=dataforaov)"; + } + } + engine.voidEval(aovCall); + break; + case 4: + aovCall = "aovresult<-aov(result~"; + for (int j = 0; j < factorNumber; j++) { + aovCall = aovCall + "factor" + j + "+"; + } + for (int i = 0; i < factorNumber; i++) { + for (int j = 0; j < factorNumber; j++) { + if (i < j) { + aovCall = aovCall + "factor" + i + "*factor" + + j + "+"; + } + } + } + aovCall = aovCall.substring(0, aovCall.length() - 1); + aovCall = aovCall + ",data=dataforaov)"; + engine.voidEval(aovCall); + break; + case 5: + aovCall = "aovresult<-aov(result~"; + for (int j = 0; j < factorNumber; j++) { + aovCall = aovCall + "factor" + j + "+"; + } + for (int i = 0; i < factorNumber; i++) { + for (int j = 0; j < factorNumber; j++) { + if (i < j) { + aovCall = aovCall + "factor" + i + "*factor" + + j + "+"; + } + } + } + aovCall = aovCall.substring(0, aovCall.length() - 1); + aovCall = aovCall + ",data=dataforaov)"; + engine.voidEval(aovCall); + break; + default: + log.info("This resolution is not managed"); + break; + } + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:" + + factorNumber + ",2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" + + factorNumber + "]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity=data.frame(SoS[1:" + + factorNumber + "],IndSensibilite[1:" + factorNumber + + "])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\",\"Sensitivity indices\")"); + + engine.voidEval("row.names(exportsensitivity)<-factornames"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.voidEval("setwd(\"" + + outputdirectory.getAbsolutePath().replaceAll("\\\\", + "/") + "\")"); + + //Set dataforaov names + engine.voidEval("resultsnames<-c(\"Simulation\"," + + "factornames,\"Result\")"); + engine.voidEval("names(dataforaov)<-resultsnames"); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + param.getSensitivityExport().get(k) + .getExportFilename() + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + param.getSensitivityExport().get(k) + .getExportFilename() + + "_SensitivityIndices.csv\")"); + + //FIXME export through java to enable export when using Rserve (when distant Rserve). + engine.terminate(); + } + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of FrF2 method method using R, at least 4 factors need to be declared (nneds the 'sensitivity' package to work)"; + } +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRMorris.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,579 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RException; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of Morris method using R. - * - * @author jcouteau - * @version $Revision$ - * - * Last update : $Date$ By : - * $Author: jcouteau $ - */ -public class SensitivityCalculatorRMorris extends AbstractSensitivityCalculator { - - @Doc("Integer giving the number of repetitions of the design, i.e. the number of elementary effect computed per factor. (Default value : 4)") - public int param_r = 4; - - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory - .getLog(SensitivityCalculatorRMorris.class); - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return false; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - setIsisFactorsR(plan, outputdirectory); - - double[] dataframe = new double[0]; - int nbExperiments = 0; - int factorNumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - - if (param_r == 0) { - param_r = 4; - } - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factorNumber; i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - "Error", - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - JOptionPane.ERROR_MESSAGE); - return null; - } - } - - // Creating the vectors. - String factorNames = ""; - String levels = ""; - String gridJump = ""; - String binf = ""; - String bsup = ""; - for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - factorNames += ","; - levels += ","; - gridJump += ","; - binf += ","; - bsup += ","; - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - - levels += ((ContinuousDomain) domain).getCardinality(); - - gridJump += (Integer) (((ContinuousDomain) domain).getCardinality() / 2); - - binf += ((ContinuousDomain) domain).getMinBound(); - - bsup += ((ContinuousDomain) domain).getMaxBound(); - } - - String rInstruction = "a<-morris(model=NULL,factors=c(%s),r=%s,design=list(type=\"oat\",levels=c(%s),grid.jump=c(%s)),binf=c(%s),bsup=c(%s))"; - - String rCall = String.format(rInstruction, factorNames, param_r, - levels, gridJump, binf, bsup); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - REngine engine = new RProxy(); - try { - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Load sensitivity package into R (if package already loaded, - // nothing happens. - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R : " + "library(sensitivity)"); - - // Run sensitivity analysis - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Creating the factors vector. - rInstruction = "factornames<-c(%s)"; - rCall = String.format(rInstruction, factorNames); - - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the morris object for the second run in a .morris file - engine.voidEval("dput(a,file=\".morris\")"); - log.info("Message sent to R : " + "dput(a,file=\".morris\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R : " - + "dput(factornames,file=\".factornames\")"); - - // Get back experiment plan - dataframe = (double[]) engine.eval("a$X"); - log.info("Message sent to R : " + "a$X"); - - if (log.isDebugEnabled()) { - log.debug("rInstruction = " + rInstruction); - } - - nbExperiments = dataframe.length / factorNumber; - - String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; - - String distribution = ""; - String parameters = ""; - - for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; - parameters += ","; - } - - distribution += "\"qunif\""; - parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() - + ";" + ((ContinuousDomain) domain).getMaxBound() - + "]\""; - } - - log.info("Message sent to R : " - + String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - - log.info("Message sent to R : " + "call<-a$call"); - engine.voidEval("call<-a$call"); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " + "isis.simule<-data.frame(a$X)"); - engine.voidEval("isis.simule<-data.frame(a$X)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - } catch (RException eee) { - eee.printStackTrace(); - throw new RuntimeException("R evaluation failed", eee); - // Error while retrieving scenario - } - - // Transform the result from R in a matrix - MatrixND morris = MatrixFactory.getInstance().create(dataframe, - new int[] { factorNumber, nbExperiments }); - - // Setting up the scenarios. - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - for (int j = 0; j < nbExperiments; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factorNumber; i++) { - Factor factor = factors.get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor - .setValueForIdentifier((Double) morris.getValue(i, - j)); - } else { - factor.setValueForIdentifier(morris.getValue(new int[] { i, - j })); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - return thisExperiment; - - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) { - - REngine engine = new RProxy(); - try { - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Call R - // Load sensitivity package into R (if package already loaded, - // nothing happens. - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R : " + "library(sensitivity)"); - - //Set the working directory (for import and exports) - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the morris object for the second run in a .morris file - engine.voidEval("a<-dget(\".morris\")"); - log.info("Message sent to R : " + "a<-dget(\".morris\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - int scenariosNumber = ((Double) engine - .eval("length(a$X)/length(a$factors)")).intValue(); - log.info("Message sent to R : " + "length(a$X)/length(a$factors)"); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < scenariosNumber; l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "attr(isis.simule,\"call\")<-isis.MethodExp$call"); - engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Compute results - engine.voidEval("tell(a,y=" + name + ")"); - log.info("Message sent to R : " + "tell(a,y=" + name + ")"); - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - - //setting isis.methodAnalyse attributes - log - .info("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - - // Get back the sensitivity results, mu, mu star and sigma. - engine.voidEval("mu<-apply(a$ee, 2, mean)"); - log.info("Message sent to R : " + "mu<-apply(a$ee, 2, mean)"); - engine - .voidEval("mu.star <- apply(a$ee, 2, function(a) mean(abs(a)))"); - log - .info("Message sent to R : " - + "mu.star <- apply(a$ee, 2, function(a) mean(abs(a)))"); - engine.voidEval("sigma <- apply(a$ee, 2, sd)"); - log - .info("Message sent to R : " - + "sigma <- apply(a$ee, 2, sd)"); - - //Create the data.frame of sensitivity indices for export purpose - engine.voidEval("df=data.frame(mu,mu.star,sigma)"); - log.info("Message sent to R : " - + "df=data.frame(mu,mu.star,sigma)"); - engine.voidEval("row.names(df)<-factornames"); - log.info("Message sent to R : " + "row.names(df)<-factornames"); - - //Create the data.frame of scenarios and results for export purpose - engine.voidEval("dfresults=data.frame(a$X,name)"); - log.info("Message sent to R : " - + "dfresults=data.frame(a$X,name)"); - - //Set dfresults names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dfresults)<-resultsnames"); - log.info("Message sent to R : " - + "names(dfresults)<-resultsnames"); - - //Set working directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Export sensitivity indices - engine.voidEval("write.csv(df,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : " - + "write.csv(df,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - - //Export results - engine.voidEval("write.csv(dfresults,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : " - + "write.csv(results,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - //FIXME export through java to enable export when using Rserve - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - } catch (Exception e) { - e.printStackTrace(); - } - - } - - @Override - public String getDescription() { - return "Implementation of Morris method using R"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRMorris.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRMorris.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,342 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.export.SensitivityExport; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; +import org.nuiton.j2r.types.RDataFrame; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.util.Doc; + +/** + * Implementation of Morris method using R. + * + * @author jcouteau + * @version $Revision$ + * + * Last update : $Date$ By : + * $Author: chatellier $ + */ +public class SensitivityCalculatorRMorris extends AbstractSensitivityAnalysis { + + @Doc("Integer giving the number of repetitions of the design, i.e. the number of elementary effect computed per factor. (Default value : 4)") + public int param_r = 4; + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continus. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return false; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputDirectory); + + RDataFrame dataFrame; + int nbExperiments; + int factorNumber = plan.getFactors().size(); + + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + + List<Factor> factors = plan.getFactors(); + + if (param_r == 0) { + param_r = 4; + } + + testNoDiscrete(factors); + + // Creating the vectors. + String factorNames = ""; + String levels = ""; + String gridJump = ""; + String binf = ""; + String bsup = ""; + for (int i = 0; i < factorNumber; i++) { + ContinuousDomain domain = (ContinuousDomain) factors.get(i).getDomain(); + if (i != 0) { + factorNames += ","; + levels += ","; + gridJump += ","; + binf += ","; + bsup += ","; + } + + factorNames += "\"" + factors.get(i).getName() + "\""; + + levels += domain.getCardinality(); + + gridJump += domain.getCardinality() / 2; + + binf += domain.getCalculatorMinBound(); + + bsup += domain.getCalculatorMaxBound(); + } + + String rInstruction = "a<-morris(model=NULL,factors=c(%s),r=%s," + + "design=list(type=\"oat\",levels=c(%s),grid.jump=c(%s))," + + "binf=c(%s),bsup=c(%s))"; + + String rCall = String.format(rInstruction, factorNames, param_r, + levels, gridJump, binf, bsup); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + try { + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + + // Run sensitivity analysis + engine.voidEval(rCall); + + // Creating the factors vector. + rInstruction = "factornames<-c(%s)"; + rCall = String.format(rInstruction, factorNames); + + engine.voidEval(rCall); + + // Set output directory + engine.setwd(outputDirectory); + + // Get back experiment plan + engine.eval("expPlan<-as.data.frame(a$X)"); + dataFrame = (RDataFrame) engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + + nbExperiments = (Integer)engine.eval("dim(a$X)[1]"); + + String factorDistribution = "isis.factor.distribution<-data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + String distribution = ""; + String parameters = ""; + + for (int i = 0; i < factorNumber; i++) { + Factor factor = factors.get(i); + ContinuousDomain domain = (ContinuousDomain) factor.getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + } + + distribution += "\"qunif\""; + parameters += "\"[" + domain.getMinBound() + ";" + + domain.getMaxBound() + "]\""; + } + engine.voidEval(String.format(factorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-a$call"); + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + engine.voidEval("attr(isis.MethodExp,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + engine.voidEval("isis.simule<-data.frame(a$X)"); + engine.voidEval("attr(isis.simule,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Setting up the scenarios. + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = factors.get(i); + factor.setValueForIdentifier(dataFrame.get(i, j)); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + } catch (RException eee) { + throw new SensitivityException("Can't generate scenarios", eee); + } + + return thisExperiment; + + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + SimulationStorage storage = simulationStorages.get(0); + String simulationName = storage.getName().replaceAll("-", ""); + + try { + REngine engine = new RProxy(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Call R + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + + //Set the working directory (for exports) + engine.setwd(outputDirectory); + + SimulationParameter param = simulationStorages.get(0) + .getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + + engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); + + for (int k = 0; k < sensitivityNumber; k++) { + + // Creates the R expression to import results in R + String name = param.getSensitivityExport().get(k) + .getExportFilename(); + + //Compute results + engine.voidEval("tell(a,y=" + name + ")"); + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "\"call_method\"=\"tell(a,y=" + name + ")" + "\"," + + "\"analysis_result\"=a)"); + + //setting isis.methodAnalyse attributes + engine.voidEval("attr(isis.methodAnalyse,\"nomModel\")<-" + + "\"isis-fish-externe-R\""); + + // Get back the sensitivity results, mu, mu star and sigma. + engine.voidEval("mu<-apply(a$ee, 2, mean)"); + engine.voidEval("mu.star <- apply(a$ee, 2, function(a) mean(abs(a)))"); + engine.voidEval("sigma <- apply(a$ee, 2, sd)"); + + //Create the data.frame of sensitivity indices for export purpose + engine.voidEval("df<-data.frame(mu,mu.star,sigma)"); + engine.voidEval("row.names(df)<-factornames"); + + //Create the data.frame of scenarios and results for export purpose + engine.voidEval("dfresults<-data.frame(a$X," + name + ")"); + + //Set dfresults names + engine.voidEval("resultsnames<-c(factornames,\"Result\")"); + engine.voidEval("names(dfresults)<-resultsnames"); + + //Export sensitivity indices + engine.voidEval("write.csv(df," + + "\"" + name + "_SensitivityIndices.csv\")"); + + //Export results + engine.voidEval("write.csv(dfresults," + + "\"" + name + "_Results.csv\")"); + //FIXME export through java to enable export when using Rserve + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-" + + "isis.methodAnalyse"; + + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine,simulationName); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of Morris method using R (needs the sensitivity" + + " package to work)"; + } + +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorROptimumLHS.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,731 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * save.image() Implementation of Optimum Latin Hypercube method using R. - * - * @author jcouteau - * @version $Revision$ - */ -public class SensitivityCalculatorROptimumLHS extends - AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory - .getLog(SensitivityCalculatorROptimumLHS.class); - - @Doc("Number of simulations (default=10)") - public int param_simulationNumber = 10; - @Doc("The maximum number of times the Columnwise Pairwise algorithm is applied to all the columns(default=2).") - public int param_MaxSweeps = 2; - @Doc("The optimal stopping criterion (between 0 and 1) (default=0.1).") - public double param_eps = 0.1; - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) - throws SensitivityException { - - setIsisFactorsR(plan, outputdirectory); - - int factornumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - double[] dataframe = new double[0]; - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factornumber; i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - "Error", - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - JOptionPane.ERROR_MESSAGE); - return null; - } - } - - REngine engine = new RProxy(); - - if ((Integer) param_simulationNumber == 0) { - param_simulationNumber = 10; - } - if ((Integer) param_MaxSweeps == 0) { - param_MaxSweeps = 2; - } - - if ((Double) param_eps == 0) { - param_eps = 0.1; - } - - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - //Load the lhs library - engine.voidEval("library(lhs)"); - log.info("Message sent to R : " + "library(lhs)"); - - //Remove all objects that will be used - engine.voidEval("remove(\"isis.factor.distribution\")"); - engine.voidEval("remove(\"isis.simule\")"); - engine.voidEval("remove(\"isis.MethodExp\")"); - engine.voidEval("remove(\"isis.methodAnalyse\")"); - - String rInstruction = "x<-optimumLHS(n=%s,k=%s,maxSweeps=%s,eps=%s)"; - - String rCall = String.format(rInstruction, param_simulationNumber, - factornumber, param_MaxSweeps, param_eps); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - //Create the scenarios - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Get back experiment plan - dataframe = (double[]) engine.eval("x"); - log.info("Message sent to R : " + "x"); - - // Transform the result from R in a matrix - MatrixND morris = MatrixFactory.getInstance().create(dataframe, - new int[] { factornumber, param_simulationNumber }); - - // Setting up the scenarios. - for (int j = 0; j < param_simulationNumber; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factornumber; i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(morris.getValue(new int[] { - i, j })); - } else { - Double value = (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor - .getDomain()).getMaxBound() - (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound()) - * morris.getValue(new int[] { i, j }); - factor.setValueForIdentifier(value); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - - String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; - - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factors.size(); i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; - factorNames += ","; - parameters += ","; - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - distribution += "\"qunif\""; - parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() - + ";" + ((ContinuousDomain) domain).getMaxBound() - + "]\""; - } - - log.info("Message sent to R : " - + String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - - log.info("Message sent to R : " + "call<-" + "\"x<-optimumLHS(n=" - + param_simulationNumber + ",k=" + factornumber - + ",maxSweeps=" + param_MaxSweeps + ",eps=" + param_eps - + ")\""); - engine.voidEval("call<-" + "\"x<-optimumLHS(n=" - + param_simulationNumber + ",k=" + factornumber - + ",maxSweeps=" + param_MaxSweeps + ",eps=" + param_eps - + ")\""); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " + "isis.simule<-data.frame(x)"); - engine.voidEval("isis.simule<-data.frame(x)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - String data = "data<-data.frame("; - - //Create the factors vectors and the dataframe instruction - for (int j = 0; j < factors.size(); j++) { - Factor factor = thisExperimentScenarios.get(0).getFactors() - .get(j); - if (factor.getDomain() instanceof EquationContinuousDomain) { - - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue() - + ","; - } else { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } - - if (j < factors.size() - 1) { - data += factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "),"; - } else { - data += factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "))"; - } - - } - engine.voidEval(data); - log.info("Message sent to R : " + data); - - // Creating the factors vector. - rInstruction = "factornames<-c("; - for (int i = 0; i < factornumber; i++) { - if (i != (factornumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R" + rInstruction); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the scenario matrix for the second run in a .optimumlhs.csv file - engine.voidEval("write.csv(data,file=\".optimumlhs.csv\")"); - log.info("Message sent to R : " - + "write.csv(data,file=\".optimumlhs.csv\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R" - + "dput(factornames,file=\".factornames\")"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - return thisExperiment; - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) throws SensitivityException { - - if ((Integer) param_simulationNumber == 0) { - param_simulationNumber = 10; - } - if ((Integer) param_MaxSweeps == 0) { - param_MaxSweeps = 2; - } - - if ((Double) param_eps == 0) { - param_eps = 0.1; - } - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - //Get back the scenarios - engine.voidEval("factors<-read.csv(\".optimumlhs.csv\")"); - log - .info("Message sent to R : factors<-read.csv(\".optimumlhs.csv\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Get back the factors number - int factorNumber = ((Double) engine.eval("length(factors)-1")) - .intValue(); - - //Get back the simulation number - param_simulationNumber = (Integer) (engine - .eval("length(factors[,1])")); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < param_simulationNumber; l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "attr(isis.simule,\"call\")<-isis.MethodExp$call"); - engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors," + name - + "=" + name + ")"; - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - //Call aov() - String aovCall = "aovresult<-aov(" + name + "~"; - for (int j = 0; j < factorNumber; j++) { - log.info("Message sent to R : " + "names(factors)[" - + (j + 2) + "]"); - - if (j < (factorNumber - 1)) { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + "+"; - } else { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + ",data=dataforaov)"; - } - } - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - - /*Export the results - *Export format is csv, data separated by ',' - *Results Export name is sensitivityExportName_Results.csv - *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv - */ - - //Compute Sum of Squares and Sensitivity indices - engine.voidEval("SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - log.info("Message sent to R : SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - engine - .voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - log - .info("Message sent to R : names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - log.info("Message sent to R : IndSensibilite<-SoS/sum(SoS)"); - - //Create a data.frame to export sensitivity important results in one file. - engine.voidEval("exportsensitivity=data.frame(SoS[1:" - + factorNumber + "],IndSensibilite[1:" + factorNumber - + "])"); - log - .info("Message sent to R : exportsensitivity=data.frame(SoS[1:" - + factorNumber - + "],IndSensibilite[1:" - + factorNumber + "])"); - engine - .voidEval("names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - log - .info("Message sent to R : names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - engine.voidEval("row.names(exportsensitivity)<-factornames"); - log.info("Message sent to R : " - + "row.names(exportsensitivity)<-factornames"); - - //Set dataforaov names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dataforaov)<-resultsnames"); - log.info("Message sent to R : " - + "names(dataforaov)<-resultsnames"); - - /*Set the export directory - *Export directory is the first simulation export directory. - */ - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Save the results with the scenarios. - engine.voidEval("write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - - //Save the sensitivity indices - engine.voidEval("write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - //FIXME export through java to enable export when using Rserve (when distant Rserve). - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall - + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - - log - .info("Message sent to R : " - + "attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - } - - @Override - public String getDescription() { - return "Implementation of Random Latin Hypercube method method using R"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorROptimumLHS.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorROptimumLHS.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,398 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RProxy; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.export.SensitivityExport; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.util.Doc; +import org.nuiton.j2r.types.RDataFrame; + +/** + * Implementation of Optimum Latin Hypercube method using R. + * + * @author jcouteau + * @version $Revision$ + */ +public class SensitivityCalculatorROptimumLHS extends + AbstractSensitivityAnalysis { + + @Doc("Number of simulations (default=10)") + public int param_simulationNumber = 10; + @Doc("The maximum number of times the Columnwise Pairwise algorithm is applied to all the columns(default=2).") + public int param_MaxSweeps = 2; + @Doc("The optimal stopping criterion (between 0 and 1) (default=0.1).") + public double param_eps = 0.1; + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputdirectory); + + int factorNumber = plan.getFactors().size(); + List<Factor> factors = plan.getFactors(); + RDataFrame dataFrame; + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + //Test all factors, if one is discrete, return null + testNoDiscrete(factors); + + try { + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Set working directory to get Isis R session + engine.loadRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + //Load the lhs library + engine.voidEval("library(lhs)"); + + String rInstruction = "x<-optimumLHS(n=%s,k=%s,maxSweeps=%s,eps=%s)"; + + String rCall = String.format(rInstruction, param_simulationNumber, + factorNumber, param_MaxSweeps, param_eps); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + //Create the scenarios + engine.voidEval(rCall); + + // Get back experiment plan + engine.eval("expPlan<-as.data.frame(x)"); + dataFrame = (RDataFrame)engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + + // Setting up the scenarios. + for (int j = 0; j < param_simulationNumber; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = plan.getFactors().get(i); + factor.setValueForIdentifier(dataFrame.get(i, j)); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + String isisFactorDistribution = "isis.factor.distribution<-" + + "data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + String distribution = ""; + String parameters = ""; + String factorNames = ""; + + for (int i = 0; i < factors.size(); i++) { + Factor tempFactor = factors.get(i); + ContinuousDomain domain = (ContinuousDomain) tempFactor.getDomain(); + if (i != 0) { + distribution += ","; + factorNames += ","; + parameters += ","; + } + + factorNames += "\"" + factors.get(i).getName() + "\""; + distribution += "\"qunif\""; + //add [min;max] to parameters + parameters += "\"[" + domain.getMinBound() + ";" + + domain.getMaxBound() + "]\""; + } + + engine.voidEval(String.format(isisFactorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-" + "\"x<-optimumLHS(" + + "n=" + param_simulationNumber + + ",k=" + factorNumber + + ",maxSweeps=" + param_MaxSweeps + + ",eps=" + param_eps + ")\""); + + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("isis.simule<-data.frame(x)"); + + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + String data = "data<-data.frame("; + + //Create the factors vectors and the dataFrame instruction + for (int j = 0; j < factors.size(); j++) { + //The factor values vector + String vector; + //Get back the factor + Scenario scenario = thisExperimentScenarios.get(0); + Factor factor = scenario.getFactors().get(j); + String factorName = factor.getName().replaceAll(" ", ""); + + vector = factorName + "<-c("; + for (int i = 0; i < param_simulationNumber; i++) { + //Get back the displayed value the factor + Scenario tempScenario = thisExperimentScenarios.get(i); + Factor tempFactor = tempScenario.getFactors().get(j); + Object value = tempFactor.getDisplayedValue(); + + if (i < (param_simulationNumber - 1)) { + vector = vector + value + ","; + } else { + vector += value; + } + + } + vector += ")"; + engine.voidEval(vector); + + if (j < factors.size() - 1) { + data += factorName + "=factor(" + factorName + "),"; + } else { + data += factorName + "=factor(" + factorName + "))"; + } + } + engine.voidEval(data); + + // Creating the factors vector. + rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + if (i != (factorNumber - 1)) { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\","; + } else { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\""; + } + } + + rInstruction += ")"; + + engine.voidEval(rInstruction); + + // Save Isis R session + engine.saveRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't generate scenarios", e); + } + + return thisExperiment; + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + //The first storage to get the name and parameters all along the method + SimulationStorage storage = simulationStorages.get(0); + + String simulationName = storage.getName().replaceAll("-", ""); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.voidEval("factors<-data.frame(x)"); + engine.voidEval("names(factors)<-factornames"); + + //Get back the factors number + int factorNumber = (Integer) engine.eval("length(factors[1,])"); + //Get back the simulation number + param_simulationNumber = (Integer) (engine.eval("length(factors[,1])")); + + SimulationParameter param = storage.getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); + + for (int k = 0; k < sensitivityNumber; k++) { + + // Creates the R expression to import results in R + SensitivityExport export = param.getSensitivityExport().get(k); + String name = export.getExportFilename(); + + //Create the dataforaov data.frame + String dataframe = "dataforaov<-data.frame(factors," + + name + "=" + name + ")"; + engine.voidEval(dataframe); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~"; + for (int j = 0; j < factorNumber; j++) { + + String factorName = (String) engine.eval("names(factors)[" + (j + 1) + "]"); + factorName = factorName.replaceAll(" ", "."); + + if (j < (factorNumber - 1)) { + aovCall += factorName + + "+"; + } else { + aovCall += factorName + ",data=dataforaov)"; + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + + //Set dataforaov names + engine.voidEval("names(dataforaov)<-c(factornames,\"Result\")"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputDirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + name + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + name + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "call_method=\"" + aovCall + "\""+ + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-" + + "isis.methodAnalyse"; + + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine, simulationName); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of Random Latin Hypercube method method " + + "using R (needs 'lhs' package to work)"; + } + +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRRandomLHS.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,706 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of Random Latin Hypercube method using R. - * - * @author jcouteau - * @version $Revision$ - */ -public class SensitivityCalculatorRRandomLHS extends - AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory - .getLog(SensitivityCalculatorRRandomLHS.class); - - @Doc("Simulation number (default=10)") - public int param_simulationNumber = 10; - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) - throws SensitivityException { - - setIsisFactorsR(plan, outputdirectory); - - int factornumber = plan.getFactors().size(); - double[] dataframe = new double[0]; - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - List<Factor<?, ?>> factors = plan.getFactors(); - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factors.size(); i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - "Error", - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - JOptionPane.ERROR_MESSAGE); - return null; - } - } - - if ((Integer) param_simulationNumber == 0) { - param_simulationNumber = 10; - } - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - //Set working directory for other results - log.info("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - //Load the lhs library - engine.voidEval("library(lhs)"); - log.info("Message sent to R : " + "library(lhs)"); - - //Create the scenarios - String rInstruction = "x<-randomLHS(%s,%s)"; - String rCall = String.format(rInstruction, param_simulationNumber, - factornumber); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Get back experiment plan - dataframe = (double[]) engine.eval("x"); - log.info("Message sent to R" + "x"); - - // Transform the result from R in a matrix - MatrixND morris = MatrixFactory.getInstance().create(dataframe, - new int[] { factornumber, param_simulationNumber }); - - // Setting up the scenarios. - for (int j = 0; j < param_simulationNumber; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factornumber; i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(morris.getValue(new int[] { - i, j })); - } else { - Double value = (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor - .getDomain()).getMaxBound() - (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound()) - * morris.getValue(new int[] { i, j }); - factor.setValueForIdentifier(value); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - - String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; - - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factors.size(); i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; - factorNames += ","; - parameters += ","; - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - distribution += "\"qunif\""; - parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() - + ";" + ((ContinuousDomain) domain).getMaxBound() - + "]\""; - } - - log.info("Message sent to R : " - + String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - - log.info("Message sent to R : " + "call<-" + "\"x<-randomLHS(" - + param_simulationNumber + "," + factornumber + ")\""); - engine.voidEval("call<-" + "\"x<-randomLHS(" - + param_simulationNumber + "," + factornumber + ")\""); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " + "isis.simule<-data.frame(x)"); - engine.voidEval("isis.simule<-data.frame(x)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - String data = "data<-data.frame("; - - //Create the factors vectors and the dataframe instruction - for (int j = 0; j < factors.size(); j++) { - Factor factor = thisExperimentScenarios.get(0).getFactors() - .get(j); - if (factor.getDomain() instanceof EquationContinuousDomain) { - - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else { - //String vector = "factor" + j + "<-c("; - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < param_simulationNumber; i++) { - if (i < (param_simulationNumber - 1)) { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue() - + ","; - } else { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } - - if (j < factors.size() - 1) { - data += factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "),"; - } else { - data += factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "))"; - } - - } - engine.voidEval(data); - log.info("Message sent to R : " + data); - - // Creating the factors vector. - rInstruction = "factornames<-c("; - for (int i = 0; i < factornumber; i++) { - if (i != (factornumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R" + rInstruction); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the scenario matrix for the second run in a .randomlhs.csv file - engine.voidEval("write.csv(data,file=\".randomlhs.csv\")"); - log.info("Message sent to R : " - + "write.csv(data,file=\".randomlhs.csv\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R" - + "dput(factornames,file=\".factornames\")"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - return thisExperiment; - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) throws SensitivityException { - - if ((Integer) param_simulationNumber == 0) { - param_simulationNumber = 10; - } - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - //Get back the scenarios - engine.voidEval("factors<-read.csv(\".randomlhs.csv\")"); - log - .info("Message sent to R : factors<-read.csv(\".randomlhs.csv\")"); - - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Get back the factors number - int factorNumber = ((Double) engine.eval("length(factors)-1")) - .intValue(); - - //Get back the simulation number - param_simulationNumber = (Integer) (engine - .eval("length(factors[,1])")); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < simulationStorages.size(); l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "attr(isis.simule,\"call\")<-isis.MethodExp$call"); - engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors," + name - + "=" + name + ")"; - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - //Call aov() - String aovCall = "aovresult<-aov(" + name + "~"; - for (int j = 0; j < factorNumber; j++) { - log.info("Message sent to R : " + "names(factors)[" - + (j + 2) + "]"); - - if (j < (factorNumber - 1)) { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + "+"; - } else { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + ",data=dataforaov)"; - } - } - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - - /*Export the results - *Export format is csv, data separated by ',' - *Results Export name is sensitivityExportName_Results.csv - *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv - */ - - //Compute Sum of Squares and Sensitivity indices - engine.voidEval("SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - log.info("Message sent to R : SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - engine - .voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - log - .info("Message sent to R : names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - log.info("Message sent to R : IndSensibilite<-SoS/sum(SoS)"); - - //Create a data.frame to export sensitivity important results in one file. - engine.voidEval("exportsensitivity=data.frame(SoS[1:" - + factorNumber + "],IndSensibilite[1:" + factorNumber - + "])"); - log - .info("Message sent to R : exportsensitivity=data.frame(SoS[1:" - + factorNumber - + "],IndSensibilite[1:" - + factorNumber + "])"); - engine - .voidEval("names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - log - .info("Message sent to R : names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - engine.voidEval("row.names(exportsensitivity)<-factornames"); - log.info("Message sent to R : " - + "row.names(exportsensitivity)<-factornames"); - - //Set dataforaov names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dataforaov)<-resultsnames"); - log.info("Message sent to R : " - + "names(dataforaov)<-resultsnames"); - - /*Set the export directory - *Export directory is the first simulation export directory. - */ - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Save the results with the scenarios. - engine.voidEval("write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - - //Save the sensitivity indices - engine.voidEval("write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - //FIXME export through java to enable export when using Rserve (when distant Rserve). - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall - + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - - log - .info("Message sent to R : " - + "attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception e) { - e.printStackTrace(); - // Error while processing - } - - } - - @Override - public String getDescription() { - return "Implementation of Random Latin Hypercube method method using R"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRRandomLHS.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRRandomLHS.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,389 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.export.SensitivityExport; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RProxy; +import org.nuiton.j2r.types.RDataFrame; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.util.Doc; + +/** + * Implementation of Random Latin Hypercube method using R. + * + * @author jcouteau + * @version $Revision$ + */ +public class SensitivityCalculatorRRandomLHS extends + AbstractSensitivityAnalysis { + + @Doc("Simulation number (default=10)") + public int param_simulationNumber = 10; + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputDirectory); + + int factorNumber = plan.getFactors().size(); + RDataFrame dataFrame; //The dataframe to get back the scenarios from R + SensitivityScenarios thisExperiment = new SensitivityScenarios(); //The experiment we will build + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); //The list of scenarios + List<Factor> factors = plan.getFactors(); //The factors + + testNoDiscrete(factors); + + try { + + REngine engine = new RProxy(); //The R engine + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Load the lhs library + engine.voidEval("library(lhs)"); + + //Create the scenarios + String rInstruction = "x<-randomLHS(%s,%s)"; + String rCall = String.format(rInstruction, param_simulationNumber, + factorNumber); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + engine.voidEval(rCall); + + // Get back experiment plan + engine.eval("expPlan<-as.data.frame(x)"); + dataFrame = (RDataFrame)engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + + // Setting up the scenarios. + for (int j = 0; j < param_simulationNumber; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = plan.getFactors().get(i); //The factor we are setting + factor.setValueForIdentifier(dataFrame.get(i,j)); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + String isisFactorDistribution = "isis.factor.distribution<-" + + "data.frame(" + + "NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + String distribution = ""; + String parameters = ""; + String factorNames = ""; + + + //Create the strings for the isis.MethodExp instruction + for (int i = 0; i < factors.size(); i++) { + ContinuousDomain domain = (ContinuousDomain)factors.get(i).getDomain(); + if (i != 0) { + distribution += ","; //the distribution + factorNames += ","; //the factor names + parameters += ","; //the parameters + } + + factorNames += "\"" + factors.get(i).getName() + "\""; + distribution += "\"qunif\""; //all distributions are qunif + double min = domain.getCalculatorMinBound(); + double max = domain.getCalculatorMaxBound(); + parameters += "\"[" + min + ";" + max + "]\""; + } + engine.voidEval(String.format(isisFactorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-" + "\"x<-randomLHS(" + + param_simulationNumber + "," + factorNumber + ")\""); + + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("isis.simule<-data.frame(x)"); + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + String data = "data<-data.frame("; + + //Create the factors vectors and the dataFrame instruction + for (int j = 0; j < factors.size(); j++) { + Scenario firstScenario = thisExperimentScenarios.get(0); + Factor factor = firstScenario.getFactors().get(j); + String factorName = factor.getName().replaceAll(" ", ""); + + //the vector of the factor values + //read all the values one by one from the already created + //scenarios. + String vector = factorName + "<-c("; + for (int i = 0; i < param_simulationNumber; i++) { + Scenario scenario = thisExperimentScenarios.get(i); + List<Factor> factorList = scenario.getFactors(); + Factor factor1 = factorList.get(j); + if (i < (param_simulationNumber - 1)) { + vector += factor1.getDisplayedValue() + ","; + } else { + vector += factor1.getDisplayedValue(); + } + + } + vector = vector + ")"; + engine.voidEval(vector); + + //add factor1=factor(factor1) for each factor... + if (j < factors.size() - 1) { + data += factorName + "=factor(" + factorName + "),"; + } else { + data += factorName + "=factor(" + factorName + "))"; + } + + } + engine.voidEval(data); + + // Creating the factors vector. + rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + if (i != (factorNumber - 1)) { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\","; + } else { + rInstruction = rInstruction + "\"" + + factors.get(i).getName() + "\""; + } + } + rInstruction += ")"; + engine.voidEval(rInstruction); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't generate scenarios", e); + } + + return thisExperiment; + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + SimulationStorage simulationStorage1 = simulationStorages.get(0); + String simName = simulationStorage1.getName(); + String simulationName = simName.replaceAll("-", ""); + SimulationParameter param = simulationStorage1.getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + //List<SensitivityExport> export = param.getSensitivityExport(); + + try { + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.voidEval("factors<-data.frame(x)"); + + //Get back the factors number + int factorNumber = (Integer) engine.eval("length(factors)"); + + //Get back the simulation number + param_simulationNumber = (Integer) (engine.eval("length(factors[,1])")); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); + + for (int k = 0; k < sensitivityNumber; k++) { + + // Creates the R expression to import results in R + String name = param.getSensitivityExport().get(k) + .getExportFilename(); + + //Create the dataforaov data.frame + String dataframe = "dataforaov<-data.frame(factors," + name + + "=" + name + ")"; + engine.voidEval(dataframe); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~"; + for (int j = 0; j < factorNumber; j++) { + + if (j < (factorNumber - 1)) { + aovCall += engine.eval("names(factors)[" + (j + 1) + "]") + + "+"; + } else { + aovCall += engine.eval("names(factors)[" + (j + 1) + "]") + + ",data=dataforaov)"; + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + + //Set dataforaov names + engine.voidEval("resultsnames<-c(factornames,\"Result\")"); + engine.voidEval("names(dataforaov)<-resultsnames"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputDirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + param.getSensitivityExport().get(k).getExportFilename() + + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + param.getSensitivityExport().get(k).getExportFilename() + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "call_method=\"" + aovCall + "\"," + + "\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-" + + "isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine, simulationName); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + + } + + @Override + public String getDescription() { + return "Implementation of Random Latin Hypercube method method using" + + " R needs the 'lhs' package to work)"; + } + +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRSobol.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,603 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ - -package sensitivity; - -import java.io.File; -import java.util.List; -import java.util.Vector; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; -import org.rosuda.JRI.REXP; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -/** - * Implementation of Sobol method using R. - * - * @author jcouteau - * @version $Revision$ - * - * Last update : $Date$ By : - * $Author: jcouteau $ - */ -public class SensitivityCalculatorRSobol extends AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory - .getLog(SensitivityCalculatorRFast.class); - - @Doc("the size of the 2 random samples") - public int param_n = 20; - - @Doc("the number of bootstrap replicates.") - public int param_nboot = 20; - - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - setIsisFactorsR(plan, outputdirectory); - - double[] dataframe = new double[0]; - int nbExperiments = 0; - int factorNumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - //Test all factors, if one is discrete, return null - for (int i = 0; i < factorNumber; i++) { - if (factors.get(i).getDomain() instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - "Error", - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - JOptionPane.ERROR_MESSAGE); - return null; - } - } - - String rInstruction = "a<-sobol2002(model=NULL,X1=X1,X2=X2,nboot=%s)"; - String rCall = String.format(rInstruction, param_nboot); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - REngine engine = new RProxy(); - - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R : " + "library(sensitivity)"); - - //Set the working directory (for import and exports) - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - engine.voidEval("X1<-data.frame(matrix(runif(" + factorNumber + "*" - + param_n + "),nrow=" + param_n + "))"); - log - .info("Message sent to R : " - + "X1<-data.frame(matrix(runif(" + factorNumber - + "*" + param_n + "),nrow=" + param_n + "))"); - engine.voidEval("X2<-data.frame(matrix(runif(" + factorNumber + "*" - + param_n + "),nrow=" + param_n + "))"); - log - .info("Message sent to R : " - + "X2<-data.frame(matrix(runif(" + factorNumber - + "*" + param_n + "),nrow=" + param_n + "))"); - - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Creating the factors vector. - rInstruction = "factornames<-c("; - for (int i = 0; i < factorNumber; i++) { - if (i != (factorNumber - 1)) { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\","; - } else { - rInstruction = rInstruction + "\"" - + factors.get(i).getName() + "\""; - } - } - - rInstruction += ")"; - - engine.voidEval(rInstruction); - log.info("Message sent to R" + rInstruction); - - // Export the sobol object for the second run in a .sobol file - engine.voidEval("dput(a,file=\".sobol\")"); - log.info("Message sent to R" + "dput(a,file=\".sobol\")"); - // Export the X1 object for the second run in a .X1 file - engine.voidEval("dput(X1,file=\".X1\")"); - log.info("Message sent to R" + "dput(a,file=\".sobol\")"); - // Export the X2 object for the second run in a .X2 file - engine.voidEval("dput(X2,file=\".X2\")"); - log.info("Message sent to R" + "dput(a,file=\".sobol\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R" - + "dput(factornames,file=\".factornames\")"); - - // Get back experiment plan - /*dataframe = (double[]) engine.eval("a$X");*/ - - Vector<REXP> dataframeVector = (Vector<REXP>) engine.eval("a$X"); - int dataframevectorsize = dataframeVector.size(); - int dataframevectorlength = dataframeVector.get(0).asDoubleArray().length; - dataframe = new double[dataframevectorsize * dataframevectorlength]; - for (int i = 0; i < dataframeVector.size(); i++) { - for (int j = 0; j < dataframeVector.get(0).asDoubleArray().length; j++) { - dataframe[i * dataframeVector.get(0).asDoubleArray().length - + j] = dataframeVector.get(i).asDoubleArray()[j]; - } - } - log.info("Message sent to R : " + "a$X"); - - nbExperiments = dataframe.length / factorNumber; - - String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; - - // Creating the vectors. - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; - parameters += ","; - factorNames += ","; - } - - distribution += "\"qunif\""; - parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() - + ";" + ((ContinuousDomain) domain).getMaxBound() - + "]\""; - factorNames += "\"" + factors.get(i).getName() + "\""; - } - - log.info("Message sent to R : " - + String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - - log.info("Message sent to R : " + "call<-a$call"); - engine.voidEval("call<-a$call"); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " + "isis.simule<-data.frame(a$X)"); - engine.voidEval("isis.simule<-data.frame(a$X)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - } catch (Exception e) { - e.printStackTrace(); - } - - // Transform the result from R in a matrix - MatrixND fast = MatrixFactory.getInstance().create(dataframe, - new int[] { factorNumber, nbExperiments }); - - // Setting up the scenarios. - for (int j = 0; j < nbExperiments; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factorNumber; i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(fast - .getValue(new int[] { i, j })); - } else { - Double value = (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor.getDomain()) - .getMaxBound() - (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound()) - * fast.getValue(new int[] { i, j }); - factor.setValueForIdentifier(value); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - return thisExperiment; - - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) { - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Call R - // Load sensitivity package into R (if package already loaded, - // nothing happens. - engine.voidEval("library(sensitivity)"); - log.info("Message sent to R : " + "library(sensitivity)"); - - //Set the working directory (for import and exports) - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Get the .X1 file - engine.voidEval("X1<-dget(\".X1\")"); - log.info("Message sent to R : " + "X1<-dget(\".X1\")"); - // Get the .X2 file - engine.voidEval("X2<-dget(\".X2\")"); - log.info("Message sent to R : " + "X2<-dget(\".X2\")"); - // Get the factornames object in the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Set X1 names - engine.voidEval("names(X1)<-factornames"); - log.info("Message sent to R : " + "names(X1)<-factornames"); - //Set X2 names - engine.voidEval("names(X2)<-factornames"); - log.info("Message sent to R : " + "names(X2)<-factornames"); - - // Get the .sobol file - engine.voidEval("a<-dget(\".sobol\")"); - log.info("Message sent to R : " + "a<-dget(\".sobol\")"); - - //Set a$X names - engine.voidEval("names(a$X)<-factornames"); - log.info("Message sent to R : " + "names(a$X)<-factornames"); - - int scenariosNumber = (Integer) engine.eval("length(a$X[,1])"); - log.info("Message sent to R : " + "length(a$X[,1])"); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < scenariosNumber; l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "attr(isis.simule,\"call\")<-isis.MethodExp$call"); - engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Compute results - engine.voidEval("tell(a,y=" + name + ")"); - log.info("Message sent to R : " + "tell(a,y=" + name + ")"); - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" - + name + ")" + "\",\"analysis_result\"=a)"); - - //setting isis.methodAnalyse attributes - log - .info("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); - - //Create the data.frame of scenarios and results for export purpose - engine.voidEval("dfresults=data.frame(a$X,results)"); - log.info("Message sent to R : " - + "dfresults=data.frame(a$X,results)"); - - //Set working directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Export V - engine.voidEval("write.csv(a$V,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$V,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_V.csv\")"); - - //Export DD - engine.voidEval("write.csv(a$D,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_D.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$D,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_D.csv\")"); - - //Export S - engine.voidEval("write.csv(a$S,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_S.csv\")"); - log.info("Message sent to R : " - + "write.csv(a$S,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_S.csv\")"); - - //Export results - engine.voidEval("write.csv(dfresults,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : " - + "write.csv(results,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - //FIXME export through java to enable export when using Rserve - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public String getDescription() { - return "Implementation of Sobol method using R (use of the R sobol2002 method)"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRSobol.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRSobol.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,336 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.export.SensitivityExport; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RProxy; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Domain; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.util.Doc; +import org.nuiton.j2r.types.RDataFrame; + +/** + * Implementation of Sobol method using R. + * + * @author jcouteau + * @version $Revision$ + * + * Last update : $Date$ By : + * $Author: jcouteau $ + */ +public class SensitivityCalculatorRSobol extends AbstractSensitivityAnalysis { + + @Doc("the size of the 2 random samples") + public int param_n = 20; + + @Doc("the number of bootstrap replicates.") + public int param_nboot = 20; + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputdirectory); + + RDataFrame dataFrame; + int nbExperiments; + int factorNumber = plan.getFactors().size(); + List<Factor> factors = plan.getFactors(); + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + testNoDiscrete(factors); + + String rInstruction = "a<-sobol2002(model=NULL,X1=X1,X2=X2,nboot=%s)"; + String rCall = String.format(rInstruction, param_nboot); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + try { + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + engine.voidEval("library(sensitivity)"); + + engine.voidEval("X1<-data.frame(matrix(runif(" + factorNumber + "*" + + param_n + "),nrow=" + param_n + "))"); + engine.voidEval("X2<-data.frame(matrix(runif(" + factorNumber + "*" + + param_n + "),nrow=" + param_n + "))"); + + engine.voidEval(rCall); + + // Creating the factors vector. + rInstruction = "factornames<-c("; + for (int i = 0; i < factorNumber; i++) { + String factorName = factors.get(i).getName(); + if (i != (factorNumber - 1)) { + rInstruction += "\"" + factorName + "\","; + } else { + rInstruction += "\"" + factorName + "\""; + } + } + + rInstruction += ")"; + + engine.voidEval(rInstruction); + + // Get back experiment plan + dataFrame = (RDataFrame) engine.eval("a$X"); + dataFrame.setVariable("a$X"); + + nbExperiments = dataFrame.dim()[0]; + + String isisFactorDistribution = "isis.factor.distribution<-" + + "data.frame(NomFacteur=c(%s)," + + "NomDistribution=c(%s)," + + "ParametreDistribution=c(%s))"; + + // Creating the vectors. + String distribution = ""; + String parameters = ""; + String factorNames = ""; + + for (int i = 0; i < factorNumber; i++) { + Factor factor = factors.get(i); + Domain domain = factor.getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + factorNames += ","; + } + + distribution += "\"qunif\""; + ContinuousDomain continuousDomain = (ContinuousDomain) domain; + double min = continuousDomain.getCalculatorMinBound(); + double max = continuousDomain.getCalculatorMaxBound(); + parameters += "\"[" + min + ";" + max + "]\""; + factorNames += "\"" + factor.getName() + "\""; + } + + engine.voidEval(String.format(isisFactorDistribution, factorNames, + distribution, parameters)); + + engine.voidEval("call<-a$call"); + + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("isis.simule<-data.frame(a$X)"); + + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputdirectory.getParentFile(), + outputdirectory.getName()); + + // Setting up the scenarios. + for (int j = 0; j < nbExperiments; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factorNumber; i++) { + Factor factor = plan.getFactors().get(i); + Double dFValue = (Double) dataFrame.get(i, j); + factor.setValueForIdentifier(dFValue); + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + } + + } catch (Exception e) { + throw new SensitivityException("Can't generate scenarios", e);} + + + thisExperiment.setScenarios(thisExperimentScenarios); + return thisExperiment; + + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + SimulationStorage firstStorage = simulationStorages.get(0); + SimulationParameter param = firstStorage.getParameter(); + int sensitivityNumber = param.getSensitivityExport().size(); + String simulationName = firstStorage.getName().replaceAll("-", ""); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + // Call R + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + + //Set X1 names + engine.voidEval("names(X1)<-factornames"); + //Set X2 names + engine.voidEval("names(X2)<-factornames"); + + //Set a$X names + engine.voidEval("names(a$X)<-factornames"); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("attr(isis.simule,\"call\")<-isis.MethodExp$call"); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = param.getSensitivityExport().get(k); + String name = sensitivityExport.getExportFilename(); + + //Compute results + engine.voidEval("tell(a,y=" + name + ")"); + + engine.voidEval("row.names(a$S)<-names(a$X)"); + engine.voidEval("row.names(a$T)<-names(a$X)"); + engine.voidEval("row.names(a$V)<-c(\"global\"," + + "names(a$X),paste(\"-\",names(a$X),sep=\"\"))"); + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "call_method=\"tell(a,y=" + name + ")" + "\"," + + "\"analysis_result\"=a)"); + + //setting isis.methodAnalyse attributes + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\")"); + + //Create the data.frame of scenarios and results for export purpose + engine.voidEval("dfresults<-data.frame(a$X,a$y)"); + + //Set working directory + engine.setwd(outputDirectory); + + //Export V + engine.voidEval("write.csv(a$V,\"" + + name + + "_SensitivityIndices.csv\")"); + //Export DD + engine.voidEval("write.csv(a$D,\"" + + name + "_D.csv\")"); + + //Export S + engine.voidEval("write.csv(a$S,\"" + + name + "_S.csv\")"); + + //Export results + engine.voidEval("write.csv(dfresults,\"" + + name + "_Results.csv\")"); + //FIXME export through java to enable export when using Rserve + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-" + + "isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine, simulationName); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + } catch (Exception e) { + throw new SensitivityException("Can't evaluate results", e); + } + } + + @Override + public String getDescription() { + return "Implementation of Sobol method using R (use of the R " + + "sobol2002 method, needs the 'sensitivity' package to work)"; + } +} Deleted: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRegularFractions.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,688 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ -package sensitivity; - -import java.io.File; -import java.util.List; - -import javax.swing.Box; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.j2r.REngine; -import org.codelutin.j2r.RException; -import org.codelutin.j2r.RProxy; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.util.FileUtil; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.SimulationParameter; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.util.Doc; - -public class SensitivityCalculatorRegularFractions extends - AbstractSensitivityCalculator { - - /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory - .getLog(SensitivityCalculatorRFrF2.class); - - @Doc("the path of the directory where the R function is stored (do not indicate the RegularFractions.R file name)") - public String param_pathToFunction = ""; - - @Doc("unique prime number of levels of all input and unit factors") - public int param_p = 2; - - @Doc("number of unit factors (so that there are N=p^r units)") - public int param_r = 2; - - @Doc("resolution of the fraction") - public int param_resolution = 2; - - @Doc("True to be able to modify the code sent to R") - public boolean param_modifR = false; - - /** - * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs - * continue. - * - * @return <tt>true</tt> s'il sait la gerer - */ - @Override - public boolean canManageCardinality() { - return true; - } - - @Override - public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - setIsisFactorsR(plan, outputdirectory); - - double[] dataframeplan = new double[0]; - int factorNumber = plan.getFactors().size(); - List<Factor<?, ?>> factors = plan.getFactors(); - SensitivityScenarios thisExperiment = new SensitivityScenarios(); - List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); - - String factorNames = ""; - - //Test all factors, if one is discrete, return null - //Create a string with all factors names - for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); - if (i != 0) { - factorNames += ","; - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - - if (domain instanceof DiscreteDomain) { - JOptionPane - .showMessageDialog( - null, - "Error", - factors.get(i).getName() - + " has a discrete domain, this is not acceptable for this method.", - JOptionPane.ERROR_MESSAGE); - return null; - } - } - - REngine engine = new RProxy(); - - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //outputdirectory.getName(); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - //Set the working directory (to import the R function) - engine.voidEval("setwd(\"" - + param_pathToFunction.replaceAll("\\\\", "/") + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + param_pathToFunction.replaceAll("\\\\", "/") + "\")"); - - //Import the function - log.info("source(\"regularfractions.R\")"); - engine.voidEval("source(\"regularfractions.R\")"); - - //Create the instruction - String rInstruction = "x<-regular.fraction(%s,%s,%s,%s)"; - String rCall = String.format(rInstruction, factors.size(), param_p, - param_r, param_resolution); - - if (param_modifR) { - JLabel label = new JLabel( - "Modifier le code R envoyé si vous le souhaitez"); - JTextPane text = new JTextPane(); - text.setText(rCall); - text.setSize(400, 400); - text.setPreferredSize(text.getSize()); - - Box box = Box.createVerticalBox(); - box.add(label); - box.add(new JScrollPane(text)); - - JOptionPane.showMessageDialog(null, box, "R modif", - JOptionPane.QUESTION_MESSAGE); - rCall = text.getText(); - } - - // Run function - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Run function - engine.voidEval("call<-\"" + rCall + "\""); - log.info("Message sent to R : " + "call<-\"" + rCall + "\""); - - // Creating the factors vector. - rInstruction = "factornames<-c(%s)"; - rCall = String.format(rInstruction, factorNames); - - engine.voidEval(rCall); - log.info("Message sent to R : " + rCall); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : " + "setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Export the result object for the second run in a .regularfractions file - engine.voidEval("dput(x,file=\".regularfractions\")"); - log.info("Message sent to R : " - + "dput(x,file=\".regularfractions\")"); - - // Export the factornames object for the second run in a .factornames file - engine.voidEval("dput(factornames,file=\".factornames\")"); - log.info("Message sent to R : " - + "dput(factornames,file=\".factornames\")"); - - // Get back experiment plan - dataframeplan = (double[]) engine.eval("x[[1]]"); - log.info("Message sent to R : " + "x[[1]]"); - - //Get back the simulation number - log.info("length(x[[1]][,1])"); - int simulationNumber = (Integer) engine.eval("length(x[[1]][,1])"); - - // Transform the result from R in a matrix - MatrixND morris = MatrixFactory.getInstance().create(dataframeplan, - new int[] { factors.size(), simulationNumber }); - - // Setting up the scenarios. - for (int j = 0; j < simulationNumber; j++) { - Scenario experimentScenario = new Scenario(); - for (int i = 0; i < factors.size(); i++) { - Factor factor = plan.getFactors().get(i); - if ((factor.getDomain() instanceof MatrixContinuousDomain) - || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier(morris.getValue(new int[] { - i, j })); - } else { - Double value = (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor - .getDomain()).getMaxBound() - (Double) ((ContinuousDomain) factor - .getDomain()).getMinBound()) - * (morris.getValue(new int[] { i, j }) / (param_p - 1)); - factor.setValueForIdentifier(value); - } - experimentScenario.addFactor(factor); - } - thisExperimentScenarios.add(experimentScenario); - thisExperiment.setScenarios(thisExperimentScenarios); - } - - String dataframe = "data<-data.frame("; - - //Create the factors vectors and the dataframe instruction - for (int j = 0; j < factorNumber; j++) { - Factor factor = thisExperimentScenarios.get(0).getFactors() - .get(j); - if (factor.getDomain() instanceof EquationContinuousDomain) { - - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < simulationNumber; i++) { - if (i < (simulationNumber - 1)) { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((EquationContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < simulationNumber; i++) { - if (i < (simulationNumber - 1)) { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue() + ","; - } else { - vector = vector - + ((MatrixContinuousDomain) thisExperimentScenarios - .get(i).getFactors().get(j) - .getDomain()).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } else { - String vector = factor.getName().replaceAll(" ", "") - + "<-c("; - for (int i = 0; i < simulationNumber; i++) { - if (i < (simulationNumber - 1)) { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue() - + ","; - } else { - vector = vector - + thisExperimentScenarios.get(i) - .getFactors().get(j).getValue(); - } - - } - vector = vector + ")"; - engine.voidEval(vector); - log.info("Message sent to R : " + vector); - } - - if (j < factorNumber - 1) { - dataframe = dataframe - + factor.getName().replaceAll(" ", "") + "=factor(" - + factor.getName().replaceAll(" ", "") + "),"; - } else { - dataframe += factor.getName().replaceAll(" ", "") - + "=factor(" + factor.getName().replaceAll(" ", "") - + "))"; - } - - } - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - log.info("Message sent to R : " - + "isis.factor.distribution<-c(0.0)"); - engine.voidEval("isis.factor.distribution<-c(0.0)"); - - log - .info("Message sent to R : " - + "isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - engine - .voidEval("isis.MethodExp<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"call\"=call)"); - - log - .info("Message sent to R : " - + "attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.MethodExp,\"nomModel\")<-\"isis-fish-externe-R\""); - - //Create isis.Simule - log.info("Message sent to R : " + "isis.simule<-data.frame(data)"); - engine.voidEval("isis.simule<-data.frame(data)"); - - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - log.info("Message sent to R : " - + "names(isis.simule)<-isis.factors[[1]]"); - engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); - - // Export the data.frame object for the second run in a .data file - engine.voidEval("write.csv(data,file=\".data.csv\")"); - log.info("Message sent to R : write.csv(data,file=\".data.csv\")"); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (RException eee) { - eee.printStackTrace(); - throw new RuntimeException("R evaluation failed", eee); - } - - return thisExperiment; - - } - - @Override - public void analyzeResult(List<SimulationStorage> simulationStorages, - File outputdirectory) throws SensitivityException { - - REngine engine = new RProxy(); - try { - - //Clear session - log.info("rm(list=ls())"); - engine.voidEval("rm(list=ls())"); - - //Set working directory to get Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - //Get Isis R session - log.info("load(\"" + outputdirectory.getName() + ".RData\")"); - engine - .voidEval("load(\"" + outputdirectory.getName() - + ".RData\")"); - - // Set output directory - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", "/") - + "\")"); - - // Get the regularfractions object from the .regularfractions file - engine.voidEval("x<-dget(\".regularfractions\")"); - log.info("Message sent to R : " + "x<-dget(\".regularfractions\")"); - - // Get the factornames object from the .factornames file - engine.voidEval("factornames<-dget(\".factornames\")"); - log.info("Message sent to R : " - + "factornames<-dget(\".factornames\")"); - - //Get back the scenarios - engine.voidEval("factors<-read.csv(\".data.csv\")"); - log.info("Message sent to R : factors<-read.csv(\".data.csv\")"); - - //Get back the factors number - int factorNumber = ((Double) engine.eval("length(factors)-1")) - .intValue(); - - SimulationParameter param = simulationStorages.get(0) - .getParameter(); - int sensitivityNumber = param.getSensitivityExport().size(); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - String rInstruction = name + "<-c("; - for (int l = 0; l < simulationStorages.size(); l++) { - File importFile = new File(simulationStorages.get(l) - .getDirectory().toString() - + File.separator - + SimulationStorage.RESULT_EXPORT_DIRECTORY, param - .getSensitivityExport().get(k).getExportFilename() - + param.getSensitivityExport().get(k) - .getExtensionFilename()); - String simulResult = FileUtil.readAsString(importFile); - double simulationResult = Double.valueOf(simulResult); - if (l < simulationStorages.size() - 1) { - rInstruction = rInstruction + simulationResult + ","; - } else { - rInstruction = rInstruction + simulationResult; - } - } - rInstruction = rInstruction + ")"; - - log.info("Message sent to R : " + rInstruction); - - // Send the simulation results - engine.voidEval(rInstruction); - - //Put results in isis.simule - engine.voidEval("isis.simule<-data.frame(isis.simule," + name - + ")"); - log.info("Message sent to R : " - + "isis.simule<-data.frame(isis.simule," + name + ")"); - } - - //adding attribute to isis.Simule - log - .info("Message sent to R : " - + "attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.simule,\"nomModel\")<-\"isis-fish-externe-R\""); - - for (int k = 0; k < sensitivityNumber; k++) { - - // Creates the R expression to import results in R - String name = param.getSensitivityExport().get(k) - .getExportFilename(); - - //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors," + name - + "=" + name + ")"; - engine.voidEval(dataframe); - log.info("Message sent to R : " + dataframe); - - //Call aov() - String aovCall = "aovresult<-aov(" + name + "~("; - for (int j = 0; j < factorNumber; j++) { - log.info("Message sent to R : " + "names(factors)[" - + (j + 2) + "]"); - - if (j < (factorNumber - 1)) { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + "+"; - } else { - aovCall = aovCall - + engine - .eval("names(factors)[" + (j + 2) + "]") - + ")"; - if (param_resolution <= 4) { - aovCall += ",data=dataforaov)"; - } else { - aovCall += "^2,data=dataforaov)"; - } - } - } - engine.voidEval(aovCall); - log.info("Message sent to R : " + aovCall); - - /*Export the results - *Export format is csv, data separated by ',' - *Results Export name is sensitivityExportName_Results.csv - *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv - */ - - //Compute Sum of Squares and Sensitivity indices - engine.voidEval("SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - log.info("Message sent to R : SoS<-summary(aovresult)[[1]][1:" - + factorNumber + ",2]"); - engine - .voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - log - .info("Message sent to R : names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:" - + factorNumber + "]"); - engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - log.info("Message sent to R : IndSensibilite<-SoS/sum(SoS)"); - - //Create a data.frame to export sensitivity important results in one file. - engine.voidEval("exportsensitivity=data.frame(SoS[1:" - + factorNumber + "],IndSensibilite[1:" + factorNumber - + "])"); - log - .info("Message sent to R : exportsensitivity=data.frame(SoS[1:" - + factorNumber - + "],IndSensibilite[1:" - + factorNumber + "])"); - engine - .voidEval("names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - log - .info("Message sent to R : names(exportsensitivity)<-c(\"Sum Of Squares\",\"Sensitivity indices\")"); - engine.voidEval("row.names(exportsensitivity)<-factornames"); - log.info("Message sent to R : " - + "row.names(exportsensitivity)<-factornames"); - - //Set dataforaov names - engine - .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(\"Simulation\",factornames,\"Result\")"); - engine.voidEval("names(dataforaov)<-resultsnames"); - log.info("Message sent to R : " - + "names(dataforaov)<-resultsnames"); - - /*Set the export directory - *Export directory is the first simulation export directory. - */ - engine.voidEval("setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath().replaceAll("\\\\", - "/") + "\")"); - - //Save the results with the scenarios. - engine.voidEval("write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - log.info("Message sent to R : write.csv(dataforaov,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() + "_Results.csv\")"); - - //Save the sensitivity indices - engine.voidEval("write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - log.info("Message sent to R : write.csv(exportsensitivity,\"" - + param.getSensitivityExport().get(k) - .getExportFilename() - + "_SensitivityIndices.csv\")"); - //FIXME export through java to enable export when using Rserve (when distant Rserve). - - //creating isis.methodAnalyse - log - .info("Message sent to R : " - + "isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - engine - .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" - + aovCall - + "\"" - + ",\"analysis_result\"=list(aovresult,IndSensibilite))"); - - log - .info("Message sent to R : " - + "attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - engine - .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\""); - - String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - log.info("Message sent to R : " - + String.format(renameIsisMethodAnalyse, simulationName - + "." + name)); - engine.voidEval(String.format(renameIsisMethodAnalyse, - simulationName + "." + name)); - - } - - //Rename R objects for saving purpose - - String renameIsisSimule = "%s.isis.simule<-isis.simule"; - String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; - String renameIsisFactor = "%s.isis.factor<-isis.factors"; - String renameIsisMethodExp = "%s.isis.methodExp<-isis.MethodExp"; - - String simulationName = simulationStorages.get(0).getName() - .replaceAll("-", ""); - - log.info("Message sent to R : " - + String.format(renameIsisSimule, simulationName)); - engine.voidEval(String.format(renameIsisSimule, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactorDistribution, - simulationName)); - engine.voidEval(String.format(renameIsisFactorDistribution, - simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisFactor, simulationName)); - engine.voidEval(String.format(renameIsisFactor, simulationName)); - - log.info("Message sent to R : " - + String.format(renameIsisMethodExp, simulationName)); - engine.voidEval(String.format(renameIsisMethodExp, simulationName)); - - //Set working directory to save Isis R session - log.info("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - engine.voidEval("setwd(\"" - + outputdirectory.getParent().replaceAll("\\\\", "/") - + "\")"); - - // Save Isis R session - log.info("save.image(file=\"" + outputdirectory.getName() + ".RData\")"); - engine.voidEval("save.image(file=\"" + outputdirectory.getName() - + ".RData\")"); - - engine.terminate(); - - } catch (Exception eee) { - eee.printStackTrace(); - throw new RuntimeException("R evaluation failed", eee); - } - - } - - @Override - public String getDescription() { - return "Implementation of Regular fractions method using R"; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/sensitivity/SensitivityCalculatorRegularFractions.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityanalysis/SensitivityCalculatorRegularFractions.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,392 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ + +package sensitivityanalysis; + +import java.io.File; +import java.util.List; + +import fr.ifremer.isisfish.export.SensitivityExport; +import org.nuiton.j2r.REngine; +import org.nuiton.j2r.RException; +import org.nuiton.j2r.RProxy; +import org.nuiton.j2r.types.RDataFrame; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationParameter; +import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityAnalysis; +import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Domain; +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.util.Doc; + +public class SensitivityCalculatorRegularFractions extends + AbstractSensitivityAnalysis { + + @Doc("the path of the directory where the R function is stored (do not indicate the RegularFractions.R file name)") + public String param_pathToFunction = ""; + + @Doc("unique prime number of levels of all input and unit factors") + public int param_p = 2; + + @Doc("number of unit factors (so that there are N=p^r units)") + public int param_r = 2; + + @Doc("resolution of the fraction") + public int param_resolution = 2; + + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + + /** + * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs + * continue. + * + * @return <tt>true</tt> s'il sait la gerer + */ + @Override + public boolean canManageCardinality() { + return true; + } + + @Override + public SensitivityScenarios compute(DesignPlan plan, File outputDirectory) + throws SensitivityException { + + setIsisFactorsR(plan, outputDirectory); + + RDataFrame dataFrame; + int factorNumber = plan.getFactors().size(); + List<Factor> factors = plan.getFactors(); + SensitivityScenarios thisExperiment = new SensitivityScenarios(); + List<Scenario> thisExperimentScenarios = thisExperiment.getScenarios(); + + String factorNames = ""; + + //Test all factors, if one is discrete, return null + //Create a string with all factors names + for (int i = 0; i < factorNumber; i++) { + Domain domain = factors.get(i).getDomain(); + if (i != 0) { + factorNames += ","; + } + + factorNames += "\"" + factors.get(i).getName() + "\""; + + if (domain instanceof DiscreteDomain) { + throw new SensitivityException(factors.get(i).getName() + + " has a discrete domain, this is not acceptable for " + + "this method."); + } + } + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Set the working directory (to import the R function) + engine.setwd(new File(param_pathToFunction)); + + //Import the function + engine.voidEval("source(\"regularfractions.R\")"); + + //Create the instruction + String rInstruction = "x<-regular.fraction(%s,%s,%s,%s)"; + String rCall = String.format(rInstruction, factors.size(), param_p, + param_r, param_resolution); + + if (param_modifR) { + rCall = editRInstruction(rCall); + } + + // Run function + engine.voidEval(rCall); + + // Run function + engine.voidEval("call<-\"" + rCall + "\""); + + // Creating the factors vector. + rInstruction = "factornames<-c(%s)"; + rCall = String.format(rInstruction, factorNames); + + engine.voidEval(rCall); + + + // Get back experiment plan + engine.eval("expPlan<-as.data.frame(x[[1]])"); + dataFrame = (RDataFrame)engine.eval("expPlan"); + dataFrame.setVariable("expPlan"); + + //Get back the simulation number + int simulationNumber = (Integer) engine.eval("length(x[[1]][,1])"); + + // Setting up the scenarios. + for (int j = 0; j < simulationNumber; j++) { + Scenario experimentScenario = new Scenario(); + for (int i = 0; i < factors.size(); i++) { + Factor factor = plan.getFactors().get(i); + Domain domain = factor.getDomain(); + Double dFValue = (Double)dataFrame.get(i,j); + if ((domain instanceof MatrixContinuousDomain) + || (domain instanceof EquationContinuousDomain)) { + factor.setValueForIdentifier(dFValue); + } else { + ContinuousDomain contDomain = (ContinuousDomain)domain; + Double max = contDomain.getCalculatorMaxBound(); + Double min = contDomain.getCalculatorMinBound(); + Double value = min + (max - min) * dFValue / (param_p - 1); + factor.setValueForIdentifier(value); + } + experimentScenario.addFactor(factor); + } + thisExperimentScenarios.add(experimentScenario); + thisExperiment.setScenarios(thisExperimentScenarios); + } + + String dataframe = "data<-data.frame("; + + //Create the factors vectors and the dataframe instruction + for (int j = 0; j < factorNumber; j++) { + Factor factor = factors.get(j); + String factorName = factor.getName().replaceAll(" ", ""); + + String vector = factorName + "<-c("; + for (int i = 0; i < simulationNumber; i++) { + Scenario scenario = thisExperimentScenarios.get(i); + List<Factor> newFactors = scenario.getFactors(); + Factor factor1 = newFactors.get(j); + + if (i < (simulationNumber - 1)) { + vector += factor1.getDisplayedValue() + ","; + } else { + vector += factor1.getDisplayedValue(); + } + + } + vector = vector + ")"; + engine.voidEval(vector); + + if (j < factorNumber - 1) { + dataframe += factorName + "=factor(" + factorName + "),"; + } else { + dataframe += factorName + "=factor(" + factorName + "))"; + } + + } + engine.voidEval(dataframe); + + engine.voidEval("isis.factor.distribution<-c(0.0)"); + + engine.voidEval("isis.MethodExp<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"call\"=call)"); + + engine.voidEval("attr(isis.MethodExp," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + //Create isis.Simule + engine.voidEval("isis.simule<-data.frame(data)"); + + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + engine.voidEval("names(isis.simule)<-isis.factors[[1]]"); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (RException eee) { + throw new SensitivityException("Can't generate scenarios", eee); + } + + return thisExperiment; + + } + + @Override + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputDirectory) throws SensitivityException { + + SimulationStorage firstStorage = simulationStorages.get(0); + SimulationParameter param = firstStorage.getParameter(); + List<SensitivityExport> exports = param.getSensitivityExport(); + int sensitivityNumber = exports.size(); + String simulationName = firstStorage.getName().replaceAll("-", ""); + + try { + + REngine engine = new RProxy(); + + //Clear session + engine.clearSession(); + + //Get Isis R session + engine.loadRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + //Get back the factors number + int factorNumber = (Integer) engine.eval("dim(data)[2]"); + + for (int k = 0; k < sensitivityNumber; k++) { + + SensitivityExport sensitivityExport = + param.getSensitivityExport().get(k); + + String rInstruction = createImportInstruction(sensitivityExport, + simulationStorages); + + // Send the simulation results + engine.voidEval(rInstruction); + + //Put results in isis.simule + engine.voidEval("isis.simule<-data.frame(isis.simule," + + sensitivityExport.getExportFilename() + ")"); + } + + //adding attribute to isis.Simule + engine.voidEval("attr(isis.simule," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + for (SensitivityExport export : exports) { + + String name = export.getExportFilename(); + + //Create the dataforaov data.frame + String dataFrame = "dataforaov<-data.frame(data," + + name + "=" + name + ")"; + engine.voidEval(dataFrame); + + //Call aov() + String aovCall = "aovresult<-aov(" + name + "~("; + for (int j = 0; j < factorNumber; j++) { + + if (j < (factorNumber - 1)) { + aovCall = aovCall + + engine.eval("names(data)[" + (j + 1) + "]") + + "+"; + } else { + aovCall = aovCall + + engine.eval("names(data)[" + (j + 1) + "]") + + ")"; + if (param_resolution <= 4) { + aovCall += ",data=dataforaov)"; + } else { + aovCall += "^2,data=dataforaov)"; + } + } + } + engine.voidEval(aovCall); + + /*Export the results + *Export format is csv, data separated by ',' + *Results Export name is sensitivityExportName_Results.csv + *Sensitivity Indices export name is sensitivityExportName_SensitivityIndices.csv + */ + + //Compute Sum of Squares and Sensitivity indices + engine.voidEval("SoS<-summary(aovresult)[[1]][1:dim(summary(aovresult)[[1]])[1],2]"); + engine.voidEval("names(SoS)<-dimnames(summary(aovresult)[[1]])[[1]][1:dim(summary(aovresult)[[1]])[1]]"); + engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); + + //Create a data.frame to export sensitivity important results in one file. + engine.voidEval("exportsensitivity<-data.frame(" + + "SoS[1:dim(summary(aovresult)[[1]])[1]]," + + "IndSensibilite[1:dim(summary(aovresult)[[1]])[1]])"); + engine.voidEval("names(exportsensitivity)<-c(" + + "\"Sum Of Squares\"," + + "\"Sensitivity indices\")"); + engine.voidEval("row.names(exportsensitivity)<-dimnames(summary(aovresult)[[1]])[1][[1]][1:dim(summary(aovresult)[[1]])[1]]"); + + //Set dataforaov names + engine.voidEval("resultsnames<-c(factornames,\"Result\")"); + engine.voidEval("names(dataforaov)<-resultsnames"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.setwd(outputDirectory); + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + name + + "_Results.csv\")"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + name + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). + + //creating isis.methodAnalyse + engine.voidEval("isis.methodAnalyse<-list(" + + "\"isis.factors\"=isis.factors," + + "\"isis.factor.distribution\"=isis.factor.distribution," + + "\"isis.simule\"=isis.simule," + + "\"call_method\"=\"" + aovCall + "\"," + + "\"analysis_result\"=list(aovresult,IndSensibilite))"); + + engine.voidEval("attr(isis.methodAnalyse," + + "\"nomModel\")<-\"isis-fish-externe-R\""); + + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; + engine.voidEval(String.format(renameIsisMethodAnalyse, + simulationName + "." + name)); + + } + + //Rename R objects for saving purpose + renameObjects(engine,simulationName); + + // Save Isis R session + engine.saveRData(outputDirectory.getParentFile(), + outputDirectory.getName()); + + engine.terminate(); + + } catch (Exception eee) { + throw new SensitivityException("Can't evaluate results", eee); + } + + } + + @Override + public String getDescription() { + return "Implementation of Regular fractions method using R"; + } + +} Modified: isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassReferenceY9.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassReferenceY9.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassReferenceY9.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -26,19 +23,20 @@ import static org.nuiton.i18n.I18n._; +import java.io.File; import java.io.Writer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.MatrixND; -import org.nuiton.topia.TopiaContext; +import org.nuiton.util.ReverseFileReader; import scripts.ResultName; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.export.SensitivityExport; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; public class SensitivityBiomassReferenceY9 implements SensitivityExport { @@ -52,53 +50,65 @@ @Doc("Population") public Population param_pop; - @Doc("Name of the reference simulation") - public String param_referenceSimulation = ""; + @Doc("URL of the Biomasses.csv reference export file") + public String param_referenceBiomassCSV =""; @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - SimulationStorage referenceSimulation = SimulationStorage - .getSimulation(param_referenceSimulation); - ResultStorage referenceResultStorage = referenceSimulation - .getResultStorage(); ResultStorage resultStorage = simulation.getResultStorage(); - Date lastDate = resultStorage.getLastDate(); + TimeStep lastStep = resultStorage.getLastStep(); Double biomass = 0.0; Double referenceBiomass = 0.0; - System.out.println("reference simul : " + param_referenceSimulation); + File referenceFile = new File(param_referenceBiomassCSV); + //instantiate a reader that starts reading from the file end. + ReverseFileReader reader = new ReverseFileReader(referenceFile); + + //read the last line of the file (should be empty) + String line = reader.readLine(); + + //read the next line (the last written line) + line = reader.readLine(); + + + String lastMonth=""; + + while (line!=null ){ + + String[] items = line.split(";"); + + //If we did not initiate the last date (we are on the last line of + // the file), we do it now with the value of the date. + if ("".equals(lastMonth)) { + lastMonth = items[3]; + } + + if ((items[0].equals(param_pop.getName())) && (items[3].equals(lastMonth))){ + referenceBiomass += Double.parseDouble(items[4]); + } + line = reader.readLine(); + } + + + //Calculate the biomass for the simulation for (Population pop : simulation.getParameter().getPopulations()) { if (pop.getName().equals(param_pop.getName())) { //Get the biomass of the last time step - MatrixND matlastdate = resultStorage.getMatrix(lastDate, pop, + MatrixND matrixLastDate = resultStorage.getMatrix(lastStep, pop, ResultName.MATRIX_BIOMASS); - biomass = matlastdate.sumAll(); - System.out.println("matlastdate:" + (Object) matlastdate); - - TopiaContext tx = referenceSimulation.getStorage() - .beginTransaction(); - - MatrixND matreferencelastdate = referenceResultStorage - .getMatrix(lastDate, ResultName.MATRIX_BIOMASS + " " - + pop, tx); - referenceBiomass = matreferencelastdate.sumAll(); - - tx.commitTransaction(); - tx.closeContext(); + //sum all + biomass = matrixLastDate.sumAll(); } } - System.out.println("simulationStorage:" + simulation); - System.out.println("referenece simulation:" + referenceSimulation); - System.out.println("resultStorage:" + resultStorage); - System.out.println("referenceStroagr:" + referenceResultStorage); - System.out.println("biomass:" + biomass); - System.out.println("referenceBiomass:" + referenceBiomass); - out.write(Double.toString(biomass / referenceBiomass)); + log.info("Biomass : " + biomass); + log.info("Reference biomass : " + referenceBiomass); + out.write(Double.toString(biomass/referenceBiomass)); + } @Override Modified: isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeReferenceY12.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeReferenceY12.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeReferenceY12.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -26,19 +23,20 @@ import static org.nuiton.i18n.I18n._; +import java.io.File; import java.io.Writer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.MatrixND; -import org.nuiton.topia.TopiaContext; +import org.nuiton.util.ReverseFileReader; import scripts.ResultName; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.export.SensitivityExport; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; public class SensitivityBiomassRelativeReferenceY12 implements @@ -53,61 +51,71 @@ @Doc("Population") public Population param_pop; - @Doc("Name of the reference simulation") - public String param_referenceSimulation = ""; + @Doc("URL of the Biomasses.csv reference export file") + public String param_referenceBiomassCSV =""; @Override public void export(SimulationStorage simulation, Writer out) throws Exception { - SimulationStorage referenceSimulation = SimulationStorage - .getSimulation(param_referenceSimulation); ResultStorage resultStorage = simulation.getResultStorage(); - ResultStorage referenceResultStorage = referenceSimulation - .getResultStorage(); - Date lastDate = resultStorage.getLastDate(); - Date firstDate = new Date(11); + TimeStep lastStep = resultStorage.getLastStep(); + TimeStep firstStep = new TimeStep(11); double biomass = 0.0; - double firstbiomass = 0.0; + double firstBiomass = 0.0; double biomassReference = 0.0; - double firstbiomassReference = 0.0; + double firstBiomassReference = 0.0; + File referenceFile = new File(param_referenceBiomassCSV); + + //instantiate a reader that starts reading from the file end. + ReverseFileReader reader = new ReverseFileReader(referenceFile); + + //read the last line of the file (should be empty) + String line = reader.readLine(); + + //read the next line (the last written line) + line = reader.readLine(); + + + String lastMonth=""; + + while (line!=null ){ + + String[] items = line.split(";"); + + //If we did not initiate the last date (we are on the last line of + // the file), we do it now with the value of the date. + if ("".equals(lastMonth)) { + lastMonth = items[3]; + } + + if ((items[0].equals(param_pop.getName())) && (items[3].equals(lastMonth))){ + biomassReference += Double.parseDouble(items[4]); + } + + if ((items[0].equals(param_pop.getName())) && (items[3].equals("11"))){ + firstBiomassReference += Double.parseDouble(items[4]); + } + line = reader.readLine(); + } + for (Population pop : simulation.getParameter().getPopulations()) { if (pop.getName().equals(param_pop.getName())) { //Get the biomass on december of the first year - MatrixND matfirstdate = resultStorage.getMatrix(firstDate, pop, + MatrixND matfirstdate = resultStorage.getMatrix(firstStep, pop, ResultName.MATRIX_BIOMASS); - firstbiomass = matfirstdate.sumAll(); + firstBiomass = matfirstdate.sumAll(); //Get the biomass of the last time step - MatrixND matlastdate = resultStorage.getMatrix(lastDate, pop, + MatrixND matlastdate = resultStorage.getMatrix(lastStep, pop, ResultName.MATRIX_BIOMASS); biomass = matlastdate.sumAll(); - - //Get the biomass on december of the first year - TopiaContext tx = referenceSimulation.getStorage() - .beginTransaction(); - MatrixND matfirstdatereference = referenceResultStorage - .getMatrix(firstDate, ResultName.MATRIX_BIOMASS + " " - + pop, tx); - firstbiomassReference = matfirstdatereference.sumAll(); - tx.commitTransaction(); - tx.closeContext(); - - //Get the biomass of the last time step - tx = referenceSimulation.getStorage().beginTransaction(); - MatrixND matlastdatereference = referenceResultStorage - .getMatrix(lastDate, ResultName.MATRIX_BIOMASS + " " - + pop, tx); - biomassReference = matlastdatereference.sumAll(); - tx.commitTransaction(); - tx.closeContext(); - } } - out.write(Double.toString((biomass / firstbiomass) - / (biomassReference / firstbiomassReference))); + out.write(Double.toString((biomass / firstBiomass) + / (biomassReference / firstBiomassReference))); } @@ -131,4 +139,4 @@ return this.necessaryResult; } -} \ No newline at end of file +} Modified: isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeY6.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeY6.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassRelativeY6.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.export.SensitivityExport; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; public class SensitivityBiomassRelativeY6 implements SensitivityExport { @@ -55,8 +52,8 @@ public void export(SimulationStorage simulation, Writer out) throws Exception { ResultStorage resultStorage = simulation.getResultStorage(); - Date lastDate = resultStorage.getLastDate(); - Date firstDate = new Date(11); + TimeStep lastStep = resultStorage.getLastStep(); + TimeStep firstStep = new TimeStep(11); double biomass = 0.0; double firstbiomass = 0.0; @@ -64,12 +61,12 @@ if (pop.getName().equals(param_pop.getName())) { //Get the biomass on december of the first year - MatrixND matfirstdate = resultStorage.getMatrix(firstDate, pop, + MatrixND matfirstdate = resultStorage.getMatrix(firstStep, pop, ResultName.MATRIX_BIOMASS); firstbiomass = matfirstdate.sumAll(); //Get the biomass of the last time step - MatrixND matlastdate = resultStorage.getMatrix(lastDate, pop, + MatrixND matlastdate = resultStorage.getMatrix(lastStep, pop, ResultName.MATRIX_BIOMASS); biomass = matlastdate.sumAll(); @@ -98,4 +95,4 @@ return this.necessaryResult; } -} \ No newline at end of file +} Modified: isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassY3.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassY3.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/sensitivityexports/SensitivityBiomassY3.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Jean Couteau * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,7 +34,7 @@ import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.export.SensitivityExport; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; public class SensitivityBiomassY3 implements SensitivityExport { @@ -54,13 +51,13 @@ public void export(SimulationStorage simulation, Writer out) throws Exception { ResultStorage resultStorage = simulation.getResultStorage(); - Date lastDate = resultStorage.getLastDate(); + TimeStep lastStep = resultStorage.getLastStep(); double biomass = 0.0; for (Population pop : simulation.getParameter().getPopulations()) { if (pop.getName().equals(param_pop.getName())) { //Get the biomass of the last time step - MatrixND matlastdate = resultStorage.getMatrix(lastDate, pop, + MatrixND matlastdate = resultStorage.getMatrix(lastStep, pop, ResultName.MATRIX_BIOMASS); biomass = matlastdate.sumAll(); } Deleted: isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/analyseplans/CalibrationSimplexePasVariable2Capturabilite.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,505 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ -package analyseplans; - -import static org.codelutin.i18n.I18n._; - -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.math.matrix.MatrixFactory; -import org.codelutin.math.matrix.MatrixIterator; -import org.codelutin.math.matrix.MatrixND; -import org.codelutin.topia.TopiaContext; -import org.codelutin.util.FileUtil; -import org.codelutin.util.StringUtil; - -import scripts.ResultName; -import fr.ifremer.isisfish.datastore.ResultStorage; -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.entities.Population; -import fr.ifremer.isisfish.entities.PopulationGroup; -import fr.ifremer.isisfish.entities.PopulationSeasonInfo; -import fr.ifremer.isisfish.simulator.AnalysePlan; -import fr.ifremer.isisfish.simulator.AnalysePlanContext; -import fr.ifremer.isisfish.util.Doc; - -/** - * CalibrationSimplexePasVariable2Capturabilite. - * - * Created: 17 septembre 2007 - * - * @author <> - * @version $Revision$ - * - * Last update: $Date$ - * by : $Author: bpoussin $ - */ -/////***You can modify class name if you want -/////***BUT attention : file name and class name must be the same (without the extention ".java"), ie here : "CalibrationSimplexePasVariable2Capturabilite" -public class CalibrationSimplexePasVariable2Capturabilite implements - AnalysePlan { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory - .getLog(CalibrationSimplexePasVariable2Capturabilite.class); - - enum State { - STATE_INIT, STATE_0, STATE_1, STATE_2, STATE_3, STATE_4 - }; - - /////***here must appear the path to export the historic file ("Historic.csv") - //where q1, q2 and criteria computed at each simulation are written - /////***Attention : before beginning a new calibration rename your eventual - //old file Historic.csv otherwise it will be lost - protected File exportHistoric = new File("Historic.csv"); - protected String exportHisto = ""; - - @Doc("Population which parameters are calibrated") - public Population param_Population = null; - @Doc("First initial point of the simplex: de la forme(\"xx;yy\")") - public String param_M1 = "2.42e-5;2.11e-6";// devient un parametre du plan d analyse - @Doc("Second initial point of the simplex") - public String param_M2 = "2.34e-5;2.59e-6";// devient un parametre du plan d analyse - @Doc("Third initial point of the simplex") - public String param_M3 = "2.59e-5;2.41e-6";// devient un parametre du plan d analyse - - ///// ***put here the path and name of the file containing the data on which you calibrate your fichery ( here observed catches) - @Doc(value = "file name and path of observed landings") - public String param_nomfichier_debarquements = "Observedlandings2001-2003.csv";//in row : time ; in columns : age or length group - protected File debarquementsObserves; - protected MatrixND matrixDebarquement; - - protected State state = State.STATE_INIT; - public Experiences experiences = new Experiences(); - public String[] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP }; - - public String[] getNecessaryResult() { - return this.necessaryResult; - } - - /** - * Permet d'afficher a l'utilisateur une aide sur le plan. - * @return L'aide ou la description du plan - */ - public String getDescription() throws Exception { - return _("Calibration using variable step Simplex method (Walters): user gives a file of observations (here catches) by time step and group (.csv), output will try to approach oservations by changing the values of catchability"); - } - - /** - * Appele au demarrage de la simulation, cette methode permet d'initialiser - * des valeurs - * @param context La simulation pour lequel on utilise cette regle - */ - public void init(AnalysePlanContext context) throws Exception { - if (param_nomfichier_debarquements == null || "".equals(param_nomfichier_debarquements)) { - debarquementsObserves = FileUtil.getFile(".*.csv", "fichier csv séparateur ';'"); - } else { - debarquementsObserves = new File(param_nomfichier_debarquements); - } - int nbYear = context.getParam().getNumberOfYear(); - - //TopiaContext db = context.getParam().getRegion().getStorage().beginTransaction(); - //Population pop = (Population) db.findByTopiaId(param_Population.getTopiaId()); - - /////*** specify dimention of the matrix containning observations (observed landings for instance) - /////*** numbers of group/columns : could be equal to your number of classes in ISIS but may also be different if your had only aggregated data - int nbGroup = 4; - /////*** enter number of observation per year (if you have observation by quarter put 4) / lines of the observations file - int nbTrim = nbYear * 4; - int[] dimMatrix = { nbTrim, nbGroup }; - matrixDebarquement = MatrixFactory.getInstance().create(dimMatrix); - //matrixDebarquement = MatrixFactory.getInstance().create(new int[]{nbGroup}); - // List<PopulationGroup> groups = pop.getPopulationGroup(); - // matrixDebarquement = MatrixFactory.getInstance().create(new List[]{groups}); - matrixDebarquement.importCSV(new FileReader(debarquementsObserves), new int[] { 0, 0 }); - log.info("MatrixDebarquement : " + matrixDebarquement); - //db.closeContext(); - } - - double g1; - double g2; - double worst1; - double worst2; - - /** - * Call before each simulation - * @param context plan context - * @param nextSimulation storage used for next simulation - * @return true if we must do next simulation, false to stop plan - * @throws Exception - */ - public boolean beforeSimulation(AnalysePlanContext context, - SimulationStorage nextSimulation) throws Exception { - boolean doNext = true; - boolean doBoucle = true; - log.info("before simulation"); - - int number = context.getNumber(); - - if (number < 3) { - log.info("number<3"); - - String[] M1 = param_M1.split(";"); - String[] M2 = param_M2.split(";"); - String[] M3 = param_M3.split(";"); - - double[] q1 = StringUtil.toArrayDouble(M1[0], M2[0], M3[0]); - double[] q2 = StringUtil.toArrayDouble(M1[1], M2[1], M3[1]); - experiences.getExperience(number).q1 = q1[number]; - experiences.getExperience(number).q2 = q2[number]; - - changeDB(experiences.getExperience(number), nextSimulation); - - } else { - - double q1 = 1000; - double q2 = 1000; - double lastCritere = experiences.getExperience(number - 1).criteria; - while (doBoucle) { - doBoucle = false; - if (state == State.STATE_INIT) { - doBoucle = false; - log.info("state init"); - - //ordonne les 3 premieres experiences selon leur critere - Collections.sort(experiences.current); - //log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + experiences.current.get(2).criteria ); - log.info("SIMPLEXE : current 0 = " - + experiences.current.get(0).criteria - + "current 1 = " - + experiences.current.get(1).criteria - + "current 2 = " - + experiences.current.get(2).criteria); - log.info("SIMPLEXE : Best q1 = " - + experiences.current.get(0).q1 + " q2 = " - + experiences.current.get(0).q2); - log.info("SIMPLEXE : NextBest q1 = " - + experiences.current.get(1).q1 + " q2 = " - + experiences.current.get(1).q2); - log.info("SIMPLEXE : Worst q1 = " - + experiences.current.get(2).q1 + " q2 = " - + experiences.current.get(2).q2); - - //Calcul et evaluation de R - double g1 = (experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0; - double g2 = (experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0; - double worst1 = experiences.current.get(2).q1; - double worst2 = experiences.current.get(2).q2; - - state = State.STATE_0; - - q1 = 2 * g1 - worst1; - q2 = 2 * g2 - worst2; - - log.info("R : q1 = " + q1 + " q2 = " + q2); - - } else if (state == State.STATE_0) { - doBoucle = false; - log.info("state 0"); - - // on fait la 5eme avec des q qui dependent de la 4eme dans le dernier cas - //log.info("g1 = " + g1 + " " + "g2 = " + g2); - //log.info("worst1 = " + worst1 + " " + "worst2 = " + worst2); - - if (lastCritere > experiences.current.get(2).criteria) { - log.info("State 0 : R : lastCtritere > current2 : R pire de W"); - state = State.STATE_1; - //calcul de Cw - q1 = ((experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0) - - (((experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0) - experiences.current - .get(2).q1) / 2.0; - q2 = ((experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0) - - (((experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0) - experiences.current - .get(2).q2) / 2.0; - log.info("Cw : q1 = " + q1 + " q2 = " + q2); - - } else if (lastCritere > experiences.current.get(1).criteria) { - log.info("State 0 :R : lastCritere > current 1 : R meilleur que W et moins bon que N"); - state = State.STATE_2; - // calcul de Cr - q1 = ((experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0) - + (((experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0) - experiences.current - .get(2).q1) / 2.0; - q2 = ((experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0) - + (((experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0) - experiences.current - .get(2).q2) / 2.0; - log.info("Cr : q1 = " + q1 + " q2 = " + q2); - - } else if (lastCritere > experiences.current.get(0).criteria) { - log.info("State 0 :R : lastCritere > current0 : R meilleur que N et moins bon que B"); - state = State.STATE_INIT; - experiences.current.remove(2);//remove(3)avant - doBoucle = true; - log.info("remove W, simplex BNR"); - - } else { // dernier cas possible: if (lastCritere < experiences.current.get(0).critere) { - log.info("State 0 :R : lastCritere < current 0 : R meilleur que B, calcul de E"); - state = State.STATE_4; - - q1 = experiences.getExperience(number - 1).q1 - + (experiences.current.get(0).q1 + experiences.current - .get(1).q1) / 2.0 - - experiences.current.get(2).q1; - q2 = experiences.getExperience(number - 1).q2 - + (experiences.current.get(0).q2 + experiences.current - .get(1).q2) / 2.0 - - experiences.current.get(2).q2; - //q1 = experiences.current.get(3).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; - //q2 = experiences.current.get(3).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; - log.info("E : q1 = " + q1 + " q2 = " + q2); - } - - } else if (state == State.STATE_1) { - log.info("state 1, simplex BNCw"); - experiences.current.remove(3); - experiences.current.remove(2); - state = State.STATE_INIT; - doBoucle = true; - - } else if (state == State.STATE_2) { - log.info("state 2, simplex BNCr"); - experiences.current.remove(3); - experiences.current.remove(2); - state = State.STATE_INIT; - doBoucle = true; - - } else if (state == State.STATE_4) { - log.info("state 4 :comparaison de E a B"); - doBoucle = true; - if (lastCritere < experiences.current.get(0).criteria) { - log.info("E meilleur que B, remove 2 et 3 : simplex BNE"); - experiences.current.remove(3); - experiences.current.remove(2); - } else { - log.info("E moins bon que B, remove 2 et 4, simplex BNR"); - experiences.current.remove(4); - experiences.current.remove(2); - } - - state = State.STATE_INIT; - } - - }//fin du while - //on remplit la table experiences - experiences.getExperience(number).q1 = q1; - experiences.getExperience(number).q2 = q2; - - log.info("on change Q dans la DB avec : q1 = " + q1 + " " + "q2 = " + q2); - - // on change la valeur de q dans la DB - changeDB(experiences.getExperience(number), nextSimulation); - }// fin du else (number > 3) - return doNext; - }// fin du before simulation - - /** - - * Call after each simulation, compute criteria for last simulation - * @param context plan context - * @param lastSimulation storage used for next simulation - * @return true if we must do next simulation, false to stop plan - * @throws Exception - */ - public boolean afterSimulation(AnalysePlanContext context, - SimulationStorage lastSimulation) throws Exception { - boolean doNext = true; - log.info("after simulation"); - int number = context.getNumber(); - ResultStorage result = lastSimulation.getResultStorage(); - - /////*** Simulated catches are cumulated over strategies, areas and metiers - - MatrixND L2 = result.getMatrix(param_Population, - ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); - // log.info("dim de L2" + " " + Arrays.toString(L2.getDim())); - /////*** If some strategies, metiers or areas must not be included in the cumulated catches see below else put "//" at the beginning of line 297 and replace "L2" by "L" at line 289 - /////*** the strategies or so to exclude must be at the begining or end of the list you enter in the parameters interface - /////*** fill the line MatrixND L = L2.getSubMatrix(a,b,c).copy(); as follow : - /////*** a = 1 if you want to exclude strategies, 2 if metiers and 4 if areas - /////*** b = indice of the first object considered - /////*** c = number of object to keep after b, b included - MatrixND L = L2.getSubMatrix(1, 2, 4).copy(); // for instance : keep strategies 2,3,4,5 - //log.info("sous matrice extraite"); - L = L.sumOverDim(1);// sum over strategies - L = L.sumOverDim(2);// sum over metiers - L = L.sumOverDim(4);// sum over zones - log.info("sommes sur les strategies, metiers et zones faites"); - - /////*** if observations are cumulated by groups else put "//" at the beginning of the following line - L = L.sumOverDim(3); - /////*** else if number of groups in your database differs from number of groups in observations ... write me an e-mail - - ////*** if observations are cumulated over quarter put 3, over year 12, else put "//" at the beginning of the following line - L = L.sumOverDim(0, 3); - - L = L.reduce(); - - ///////////////////Calcul du critere////////////////// - log.info("calcul du critere"); - log.info("dim de L" + " " + Arrays.toString(L.getDim())); - log.info("dim de obs" + " " - + Arrays.toString(matrixDebarquement.getDim())); - double crit = 0; - for (MatrixIterator g = L.iterator(); g.hasNext();) { - g.next(); - //boucle sur les trimestres et les classes d age - - int[] dim = g.getCoordinates(); - - double obs = matrixDebarquement.getValue(dim); - double simules = g.getValue(); - - crit += Math.pow(obs - simules, 2); // crit = crit + (obs-simules)^2 - }// fin du for - log.info("critere " + number + " = " + crit); - - //ajoute le critere dans la table experiences - experiences.getExperience(number).criteria = crit; - - //ecriture de la table historic - exportHisto += experiences.getExperience(number).q1 + ";" - + experiences.getExperience(number).q2 + ";" - + experiences.getExperience(number).criteria + "\n"; - org.codelutin.util.FileUtil.writeString(exportHistoric, exportHisto); - - return doNext; - - }// fin du after simulation - - /** - * Modify nextSimulation database with q1 and q2 in exp. - * - * @param exp - * @param nextSimulation - * @throws Exception - */ - protected void changeDB(Experience exp, SimulationStorage nextSimulation) - throws Exception { - //methode appelee dans before simualtion - TopiaContext db = nextSimulation.getStorage().beginTransaction();//ouvrir un context pour modifier les donnees - Population pop = (Population) db.findByTopiaId(param_Population.getTopiaId()); //reccupere la pop ciblee - MatrixND c = pop.getCapturability(); // reccupere la matrice de capturabilité - - //log.info("Pour cette simulation : q1 = " + exp.q1 + ";" + "q2 = " + exp.q2 ); - - /////*** that is where you explain how to fill the catchability matrix with q1 and q2 - for (MatrixIterator i = c.iterator(); i.hasNext();) { - i.next(); - Object[] sem = i.getSemanticsCoordinates(); - PopulationGroup group = (PopulationGroup) sem[0]; - //PopulationSeasonInfo season = (PopulationSeasonInfo) sem[1]; - - ////*** exemple when q2 corresponds to the 12 first groups (groups 0 to 11) - if (group.getId() < 12) { - i.setValue(exp.q2); - } else { - i.setValue(exp.q1); - } - - /////*** exemple when it depends on seasons and groups - /* if (season.getFirstMonth().after(Month.JULY) && group.getId() >=18){ //month >= aout && groupID >= 18 - i.setValue(exp.q2); - }else { - i.setValue(exp.q1); - } - */ - - }//fin du for - - db.commitTransaction(); // effectue la modification - db.closeContext(); // ferme le context - } - - static public class Experiences { - // cree la liste experiences ou sont stoqués q1,q2 et critere pour chaque simulation - - /** contains last simplex and potentialy 2 more simulation */ - public List<Experience> current = new ArrayList<Experience>(); - - /** contains all experience done */ - public List<Experience> history = new ArrayList<Experience>(); - - /** - * return experience requested, if this experience doesn't exist - * create it. - * - * @param i simulation number - * @return experience with simulation number fixed if new experience - * is returned - */ - public Experience getExperience(int i) { - Experience result; - if (i < history.size()) { - result = history.get(i); - } else { - result = new Experience(); - result.simNumber = i; - history.add(i, result); - current.add(result); - } - return result; - }//fin de la definition de getExperience - - /** - * @return the history - */ - public List<Experience> getHistory() { - return this.history; - } - }// fin de la creation des listes experiences - - static public class Experience implements Comparable<Experience> { - public int simNumber; - public double criteria; - public double q1; - public double q2; - - /** - * Permit to order experience, first is experience with smallest criteria - */ - public int compareTo(Experience other) { - int result = Double.compare(this.criteria, other.criteria); - return result; - } - } - -} \ No newline at end of file Copied: isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/analyseplans/CalibrationSimplexePasVariable2Capturabilite.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/simulationplans/CalibrationSimplexePasVariable2Capturabilite.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,485 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2007 - 2011 Ifremer, CodeLutin, Sigrid Lehuta + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ +package simulationplans; + +import static org.nuiton.i18n.I18n._; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixIterator; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.topia.TopiaContext; +import org.nuiton.util.FileUtil; +import org.nuiton.util.StringUtil; + +import fr.ifremer.isisfish.datastore.ResultStorage; +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.entities.Population; +import fr.ifremer.isisfish.entities.PopulationGroup; +import fr.ifremer.isisfish.simulator.SimulationPlanContext; +import fr.ifremer.isisfish.simulator.SimulationPlan; +import fr.ifremer.isisfish.util.Doc; + +import scripts.ResultName; + +/** + * CalibrationSimplexePasVariable2Capturabilite. + * + * Created: 17 septembre 2007 + * + * @author sigrid lehuta + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author: bpoussin $ + */ + +// //////////////////////////////////////////////////////////////////////// +// USER GUIDE +//------------------------------------------------------------------------- +// Script must be adapted to the case study (calibration data, catchability assumptions) +// Script won't compile as it stands +// Comments preceeded by /////*** explain where and how to adapt the script +// Access to the APIs is free +// //////////////////////////////////////////////////////////////////////// + +// ***You can modify class name if you want +// ***BUT attention : file name and class name must be the same (without the extention ".java"), +// ie here : "CalibrationSimplexePasVariable2Capturabilite" +public class CalibrationSimplexePasVariable2Capturabilite implements SimulationPlan { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Log log = LogFactory + .getLog(CalibrationSimplexePasVariable2Capturabilite.class); + + enum State { + STATE_INIT, STATE_0, STATE_1, STATE_2, STATE_3, STATE_4 + }; + + /////***here must appear the path to export the historic file ("Historic.csv") + //in which q1, q2 and objective function computed at each simulation are stored + /////***Attention : before beginning a new calibration rename any potential + //old Historic.csv files or they will be lost + protected File exportHistoric = new File("Historic.csv"); + + protected String exportHisto = ""; + + @Doc("Population which parameters are calibrated") + public Population param_Population = null; + @Doc("First initial point of the simplex: de la forme(\"xx;yy\")") + public String param_M1 = "2.42e-5;2.11e-6";// devient un parametre du plan d analyse + @Doc("Second initial point of the simplex") + public String param_M2 = "2.34e-5;2.59e-6";// devient un parametre du plan d analyse + @Doc("Third initial point of the simplex") + public String param_M3 = "2.59e-5;2.41e-6";// devient un parametre du plan d analyse + + // ***put here the path and name of the file containing the data used to calibrate + // your fishery ( here observed landings per season and age groups) + @Doc(value = "file name and path of observed landings") + public String param_nomfichier_debarquements = "Observedlandings2001-2003.csv"; + protected File debarquementsObserves; + protected MatrixND matrixDebarquement; + + protected State state = State.STATE_INIT; + public Experiences experiences = new Experiences(); + + //*** write the name of the simulated matrix that contains the data corresponding + // to your observations (here MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP) + public String[] necessaryResult = { + ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP + }; + + public String[] getNecessaryResult() { + return this.necessaryResult; + } + + /** + * Permet d'afficher a l'utilisateur une aide sur le plan. + * @return L'aide ou la description du plan + */ + public String getDescription() throws Exception { + return _("Calibration using variable step Simplex method (Walters): user" + + "gives a file of observations (here catches)(.csv), simulated output" + + "will try to approach oservations by changing the values of catchability"); + } + + /** + * Appele au demarrage de la simulation, cette methode permet d'initialiser + * des valeurs + * @param context La simulation pour lequel on utilise cette regle + */ + public void init(SimulationPlanContext context) throws Exception { + if (param_nomfichier_debarquements == null + || "".equals(param_nomfichier_debarquements)) { + debarquementsObserves = FileUtil.getFile(".*.csv", + "fichier csv séparateur ';'"); + } else { + debarquementsObserves = new File(param_nomfichier_debarquements); + } + + // ***Create the matrix named matrixDebarquement that will contain your observed landings + // method: MatrixFactory.getInstance().create() + // ***Then import your file in it + // method : matrixDebarquement.importCSV(); + log.info("MatrixDebarquement : " + matrixDebarquement); + } + + double g1; + double g2; + double worst1; + double worst2; + + /** + * Call before each simulation + * @param context plan context + * @param nextSimulation storage used for next simulation + * @return true if we must do next simulation, false to stop plan + * @throws Exception + */ + public boolean beforeSimulation(SimulationPlanContext context, + SimulationStorage nextSimulation) throws Exception { + // the whole beforeSimulation part codes for the variable step simplex + // algorithm (Walters et al.1999), no change to bring + boolean doNext = true; + boolean doBoucle = true; + log.info("before simulation"); + + int number = nextSimulation.getParameter().getAnalysePlanNumber(); + + if (number < 3) { + log.info("number<3"); + + String[] M1 = param_M1.split(";"); + String[] M2 = param_M2.split(";"); + String[] M3 = param_M3.split(";"); + + double[] q1 = StringUtil.toArrayDouble(M1[0], M2[0], M3[0]); + double[] q2 = StringUtil.toArrayDouble(M1[1], M2[1], M3[1]); + experiences.getExperience(number).q1 = q1[number]; + experiences.getExperience(number).q2 = q2[number]; + + changeDB(experiences.getExperience(number), nextSimulation); + + } else { + + double q1 = 1000; + double q2 = 1000; + double lastCritere = experiences.getExperience(number - 1).criteria; + while (doBoucle) { + doBoucle = false; + if (state == State.STATE_INIT) { + doBoucle = false; + log.info("state init"); + + //ordonne les 3 premieres experiences selon leur critere + Collections.sort(experiences.current); + //log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + + // "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + + // experiences.current.get(2).criteria); + log.info("SIMPLEXE : current 0 = " + + experiences.current.get(0).criteria + + "current 1 = " + + experiences.current.get(1).criteria + + "current 2 = " + + experiences.current.get(2).criteria); + log.info("SIMPLEXE : Best q1 = " + + experiences.current.get(0).q1 + " q2 = " + + experiences.current.get(0).q2); + log.info("SIMPLEXE : NextBest q1 = " + + experiences.current.get(1).q1 + " q2 = " + + experiences.current.get(1).q2); + log.info("SIMPLEXE : Worst q1 = " + + experiences.current.get(2).q1 + " q2 = " + + experiences.current.get(2).q2); + + //Calcul et evaluation de R + double g1 = (experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0; + double g2 = (experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0; + double worst1 = experiences.current.get(2).q1; + double worst2 = experiences.current.get(2).q2; + + state = State.STATE_0; + + q1 = 2 * g1 - worst1; + q2 = 2 * g2 - worst2; + + log.info("R : q1 = " + q1 + " q2 = " + q2); + + } else if (state == State.STATE_0) { + doBoucle = false; + log.info("state 0"); + + // on fait la 5eme avec des q qui dependent de la 4eme dans le dernier cas + //log.info("g1 = " + g1 + " " + "g2 = " + g2); + //log.info("worst1 = " + worst1 + " " + "worst2 = " + worst2); + + if (lastCritere > experiences.current.get(2).criteria) { + log.info("State 0 : R : lastCtritere > current2 : R pire de W"); + state = State.STATE_1; + //calcul de Cw + q1 = ((experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0) + - (((experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0) - experiences.current + .get(2).q1) / 2.0; + q2 = ((experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0) + - (((experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0) - experiences.current + .get(2).q2) / 2.0; + log.info("Cw : q1 = " + q1 + " q2 = " + q2); + + } else if (lastCritere > experiences.current.get(1).criteria) { + log.info("State 0 :R : lastCritere > current 1 : R meilleur que W et moins bon que N"); + state = State.STATE_2; + // calcul de Cr + q1 = ((experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0) + + (((experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0) - experiences.current + .get(2).q1) / 2.0; + q2 = ((experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0) + + (((experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0) - experiences.current + .get(2).q2) / 2.0; + log.info("Cr : q1 = " + q1 + " q2 = " + q2); + + } else if (lastCritere > experiences.current.get(0).criteria) { + log.info("State 0 :R : lastCritere > current0 : R meilleur que N et moins bon que B"); + state = State.STATE_INIT; + experiences.current.remove(2);//remove(3)avant + doBoucle = true; + log.info("remove W, simplex BNR"); + + } else { // dernier cas possible: if (lastCritere < experiences.current.get(0).critere) { + log.info("State 0 :R : lastCritere < current 0 : R meilleur que B, calcul de E"); + state = State.STATE_4; + + q1 = experiences.getExperience(number - 1).q1 + + (experiences.current.get(0).q1 + experiences.current + .get(1).q1) / 2.0 + - experiences.current.get(2).q1; + q2 = experiences.getExperience(number - 1).q2 + + (experiences.current.get(0).q2 + experiences.current + .get(1).q2) / 2.0 + - experiences.current.get(2).q2; + //q1 = experiences.current.get(3).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; + //q2 = experiences.current.get(3).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; + log.info("E : q1 = " + q1 + " q2 = " + q2); + } + + } else if (state == State.STATE_1) { + log.info("state 1, simplex BNCw"); + experiences.current.remove(3); + experiences.current.remove(2); + state = State.STATE_INIT; + doBoucle = true; + + } else if (state == State.STATE_2) { + log.info("state 2, simplex BNCr"); + experiences.current.remove(3); + experiences.current.remove(2); + state = State.STATE_INIT; + doBoucle = true; + + } else if (state == State.STATE_4) { + log.info("state 4 :comparaison de E a B"); + doBoucle = true; + if (lastCritere < experiences.current.get(0).criteria) { + log.info("E meilleur que B, remove 2 et 3 : simplex BNE"); + experiences.current.remove(3); + experiences.current.remove(2); + } else { + log.info("E moins bon que B, remove 2 et 4, simplex BNR"); + experiences.current.remove(4); + experiences.current.remove(2); + } + + state = State.STATE_INIT; + } + + }//fin du while + //on remplit la table experiences + experiences.getExperience(number).q1 = q1; + experiences.getExperience(number).q2 = q2; + + log.info("on change Q dans la DB avec : q1 = " + q1 + " " + "q2 = " + q2); + + // on change la valeur de q dans la DB + changeDB(experiences.getExperience(number), nextSimulation); + }// fin du else (number > 3) + return doNext; + }// fin du before simulation + + /** + * Call after each simulation, compute criteria for last simulation. + * + * @param context plan context + * @param lastSimulation storage used for next simulation + * @return true if we must do next simulation, false to stop plan + * @throws Exception + */ + public boolean afterSimulation(SimulationPlanContext context, + SimulationStorage lastSimulation) throws Exception { + boolean doNext = true; + log.info("after simulation"); + int number = lastSimulation.getParameter().getAnalysePlanNumber(); + ResultStorage result = lastSimulation.getResultStorage(); + + /////***import the matrix of simulated data (here landings) from the simulation result + MatrixND L = result.getMatrix(param_Population, + ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); + /////*** extract, sum, etc to obtain the same format/data as your observation matrix + // useful methods to work on matrix : sumOverDim(), getSubMatrix(), reduce() + + ///////////////////Calcul du critere////////////////// + log.info("calcul de la fonction objectif"); + log.info("dim de L" + " " + Arrays.toString(L.getDim())); + log.info("dim de obs" + " " + + Arrays.toString(matrixDebarquement.getDim())); + + double obj = 0; + // *** using the matrixIterator assumes that the observation and simulated + // matrix are organised in the exact same way ( columns and rows corresponding in each of them) + for (MatrixIterator g = L.iterator(); g.hasNext();) { + g.next(); + int[] dim = g.getCoordinates(); + double obs = matrixDebarquement.getValue(dim); + double simules = g.getValue(); + obj += Math.pow(obs - simules, 2); + } + + //ajoute le critere dans la table experiences + experiences.getExperience(number).criteria = obj; + + //ecriture de la table historic + exportHisto += experiences.getExperience(number).q1 + ";" + + experiences.getExperience(number).q2 + ";" + + experiences.getExperience(number).criteria + "\n"; + org.nuiton.util.FileUtil.writeString(exportHistoric, exportHisto); + + return doNext; + }// fin du after simulation + + /** + * Modify nextSimulation database with q1 and q2 in exp. + * + * @param exp + * @param nextSimulation + * @throws Exception + */ + protected void changeDB(Experience exp, SimulationStorage nextSimulation) + throws Exception { + // methode appelee dans before simualtion + TopiaContext db = nextSimulation.getStorage().beginTransaction();//ouvrir un context pour modifier les donnees + Population pop = (Population) db.findByTopiaId(param_Population.getTopiaId()); //reccupere la pop ciblee + MatrixND c = pop.getCapturability(); // reccupere la matrice de capturabilité + + // *** that is where you explain how to fill the catchability matrix with q1 and q2 + for (MatrixIterator i = c.iterator(); i.hasNext();) { + i.next(); + Object[] sem = i.getSemanticsCoordinates(); + PopulationGroup group = (PopulationGroup) sem[0]; + + // *** exemple when q2 corresponds to the 12 first groups (groups 0 to 11) + if (group.getId() < 12) { + i.setValue(exp.q2); + } else { + i.setValue(exp.q1); + } + + // *** exemple when it depends on seasons and groups + /*PopulationSeasonInfo season = (PopulationSeasonInfo) sem[1]; + if (season.getFirstMonth().after(Month.JULY) && group.getId() >=18){ //month >= aout && groupID >= 18 + i.setValue(exp.q2); + } else { + i.setValue(exp.q1); + } */ + }//fin du for + + db.commitTransaction(); // effectue la modification + db.closeContext(); // ferme le context + } + + static public class Experiences { + // cree la liste experiences ou sont stoqués q1,q2 et critere pour chaque simulation + + /** contains last simplex and potentialy 2 more simulation */ + public List<Experience> current = new ArrayList<Experience>(); + + /** contains all experience done */ + public List<Experience> history = new ArrayList<Experience>(); + + /** + * return experience requested, if this experience doesn't exist + * create it. + * + * @param i simulation number + * @return experience with simulation number fixed if new experience + * is returned + */ + public Experience getExperience(int i) { + Experience result; + if (i < history.size()) { + result = history.get(i); + } else { + result = new Experience(); + result.simNumber = i; + history.add(i, result); + current.add(result); + } + return result; + }//fin de la definition de getExperience + + /** + * @return the history + */ + public List<Experience> getHistory() { + return this.history; + } + }// fin de la creation des listes experiences + + static public class Experience implements Comparable<Experience> { + public int simNumber; + public double criteria; + public double q1; + public double q2; + + /** + * Permit to order experience, first is experience with smallest criteria + */ + public int compareTo(Experience other) { + int result = Double.compare(this.criteria, other.criteria); + return result; + } + } + +} \ No newline at end of file Deleted: isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/analyseplans/SimulationNumberRestriction.java 2011-06-14 13:21:14 UTC (rev 3392) +++ isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,120 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-2.0.html>. - * #L% - */ -package analyseplans; - -import static org.codelutin.i18n.I18n._; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.AnalysePlanContext; -import fr.ifremer.isisfish.simulator.AnalysePlanIndependent; -import fr.ifremer.isisfish.util.Doc; - -/** - * ExempleSimulationsIndependantes.java - * - * Created: 2 mars 2007 - * - * @author bpoussin <bpoussin at labs.libre-entreprise.org> - * @version $Revision$ - * - * Last update: $Date$ by : $Author: bpoussin $ - */ -public class SimulationNumberRestriction implements AnalysePlanIndependent { - - /** to use log facility, just put in your code: log.info("..."); */ - static private Log log = LogFactory.getLog(SimulationNumberRestriction.class); - - @Doc(value = "do the doc of param max") - public int param_max = 10; - - public String[] necessaryResult = { - // put here all necessary result for this rule - // example: - // ResultName.MATRIX_BIOMASS, - // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, - }; - - @Override - public String[] getNecessaryResult() { - return this.necessaryResult; - } - - /** - * Permet d'afficher a l'utilisateur une aide sur le plan. - * - * @return L'aide ou la description du plan - */ - @Override - public String getDescription() throws Exception { - return _("Permit to specify maximum simulation numbers"); - } - - /** - * Appelé au démarrage de la simulation, cette méthode permet d'initialiser - * des valeurs - * - * @param context La simulation pour lequel on utilise cette regle - */ - @Override - public void init(AnalysePlanContext context) throws Exception { - - } - - /** - * Call before each simulation - * - * @param context - * plan context - * @param nextSimulation - * storage used for next simulation - * @return true if we must do next simulation, false to stop plan - * @throws Exception - */ - @Override - public boolean beforeSimulation(AnalysePlanContext context, - SimulationStorage nextSimulation) throws Exception { - boolean result = context.getNumber() < param_max; - return result; - } - - /** - * Call after each simulation - * - * @param context - * plan context - * @param lastSimulation storage used for last simulation - * @return true if we must do next simulation, false to stop plan - * @throws Exception - */ - @Override - public boolean afterSimulation(AnalysePlanContext context, - SimulationStorage lastSimulation) throws Exception { - return true; - } - -} Copied: isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java (from rev 3393, isis-fish/trunk/src/test/resources/test-database/analyseplans/SimulationNumberRestriction.java) =================================================================== --- isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java (rev 0) +++ isis-fish/trunk/src/test/resources/test-database/simulationplans/SimulationNumberRestriction.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -0,0 +1,117 @@ +/* + * #%L + * IsisFish data + * %% + * Copyright (C) 2006 - 2011 Ifremer, CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * #L% + */ +package simulationplans; + +import static org.nuiton.i18n.I18n._; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationPlanContext; +import fr.ifremer.isisfish.simulator.SimulationPlanIndependent; +import fr.ifremer.isisfish.util.Doc; + +/** + * ExempleSimulationsIndependantes.java + * + * Created: 2 mars 2007 + * + * @author bpoussin <bpoussin at labs.libre-entreprise.org> + * @version $Revision$ + * + * Last update: $Date$ by : $Author: bpoussin $ + */ +public class SimulationNumberRestriction implements SimulationPlanIndependent { + + /** to use log facility, just put in your code: log.info("..."); */ + static private Log log = LogFactory.getLog(SimulationNumberRestriction.class); + + @Doc(value = "do the doc of param max") + public int param_max = 10; + + public String[] necessaryResult = { + // put here all necessary result for this rule + // example: + // ResultName.MATRIX_BIOMASS, + // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, + }; + + @Override + public String[] getNecessaryResult() { + return this.necessaryResult; + } + + /** + * Permet d'afficher a l'utilisateur une aide sur le plan. + * + * @return L'aide ou la description du plan + */ + @Override + public String getDescription() throws Exception { + return _("Permit to specify maximum simulation numbers"); + } + + /** + * Appelé au démarrage de la simulation, cette méthode permet d'initialiser + * des valeurs + * + * @param context La simulation pour lequel on utilise cette regle + */ + @Override + public void init(SimulationPlanContext context) throws Exception { + + } + + /** + * Call before each simulation + * + * @param context + * plan context + * @param nextSimulation + * storage used for next simulation + * @return true if we must do next simulation, false to stop plan + * @throws Exception + */ + @Override + public boolean beforeSimulation(SimulationPlanContext context, + SimulationStorage nextSimulation) throws Exception { + boolean result = nextSimulation.getParameter().getAnalysePlanNumber() < param_max; + return result; + } + + /** + * Call after each simulation + * + * @param context + * plan context + * @param lastSimulation storage used for last simulation + * @return true if we must do next simulation, false to stop plan + * @throws Exception + */ + @Override + public boolean afterSimulation(SimulationPlanContext context, + SimulationStorage lastSimulation) throws Exception { + return true; + } + +} Modified: isis-fish/trunk/src/test/resources/test-database/simulators/DefaultSimulator.java =================================================================== --- isis-fish/trunk/src/test/resources/test-database/simulators/DefaultSimulator.java 2011-07-08 14:21:12 UTC (rev 3440) +++ isis-fish/trunk/src/test/resources/test-database/simulators/DefaultSimulator.java 2011-07-08 14:22:36 UTC (rev 3441) @@ -1,11 +1,8 @@ /* * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ + * IsisFish data * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, Cédric Pineau, Benjamin Poussin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -23,18 +20,6 @@ * #L% */ -/* * - * DefaultSimulator.java - * - * Created: 21 ao?t 2006 10:57:46 - * - * @author poussin - * @version $Revision: 1 $ - * - * Last update: $Date: 2009-10-19 14:25:49 +0200 (lun., 19 oct. 2009) $ - * by : $Author: bpoussin $ - */ - package simulators; import static org.nuiton.i18n.I18n._; @@ -66,18 +51,24 @@ import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.simulator.Simulator; -import fr.ifremer.isisfish.types.Date; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.types.Month; /** + * DefaultSimulator.java + * + * Created: 21 août 2006 10:57:46 + * * @author poussin - * + * @version $Revision: 1.19 $ + * + * Last update: $Date: 2007-11-06 18:16:14 $ + * by : $Author: bpoussin $ */ - public class DefaultSimulator implements Simulator { /** to use log facility, just put in your code: log.info("..."); */ - private Log log = LogFactory.getLog(DefaultSimulator.class); + static private Log log = LogFactory.getLog(DefaultSimulator.class); /** * Called by isis don't modify signature @@ -88,8 +79,8 @@ .getParameter(); SimulationControl control = context.getSimulationControl(); int lastYear = param.getNumberOfYear(); - int lastDate = lastYear * Month.NUMBER_OF_MONTH; - Date date = control.getDate(); + int lastStep = lastYear * Month.NUMBER_OF_MONTH; + TimeStep step = control.getTimeStep(); ResultManager resManager = context.getResultManager(); TopiaContext db = context.getDB(); @@ -101,7 +92,7 @@ MetierMonitor metierMonitor = context.getMetierMonitor(); RuleMonitor ruleMonitor = context.getRuleMonitor(); - List<Population> allpops = siMatrix.getPopulations(date); + List<Population> allpops = siMatrix.getPopulations(step); populationMonitor.init(allpops); for (Population pop : allpops) { @@ -132,7 +123,7 @@ // // Simulation loop // - while (date.getDate() < lastDate) { + while (step.getStep() < lastStep) { // // if user stop simulation before last year @@ -141,9 +132,9 @@ break; } - control.setDate(date); - control.setProgress(date.getDate()); - control.setText(_("begin step " + date)); + control.setTimeStep(step); + control.setProgress(step.getStep()); + control.setText(_("begin step " + step)); // // Reload parameters for current step @@ -156,18 +147,18 @@ // raz des metiers interdits et des licences metierMonitor.clear(); - if (date.getMonth().equals(Month.JANUARY)) { + if (step.getMonth().equals(Month.JANUARY)) { populationMonitor.clearCatch(); } // only if there are one or more strategy - if (siMatrix.getStrategies(date).size() > 0) { + if (siMatrix.getStrategies(step).size() > 0) { if (resManager.isEnabled(ResultName.MATRIX_NO_ACTIVITY)) { - MatrixND mat = metierMonitor.getOrCreateNoActivity(date, + MatrixND mat = metierMonitor.getOrCreateNoActivity(step, ResultName.MATRIX_NO_ACTIVITY, siMatrix - .getStrategies(date), siMatrix - .getMetiers(date)); - resManager.addResult(date, mat); + .getStrategies(step), siMatrix + .getMetiers(step)); + resManager.addResult(step, mat); } } @@ -177,22 +168,22 @@ control.setText("Evaluate rules conditions (" + rules.size() + " rules)"); for (Rule rule : rules) { - for (Metier metier : siMatrix.getMetiers(date)) { + for (Metier metier : siMatrix.getMetiers(step)) { boolean active = false; try { - active = rule.condition(context, date, metier); + active = rule.condition(context, step, metier); } catch (Exception eee) { if (log.isWarnEnabled()) { log.warn("Can't evaluate rule condition for: " + rule, eee); } } - ruleMonitor.setEvaluationCondition(date, rule, metier, + ruleMonitor.setEvaluationCondition(step, rule, metier, active); if (active) { log.info("Activate rule: " + rule.getClass().getSimpleName()); - resManager.addActiveRule(date, rule); + resManager.addActiveRule(step, rule); } } } @@ -202,11 +193,11 @@ // control.setText("Do pre action Rules"); for (Rule rule : rules) { - for (Metier metier : siMatrix.getMetiers(date)) { - boolean condition = ruleMonitor.getEvalutionCondition(date, + for (Metier metier : siMatrix.getMetiers(step)) { + boolean condition = ruleMonitor.getEvalutionCondition(step, rule, metier); if (condition) { - rule.preAction(context, date, metier); + rule.preAction(context, step, metier); } } } @@ -215,16 +206,16 @@ // Keep modification's information done in rule // if (resManager.isEnabled(ResultName.MATRIX_METIER_ZONE)) { - MatrixND metierZone = siMatrix.getMetierZone(date); - resManager.addResult(date, metierZone); + MatrixND metierZone = siMatrix.getMetierZone(step); + resManager.addResult(step, metierZone); } // // Simulate one step for all pop // control.setText("Simulate one month"); - for (Population pop : siMatrix.getPopulations(date)) { - computeMonth(context, siMatrix, date, pop); + for (Population pop : siMatrix.getPopulations(step)) { + computeMonth(context, siMatrix, step, pop); } // @@ -232,19 +223,19 @@ // // only if there are one or more strategy - if (siMatrix.getStrategies(date).size() > 0) { + if (siMatrix.getStrategies(step).size() > 0) { control.setText("Add some results"); if (resManager .isEnabled(ResultName.MATRIX_EFFORT_PER_STRATEGY_MET)) { MatrixND effortPerStrategyMet = siMatrix - .matrixEffortPerStrategyMet(date); - resManager.addResult(date, effortPerStrategyMet); + .matrixEffortPerStrategyMet(step); + resManager.addResult(step, effortPerStrategyMet); } if (resManager.isEnabled(ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET)) { - MatrixND effortNominalPerStrategyMet = siMatrix.matrixEffortNominalPerStrategyMet(date); - resManager.addResult(date, effortNominalPerStrategyMet); + MatrixND effortNominalPerStrategyMet = siMatrix.matrixEffortNominalPerStrategyMet(step); + resManager.addResult(step, effortNominalPerStrategyMet); } // @@ -253,7 +244,7 @@ if (!"false".equalsIgnoreCase(param.getTagValue().get( "ecoResult"))) { control.setText("Add economics results"); - saveGravityModel(date, resManager, gravityModel); + saveGravityModel(step, resManager, gravityModel); } } @@ -261,9 +252,9 @@ // Add economics results // if (resManager.isEnabled(ResultName.MATRIX_PRICE)) { - for (Population pop : siMatrix.getPopulations(date)) { - MatrixND matPrice = siMatrix.matrixPrice(date, pop); - resManager.addResult(date, pop, matPrice); + for (Population pop : siMatrix.getPopulations(step)) { + MatrixND matPrice = siMatrix.matrixPrice(step, pop); + resManager.addResult(step, pop, matPrice); } } @@ -272,43 +263,43 @@ // control.setText("Do post action Rules"); for (Rule rule : rules) { - for (Metier metier : siMatrix.getMetiers(date)) { - if (ruleMonitor.getEvalutionCondition(date, rule, metier)) { - rule.postAction(context, date, metier); + for (Metier metier : siMatrix.getMetiers(step)) { + if (ruleMonitor.getEvalutionCondition(step, rule, metier)) { + rule.postAction(context, step, metier); } } } // discard and landing must be done after post action rules // only if there are one or more strategy - if (siMatrix.getStrategies(date).size() > 0) { + if (siMatrix.getStrategies(step).size() > 0) { control.setText("Compute discard and landing"); - for (Population pop : siMatrix.getPopulations(date)) { + for (Population pop : siMatrix.getPopulations(step)) { // // discard computation // - MatrixND discard = populationMonitor.getDiscard(date, pop); - if (discard != null || date.getDate() == 0) { // force discard for the first month to have discard in result + MatrixND discard = populationMonitor.getDiscard(step, pop); + if (discard != null || step.getStep() == 0) { // force discard for the first month to have discard in result if (discard == null) { discard = MatrixFactory.getInstance().create( ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP, - new List[] { siMatrix.getStrategies(date), - siMatrix.getMetiers(date), + new List[] { siMatrix.getStrategies(step), + siMatrix.getMetiers(step), pop.getPopulationGroup(), pop.getPopulationZone() }, new String[] { n_("Strategies"), n_("Metiers"), n_("Groups"), n_("Zones") }); } - resManager.addResult(date, pop, discard); + resManager.addResult(step, pop, discard); if (resManager .isEnabled(ResultName.MATRIX_DISCARDS_WEIGHT_PER_STR_MET_PER_ZONE_POP)) { MatrixND discardWeightPerStrategyMet = siMatrix .matrixDiscardWeightPerStrategyMetPerZonePop( - pop, date, discard); - resManager.addResult(date, pop, + pop, step, discard); + resManager.addResult(step, pop, discardWeightPerStrategyMet); } @@ -324,7 +315,7 @@ landing = landing.minus(discard); } landing.setName(ResultName.MATRIX_LANDING_PER_MET); - resManager.addResult(date, pop, landing); + resManager.addResult(step, pop, landing); } } } @@ -345,7 +336,7 @@ // // Go next step // - date = date.next(); + step = step.next(); } } @@ -356,7 +347,7 @@ } protected void computeMonth(SimulationContext context, SiMatrix siMatrix, - Date date, Population pop) throws IsisFishException, TopiaException { + TimeStep step, Population pop) throws IsisFishException, TopiaException { // to add result ResultStorage resManager = context.getSimulationStorage() .getResultStorage(); @@ -365,7 +356,7 @@ MatrixND N = popMon.getN(pop); if (log.isInfoEnabled()) { - log.info("====================== begin " + date + " - " + pop + log.info("====================== begin " + step + " - " + pop + " =========================== " + System.currentTimeMillis()); log.info("N: " + N); @@ -373,19 +364,19 @@ // add N and biomass result now, before computation // N is reassigned during computation - resManager.addResult(date, pop, N); + resManager.addResult(step, pop, N); if (resManager.isEnabled(ResultName.MATRIX_BIOMASS)) { - MatrixND biomass = siMatrix.matrixBiomass(N, pop, date); - resManager.addResult(date, pop, biomass); + MatrixND biomass = siMatrix.matrixBiomass(N, pop, step); + resManager.addResult(step, pop, biomass); } - Month month = date.getMonth(); + Month month = step.getMonth(); PopulationSeasonInfo info = pop.getPopulationSeasonInfo(month); // group change MatrixND CA = null; - if (date.getDate() == 0) { + if (step.getStep() == 0) { CA = MatrixFactory.getInstance().matrixId( pop.sizePopulationGroup() * pop.sizePopulationZone()); } else { @@ -426,10 +417,10 @@ // ajout de la matrice R dans le suivi de la pop comme etant // la reproduction pour le mois courant. - popMon.setReproduction(date, pop, R); + popMon.setReproduction(step, pop, R); // recrutement - MatrixND recruitment = popMon.getRecruitment(date, pop); + MatrixND recruitment = popMon.getRecruitment(step, pop); log.debug("recruitment: " + recruitment); // mortalite de la reproduction @@ -438,84 +429,84 @@ N = N.add(recruitment); log.debug("N after recru: " + N); - if (resManager.isEnabled(ResultName.MATRIX_ABUNDANCE)) { + if (resManager.isEnabled(ResultName.MATRIX_ABUNDANCE_BEGIN_MONTH)) { MatrixND abondanceBM = siMatrix.matrixAbondanceBeginMonth(N, pop, - date); - resManager.addResult(date, pop, abondanceBM); + step); + resManager.addResult(step, pop, abondanceBM); } - if (resManager.isEnabled(ResultName.MATRIX_BIOMASS)) { - MatrixND biomassBM = siMatrix.matrixBiomassBeginMonth(N, pop, date); - resManager.addResult(date, pop, biomassBM); + if (resManager.isEnabled(ResultName.MATRIX_BIOMASS_BEGIN_MONTH)) { + MatrixND biomassBM = siMatrix.matrixBiomassBeginMonth(N, pop, step); + resManager.addResult(step, pop, biomassBM); } MatrixND abundance = N; // compute fishing matrix only if there are one or more strategy - if (siMatrix.getStrategies(date).size() > 0) { + if (siMatrix.getStrategies(step).size() > 0) { // compute some Matrix and add result // this matrix is necessary for PopulationMonitor.holdCatch (reused in rule) MatrixND catchPerStrategyMetPerZonePop; if (isEffortByCell(context)) { - abundance = siMatrix.matrixAbundance(N, pop, date); + abundance = siMatrix.matrixAbundance(N, pop, step); catchPerStrategyMetPerZonePop = siMatrix - .matrixCatchPerStrategyMetPerZonePop(N, pop, date); + .matrixCatchPerStrategyMetPerZonePop(N, pop, step); } else { // en zone MatrixND matrixFishingMortality = siMatrix - .matrixFishingMortality(date, pop); - resManager.addResult(date, pop, matrixFishingMortality); + .matrixFishingMortality(step, pop); + resManager.addResult(step, pop, matrixFishingMortality); - abundance = siMatrix.matrixAbundance(N, pop, date, + abundance = siMatrix.matrixAbundance(N, pop, step, matrixFishingMortality); // this matrix is necessary for matrixCatchPerStrategyMet MatrixND catchRatePerStrategyMet = siMatrix - .matrixCatchRatePerStrategyMetPerZone(pop, date, + .matrixCatchRatePerStrategyMetPerZone(pop, step, matrixFishingMortality); - resManager.addResult(date, pop, catchRatePerStrategyMet); + resManager.addResult(step, pop, catchRatePerStrategyMet); catchPerStrategyMetPerZonePop = siMatrix - .matrixCatchPerStrategyMetPerZone(N, pop, date, + .matrixCatchPerStrategyMetPerZone(N, pop, step, catchRatePerStrategyMet); } popMon.holdCatch(pop, catchPerStrategyMetPerZonePop); - resManager.addResult(date, pop, catchPerStrategyMetPerZonePop); + resManager.addResult(step, pop, catchPerStrategyMetPerZonePop); if (resManager .isEnabled(ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP)) { MatrixND catchWeightPerStrategyMet = siMatrix - .matrixCatchWeightPerStrategyMetPerZonePop(date, pop, + .matrixCatchWeightPerStrategyMetPerZonePop(step, pop, catchPerStrategyMetPerZonePop); - resManager.addResult(date, pop, catchWeightPerStrategyMet); + resManager.addResult(step, pop, catchWeightPerStrategyMet); } if (isEffortByCell(context)) { MatrixND catchPerStrategyMetPerZoneMet = siMatrix - .matrixCatchPerStrategyMetPerZoneMet(N, pop, date); - resManager.addResult(date, pop, catchPerStrategyMetPerZoneMet); + .matrixCatchPerStrategyMetPerZoneMet(N, pop, step); + resManager.addResult(step, pop, catchPerStrategyMetPerZoneMet); if (resManager .isEnabled(ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_MET)) { MatrixND catchWeightPerStrategyMet = siMatrix - .matrixCatchWeightPerStrategyMetPerZoneMet(date, + .matrixCatchWeightPerStrategyMetPerZoneMet(step, pop, catchPerStrategyMetPerZoneMet); - resManager.addResult(date, pop, catchWeightPerStrategyMet); + resManager.addResult(step, pop, catchWeightPerStrategyMet); } } } else { // no strategies // compute only if fishing mortality =0 to apply Natural Mortality - abundance = siMatrix.matrixAbundanceSsF(N, pop, date); + abundance = siMatrix.matrixAbundanceSsF(N, pop, step); } log.debug("abundance: " + abundance); // Keep new N popMon.setN(pop, abundance); - log.debug("====================== end " + date + " - " + pop + log.debug("====================== end " + step + " - " + pop + " ==========================="); } @@ -526,43 +517,43 @@ * @throws IsisFishException * @throws TopiaException */ - private void saveGravityModel(Date date, ResultManager resManager, + private void saveGravityModel(TimeStep step, ResultManager resManager, GravityModel gravityModel) throws IsisFishException, TopiaException { if (resManager .isEnabled(ResultName.MATRIX_FISHING_TIME_PER_MONTH_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixFishingTimePerMonthPerVessel(date); - resManager.addResult(date, mat); + .matrixFishingTimePerMonthPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_FUEL_COSTS_OF_TRAVEL_PER_VESSEL)) { - MatrixND mat = gravityModel.matrixFuelCostsOfTravelPerVessel(date); - resManager.addResult(date, mat); + MatrixND mat = gravityModel.matrixFuelCostsOfTravelPerVessel(step); + resManager.addResult(step, mat); } if (resManager.isEnabled(ResultName.MATRIX_COSTS_OF_FISHING_PER_VESSEL)) { - MatrixND mat = gravityModel.matrixCostsOfFishingPerVessel(date); - resManager.addResult(date, mat); + MatrixND mat = gravityModel.matrixCostsOfFishingPerVessel(step); + resManager.addResult(step, mat); } if (resManager.isEnabled(ResultName.MATRIX_FUEL_COSTS_PER_VESSEL)) { - MatrixND mat = gravityModel.matrixFuelCostsOfTravelPerVessel(date); - resManager.addResult(date, mat); + MatrixND mat = gravityModel.matrixFuelCostsOfTravelPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_REPAIR_AND_MAINTENANCE_GEAR_COSTS_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixRepairAndMaintenanceGearCostsPerVessel(date); - resManager.addResult(date, mat); + .matrixRepairAndMaintenanceGearCostsPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_OTHER_RUNNING_COSTS_PER_VESSEL)) { - MatrixND mat = gravityModel.matrixOtherRunningCostsPerVessel(date); - resManager.addResult(date, mat); + MatrixND mat = gravityModel.matrixOtherRunningCostsPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_SHARED_NOT_FIXED_COSTS_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixSharedNotFixedCostsPerVessel(date); - resManager.addResult(date, mat); + .matrixSharedNotFixedCostsPerVessel(step); + resManager.addResult(step, mat); } // if (resManager.isEnabled(ResultName.MATRIX_SHARED_FIXED_COSTS_PER_VESSEL_PER_MET)) { // MatrixND mat = gravityModel.matrixSharedFixedCostsPerVesselPerMet(date); @@ -571,80 +562,80 @@ if (resManager .isEnabled(ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_SPECIES_PER_STRATEGY_MET)) { MatrixND mat = gravityModel - .matrixGrossValueOfLandingsPerSpeciesPerStrategyMet(date); - resManager.addResult(date, mat); + .matrixGrossValueOfLandingsPerSpeciesPerStrategyMet(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET)) { MatrixND mat = gravityModel - .matrixGrossValueOfLandingsPerStrategyMet(date); - resManager.addResult(date, mat); + .matrixGrossValueOfLandingsPerStrategyMet(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixGrossValueOfLandingsPerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixGrossValueOfLandingsPerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET)) { MatrixND mat = gravityModel - .matrixNetValueOfLandingsPerStrategyMet(date); - resManager.addResult(date, mat); + .matrixNetValueOfLandingsPerStrategyMet(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixNetValueOfLandingsPerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixNetValueOfLandingsPerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_NET_RENEVUE_TO_SHARE_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixNetRenevueToSharePerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixNetRenevueToSharePerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_CREW_SHARE_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixCrewSharePerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixCrewSharePerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixOwnerMarginOverVariableCostsPerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixOwnerMarginOverVariableCostsPerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_MET_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixVesselMarginOverVariableCostsPerStrategyMetPerVessel(date); - resManager.addResult(date, mat); + .matrixVesselMarginOverVariableCostsPerStrategyMetPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixOwnerMarginOverVariableCostsPerStrategyPerVessel(date); - resManager.addResult(date, mat); + .matrixOwnerMarginOverVariableCostsPerStrategyPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_OWNER_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY)) { MatrixND mat = gravityModel - .matrixOwnerMarginOverVariableCostsPerStrategy(date); - resManager.addResult(date, mat); + .matrixOwnerMarginOverVariableCostsPerStrategy(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY_PER_VESSEL)) { MatrixND mat = gravityModel - .matrixVesselMarginOverVariableCostsPerStrategyPerVessel(date); - resManager.addResult(date, mat); + .matrixVesselMarginOverVariableCostsPerStrategyPerVessel(step); + resManager.addResult(step, mat); } if (resManager .isEnabled(ResultName.MATRIX_VESSEL_MARGIN_OVER_VARIABLE_COSTS_PER_STRATEGY)) { MatrixND mat = gravityModel - .matrixVesselMarginOverVariableCostsPerStrategy(date); - resManager.addResult(date, mat); + .matrixVesselMarginOverVariableCostsPerStrategy(step); + resManager.addResult(step, mat); } }