Author: jcouteau Date: 2009-04-29 10:27:13 +0000 (Wed, 29 Apr 2009) New Revision: 131 Modified: trunk/sensitivity/SensitivityCalculatorRSobol.java Log: Adaptation de la m?\195?\169thode de Sobol au nouveau CDC Pop-up d'erreur si facteur discret Possibilit?\195?\169 de modifier l'instruction R Modified: trunk/sensitivity/SensitivityCalculatorRSobol.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRSobol.java 2009-04-29 09:47:25 UTC (rev 130) +++ trunk/sensitivity/SensitivityCalculatorRSobol.java 2009-04-29 10:27:13 UTC (rev 131) @@ -19,10 +19,15 @@ package sensitivity; import java.io.File; -import java.io.Serializable; import java.util.List; import java.util.Vector; +import javax.swing.Box; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.j2r.REngine; @@ -33,11 +38,11 @@ import org.rosuda.JRI.REXP; 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; @@ -61,14 +66,14 @@ private static Log log = LogFactory .getLog(SensitivityCalculatorRFast.class); - @Doc("doc") - public int param_n; + @Doc("the size of the 2 random samples") + public int param_n = 20; - @Doc("an integer, the maximum order in the ANOVA decomposition (all indices up to this order will be computed)") - public int param_order; + @Doc("the number of bootstrap replicates.") + public int param_nboot = 20; - @Doc("doc") - public int param_nboot; + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; /** * Retourne vrai si le calculateur sait gerer la cardinalité des facteurs @@ -82,6 +87,8 @@ public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { + setIsisFactorsR(plan, outputdirectory); + double[] dataframe = new double[0]; int nbExperiments = 0; int factorNumber = plan.getFactors().size(); @@ -92,14 +99,49 @@ //Test all factors, if one is discrete, return null for (int i = 0; i < factorNumber; 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; } } + String rInstruction = "a<-sobol2002(model=NULL,X1=X1,X2=X2,nboot=%s)"; + String rCall = String.format(rInstruction, param_nboot); + + if (param_modifR) { + JLabel label = new JLabel( + "Modifier le code R envoyé si vous le souhaitez"); + JTextPane text = new JTextPane(); + text.setText(rCall); + text.setSize(400, 400); + text.setPreferredSize(text.getSize()); + + Box box = Box.createVerticalBox(); + box.add(label); + box.add(new JScrollPane(text)); + + JOptionPane.showMessageDialog(null, box, "R modif", + JOptionPane.QUESTION_MESSAGE); + rCall = text.getText(); + } + 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\")"); + engine.voidEval("library(sensitivity)"); log.info("Message sent to R : " + "library(sensitivity)"); @@ -122,14 +164,11 @@ + "X2<-data.frame(matrix(runif(" + factorNumber + "*" + param_n + "),nrow=" + param_n + "))"); - engine.voidEval("a<-sobol(model=NULL,X1=X1,X2=X2,order=" - + param_order + ",nboot=" + param_nboot + ")"); - log.info("Message sent to R : " - + "a<-sobol(model=NULL,X1=X1,X2=X2,order=" + param_order - + ",nboot=" + param_nboot + ")"); + engine.voidEval(rCall); + log.info("Message sent to R : " + rCall); // Creating the factors vector. - String rInstruction = "factornames<-c("; + rInstruction = "factornames<-c("; for (int i = 0; i < factorNumber; i++) { if (i != (factorNumber - 1)) { rInstruction = rInstruction + "\"" @@ -175,12 +214,76 @@ } log.info("Message sent to R : " + "a$X"); + nbExperiments = dataframe.length / factorNumber; + + String isisFactorDistribution = "isis.factor.distribution<-data.frame(NomFacteur=c(%s),NomDistribution=c(%s),ParametreDistribution=c(%s))"; + + // Creating the vectors. + String distribution = ""; + String parameters = ""; + String factorNames = ""; + + for (int i = 0; i < factorNumber; i++) { + Domain domain = factors.get(i).getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + factorNames += ","; + } + + distribution += "\"qunif\""; + parameters += "\"[" + ((ContinuousDomain) domain).getMinBound() + + ";" + ((ContinuousDomain) domain).getMaxBound() + + "]\""; + factorNames += "\"" + factors.get(i).getName() + "\""; + } + + 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<-a$call"); + engine.voidEval("call<-a$call"); + + 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(a$X)"); + engine.voidEval("isis.simule<-data.frame(a$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]]"); + + //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(); } - nbExperiments = dataframe.length / factorNumber; - // Transform the result from R in a matrix MatrixND fast = MatrixFactory.getInstance().create(dataframe, new int[] { factorNumber, nbExperiments }); @@ -189,8 +292,7 @@ for (int j = 0; j < nbExperiments; 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.setValueForIdentifier(Double.valueOf( @@ -198,8 +300,8 @@ } else { Double value = (Double) ((ContinuousDomain) factor .getDomain()).getMinBound() - + ((Double) ((ContinuousDomain) factor - .getDomain()).getMaxBound() - (Double) ((ContinuousDomain) factor + + ((Double) ((ContinuousDomain) factor.getDomain()) + .getMaxBound() - (Double) ((ContinuousDomain) factor .getDomain()).getMinBound()) * fast.getValue(new int[] { i, j }); factor.setValueForIdentifier(value); @@ -219,6 +321,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. @@ -266,7 +376,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() @@ -293,10 +405,49 @@ // 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 < sensitivityNumber; k++) { + + // Creates the R expression to import results in R + String name = simulationStorages.get(0).getParameter() + .getSensitivityExport().get(k).getExportFilename(); + //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 + ")"); + //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=\"tell(a,y=" + + name + ")" + "\",\"analysis_result\"=a)"); + engine + .voidEval("isis.methodAnalyse<-list(\"isis.factors\"=isis.factors,\"isis.factor.distribution\"=isis.factor.distribution,\"isis.simule\"=isis.simule,call_method=\"tell(a,y=" + + name + ")" + "\",\"analysis_result\"=a)"); + + //setting isis.methodAnalyse attributes + log + .info("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); + engine + .voidEval("attr(isis.methodAnalyse,\"nomModel\")<-\"isis-fish-externe-R\")"); + //Create the data.frame of scenarios and results for export purpose engine.voidEval("dfresults=data.frame(a$X,results)"); log.info("Message sent to R : " @@ -354,14 +505,59 @@ .getExportFilename() + "_Results.csv\")"); //FIXME export through java to enable export when using Rserve + 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)); + } + + //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()"); } catch (Exception e) { e.printStackTrace(); } } public String getDescription() { - return "Implementation of Sobol method using R"; + return "Implementation of Sobol method using R (use of the R sobol2002 method)"; } }
participants (1)
-
jcouteau@users.labs.libre-entreprise.org