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
}