Author: jcouteau Date: 2009-03-03 10:53:32 +0000 (Tue, 03 Mar 2009) New Revision: 67 Modified: trunk/sensitivity/SensitivityCalculatorRMorris.java Log: Uses MatrixND as dataframe. Export sensitivity results (mu, mustar and sigma) in "sensivity.txt" file on the first simulation result folder Modified: trunk/sensitivity/SensitivityCalculatorRMorris.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-03-02 17:22:36 UTC (rev 66) +++ trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-03-03 10:53:32 UTC (rev 67) @@ -18,34 +18,44 @@ package sensitivity; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; 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 scripts.ResultName; import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; +import fr.ifremer.isisfish.simulator.sensitivity.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.DiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.Scenario; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; /** * Implementation of Morris method using R - * + * * @author jcouteau * @version $Revision: 1.0 $ * - * Last update : $Date: 26 févr. 2009 $ - * By : $Author: chatellier $ + * Last update : $Date: 26 févr. 2009 $ By : $Author: chatellier $ */ public class SensitivityCalculatorRMorris implements SensitivityCalculator { + protected String[] necessaryResult = { ResultName.MATRIX_BIOMASS }; + public SensitivityScenarios compute(DesignPlan plan) { double[] dataframe = new double[0]; int nbExperiments = 0; @@ -60,7 +70,8 @@ rInstruction = rInstruction + "\"" + factors.get(i).getName() + "\","; } else { - rInstruction = rInstruction + "\"" + factors.get(i).getName() + "\""; + rInstruction = rInstruction + "\"" + factors.get(i).getName() + + "\""; } } @@ -148,7 +159,7 @@ try { // Load sensitivity package into R (if package already loaded, // nothing happens. - engine.voidEval("library(sensitivity"); + engine.voidEval("library(sensitivity)"); // Run sensitivity analysis engine.voidEval(rInstruction); // Get back experiment plan @@ -162,37 +173,131 @@ } // Transform the result from R in a matrix - double[][] morris = new double[factorNumber][nbExperiments]; - for (int i = 0; i < factorNumber; i++) { - for (int j = 0; j < nbExperiments; j++) { - morris[i][j] = dataframe[i * nbExperiments + j]; - } - } + 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(); + List<Factor<? extends Serializable>> factorslist = new ArrayList(); for (int i = 0; i < factorNumber; i++) { - factors.get(i).setValueForIdentifier(morris[i][j]); + Factor<? extends Serializable> factor = (Factor<? extends Serializable>) factors + .get(i).clone(); + factor.setValueForIdentifier(morris + .getValue(new int[] { i, j })); + factorslist.add(factor); } - experimentScenario.setFactors(factors); + experimentScenario.setFactors(factorslist); thisExperimentScenarios.add(experimentScenario); thisExperiment.setScenarios(thisExperimentScenarios); } - return thisExperiment; } public void analyzeResult(SensitivityScenarios sensitivityScenarios, - List<SimulationStorage> simulationStorages) { + List<SimulationStorage> simulationStorages) { + // This is is an analysis example with biomass analysis. + + // Creates the R expression. + String rInstruction = "tell(x,y=c("; + + for (int i = 0; i < sensitivityScenarios.getScenarios().size(); i++) { + try { + File biomass; + MatrixND matrixBiomass; + biomass = new File(simulationStorages.get(i) + .getSimulationDirectory().toString(), "Biomasses.csv"); + /* + * biomass = FileUtil.getFile(".*.csv", "fichier csv séparateur + * ';'"); + */ + matrixBiomass = MatrixFactory.getInstance().create( + new int[] { 0 }); + + matrixBiomass.importCSV(new FileReader(biomass), + new int[] { 0 }); + + // uses the very last value of the matrix to check sensitivity + + int[] dimensions = matrixBiomass.getDim(); + if (i == sensitivityScenarios.getScenarios().size() - 1) { + rInstruction = rInstruction + + (double) matrixBiomass.getValue(dimensions) + + "))"; + } else { + rInstruction = rInstruction + + (double) matrixBiomass.getValue(dimensions) + ","; + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + double[] mu = { 0 }; + double[] mustar = { 0 }; + double[] sigma = { 0 }; + + // Call R + REngine engine = new RProxy(); + try { + // Load sensitivity package into R (if package already loaded, + // nothing happens. + engine.voidEval("library(sensitivity)"); + // Send the simulation results + engine.voidEval(rInstruction); + // Get back the sensitivity results, mu, mu star and sigma. + engine.voidEval("mu<-apply(x$ee, 2, mean)"); + mu = (double[]) engine.eval("mu"); + engine + .voidEval("mu.star <- apply(x$ee, 2, function(x) mean(abs(x)))"); + mustar = (double[]) engine.eval("mu.star"); + engine.voidEval("sigma <- apply(x$ee, 2, sd)"); + sigma = (double[]) engine.eval("sigma"); + + } catch (RException e) { + e.printStackTrace(); + // Error while retrieving the results + } + + // Treat the sensitivity results as wished. + // Create the content for export + String exportContent = ""; + for (int i = 0; i < sigma.length; i++) { + exportContent = exportContent + + "Factor : " + + sensitivityScenarios.getScenarios().get(0).getFactors() + .get(i).getName() + "\n mu = " + mu[i] + + "\n mu.star = " + mustar[i] + "\n sigma = " + sigma[i] + + "\n\n\n"; + } + + // export in the first simulation storage + try { + File export; + export = new File(simulationStorages.get(0) + .getSimulationDirectory().toString(), "sensitivity.txt"); + + FileWriter fstream = new FileWriter(export); + BufferedWriter out = new BufferedWriter(fstream); + out.write(exportContent); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } - - public String getDescription(){ + + public String getDescription() { return "Implementation of Morris method using R"; } + public String[] getNecessaryResult() { + return this.necessaryResult; + } + }
participants (1)
-
jcouteau@users.labs.libre-entreprise.org