Author: jcouteau Date: 2009-04-29 09:47:25 +0000 (Wed, 29 Apr 2009) New Revision: 130 Modified: trunk/sensitivity/SensitivityCalculatorRFast.java Log: Adapt Fast method to new CDC Pop-up message if one discrete factor Possibility to modify R instruction Modified: trunk/sensitivity/SensitivityCalculatorRFast.java =================================================================== --- trunk/sensitivity/SensitivityCalculatorRFast.java 2009-04-29 09:35:53 UTC (rev 129) +++ trunk/sensitivity/SensitivityCalculatorRFast.java 2009-04-29 09:47:25 UTC (rev 130) @@ -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; @@ -34,12 +39,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; @@ -63,12 +67,15 @@ private static Log log = LogFactory .getLog(SensitivityCalculatorRFast.class); - @Doc("an integer giving the sample size, i.e. the length of the discretization of the s-space (see Cukier et al.). (default=17)") - public int param_n; + @Doc("an integer giving the sample size, i.e. the length of the discretization of the s-space (see Cukier et al.). (default=20)") + public int param_n = 20; - @Doc("an integer specifying the interference parameter, i.e. the number of harmonics to sum in the Fourier series decomposition (see Cukier et al.). (default=1)") - public int param_M; + @Doc("an integer specifying the interference parameter, i.e. the number of harmonics to sum in the Fourier series decomposition (see Cukier et al.). (default=6)") + public int param_M = 6; + @Doc("True to be able to modify the code sent to R") + public boolean param_modifR = false; + //public int[] param_omega; /** @@ -83,14 +90,8 @@ public SensitivityScenarios compute(DesignPlan plan, File outputdirectory) { - if (param_n == 0) { - param_n = 17; - } + setIsisFactorsR(plan, outputdirectory); - if (param_M == 0) { - param_M = 1; - } - double[] dataframe = new double[0]; int nbExperiments = 0; int factorNumber = plan.getFactors().size(); @@ -101,28 +102,57 @@ //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<-fast99(model=NULL,factors=c(" - + factors.size(); + String rInstruction = "a<-fast99(model=NULL,factors=c(%s), n=%s,M=%s, q = \"qunif\", q.arg=list(min=0,max=1))"; + String rCall = String.format(rInstruction, factors.size(), param_n, + param_M); - rInstruction = rInstruction + "), n=" + param_n + ",M=" + param_M; + 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()); - rInstruction = rInstruction - + ", q = \"qunif\", q.arg=list(min=0,max=1))"; + 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\")"); + // 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); - log.info("Message sent to R" + rInstruction); + engine.voidEval(rCall); + log.info("Message sent to R" + rCall); // Creating the factors vector. rInstruction = "factornames<-c("; @@ -167,6 +197,7 @@ + j] = dataframeVector.get(i).asDoubleArray()[j]; } } + log.info("Message sent to R" + "a$X"); if (log.isDebugEnabled()) { @@ -175,8 +206,73 @@ nbExperiments = dataframe.length / factorNumber; - } catch (RException e) { - e.printStackTrace(); + 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 (RException eee) { + eee.printStackTrace(); + throw new RuntimeException("R evaluation failed", eee); // Error while retrieving scenario } @@ -188,8 +284,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( @@ -197,8 +292,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); @@ -215,17 +310,17 @@ public void analyzeResult(List<SimulationStorage> simulationStorages, File outputdirectory) { - if (param_n == 0) { - param_n = 17; - } - - if (param_M == 0) { - param_M = 1; - } - 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. @@ -257,7 +352,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() @@ -284,15 +381,54 @@ // 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 : " + "dfresults=data.frame(a$X,results)"); - //Set working directory engine.voidEval("setwd(\"" + outputdirectory.getAbsolutePath() @@ -350,11 +486,9 @@ .getSensitivityExport().get(k) .getExportFilename() + "_Dt.csv\")"); //Set dfresults names - engine - .voidEval("resultsnames<-c(factornames,\"Result\")"); - log - .info("Message sent to R : " - + "resultsnames<-c(factornames,\"Result\")"); + engine.voidEval("resultsnames<-c(factornames,\"Result\")"); + log.info("Message sent to R : " + + "resultsnames<-c(factornames,\"Result\")"); engine.voidEval("names(dfresults)<-resultsnames"); log.info("Message sent to R : " + "names(dfresults)<-resultsnames"); @@ -371,7 +505,53 @@ .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(); }