Author: jcouteau Date: 2013-11-22 18:52:48 +0100 (Fri, 22 Nov 2013) New Revision: 3842 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/3842 Log: refs #725 : Prise en compte de la distribution dans les AS Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisTest.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Fast.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Morris.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/OptimumLHS.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RandomLHS.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularExpandGrid.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularFractions.java branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Sobol.java Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -31,6 +31,7 @@ import java.io.IOException; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.swing.Box; import javax.swing.JLabel; @@ -39,6 +40,7 @@ import javax.swing.JTextPane; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.j2r.REngine; @@ -396,6 +398,44 @@ return result; } + protected String getIsisFactorDistribution(List<Factor> factors){ + 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 < factors.size(); i++) { + Factor factor = factors.get(i); + ContinuousDomain domain = (ContinuousDomain)factor.getDomain(); + if (i != 0) { + distribution += ","; + parameters += ","; + factorNames += ","; + } + + Distribution r_distribution = domain.getDistribution(); + + distribution += "\""+ r_distribution.getInstruction() +"\""; + parameters += "\"["; + + for (Map.Entry<String,Object> param:domain.getDistributionParameters().entrySet()){ + parameters += param.getKey() + "=" + param.getValue() + ";"; + } + + parameters = StringUtils.removeEnd(parameters, ";"); + parameters += "]\""; + + factorNames += "\"" + factor.getName() + "\""; + } + + return String.format(isisFactorDistribution, factorNames, distribution, parameters); + } + /** * * @param value Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -35,6 +35,9 @@ import fr.ifremer.isisfish.simulator.sensitivity.Distribution.DistributionParam; import fr.ifremer.isisfish.simulator.sensitivity.Domain; import fr.ifremer.isisfish.simulator.sensitivity.visitor.DomainVisitor; +import jdistlib.Uniform; +import jdistlib.rng.QMersenneTwister; +import jdistlib.rng.QRandomEngine; /** * All the continuous domains are based on distribution definition. @@ -165,17 +168,8 @@ @Override public Object getValueForIdentifier(Object identifier) { - Double result = 0d; + Double result = Uniform.quantile((Double)identifier,0,1, true,false); - /*if (isPercentageType()) { - // since 3.4.0.0, operator is always * - result = ((Double)referenceValue + (((Double)referenceValue * coefficient) - * ((2 * (Double)identifier - 1)))); - } else { - result = ((Double)identifier * ((Double)maxBound - (Double)minBound)) - + (Double)minBound; - }*/ - return result; } Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisTest.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisTest.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -27,6 +27,8 @@ import java.io.File; import java.io.IOException; +import fr.ifremer.isisfish.IsisFish; +import jdistlib.Uniform; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -97,6 +99,7 @@ protected Factor getContinuousDoubleUniformMMFactor() { // factor 1, min/max on int Factor factor1 = new Factor("test unifmm"); + factor1.setCardinality(2); ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM); domain1.addDistributionParam("min", 0.0); domain1.addDistributionParam("max", 2.0); @@ -108,6 +111,7 @@ protected Factor getContinuousDoubleUniformPcFactor() { // factor 1, min/max on int Factor factor2 = new Factor("test unifpc"); + factor2.setCardinality(2); ContinuousDomain domain2 = new ContinuousDomain(Distribution.QUNIFPC); domain2.addDistributionParam("reference", 40.0); domain2.addDistributionParam("coefficient", 0.05); @@ -195,12 +199,22 @@ // uniform min/max DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor()); SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir); - Assert.assertEquals(3, scenarii.getScenarios().size()); - + Assert.assertEquals(9, scenarii.getScenarios().size()); + // uniform pc designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor()); scenarii = script.compute(designPlan, simulationsDir); - Assert.assertEquals(3, scenarii.getScenarios().size()); + Assert.assertEquals(9, scenarii.getScenarios().size()); + + // check fail is discrete + designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor()); + try { + script.compute(designPlan, simulationsDir); + Assert.fail("Exception should have been thrown at this stage"); + } catch (SensitivityException eee){ + //do nothing + } + } /** @@ -230,8 +244,24 @@ SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("Fast").getNewSensitivityAnalysisInstance(); Assert.assertNotNull("Fast script not found in test data", script); + // uniform min/max DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor()); SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(40, scenarii.getScenarios().size()); + + // uniform pc + designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor()); + scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(40, scenarii.getScenarios().size()); + + // check fail is discrete + designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor()); + try { + script.compute(designPlan, simulationsDir); + Assert.fail("Exception should have been thrown at this stage"); + } catch (SensitivityException eee){ + //do nothing + } } @@ -246,8 +276,24 @@ SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("OptimumLHS").getNewSensitivityAnalysisInstance(); Assert.assertNotNull("OptimumLHS script not found in test data", script); + // uniform min/max DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor()); SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(10, scenarii.getScenarios().size()); + + // uniform pc + designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor()); + scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(10, scenarii.getScenarios().size()); + + // check fail is discrete + designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor()); + try { + script.compute(designPlan, simulationsDir); + Assert.fail("Exception should have been thrown at this stage"); + } catch (SensitivityException eee){ + //do nothing + } } @@ -262,8 +308,24 @@ SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RandomLHS").getNewSensitivityAnalysisInstance(); Assert.assertNotNull("RandomLHS script not found in test data", script); + // uniform min/max DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor()); SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(10, scenarii.getScenarios().size()); + + // uniform pc + designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor()); + scenarii = script.compute(designPlan, simulationsDir); + Assert.assertEquals(10, scenarii.getScenarios().size()); + + // check fail is discrete + designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor()); + try { + script.compute(designPlan, simulationsDir); + Assert.fail("Exception should have been thrown at this stage"); + } catch (SensitivityException eee){ + //do nothing + } } @@ -292,10 +354,13 @@ @Test public void testRegularFractions() throws IsisFishException, SensitivityException { SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RegularFractions").getNewSensitivityAnalysisInstance(); + SensitivityAnalysisStorage.setParameterValue(script,"pathToFunction", IsisFish.config.getDatabaseDirectory().getAbsolutePath() + "/sensitivityanalysis"); Assert.assertNotNull("RegularFractions script not found in test data", script); DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor()); SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir); + + System.out.println(); } @@ -320,5 +385,14 @@ scenarii = script.compute(designPlan, simulationsDir); Assert.assertEquals(80, scenarii.getScenarios().size()); + // check fail is discrete + designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor()); + try { + script.compute(designPlan, simulationsDir); + Assert.fail("Exception should have been thrown at this stage"); + } catch (SensitivityException eee){ + //do nothing + } + } } Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Fast.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Fast.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Fast.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -24,8 +24,10 @@ import java.io.File; import java.util.List; +import java.util.Map; import fr.ifremer.isisfish.simulator.sensitivity.*; +import org.apache.commons.lang3.StringUtils; import org.nuiton.j2r.REngine; import org.nuiton.j2r.RException; import org.nuiton.j2r.RProxy; @@ -138,33 +140,8 @@ nbExperiments = (Integer)engine.eval("dim(a$X)[1]"); - String factorDistribution = "isis.factor.distribution<-data.frame(" + - "NomFacteur=c(%s)," + - "NomDistribution=c(%s)," + - "ParametreDistribution=c(%s))"; + engine.voidEval(getIsisFactorDistribution(factors)); - // Creating the vectors. - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factorNumber; i++) { - Factor factor = factors.get(i); - ContinuousDomain domain = (ContinuousDomain) factor.getDomain(); - if (i != 0) { - distribution += ","; - parameters += ","; - factorNames += ","; - } - - distribution += "\"qunif\""; -// parameters += "\"[" + domain.getMinBound() + ";" + -// domain.getMaxBound() + "]\""; - factorNames += "\"" + factor.getName() + "\""; - } - engine.voidEval(String.format(factorDistribution, factorNames, - distribution, parameters)); - engine.voidEval("call<-a$call"); @@ -192,18 +169,7 @@ Scenario experimentScenario = new Scenario(); for (int i = 0; i < factorNumber; i++) { Factor factor = plan.getFactors().get(i); - Domain domain = factor.getDomain(); -// if ((domain instanceof MatrixContinuousDomain) -// || (domain instanceof EquationContinuousDomain)) { -// factor.setValueForIdentifier(dataFrame.get(i,j)); -// } else { -// ContinuousDomain continuousDomain = (ContinuousDomain)domain; -// Double min = continuousDomain.getCalculatorMinBound(); -// Double max = continuousDomain.getCalculatorMaxBound(); -// Double dFValue = (Double)dataFrame.get(i,j); -// Double value = min + (max - min) * dFValue; -// factor.setValueForIdentifier(value); -// } + factor.setValueForIdentifier(dataFrame.get(i,j)); experimentScenario.addFactor(factor); } thisExperimentScenarios.add(experimentScenario); Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Morris.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Morris.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Morris.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -108,8 +108,8 @@ gridJump += factor.getCardinality() / 2; - binf+= getMinBound(factor); - bsup+= getMaxBound(factor); + binf += 0; + bsup += 1; } String rInstruction = "a<-morris(model=NULL,factors=c(%s),r=%s," + Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/OptimumLHS.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/OptimumLHS.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/OptimumLHS.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -126,34 +126,7 @@ thisExperiment.setScenarios(thisExperimentScenarios); } - 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++) { - Factor tempFactor = factors.get(i); - ContinuousDomain domain = (ContinuousDomain) tempFactor.getDomain(); - if (i != 0) { - distribution += ","; - factorNames += ","; - parameters += ","; - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - distribution += "\"qunif\""; - //add [min;max] to parameters -// parameters += "\"[" + domain.getMinBound() + ";" + -// domain.getMaxBound() + "]\""; - } - - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); + engine.voidEval(getIsisFactorDistribution(factors)); engine.voidEval("call<-" + "\"x<-optimumLHS(" + "n=" + param_simulationNumber Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RandomLHS.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RandomLHS.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RandomLHS.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -122,35 +122,8 @@ thisExperiment.setScenarios(thisExperimentScenarios); } - String isisFactorDistribution = "isis.factor.distribution<-" + - "data.frame(" + - "NomFacteur=c(%s)," + - "NomDistribution=c(%s)," + - "ParametreDistribution=c(%s))"; + engine.voidEval(getIsisFactorDistribution(factors)); - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - - //Create the strings for the isis.MethodExp instruction - for (int i = 0; i < factors.size(); i++) { - ContinuousDomain domain = (ContinuousDomain)factors.get(i).getDomain(); - if (i != 0) { - distribution += ","; //the distribution - factorNames += ","; //the factor names - parameters += ","; //the parameters - } - - factorNames += "\"" + factors.get(i).getName() + "\""; - distribution += "\"qunif\""; //all distributions are qunif -// double min = domain.getCalculatorMinBound(); -// double max = domain.getCalculatorMaxBound(); -// parameters += "\"[" + min + ";" + max + "]\""; - } - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval("call<-" + "\"x<-randomLHS(" + param_simulationNumber + "," + factorNumber + ")\""); Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularExpandGrid.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularExpandGrid.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularExpandGrid.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -100,8 +100,8 @@ Domain domain = factor.getDomain(); if (domain instanceof ContinuousDomain) { - ContinuousDomain contDomain = (ContinuousDomain) domain; - int card = factor.getCardinality(); +// ContinuousDomain contDomain = (ContinuousDomain) domain; +// int card = factor.getCardinality(); // Double min = contDomain.getCalculatorMinBound(); // Double max = contDomain.getCalculatorMaxBound(); // Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularFractions.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularFractions.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/RegularFractions.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -91,7 +91,6 @@ //Create a string with all factors names for (int i = 0; i < factorNumber; i++) { - Domain domain = factors.get(i).getDomain(); if (i != 0) { factorNames += ","; } @@ -151,18 +150,7 @@ Scenario experimentScenario = new Scenario(); for (int i = 0; i < factors.size(); i++) { Factor factor = plan.getFactors().get(i); - Domain domain = factor.getDomain(); - Double dFValue = (Double)dataFrame.get(i,j); -// if ((domain instanceof MatrixContinuousDomain) -// || (domain instanceof EquationContinuousDomain)) { -// factor.setValueForIdentifier(dFValue); -// } else { -// ContinuousDomain contDomain = (ContinuousDomain)domain; -// Double max = contDomain.getCalculatorMaxBound(); -// Double min = contDomain.getCalculatorMinBound(); -// Double value = min + (max - min) * dFValue / (param_p - 1); -// factor.setValueForIdentifier(value); -// } + factor.setValueForIdentifier(dataFrame.get(i,j)); experimentScenario.addFactor(factor); } thisExperimentScenarios.add(experimentScenario); @@ -201,7 +189,7 @@ } engine.voidEval(dataframe); - engine.voidEval("isis.factor.distribution<-c(0.0)"); + engine.voidEval(getIsisFactorDistribution(factors)); engine.voidEval("isis.MethodExp<-list(" + "\"isis.factors\"=isis.factors," + Modified: branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Sobol.java =================================================================== --- branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Sobol.java 2013-11-22 15:31:45 UTC (rev 3841) +++ branches/4.0.1/src/test/resources/test-database/sensitivityanalysis/Sobol.java 2013-11-22 17:52:48 UTC (rev 3842) @@ -106,20 +106,7 @@ String x = "<-data.frame(matrix(c("; for (int i = 0; i < factorNumber; i++) { - Factor factor = factors.get(i); - ContinuousDomain domain = (ContinuousDomain)factor.getDomain(); - - Distribution r_distribution = domain.getDistribution(); - - x += r_distribution.getInstruction() +"("+param_n+","; - - for (Map.Entry<String,Object> param:domain.getDistributionParameters().entrySet()){ - x += param.getKey() + "=" + param.getValue() + ","; - } - - x = StringUtils.removeEnd(x, ","); - - x+= "),"; + x += "runif("+param_n+"),"; } x = StringUtils.removeEnd(x, ","); @@ -152,43 +139,8 @@ nbExperiments = dataFrame.dim()[0]; - String isisFactorDistribution = "isis.factor.distribution<-" + - "data.frame(NomFacteur=c(%s)," + - "NomDistribution=c(%s)," + - "ParametreDistribution=c(%s))"; + engine.voidEval(getIsisFactorDistribution(factors)); - // Creating the vectors. - String distribution = ""; - String parameters = ""; - String factorNames = ""; - - for (int i = 0; i < factorNumber; i++) { - Factor factor = factors.get(i); - ContinuousDomain domain = (ContinuousDomain)factor.getDomain(); - if (i != 0) { - distribution += ","; - parameters += ","; - factorNames += ","; - } - - Distribution r_distribution = domain.getDistribution(); - - distribution += "\""+ r_distribution.getInstruction() +"\""; - parameters += "\"["; - - for (Map.Entry<String,Object> param:domain.getDistributionParameters().entrySet()){ - parameters += param.getKey() + "=" + param.getValue() + ";"; - } - - parameters = StringUtils.removeEnd(parameters, ";"); - parameters += "]\""; - - factorNames += "\"" + factor.getName() + "\""; - } - - engine.voidEval(String.format(isisFactorDistribution, factorNames, - distribution, parameters)); - engine.voidEval("call<-a$call"); engine.voidEval("isis.MethodExp<-list(" +