Author: chatellier Date: 2011-03-30 16:26:57 +0000 (Wed, 30 Mar 2011) New Revision: 3220 Log: Gere les groups de facteurs apres calcul par les calculators et leurs g?\195?\169n?\195?\169rations dans le prescript de simulation. Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityCalculator.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Domain.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/DiscreteDomain.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -82,6 +82,7 @@ import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.Scenario; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; @@ -437,6 +438,8 @@ TopiaContext context = regionStorage.getStorage().beginTransaction(); sensitivitycalculator.setTopiaContext(context); + // Sensitivity scenario returned contains same factor references + // as input design plan. Factor group are still present SensitivityScenarios sensitivityScenarios = sensitivitycalculator .compute(designPlan, masterExportDirectory); @@ -509,15 +512,24 @@ } } + /** Permet de manipuler un int entre plusieurs appele de methodes recursive. */ + public static class Counter { + protected int counter = 0; + public void inc() { + counter++; + } + public int getCounter() { + return counter; + } + } + /** * Generate prescript to set factor values before simulation start. * * @param scenario to generate prescript * @return simulation pre script with correct values - * @throws IOException if pre script can't be made */ - protected String generatePreScript(Scenario scenario) throws IOException { - + protected String generatePreScript(Scenario scenario) { ConvertUtilsBean beanUtils = ConverterUtil.getConverter(null); // n'utilise plus freemarker, car il y avait plus d'instruction @@ -530,72 +542,93 @@ buffer.append("ConvertUtilsBean beanUtils = ConverterUtil.getConverter(db);\n"); buffer.append("SimulationParameter params = context.getSimulationStorage().getParameter();\n"); - int factorIndex = 0; // pour les collision de nom value - for (Factor factor : scenario.getFactors()) { - buffer.append("/* factor : ").append(factor.getName()).append(" */\n"); + generatePreScript(beanUtils, buffer, new Counter(), scenario.getFactors()); + + String scriptContent = buffer.toString(); + if (log.isTraceEnabled()) { + log.trace("Simulation prescript content = " + scriptContent); + } + return scriptContent; + } - // cas special 1 : population de départ - if (factor.getPath().startsWith("parameters.population.")) { - String paramName = StringUtils.removeStart(factor.getPath(), "parameters."); - paramName += ".number"; - // pas de convert, c'est fait comme ca dans - // SimulationParameters.toProperties(); - MatrixND matrix = (MatrixND)factor.getValue(); - Object stringValue = String.valueOf(matrix.toList()); - buffer.append("params.setProperty(\"").append(paramName).append("\",\"").append(stringValue).append("\");\n"); + /** + * Generate prescript for a factor list that can be called recursively to + * manage factor group. + * + * @param beanUtils beanUtils converter + * @param buffer buffer to fill + * @param level call level used to avoid variables name collision + * @param factors factor list to manage + */ + protected void generatePreScript(ConvertUtilsBean beanUtils, StringBuffer buffer, Counter counter, Collection<Factor> factors) { + + for (Factor factor : factors) { + if (factor instanceof FactorGroup) { + buffer.append("/* factor group : ").append(factor.getName()).append(" */\n"); + FactorGroup factorGroup = (FactorGroup)factor; + generatePreScript(beanUtils, buffer, counter, factorGroup.getFactors()); } - // cas special 2 : regles - else if (factor.getPath().equals("parameters.rules")) { - List<Rule> rules = (List<Rule>)factor.getValue(); - List<String> rulesNames = new ArrayList<String>(); - int ruleIndex = 0; - for (Rule rule : rules) { - rulesNames.add(rule.getClass().getSimpleName()); - Properties rulesProps = RuleHelper.getRuleAsProperties(ruleIndex++, null, rule); - for (String rulesProp : rulesProps.stringPropertyNames()) { - String value = rulesProps.getProperty(rulesProp); - buffer.append("params.setProperty(\"").append(rulesProp).append("\",\"").append(value).append("\");\n"); + else { + int factorIndex = counter.getCounter(); + buffer.append("/* factor : ").append(factor.getName()).append(" */\n"); + + // cas special 1 : population de départ + if (factor.getPath().startsWith("parameters.population.")) { + String paramName = StringUtils.removeStart(factor.getPath(), "parameters."); + paramName += ".number"; + // pas de convert, c'est fait comme ca dans + // SimulationParameters.toProperties(); + MatrixND matrix = (MatrixND)factor.getValue(); + Object stringValue = String.valueOf(matrix.toList()); + buffer.append("params.setProperty(\"").append(paramName).append("\",\"").append(stringValue).append("\");\n"); + } + // cas special 2 : regles + else if (factor.getPath().equals("parameters.rules")) { + List<Rule> rules = (List<Rule>)factor.getValue(); + List<String> rulesNames = new ArrayList<String>(); + int ruleIndex = 0; + for (Rule rule : rules) { + rulesNames.add(rule.getClass().getSimpleName()); + Properties rulesProps = RuleHelper.getRuleAsProperties(ruleIndex++, null, rule); + for (String rulesProp : rulesProps.stringPropertyNames()) { + String value = rulesProps.getProperty(rulesProp); + buffer.append("params.setProperty(\"").append(rulesProp).append("\",\"").append(value).append("\");\n"); + } } + buffer.append("params.setProperty(\"rules\",\"").append(StringUtils.join(rulesNames, ",")).append("\");\n"); } - buffer.append("params.setProperty(\"rules\",\"").append(StringUtils.join(rulesNames, ",")).append("\");\n"); + // cas special 3 : equation + else if (factor.getDomain() instanceof EquationContinuousDomain) { + EquationContinuousDomain domain = (EquationContinuousDomain)factor.getDomain(); + buffer.append("context.setValue(\"").append(factor.getName()); + buffer.append("\",").append(factor.getValue()).append(",\""); + buffer.append(domain.getOperator()).append("\");\n"); + } + // cas pas si special + else { + Object value = factor.getValue(); + String stringValue = beanUtils.convert(value); + String path = factor.getPath(); + String topiaId = path.substring(0, path.lastIndexOf('#')); + String property = path.substring(path.lastIndexOf('#') + 1); + // Double value123 = beanUtils.convert("mystringvalue", Double.class); + buffer.append(value.getClass().getName()).append(" value"); + buffer.append(factorIndex).append(" = beanUtils.convert(\""); + buffer.append(stringValue).append("\", ").append(value.getClass().getName()); + buffer.append(".class);\n"); + // TopiaEntity entity123 = db.findByTopiaId(topiaId); + buffer.append("TopiaEntity entity").append(factorIndex); + buffer.append(" = db.findByTopiaId(\"").append(topiaId); + buffer.append("\");\n"); + // BeanUtils.setProperty(entity123, "property", value123); + buffer.append("BeanUtils.setProperty(entity").append(factorIndex); + buffer.append(", \"").append(property).append("\", "); + buffer.append("value").append(factorIndex).append(");\n"); + } } - // cas special 3 : equation - else if (factor.getDomain() instanceof EquationContinuousDomain) { - EquationContinuousDomain domain = (EquationContinuousDomain)factor.getDomain(); - buffer.append("context.setValue(\"").append(factor.getName()); - buffer.append("\",").append(factor.getValue()).append(",\""); - buffer.append(domain.getOperator()).append("\");\n"); - } - // cas pas si special - else { - Object value = factor.getValue(); - String stringValue = beanUtils.convert(value); - String path = factor.getPath(); - String topiaId = path.substring(0, path.lastIndexOf('#')); - String property = path.substring(path.lastIndexOf('#') + 1); - // Double value123 = beanUtils.convert("mystringvalue", Double.class); - buffer.append(value.getClass().getName()).append(" value"); - buffer.append(factorIndex).append(" = beanUtils.convert(\""); - buffer.append(stringValue).append("\", ").append(value.getClass().getName()); - buffer.append(".class);\n"); - // TopiaEntity entity123 = db.findByTopiaId(topiaId); - buffer.append("TopiaEntity entity").append(factorIndex); - buffer.append(" = db.findByTopiaId(\"").append(topiaId); - buffer.append("\");\n"); - // BeanUtils.setProperty(entity123, "property", value123); - buffer.append("BeanUtils.setProperty(entity").append(factorIndex); - buffer.append(", \"").append(property).append("\", "); - buffer.append("value").append(factorIndex).append(");\n"); - } - - factorIndex++; - } - String scriptContent = buffer.toString(); - if (log.isTraceEnabled()) { - log.trace("Simulation prescript content = " + scriptContent); + counter.inc(); } - return scriptContent; } protected void submit(SimulationJob job) { Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityCalculator.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityCalculator.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityCalculator.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -216,7 +216,7 @@ for (Factor factor:factors) { if (factor.getDomain() instanceof DiscreteDomain) { String attributeValues = "list("; - Collection values = ((DiscreteDomain) factor.getDomain()) + Collection<Object> values = ((DiscreteDomain) factor.getDomain()) .getValues().values(); for (Object j:values) { attributeValues += j + ","; Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Domain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Domain.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Domain.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -59,19 +59,28 @@ * @return found value or <tt>null</tt> if not found */ Object getValueForIdentifier(Object identifier); - + /** + * Compute value for domain. + * + * @param valueIdentifier + * @return computed value for domain + * @since 3.3.1.0 + */ + public Object getComputedValueForIdentifier(Object valueIdentifier); + + /** * Accept a new visitor. * * @param visitor */ public void accept(DomainVisitor visitor); - + /** * Clone the domain * * @return the domain cloned */ - public Domain clone(); + } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -182,6 +182,17 @@ } /** + * This method is protected and can be called only by {@link FactorGroup} + * to compute given valueIdentifier with specific factor domain + * implementation. + * + * @param valueIdentifier + */ + protected void setComputedValueForIdentifier(Object valueIdentifier) { + value = domain.getComputedValueForIdentifier(valueIdentifier); + } + + /** * Get path. * * @return the path @@ -222,10 +233,9 @@ try { f = (Factor)super.clone(); - f.domain = domain.clone(); - //f.path = path; - // FIXME make real clone() for value - //f.value = value; + if (domain != null) { + f.domain = domain.clone(); + } } catch (CloneNotSupportedException e) { throw new RuntimeException("Error on clone()", e); } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -273,6 +273,38 @@ } /** + * Return factor group domain depending of factor group type (discrete/continuous). + * + * @return factor group domain + */ + @Override + public Domain getDomain() { + Domain domain = null; + if (isContinuous()) { + domain = new ContinuousDomain(0.0, 1.0); + } + else if (isDiscrete()) { + // les domaines doivent avoir les même domaines + // et pour l'utilisation quand fera l'appelant + // de getDomain(), on peut en retourner un au hazard + domain = factors.get(0).getDomain(); + } + // else pas de factor dans le group + return domain; + } + + /** + * Set value for label. + * + * @param valueIdentifier new value identifier to get + */ + public void setValueForIdentifier(Object valueIdentifier) { + for (Factor factor : factors) { + factor.setComputedValueForIdentifier(valueIdentifier); + } + } + + /** * Accept a new visitor. * * @param visitor Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -108,6 +108,19 @@ public Object getValueForIdentifier(Object identifier) { return identifier; } + + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.Domain#getComputedValueForIdentifier(java.lang.Object) + */ + @Override + public Object getComputedValueForIdentifier(Object valueIdentifier) { + // dans ce cas, la value est entre 0 et 1 + double doubleValue = (Double)valueIdentifier; + + double value = minBound + (minBound + maxBound) * doubleValue; + + return value; + } /** * Accept a new visitor. Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/DiscreteDomain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/DiscreteDomain.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/DiscreteDomain.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -94,6 +94,14 @@ return values.get(identifier); } + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.Domain#getComputedValueForIdentifier(java.lang.Object) + */ + @Override + public Object getComputedValueForIdentifier(Object valueIdentifier) { + return getValueForIdentifier(valueIdentifier); + } + /** * Accept a new visitor. * Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin + * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -177,6 +177,14 @@ } return identifier; } + + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.Domain#getComputedValueForIdentifier(java.lang.Object) + */ + @Override + public Object getComputedValueForIdentifier(Object valueIdentifier) { + return getValueForIdentifier(valueIdentifier); + } /** * Get value used to create the equation. Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin + * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -168,6 +168,14 @@ return temp; } + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.Domain#getComputedValueForIdentifier(java.lang.Object) + */ + @Override + public Object getComputedValueForIdentifier(Object valueIdentifier) { + return getValueForIdentifier(valueIdentifier); + } + /** * Get value used to create the matrix. * Modified: isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java =================================================================== --- isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2011-03-30 16:16:09 UTC (rev 3219) +++ isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2011-03-30 16:26:57 UTC (rev 3220) @@ -25,7 +25,6 @@ package fr.ifremer.isisfish.simulator.launcher; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; @@ -58,6 +57,7 @@ import fr.ifremer.isisfish.simulator.SimulationParameterImpl; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.Scenario; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculatorRandomMock; @@ -66,7 +66,6 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDomain; -import freemarker.template.TemplateException; /** * Test for {@link SimulationService}. @@ -227,13 +226,11 @@ /** * Test la generation de facteur simple. * - * @throws IOException - * @throws TemplateException * @throws StorageException * @throws TopiaException */ @Test - public void testFactorPreScriptFactorInt() throws IOException, TemplateException, StorageException, TopiaException { + public void testFactorPreScriptFactorInt() throws StorageException, TopiaException { // factor Factor factor = new Factor("testint"); @@ -262,18 +259,12 @@ /** * Creer un simulation. * Creer un populationSeasonInfoDAO. - * Affectation de la matrice m1. - * Le prescript doit la changer en m2. * - * @throws IOException - * @throws TemplateException * @throws StorageException * @throws TopiaException - * - * FIXME fix this test (empty schema error) */ @Test - public void testFactorPreScriptFactorMatrix() throws IOException, TemplateException, StorageException, TopiaException { + public void testFactorPreScriptFactorMatrix() throws StorageException, TopiaException { // matrix 1 MatrixND matrix1 = MatrixFactory.getInstance().create("test1", @@ -329,13 +320,11 @@ /** * Creer un scenario basé sur les EquationDomain. * - * @throws IOException - * @throws TemplateException * @throws StorageException * @throws TopiaException */ @Test - public void testFactorPreScriptEquation() throws IOException, TemplateException, StorageException, TopiaException { + public void testFactorPreScriptEquation() throws StorageException, TopiaException { // factor Factor factorEquation = new Factor("test.equation.name.K1"); @@ -356,7 +345,7 @@ SimulationService service = SimulationService.getService(); String scriptContent = service.generatePreScript(scenario); - log.info("Script = " + scriptContent); + //log.info("Script = " + scriptContent); // le nom de la valeur de la variable n'apparait pas "en elle meme" // dans le prescript, il y a seulement le nom @@ -368,12 +357,10 @@ * Test que la generation du prescript avec l'ajout des populations * de départ et des regles de IsisFish 3.3.1.0 fonctionne correctement. * - * @throws TemplateException - * @throws IOException * @throws IsisFishException */ @Test - public void testPrescriptGenerationPopAndRules() throws IOException, TemplateException, IsisFishException { + public void testPrescriptGenerationPopAndRules() throws IsisFishException { // get a context to a database RegionStorage regionStorage = RegionStorage.getRegion("BaseMotosICA"); @@ -416,11 +403,92 @@ // generate prescript for that wonderfull scenario SimulationService service = SimulationService.getService(); String preScriptContent = service.generatePreScript(scenario1); - log.info("Script = " + preScriptContent); + //log.info("Script = " + preScriptContent); Assert.assertTrue(preScriptContent.contains("params.setProperty(\"population.xxx.number\"")); Assert.assertTrue(preScriptContent.contains("params.setProperty(\"rule.0.parameter.species\",\"fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378\");")); Assert.assertTrue(preScriptContent.contains("params.setProperty(\"rule.1.parameter.propSurvie\",\"42.0\");")); Assert.assertTrue(preScriptContent.contains("rules\",\"TACpoids,TailleMin\")")); } + + /** + * Test que la generation du prescript avec l'ajout des groupes des facteurs + * depuis IsisFish 3.3.1.0 fonctionne correctement. + * + * @throws IsisFishException + */ + @Test + public void testPrescriptGenerationGroups() throws IsisFishException { + + // build test scenario + Scenario scenario1 = new Scenario(); + + // factor 1 + Factor factor1 = new Factor("factor 1 (double)"); + ContinuousDomain domain1 = new ContinuousDomain(); + domain1.setMinBound(0.0); + domain1.setMaxBound(50.0); + domain1.setCardinality(4); + factor1.setDomain(domain1); + factor1.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); + + // factor 2 + Factor factor2 = new Factor("factor 2 (double)"); + ContinuousDomain domain2 = new ContinuousDomain(); + domain2.setMinBound(1.0); + domain2.setMaxBound(9.0); + domain2.setCardinality(3); + factor2.setDomain(domain2); + factor2.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength"); + + // factor 3 + Factor factor3 = new Factor("factor 3 (double)"); + DiscreteDomain domain3 = new DiscreteDomain(); + domain3.getValues().put(0.0, 12.3); + domain3.getValues().put(1.0, 70.9); + domain3.getValues().put(2.0, 21.0); + domain3.getValues().put(3.0, -12.1); + domain3.getValues().put(4.0, -8.45); + factor3.setDomain(domain3); + factor3.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); + + // factor 4 + Factor factor4 = new Factor("factor 4 (double)"); + DiscreteDomain domain4 = new DiscreteDomain(); + domain4.getValues().put(0.0, -7.3); + domain4.getValues().put(1.0, 4.9); + domain4.getValues().put(2.0, -42.0); + domain4.getValues().put(3.0, 27.1); + domain4.getValues().put(4.0, 53.32); + factor4.setDomain(domain4); + factor4.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength"); + + // group continu + FactorGroup group1 = new FactorGroup("myContinuousGroup"); + group1.addFactor(factor1); + group1.addFactor(factor2); + + // group discret + FactorGroup group2 = new FactorGroup("myDiscreteGroup"); + group2.addFactor(factor3); + group2.addFactor(factor4); + + // compute AS => scenario + group1.setValueForIdentifier(0.75); + scenario1.addFactor(group1); + group2.setValueForIdentifier(2.0); + scenario1.addFactor(group2); + + // generate prescript for that wonderfull scenario + SimulationService service = SimulationService.getService(); + String preScriptContent = service.generatePreScript(scenario1); + //log.info("Script = " + preScriptContent); + + Assert.assertTrue(preScriptContent.contains("/* factor group : myContinuousGroup */")); + Assert.assertTrue(preScriptContent.contains("beanUtils.convert(\"37.5\"")); + Assert.assertTrue(preScriptContent.contains("beanUtils.convert(\"8.5\"")); + Assert.assertTrue(preScriptContent.contains("/* factor group : myDiscreteGroup */")); + Assert.assertTrue(preScriptContent.contains("beanUtils.convert(\"21.0\"")); + Assert.assertTrue(preScriptContent.contains("value4 = beanUtils.convert(\"-42.0\"")); + } }