Author: jcouteau Date: 2009-04-17 13:51:32 +0000 (Fri, 17 Apr 2009) New Revision: 112 Modified: trunk/sensitivity/SensitivityCalculatorRMorris.java Log: Adapt Morris method to the new R CDC Modified: trunk/sensitivity/SensitivityCalculatorRMorris.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-04-17 12:27:11 UTC (rev 111) +++ trunk/sensitivity/SensitivityCalculatorRMorris.java 2009-04-17 13:51:32 UTC (rev 112) @@ -19,7 +19,6 @@ package sensitivity; import java.io.File; -import java.io.Serializable; import java.util.List; import javax.swing.Box; @@ -38,13 +37,11 @@ import org.codelutin.util.FileUtil; import fr.ifremer.isisfish.datastore.SimulationStorage; +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.SensitivityCalculator; -import fr.ifremer.isisfish.simulator.sensitivity.AbstractSensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; @@ -62,7 +59,7 @@ * $Author$ */ @Doc("Morris method") -public class SensitivityCalculatorRMorris extends AbstractSensitivityCalculator { +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; @@ -85,9 +82,9 @@ } public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - - setIsisFactorsR(plan,outputdirectory); + setIsisFactorsR(plan, outputdirectory); + double[] dataframe = new double[0]; int nbExperiments = 0; int factorNumber = plan.getFactors().size(); @@ -129,17 +126,13 @@ factorNames += "\"" + factors.get(i).getName() + "\""; - levels += ((ContinuousDomain) domain) - .getCardinality(); + levels += ((ContinuousDomain) domain).getCardinality(); - gridJump += (Integer) (((ContinuousDomain) domain) - .getCardinality() / 2); + gridJump += (Integer) (((ContinuousDomain) domain).getCardinality() / 2); - binf += ((ContinuousDomain) domain) - .getMinBound(); + binf += ((ContinuousDomain) domain).getMinBound(); - bsup += ((ContinuousDomain) domain) - .getMaxBound(); + 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))"; @@ -166,13 +159,21 @@ REngine engine = new RProxy(); try { + //Set working directory to get Isis R session + log.info("setwd(\"" + outputdirectory.getParent() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); + + //Get Isis R session + log.info("load(\".RData\")"); + engine.voidEval("load(\".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(rInstruction); + engine.voidEval(rCall); log.info("Message sent to R : " + rCall); // Creating the factors vector. @@ -180,26 +181,26 @@ rCall = String.format(rInstruction, factorNames); engine.voidEval(rCall); - log.info("Message sent to R" + rCall); + log.info("Message sent to R : " + rCall); // Set output directory engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + "\")"); - log.info("Message sent to R" + "setwd(\"" + log.info("Message sent to R : " + "setwd(\"" + outputdirectory.getAbsolutePath() + "\")"); // 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\")"); + 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" + 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"); + log.info("Message sent to R : " + "a$X"); if (log.isDebugEnabled()) { log.debug("rInstruction = " + rInstruction); @@ -207,6 +208,46 @@ nbExperiments = dataframe.length / factorNumber; + 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 : " + "call<-a$call"); + engine.voidEval("call<-a$call"); + + log + .info("Message sent to R : " + + "isis.MethodExp<-list(isis.factors,isis.factor.distribution,call)"); + engine + .voidEval("isis.MethodExp<-list(isis.factors,isis.factor.distribution,call)"); + + log + .info("Message sent to R : " + + "attributes(isis.MethodExp)<-list(nomModel=\"isis-fish-externe-R\")"); + engine + .voidEval("attributes(isis.MethodExp)<-list(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 : " + + "attributes(isis.simule)<-list(nomModel=\"isis-fish-externe-R\")"); + engine + .voidEval("attributes(isis.simule)<-list(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() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); + + // Save Isis R session + log.info("save.image()"); + engine.voidEval("save.image()"); + } catch (RException eee) { eee.printStackTrace(); throw new RuntimeException("R evaluation failed", eee); @@ -226,7 +267,9 @@ Factor factor = factors.get(i); if ((factor.getDomain() instanceof MatrixContinuousDomain) || (factor.getDomain() instanceof EquationContinuousDomain)) { - factor.setValueForIdentifier((Double)morris.getValue(i, j)); + factor + .setValueForIdentifier((Double) morris.getValue(i, + j)); } else { factor.setValueForIdentifier(morris.getValue(new int[] { i, j })); @@ -246,6 +289,14 @@ REngine engine = new RProxy(); try { + //Set working directory to get Isis R session + log.info("setwd(\"" + outputdirectory.getParent() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); + + //Get Isis R session + log.info("load(\".RData\")"); + engine.voidEval("load(\".RData\")"); + // Call R // Load sensitivity package into R (if package already loaded, // nothing happens. @@ -278,7 +329,9 @@ for (int k = 0; k < sensitivityNumber; k++) { // Creates the R expression to import results in R - String rInstruction = "results<-c("; + String name = simulationStorages.get(0).getParameter() + .getSensitivityExport().get(k).getExportFilename(); + String rInstruction = name + "<-c("; for (int l = 0; l < scenariosNumber; l++) { File importFile = new File(simulationStorages.get(l) .getDirectory().toString() @@ -306,8 +359,8 @@ engine.voidEval(rInstruction); //Compute results - engine.voidEval("tell(a,y=results)"); - log.info("Message sent to R : " + "tell(a,y=results)"); + engine.voidEval("tell(a,y=name)"); + log.info("Message sent to R : " + "tell(a,y=name)"); // Get back the sensitivity results, mu, mu star and sigma. engine.voidEval("mu<-apply(a$ee, 2, mean)"); @@ -330,9 +383,9 @@ 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,results)"); + engine.voidEval("dfresults=data.frame(a$X,name)"); log.info("Message sent to R : " - + "dfresults=data.frame(a$X,results)"); + + "dfresults=data.frame(a$X,name)"); //Set dfresults names engine @@ -375,7 +428,70 @@ .getExportFilename() + "_Results.csv\")"); //FIXME export through java to enable export when using Rserve + //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 : " + + "attributes(isis.simule)<-list(nomModel=\"isis-fish-externe-R\")"); + engine + .voidEval("attributes(isis.simule)<-list(nomModel=\"isis-fish-externe-R\")"); + + //creating isis.methodAnalyse + log + .info("Message sent to R : " + + "isis.methodAnalyse<-list(isis.factor,isis.factor.distribution,isis.simule,call_method=\"tell(a,results)\",a)"); + engine + .voidEval("isis.methodAnalyse<-list(isis.factor,isis.factor.distribution,isis.simule,call_method=\"tell(a,results)\",a)"); + + //Rename R objects for saving purpose + + String renameIsisSimule = "%s.isis.simule<-isis.simule"; + String renameIsisMethodAnalyse = "%s.isis.methodAnalyse<-isis.methodAnalyse"; + String renameIsisFactorDistribution = "%s.isis.factor.distribution<-isis.factor.distribution"; + String renameIsisFactor = "%s.isis.factor<-isis.factor"; + 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(renameIsisMethodAnalyse, simulationName)); + engine.voidEval(String.format(renameIsisMethodAnalyse, + 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() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); + + // Save Isis R session + log.info("save.image()"); + engine.voidEval("save.image()"); + } catch (Exception e) { e.printStackTrace(); }