Author: jcouteau Date: 2009-04-22 16:31:17 +0000 (Wed, 22 Apr 2009) New Revision: 119 Modified: trunk/sensitivity/SensitivityCalculatorRRandomLHS.java Log: RandomLHS conform to new CDC Modified: trunk/sensitivity/SensitivityCalculatorRRandomLHS.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRRandomLHS.java 2009-04-22 14:33:10 UTC (rev 118) +++ trunk/sensitivity/SensitivityCalculatorRRandomLHS.java 2009-04-22 16:31:17 UTC (rev 119) @@ -19,9 +19,10 @@ package sensitivity; import java.io.File; -import java.io.Serializable; import java.util.List; +import javax.swing.JOptionPane; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.j2r.REngine; @@ -31,14 +32,15 @@ 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.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; @@ -51,14 +53,15 @@ * */ @Doc("Random Latin Hypercube") -public class SensitivityCalculatorRRandomLHS extends AbstractSensitivityCalculator { +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; + public int param_simulationNumber = 10; /** * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs @@ -73,12 +76,28 @@ 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; } @@ -86,6 +105,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\")"); + //Load the lhs library engine.voidEval("library(lhs)"); log.info("Message sent to R : " + "library(lhs)"); @@ -108,8 +135,7 @@ 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 factor = plan.getFactors().get(i); if ((factor.getDomain() instanceof MatrixContinuousDomain) || (factor.getDomain() instanceof EquationContinuousDomain)) { factor @@ -131,13 +157,74 @@ thisExperiment.setScenarios(thisExperimentScenarios); } - //Create the factors vectors - for (int j = 0; j < factornumber; j++) { - Factor factor = thisExperimentScenarios - .get(0).getFactors().get(j); + 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" + j + "<-c("; + String vector = factor.getName().replaceAll(" ", "") + + "<-c("; for (int i = 0; i < param_simulationNumber; i++) { if (i < (param_simulationNumber - 1)) { vector = vector @@ -156,7 +243,9 @@ engine.voidEval(vector); log.info("Message sent to R : " + vector); } else if (factor.getDomain() instanceof MatrixContinuousDomain) { - String vector = "factor" + j + "<-c("; + //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 @@ -175,7 +264,9 @@ engine.voidEval(vector); log.info("Message sent to R : " + vector); } else { - String vector = "factor" + j + "<-c("; + //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 @@ -193,15 +284,13 @@ 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 + "),"; + if (j < factors.size() - 1) { + data += factor.getName().replaceAll(" ", "") + "=factor(" + + factor.getName().replaceAll(" ", "") + "),"; } else { - data = data + "factor" + j + "=factor(factor" + j + "))"; + data += factor.getName().replaceAll(" ", "") + "=factor(" + + factor.getName().replaceAll(" ", "") + "))"; } } @@ -241,6 +330,14 @@ log.info("Message sent to R" + "dput(factornames,file=\".factornames\")"); + //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()"); + engine.terminate(); } catch (Exception e) { @@ -261,36 +358,44 @@ REngine engine = new RProxy(); try { - param_simulationNumber = simulationStorages.get(0).getParameter() - .getSensitivityExport().size(); + //Set working directory to get Isis R session + log.info("setwd(\"" + outputdirectory.getParent() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); - for (int k = 0; k < param_simulationNumber; k++) { + //Get Isis R session + log.info("load(\".RData\")"); + engine.voidEval("load(\".RData\")"); - // Set output directory - engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath() + "\")"); + // Set output directory + engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() + + "\")"); + log.info("Message sent to R : setwd(\"" + + outputdirectory.getAbsolutePath() + "\")"); - //Get back the scenarios - //engine.voidEval("factors<-read.csv(\".expandgrid.csv\",row.names=1,col.names=1)"); - engine.voidEval("factors<-read.csv(\".randomlhs.csv\")"); - log - .info("Message sent to R : factors<-read.csv(\".randomlhs.csv\")"); + //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 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(); - //factorNumber=factorNumber-1; + //Get back the factors number + int factorNumber = ((Double) engine.eval("length(factors)-1")) + .intValue(); - //Create the results vectors - String result = "result<-c("; - for (int l = 0; l < simulationStorages.size(); l++) { + param_simulationNumber = simulationStorages.get(0).getParameter() + .getSensitivityExport().size(); + + for (int k = 0; k < param_simulationNumber; k++) { + + // Creates the R expression to import results in R + String name = simulationStorages.get(0).getParameter() + .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 @@ -304,27 +409,64 @@ String simulResult = FileUtil.readAsString(importFile); double simulationResult = Double.valueOf(simulResult); if (l < simulationStorages.size() - 1) { - result = result + simulationResult + ","; + rInstruction = rInstruction + simulationResult + ","; } else { - result = result + simulationResult; + rInstruction = rInstruction + simulationResult; } } - result = result + ")"; - engine.voidEval(result); - log.info("Message sent to R : " + result); + 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 < param_simulationNumber; k++) { + + // Creates the R expression to import results in R + String name = simulationStorages.get(0).getParameter() + .getSensitivityExport().get(k).getExportFilename(); + //Create the dataforaov data.frame - String dataframe = "dataforaov<-data.frame(factors,result=result)"; + String dataframe = "dataforaov<-data.frame(factors," + name + + "=" + name + ")"; engine.voidEval(dataframe); log.info("Message sent to R : " + dataframe); //Call aov() - String aovCall = "aovresult<-aov(result~"; + 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 + "factor" + j + "+"; + aovCall = aovCall + + engine + .eval("names(factors)[" + (j + 2) + "]") + + "+"; } else { - aovCall = aovCall + "factor" + j + ",data=dataforaov)"; + aovCall = aovCall + + engine + .eval("names(factors)[" + (j + 2) + "]") + + ",data=dataforaov)"; } } engine.voidEval(aovCall); @@ -367,14 +509,6 @@ 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() - + "\")"); - log.info("Message sent to R : setwd(\"" - + outputdirectory.getAbsolutePath() + "\")"); - //Set dataforaov names engine .voidEval("resultsnames<-c(\"Simulation\",factornames,\"Result\")"); @@ -385,6 +519,14 @@ 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() + + "\")"); + log.info("Message sent to R : setwd(\"" + + outputdirectory.getAbsolutePath() + "\")"); + //Save the results with the scenarios. engine.voidEval("write.csv(dataforaov,\"" + simulationStorages.get(0).getParameter() @@ -407,10 +549,71 @@ .getExportFilename() + "_SensitivityIndices.csv\")"); //FIXME export through java to enable export when using Rserve (when distant Rserve). - engine.terminate(); + + //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 + "\"" + ",aovresult)"); + engine + .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"" + + aovCall + "\"" + ",aovresult)"); + + 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)); + } - log.info("end"); + //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() + "\")"); + engine.voidEval("setwd(\"" + outputdirectory.getParent() + "\")"); + + // Save Isis R session + log.info("save.image()"); + engine.voidEval("save.image()"); + + engine.terminate(); + } catch (Exception e) { e.printStackTrace(); // Error while processing
participants (1)
-
jcouteau@users.labs.libre-entreprise.org