r3211 - in isis-fish/branches/3.3.1/src: main/java/fr/ifremer/isisfish/simulator main/java/fr/ifremer/isisfish/simulator/launcher main/resources/templates test/java/fr/ifremer/isisfish/simulator test/java/fr/ifremer/isisfish/simulator/launcher
Author: chatellier Date: 2011-03-29 10:12:18 +0000 (Tue, 29 Mar 2011) New Revision: 3211 Log: Retrait du script freemarker pour la generation du prescript (stringbuffer c'est la vie). Gestion des populations de d?\195?\169part et des regles. Removed: isis-fish/branches/3.3.1/src/main/resources/templates/prescript/ Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.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/SimulationPreScript.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java 2011-03-29 10:11:07 UTC (rev 3210) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java 2011-03-29 10:12:18 UTC (rev 3211) @@ -77,10 +77,10 @@ bsh.eval("import org.nuiton.topia.*;"); bsh.eval("import org.nuiton.topia.persistence.*;"); bsh.eval("import fr.ifremer.isisfish.*;"); - bsh.eval("import java.util.*;"); bsh.eval("import fr.ifremer.isisfish.types.*;"); bsh.eval("import fr.ifremer.isisfish.types.Date;"); bsh.eval("import fr.ifremer.isisfish.entities.*;"); + bsh.eval("import java.util.*;"); bsh.eval(presimulationScript); tx.commitTransaction(); 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-29 10:11:07 UTC (rev 3210) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2011-03-29 10:12:18 UTC (rev 3211) @@ -32,8 +32,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -49,6 +47,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import org.apache.commons.beanutils.ConvertUtilsBean; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.mutable.MutableInt; import org.apache.commons.lang.time.DurationFormatUtils; @@ -74,23 +73,20 @@ import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.mexico.MexicoHelper; import fr.ifremer.isisfish.rule.Rule; +import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.AnalysePlan; import fr.ifremer.isisfish.simulator.AnalysePlanContext; import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.simulator.SimulationException; 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.Scenario; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityScenarios; -import fr.ifremer.isisfish.util.ClasspathTemplateLoader; +import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.util.CompileHelper; import fr.ifremer.isisfish.util.ConverterUtil; -import freemarker.cache.TemplateLoader; -import freemarker.ext.beans.BeansWrapper; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; /** * Cette classe est responsable de conservation de toutes les simulations faites @@ -126,12 +122,6 @@ protected static SimulationService instance = new SimulationService(); - /** Freemarker configuration used to get prescripts content. */ - protected Configuration freemarkerConfiguration; - - /** Freemarker pre script template. */ - protected static final String SENSITIVITY_PRE_SCRIPT = "templates/prescript/factorprescript.ftl"; - /** * Retourne l'instance du {@link SimulationService} a utiliser * @return l'instance a utiliser @@ -519,55 +509,86 @@ } /** - * Get freemarker configuration. - */ - protected Configuration getFreemarkerConfiguration() { - Configuration configuration = new Configuration(); - - // needed to overwrite "Defaults to default system encoding." - // fix encoding issue on some systems - configuration.setDefaultEncoding("utf-8"); - - // specific template loader to get template from jars (classpath) - TemplateLoader templateLoader = new ClasspathTemplateLoader(); - configuration.setTemplateLoader(templateLoader); - - configuration.setObjectWrapper(new BeansWrapper()); - - return configuration; - } - - /** * Generate prescript to set factor values before simulation start. * - * @param scenario + * @param scenario to generate prescript * @return simulation pre script with correct values * @throws IOException if pre script can't be made - * @throws TemplateException if pre script can't be made */ - protected String generatePreScript(Scenario scenario) throws IOException, - TemplateException { + protected String generatePreScript(Scenario scenario) throws IOException { - // init one at first call - if (freemarkerConfiguration == null) { - freemarkerConfiguration = getFreemarkerConfiguration(); - } + ConvertUtilsBean beanUtils = ConverterUtil.getConverter(null); - Writer out = new StringWriter(); - Template template = freemarkerConfiguration - .getTemplate(SENSITIVITY_PRE_SCRIPT); - Map<String, Object> root = new HashMap<String, Object>(); - root.put("scenario", scenario); - root.put("beanUtils", ConverterUtil.getConverter(null)); + // n'utilise plus freemarker, car il y avait plus d'instruction + // freemarker compliqué que de code a afficher + StringBuffer buffer = new StringBuffer(); + buffer.append("import org.apache.commons.beanutils.BeanUtils;\n"); + buffer.append("import org.apache.commons.beanutils.ConvertUtilsBean;\n"); + buffer.append("import fr.ifremer.isisfish.util.ConverterUtil;\n"); + buffer.append("import fr.ifremer.isisfish.simulator.SimulationParameter;\n"); + buffer.append("ConvertUtilsBean beanUtils = ConverterUtil.getConverter(db);\n"); + buffer.append("SimulationParameter params = context.getSimulationStorage().getParameter();\n"); - template.process(root, out); - out.flush(); - String scriptContent = out.toString(); + int factorIndex = 0; // pour les collision de nom value + for (Factor factor : scenario.getFactors()) { + buffer.append("/* factor : ").append(factor.getName()).append(" */\n"); + // cas special 1 : population de départ + if (factor.getPath().startsWith("parameters.population.")) { + Object stringValue = beanUtils.convert(factor.getValue()); + buffer.append("params.setProperty(\"").append(factor.getPath()).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"); + } + // 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); } - return scriptContent; } Modified: isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java =================================================================== --- isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java 2011-03-29 10:11:07 UTC (rev 3210) +++ isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java 2011-03-29 10:12:18 UTC (rev 3211) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, 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 @@ -25,58 +25,28 @@ package fr.ifremer.isisfish.simulator; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import junit.framework.Assert; - import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtilsBean; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.math.matrix.MatrixFactory; -import org.nuiton.math.matrix.MatrixND; -import org.nuiton.math.matrix.MatrixNDImpl; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaException; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.nuiton.math.matrix.MatrixFactory; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.math.matrix.MatrixNDImpl; import fr.ifremer.isisfish.AbstractIsisFishTest; -import fr.ifremer.isisfish.IsisFishDAOHelper; -import fr.ifremer.isisfish.datastore.SimulationStorage; -import fr.ifremer.isisfish.datastore.StorageException; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.PopulationImpl; -import fr.ifremer.isisfish.entities.PopulationSeasonInfo; -import fr.ifremer.isisfish.entities.PopulationSeasonInfoDAO; -import fr.ifremer.isisfish.entities.VesselType; -import fr.ifremer.isisfish.entities.VesselTypeDAO; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; -import fr.ifremer.isisfish.simulator.sensitivity.Scenario; -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.util.ConverterUtil; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; /** * Test for simulation prescript. * - * Creer un populationSeasonInfoDAO. - * Affectation de la matrice m1. - * Le prescript doit la changer en m2. - * * @author chatellier * @version $Revision$ * @@ -84,263 +54,23 @@ * By : $Author$ */ public class SimulationPreScriptTest extends AbstractIsisFishTest { - - /** log. */ - private static Log log = LogFactory.getLog(SimulationPreScriptTest.class); - - protected static Configuration freemarkerConfiguration; @Before public void setUp() throws Exception { // not do it in @BeforeClass // test will fail ! init(); - freemarkerConfiguration = getFreemarkerConfiguration(); // very important , other test wil fail with that //System.setProperty("hibernate.hbm2ddl.auto", "create"); } - + @After public void tearDown() { // very important , other test wil fail with that //System.clearProperty("hibernate.hbm2ddl.auto"); } - - /** - * Creer un simulation. - * - * @throws IOException - * @throws TemplateException - * @throws StorageException - * @throws TopiaException - * - * FIXME fix this test (empty schema error) - */ - @Test - public void testFactorPreScriptFactorInt() throws IOException, TemplateException, StorageException, TopiaException { - String topiaId = null; - - // init simulation - SimulationContext context = SimulationContext.get(); - SimulationParameter params = new SimulationParameterImpl(); - SimulationStorage simulation = SimulationStorage.create("test_1_int", params); - TopiaContext storageContext = simulation.getStorage(); - storageContext.createSchema(); - TopiaContext childStorageContext = storageContext.beginTransaction(); - VesselTypeDAO vesselTypeDAO = IsisFishDAOHelper.getVesselTypeDAO(childStorageContext); - VesselType vesselType = vesselTypeDAO.create(); - vesselType.setLength(4); - vesselType.update(); - topiaId = vesselType.getTopiaId(); - childStorageContext.commitTransaction(); - - // factor - Factor factor = new Factor("testint"); - ContinuousDomain domain = new ContinuousDomain(); - domain.setMinBound(0); - domain.setMaxBound(50); - factor.setDomain(domain); - factor.setPath(topiaId + "#length"); - factor.setValueForIdentifier(49); - - Assert.assertEquals((Integer)49, factor.getValue()); - - // scenario - Scenario scenario = new Scenario(); - List<Factor> factors = new ArrayList<Factor>(); - factors.add(factor); - scenario.setFactors(factors); - - // context values - Map<String, Object> root = new HashMap<String, Object>(); - root.put("scenario", scenario); - root.put("beanUtils", ConverterUtil.getConverter(null)); - - // process template - Template template = freemarkerConfiguration - .getTemplate("templates/prescript/factorprescript.ftl"); - Writer out = new StringWriter(); - template.process(root, out); - out.flush(); - String scriptContent = out.toString(); - log.info("Script = " + scriptContent); - - // - SimulationPreScript simulationPreScript = new SimulationPreScript(); - params.setUsePreScript(true); - params.setPreScript(scriptContent); - - context.setSimulationStorage(simulation); - // FIXME here is the error, getDb throw exception - //simulationPreScript.beforeSimulation(context); - SimulationContext.remove(); - - // try to find previous entity - vesselType = vesselTypeDAO.findByTopiaId(topiaId); - - // FIXME should test value remplaced by precript - //Assert.assertEquals(49, vesselType.getLength()); - } - /** - * 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 { - - // matrix 1 - MatrixND matrix1 = MatrixFactory.getInstance().create("test1", - new int[] { 3, 2 }, new String[] { "col1", "col2" }); - matrix1.setValue(new int[] { 0, 0 }, 13); - matrix1.setValue(new int[] { 0, 1 }, -14); - matrix1.setValue(new int[] { 1, 0 }, 21); - matrix1.setValue(new int[] { 1, 1 }, 2); - matrix1.setValue(new int[] { 2, 0 }, 12); - matrix1.setValue(new int[] { 2, 1 }, -1); - - // matrix 2 - MatrixND matrix2 = MatrixFactory.getInstance().create("test2", - new int[] { 2, 3 }, new String[] { "col1", "col2" }); - matrix2.setValue(new int[] { 0, 0 }, 9999); - matrix2.setValue(new int[] { 0, 1 }, 15000); - matrix2.setValue(new int[] { 0, 2 }, -40000); - matrix2.setValue(new int[] { 1, 0 }, 21345); - matrix2.setValue(new int[] { 1, 1 }, 81000); - matrix2.setValue(new int[] { 1, 2 }, -13000); - - String topiaId = null; - - // init simulation - SimulationContext context = SimulationContext.get(); - SimulationParameter params = new SimulationParameterImpl(); - SimulationStorage simulation = SimulationStorage.create("test_2_matrix", params); - TopiaContext storageContext = simulation.getStorage(); - storageContext.createSchema(); - TopiaContext childStorageContext = storageContext.beginTransaction(); - PopulationSeasonInfoDAO populationSeasonInfoDAO = IsisFishDAOHelper.getPopulationSeasonInfoDAO(childStorageContext); - PopulationSeasonInfo populationSeasonInfo = populationSeasonInfoDAO.create(); - populationSeasonInfo.setMigrationMatrix(matrix1); - populationSeasonInfo.update(); - topiaId = populationSeasonInfo.getTopiaId(); - childStorageContext.commitTransaction(); - - // factor - Factor factor1 = new Factor("testmatrix"); - DiscreteDomain domain1 = new DiscreteDomain(); - domain1.getValues().put("m1", matrix1); - factor1.setDomain(domain1); - factor1.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); - factor1.setValueForIdentifier("m1"); - - // factor - Factor factor2 = new Factor("testmatrix"); - DiscreteDomain domain2 = new DiscreteDomain(); - domain2.getValues().put("m2", matrix1); - factor2.setDomain(domain2); - factor2.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); - factor2.setValueForIdentifier("m2"); - - // scenario - Scenario scenario = new Scenario(); - List<Factor> factors = new ArrayList<Factor>(); - factors.add(factor1); - factors.add(factor2); - scenario.setFactors(factors); - - // context values - Map<String, Object> root = new HashMap<String, Object>(); - root.put("scenario", scenario); - root.put("beanUtils", ConverterUtil.getConverter(null)); - - // process template - Template template = freemarkerConfiguration - .getTemplate("templates/prescript/factorprescript.ftl"); - Writer out = new StringWriter(); - template.process(root, out); - out.flush(); - String scriptContent = out.toString(); - log.info("Script = " + scriptContent); - - // - SimulationPreScript simulationPreScript = new SimulationPreScript(); - params.setUsePreScript(true); - params.setPreScript(scriptContent); - - context.setSimulationStorage(simulation); - // FIXME here is the error, getDb throw exception - //simulationPreScript.beforeSimulation(context); - SimulationContext.remove(); - - // try to find previous entity - populationSeasonInfo = populationSeasonInfoDAO.findByTopiaId(topiaId); - // FIXME should test value remplaced by precript - //Assert.assertEquals(matrix2, populationSeasonInfo.getMigrationMatrix()); - } - - /** - * Creer un scenario basé sur les EquationDomain. - * - * @throws IOException - * @throws TemplateException - * @throws StorageException - * @throws TopiaException - */ - @Test - public void testFactorPreScriptEquation() throws IOException, TemplateException, StorageException, TopiaException { - - // factor - Factor factorEquation = new Factor("test.equation.name"); - EquationContinuousDomain domain1 = new EquationContinuousDomain(); - domain1.setReferenceValue(3.0); - domain1.setOperator("-"); - domain1.setCoefficient(0.1); - domain1.setVariableName("K1"); - factorEquation.setDomain(domain1); - factorEquation.setPath("fr.ifremer.equation1#testFactorPreScriptEquation"); - factorEquation.setValueForIdentifier(0.1); - - log.info("Script = " + domain1.getClass().getSimpleName()); - - // scenario - Scenario scenario = new Scenario(); - List<Factor> factors = new ArrayList<Factor>(); - factors.add(factorEquation); - scenario.setFactors(factors); - - // context values - Map<String, Object> root = new HashMap<String, Object>(); - root.put("scenario", scenario); - root.put("beanUtils", ConverterUtil.getConverter(null)); - - // process template - Template template = freemarkerConfiguration.getTemplate("templates/prescript/factorprescript.ftl"); - Writer out = new StringWriter(); - template.process(root, out); - out.flush(); - String scriptContent = out.toString(); - log.info("Script = " + scriptContent); - //Assert.assertTrue(scriptContent.indexOf("\"PopulationEquation.K1\", 0.68, \"-\"") != -1); - - // le nom de la valeur de la variable n'apparait pas "en elle meme" - // dans le prescript, il y a seulement le nom - // du facteur. Charge à l'UI de savoir comment l'afficher - Assert.assertTrue(scriptContent.indexOf("\"test.equation.name\", 0.68, \"-\"") != -1); - - Assert.assertTrue(scriptContent.indexOf("K1") == -1); - } - - /** * Test que les chaine represantant des matrices sont correctement * transformée en MatrixND. * 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-29 10:11:07 UTC (rev 3210) +++ isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2011-03-29 10:12:18 UTC (rev 3211) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2006 - 2010 Ifremer, Code Lutin + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, 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 @@ -25,31 +25,48 @@ package fr.ifremer.isisfish.simulator.launcher; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.nuiton.math.matrix.MatrixFactory; +import org.nuiton.math.matrix.MatrixHelper; import org.nuiton.math.matrix.MatrixND; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.IsisFishException; +import fr.ifremer.isisfish.datastore.RegionStorage; +import fr.ifremer.isisfish.datastore.RuleStorage; +import fr.ifremer.isisfish.datastore.StorageException; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.PopulationGroup; import fr.ifremer.isisfish.entities.PopulationImpl; import fr.ifremer.isisfish.entities.Strategy; import fr.ifremer.isisfish.entities.StrategyImpl; import fr.ifremer.isisfish.entities.Zone; +import fr.ifremer.isisfish.rule.Rule; +import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.SimulationParameter; 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.Scenario; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculator; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityCalculatorRandomMock; 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.simulator.sensitivity.domain.RuleDomain; +import freemarker.template.TemplateException; /** * Test for {@link SimulationService}. @@ -89,15 +106,15 @@ factor1.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); // factor 2 - /*Factor<Double> factor2 = new Factor<Double>("factor 2 (double)"); - DiscreteDomain<Double> domain2 = new DiscreteDomain<Double>(); + Factor factor2 = new Factor("factor 2 (double)"); + DiscreteDomain domain2 = new DiscreteDomain(); domain2.getValues().put(0.0, 12.3); domain2.getValues().put(1.0, 70.9); domain2.getValues().put(2.0, 21.0); domain2.getValues().put(3.0, -12.1); domain2.getValues().put(4.0, -8.45); factor2.setDomain(domain2); - factor2.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength");*/ + factor2.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength"); // factor 3 Factor factor3 = new Factor("factor 3 (double)"); @@ -206,4 +223,204 @@ } } } + + /** + * Test la generation de facteur simple. + * + * @throws IOException + * @throws TemplateException + * @throws StorageException + * @throws TopiaException + */ + @Test + public void testFactorPreScriptFactorInt() throws IOException, TemplateException, StorageException, TopiaException { + + // factor + Factor factor = new Factor("testint"); + ContinuousDomain domain = new ContinuousDomain(); + domain.setMinBound(0); + domain.setMaxBound(50); + factor.setDomain(domain); + factor.setPath("fr.ifremer.entities.Cell#1234567890#length"); + factor.setValueForIdentifier(49); + + Assert.assertEquals((Integer)49, factor.getValue()); + + // scenario + Scenario scenario = new Scenario(); + List<Factor> factors = new ArrayList<Factor>(); + factors.add(factor); + scenario.setFactors(factors); + + SimulationService service = SimulationService.getService(); + String scriptContent = service.generatePreScript(scenario); + Assert.assertTrue(scriptContent.contains("java.lang.Integer")); + Assert.assertTrue(scriptContent.contains("db.findByTopiaId(\"fr.ifremer.entities.Cell#1234567890\")")); + Assert.assertTrue(scriptContent.contains("BeanUtils.setProperty(entity0, \"length\"")); + } + + /** + * 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 { + + // matrix 1 + MatrixND matrix1 = MatrixFactory.getInstance().create("test1", + new int[] { 3, 2 }, new String[] { "col1", "col2" }); + matrix1.setValue(new int[] { 0, 0 }, 13); + matrix1.setValue(new int[] { 0, 1 }, -14); + matrix1.setValue(new int[] { 1, 0 }, 21); + matrix1.setValue(new int[] { 1, 1 }, 2); + matrix1.setValue(new int[] { 2, 0 }, 12); + matrix1.setValue(new int[] { 2, 1 }, -1); + + // matrix 2 + MatrixND matrix2 = MatrixFactory.getInstance().create("test2", + new int[] { 2, 3 }, new String[] { "col1", "col2" }); + matrix2.setValue(new int[] { 0, 0 }, 9999); + matrix2.setValue(new int[] { 0, 1 }, 15000); + matrix2.setValue(new int[] { 0, 2 }, -40000); + matrix2.setValue(new int[] { 1, 0 }, 21345); + matrix2.setValue(new int[] { 1, 1 }, 81000); + matrix2.setValue(new int[] { 1, 2 }, -13000); + + // factor + Factor factor1 = new Factor("testmatrix"); + DiscreteDomain domain1 = new DiscreteDomain(); + domain1.getValues().put("m1", matrix1); + factor1.setDomain(domain1); + factor1.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); + factor1.setValueForIdentifier("m1"); + + // factor + Factor factor2 = new Factor("testmatrix"); + DiscreteDomain domain2 = new DiscreteDomain(); + domain2.getValues().put("m2", matrix1); + factor2.setDomain(domain2); + factor2.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); + factor2.setValueForIdentifier("m2"); + + // scenario + Scenario scenario = new Scenario(); + List<Factor> factors = new ArrayList<Factor>(); + factors.add(factor1); + factors.add(factor2); + scenario.setFactors(factors); + + SimulationService service = SimulationService.getService(); + String scriptContent = service.generatePreScript(scenario); + //log.info("Script = " + scriptContent); + Assert.assertTrue(scriptContent.contains("org.nuiton.math.matrix.MatrixNDImpl ")); + Assert.assertTrue(scriptContent.contains("db.findByTopiaId(\"org.nuiton.math.matrix.MatrixND#563456293453#2.456347646\");")); + Assert.assertTrue(scriptContent.contains("BeanUtils.setProperty(entity0, \"dim\"")); + } + + /** + * Creer un scenario basé sur les EquationDomain. + * + * @throws IOException + * @throws TemplateException + * @throws StorageException + * @throws TopiaException + */ + @Test + public void testFactorPreScriptEquation() throws IOException, TemplateException, StorageException, TopiaException { + + // factor + Factor factorEquation = new Factor("test.equation.name.K1"); + EquationContinuousDomain domain1 = new EquationContinuousDomain(); + domain1.setReferenceValue(10.0); + domain1.setOperator("-"); + domain1.setCoefficient(0.1); + domain1.setVariableName("K1"); + factorEquation.setDomain(domain1); + factorEquation.setPath("fr.ifremer.equation1#testFactorPreScriptEquation"); + factorEquation.setValueForIdentifier(0.4); + + // scenario + Scenario scenario = new Scenario(); + List<Factor> factors = new ArrayList<Factor>(); + factors.add(factorEquation); + scenario.setFactors(factors); + + SimulationService service = SimulationService.getService(); + String scriptContent = service.generatePreScript(scenario); + 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 + // du facteur. Charge à l'UI de savoir comment l'afficher + Assert.assertTrue(scriptContent.contains("\"test.equation.name.K1\",8.02,\"-\"")); + } + + /** + * 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 { + + // get a context to a database + RegionStorage regionStorage = RegionStorage.getRegion("BaseMotosICA"); + TopiaContext regionContext = regionStorage.getStorage(); + + // build test scenario + Scenario scenario1 = new Scenario(); + + // factor pop + Factor factorPop = new Factor("myPopulationParams"); + factorPop.setDomain(new MatrixContinuousDomain()); + factorPop.setPath("parameters.population.xxx"); + MatrixND mat = MatrixFactory.getInstance().create(new int[]{2, 3}); + MatrixHelper.convertToId(mat); + factorPop.setValue(mat); + + // factor rule, species = c'est une des especes de la base BaseMotosICA + Rule ruleTacPoids = RuleStorage.getRule("TACpoids").getNewRuleInstance(); + Properties props = new Properties(); + props.setProperty("rule.0.parameter.species", "fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378"); + RuleHelper.populateRule(0, regionContext, ruleTacPoids, props); + Rule ruleTailleMin = RuleStorage.getRule("TailleMin").getNewRuleInstance(); + props = new Properties(); + props.setProperty("rule.0.parameter.species", "fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378"); + props.setProperty("rule.0.parameter.propSurvie", "42"); + RuleHelper.populateRule(0, regionContext, ruleTailleMin, props); + Factor factorRule = new Factor("myRuleParams"); + factorPop.setDomain(new RuleDomain()); + factorRule.setPath("parameters.rules"); + List<Rule> rules = new ArrayList<Rule>(); + rules.add(ruleTacPoids); + rules.add(ruleTailleMin); + factorRule.setValue(rules); + + List<Factor> factors = new ArrayList<Factor>(); + factors.add(factorPop); + factors.add(factorRule); + scenario1.setFactors(factors); + + // generate prescript for that wonderfull scenario + SimulationService service = SimulationService.getService(); + String preScriptContent = service.generatePreScript(scenario1); + log.info("Script = " + preScriptContent); + + Assert.assertTrue(preScriptContent.contains("params.setProperty(\"parameters.population.xxx\"")); + 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\")")); + } }
participants (1)
-
chatellier@users.labs.libre-entreprise.org