Author: jcouteau Date: 2009-03-16 10:27:55 +0000 (Mon, 16 Mar 2009) New Revision: 75 Modified: trunk/sensitivity/SensitivityCalculatorJavaExpandGrid.java trunk/sensitivity/SensitivityCalculatorRMorris.java Log: Adapt analysis to Interface changes. Modified: trunk/sensitivity/SensitivityCalculatorJavaExpandGrid.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorJavaExpandGrid.java 2009-03-13 09:30:36 UTC (rev 74) +++ trunk/sensitivity/SensitivityCalculatorJavaExpandGrid.java 2009-03-16 10:27:55 UTC (rev 75) @@ -47,7 +47,7 @@ public class SensitivityCalculatorJavaExpandGrid implements SensitivityCalculator { - public SensitivityScenarios compute(DesignPlan plan) + public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) throws SensitivityException { int k = 1; //number of sensitivity scenarios (initialization) @@ -112,45 +112,83 @@ thisExperimentScenarios.add(experimentScenario); thisExperiment.setScenarios(thisExperimentScenarios); } + + /* + * Call R to save the data for result analysis + */ + int scenariosNumber = thisExperimentScenarios.size(); + + REngine engine = new RProxy(); + try { + //Create the factors vectors + for (int j = 0; j < factorNumber; j++) { + String vector = "factor" + j + "<-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); + + } + + //Create the data data.frame from the factors + String dataframe = "data<-data.frame("; + for (int j = 0; j < factorNumber; j++) { + if (j < factorNumber - 1) { + dataframe = dataframe + "factor" + j + "=factor(factor" + j + + "))"; + } else { + dataframe = dataframe + "factor" + j + "=factor(factor" + j + + "),"; + } + + } + engine.voidEval(dataframe); + + // Set output directory + engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + + "\")"); + + // Export the data.frame object for the second run in a .expandgrid file + engine.voidEval("dput(data,file=\".expandgrid\")"); + + } catch (Exception e) { + e.printStackTrace(); + // Error while processing + } + return thisExperiment; } - public void analyzeResult(SensitivityScenarios sensitivityScenarios, - List<SimulationStorage> simulationStorages) - throws SensitivityException { + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputdirectory) throws SensitivityException { - int scenariosNumber = sensitivityScenarios.getScenarios().size(); - int factorNumber = sensitivityScenarios.getScenarios().get(0) - .getFactors().size(); - REngine engine = new RProxy(); try { + /*int scenariosNumber = sensitivityScenarios.getScenarios().size(); + int factorNumber = sensitivityScenarios.getScenarios().get(0) + .getFactors().size();*/ + int sensitivityNumber = simulationStorages.get(0).getParameter() .getSensitivityExportNames().size(); for (int k = 0; k < sensitivityNumber; k++) { - //Create the params vectors - for (int j = 0; j < factorNumber; j++) { - String vector = "factor" + j + "<-c("; - for (int i = 0; i < scenariosNumber; i++) { - if (i < (scenariosNumber - 1)) { - vector = vector - + sensitivityScenarios.getScenarios() - .get(i).getFactors().get(j) - .getValue() + ","; - } else { - vector = vector - + sensitivityScenarios.getScenarios() - .get(i).getFactors().get(j) - .getValue(); - } + //Get back the scenarios + engine.voidEval("factors<-dget(\".expandgrid\")"); - } - vector = vector + ")"; - engine.voidEval(vector); - } + //Get back the factors number + int factorNumber = (Integer) engine.eval("length(factors)"); //Create the results vectors String result = "result<-c("; @@ -186,13 +224,7 @@ engine.voidEval(result); //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame("; - for (int j = 0; j < factorNumber; j++) { - dataframe = dataframe + "factor" + j + "=factor(factor" + j - + "),"; - - } - dataframe = dataframe + "result=result)"; + String dataframe = "dataforaov<-data.frame(factors,result=result)"; engine.voidEval(dataframe); //Call aov() @@ -206,27 +238,44 @@ } engine.voidEval(aovCall); - //Export the results - /* - * SoS<-anova(aovresult)[1:3,2] - * IndSensibilite<-SoS/sum(SoS) - * write.csv(IndSensibilite) + /*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 */ - engine.voidEval("SoS<-anova(aovresult)[1:" + factorNumber - + ",2]"); - engine.voidEval("names(SoS)<-dimnames(anova(aovtest))[[1]][1:" - + factorNumber + "]"); + //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]]"); engine.voidEval("IndSensibilite<-SoS/sum(SoS)"); - engine.voidEval("setwd(\"" - + simulationStorages.get(0).getDirectory().toString() + + //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\")"); + + /*Set the export directory + *Export directory is the first simulation export directory. + */ + engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + "\")"); - engine - .voidEval("write.csv(IndSensibilite,\"" - + simulationStorages.get(0).getParameter() - .getSensitivityExportNames().get(k) - + ".csv\")"); - //FIXME export through java to enable export when using Rserve + + //Save the results with the scenarios. + engine.voidEval("write.csv(dataforaov,\"" + + simulationStorages.get(0).getParameter() + .getSensitivityExportNames().get(k) + + "_Results.csv"); + + //Save the sensitivity indices + engine.voidEval("write.csv(exportsensitivity,\"" + + simulationStorages.get(0).getParameter() + .getSensitivityExportNames().get(k) + + "_SensitivityIndices.csv\")"); + //FIXME export through java to enable export when using Rserve (when distant Rserve). } } catch (Exception e) { Modified: trunk/sensitivity/SensitivityCalculatorRMorris.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-03-13 09:30:36 UTC (rev 74) +++ trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-03-16 10:27:55 UTC (rev 75) @@ -31,8 +31,6 @@ import org.codelutin.math.matrix.MatrixND; import org.codelutin.util.FileUtil; -import scripts.GravityModel; - import fr.ifremer.isisfish.datastore.ExportStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; @@ -51,16 +49,17 @@ * @author jcouteau * @version $Revision$ * - * Last update : $Date$ - * By : $Author$ + * Last update : $Date$ By : + * $Author$ */ public class SensitivityCalculatorRMorris implements SensitivityCalculator { /** to use log facility, just put in your code: log.info("..."); */ - private static Log log = LogFactory.getLog(SensitivityCalculatorRMorris.class); - - public SensitivityScenarios compute(DesignPlan plan) { + private static Log log = LogFactory + .getLog(SensitivityCalculatorRMorris.class); + public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { + double[] dataframe = new double[0]; int nbExperiments = 0; int factorNumber = plan.getFactors().size(); @@ -175,15 +174,24 @@ // Load sensitivity package into R (if package already loaded, // nothing happens. engine.voidEval("library(sensitivity)"); + // Run sensitivity analysis engine.voidEval(rInstruction); + + // Set output directory + engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + + "\")"); + + // Export the morris object for the second run in a .morris file + engine.voidEval("dput(a,file=\".morris\")"); + // Get back experiment plan dataframe = (double[]) engine.eval("a$X"); if (log.isDebugEnabled()) { log.debug("rInstruction = " + rInstruction); } - + nbExperiments = dataframe.length / factorNumber; } catch (RException e) { @@ -231,21 +239,30 @@ } - public void analyzeResult(SensitivityScenarios sensitivityScenarios, - List<SimulationStorage> simulationStorages) { + public void analyzeResult(List<SimulationStorage> simulationStorages, + File outputdirectory) { - int scenariosNumber = sensitivityScenarios.getScenarios().size(); - REngine engine = new RProxy(); try { + //Set the working directory (for import and exports) + engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + + "\")"); + + // Export the morris object for the second run in a .morris file + engine.voidEval("a<-dget(\".morris\")"); + + /*int scenariosNumber = sensitivityScenarios.getScenarios().size();*/ + int scenariosNumber = (Integer) engine + .eval("length(y$X)/y$factors"); + int sensitivityNumber = simulationStorages.get(0).getParameter() .getSensitivityExportNames().size(); for (int k = 0; k < sensitivityNumber; k++) { - // Creates the R expression. - String rInstruction = "tell(x,y=c("; + // Creates the R expression to import results in R + String rInstruction = "results<-c("; for (int l = 0; l < scenariosNumber; l++) { File importFile = new File( simulationStorages.get(l).getDirectory().toString(), @@ -280,22 +297,30 @@ // Load sensitivity package into R (if package already loaded, // nothing happens. engine.voidEval("library(sensitivity)"); + // Send the simulation results engine.voidEval(rInstruction); + + //Compute results + engine.voidEval("tell(x,y=results"); + // Get back the sensitivity results, mu, mu star and sigma. engine.voidEval("mu<-apply(x$ee, 2, mean)"); engine .voidEval("mu.star <- apply(x$ee, 2, function(x) mean(abs(x)))"); engine.voidEval("sigma <- apply(x$ee, 2, sd)"); + + //Create the data.frame of sensitivity indices for export purpose engine.voidEval("df=data.frame(mu,mu.star,sigma)"); + + // engine.voidEval("setwd(\"" + simulationStorages.get(0).getDirectory().toString() + "\")"); - engine - .voidEval("write.csv(df,\"" - + simulationStorages.get(0).getParameter() - .getSensitivityExportNames().get(k) - + ".csv\")"); + engine.voidEval("write.csv(df,\"" + + simulationStorages.get(0).getParameter() + .getSensitivityExportNames().get(k) + + "_SensitivityIndices.csv\")"); //FIXME export through java to enable export when using Rserve }