View Javadoc
1   /*
2    * #%L
3    * IsisFish
4    * 
5    * $Id: SensitivityAnalysisTest.java 4156 2014-12-09 11:27:18Z echatellier $
6    * $HeadURL: https://svn.codelutin.com/isis-fish/tags/isis-fish-4.4.0.2/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisTest.java $
7    * %%
8    * Copyright (C) 2013 Ifremer, Code Lutin, Chatellier Eric
9    * %%
10   * This program is free software: you can redistribute it and/or modify
11   * it under the terms of the GNU General Public License as
12   * published by the Free Software Foundation, either version 3 of the 
13   * License, or (at your option) any later version.
14   * 
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Public License for more details.
19   * 
20   * You should have received a copy of the GNU General Public 
21   * License along with this program.  If not, see
22   * <http://www.gnu.org/licenses/gpl-3.0.html>.
23   * #L%
24   */
25  package fr.ifremer.isisfish.simulator.sensitivity;
26  
27  import java.io.File;
28  import java.io.IOException;
29  
30  import fr.ifremer.isisfish.IsisFish;
31  
32  import org.apache.commons.io.FileUtils;
33  import org.apache.commons.logging.Log;
34  import org.apache.commons.logging.LogFactory;
35  import org.aspectj.util.FileUtil;
36  import org.junit.After;
37  import org.junit.Assert;
38  import org.junit.Assume;
39  import org.junit.Before;
40  import org.junit.Ignore;
41  import org.junit.Test;
42  import org.nuiton.j2r.RException;
43  import org.nuiton.j2r.RProxy;
44  
45  import fr.ifremer.isisfish.AbstractIsisFishTest;
46  import fr.ifremer.isisfish.IsisFishException;
47  import fr.ifremer.isisfish.datastore.SensitivityAnalysisStorage;
48  import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain;
49  import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain;
50  
51  /**
52   * Test les scripts d'AS disponible dans les ressources de tests.
53   * 
54   * @author Eric Chatellier
55   */
56  public class SensitivityAnalysisTest extends AbstractIsisFishTest {
57  
58      private static final Log log = LogFactory.getLog(SensitivityAnalysisTest.class);
59  
60      /** Simulation dir used to save Rdata files. */
61      protected File simulationsDir;
62  
63      /**
64       * Ces tests utilisent directement le moteur R, s'il n'est pas disponible,
65       * on va eviter de faire les tests.
66       */
67      @Before
68      public void setUp() {
69  
70          System.setProperty("R.type", "jni");
71          try {
72              new RProxy();
73          } catch (RException e) {
74              if (log.isDebugEnabled()) {
75                  log.debug("R not available. Skipping current test");
76              }
77              Assume.assumeNoException(e);
78          }
79          simulationsDir = FileUtil.getTempDir("simulations");
80      }
81  
82      protected DesignPlan getDesignPlan(Factor... factors) {
83          DesignPlan result = new DesignPlan();
84          int factorIndex = 1;
85          for (Factor factor : factors) {
86              factor.setName("f" + factorIndex++);
87              result.addFactor(factor);
88          }
89          return result;
90      }
91  
92      protected FactorGroup getFactorGroup(boolean continuous, Factor... factors) {
93          FactorGroup result = new FactorGroup("", continuous);
94          for (Factor factor : factors) {
95              result.addFactor(factor);
96          }
97          return result;
98      }
99  
100     protected Factor getContinuousDoubleUniformMMFactor() {
101         // factor 1, min/max on int
102         Factor factor1 = new Factor("test unifmm");
103         factor1.setCardinality(2);
104         ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM);
105         domain1.addDistributionParam("min", 0.0);
106         domain1.addDistributionParam("max", 2.0);
107         factor1.setDomain(domain1);
108         factor1.setPath("org.nuiton.factor#1234567890#0.12242345354#name");
109         return factor1;
110     }
111 
112     protected Factor getContinuousDoubleUniformPcFactor() {
113         // factor 1, min/max on int
114         Factor factor2 = new Factor("test unifpc");
115         factor2.setCardinality(2);
116         ContinuousDomain domain2 = new ContinuousDomain(Distribution.QUNIFPC);
117         domain2.addDistributionParam("reference", 40.0);
118         domain2.addDistributionParam("coefficient", 0.05);
119         factor2.setDomain(domain2);
120         factor2.setPath("org.nuiton.factor#1234567890#0.12242345354#name");
121         return factor2;
122     }
123 
124     /*protected Factor getContinuousMatrixUniformPCFactor() {
125         // matrix 1
126         MatrixND matrix1 = MatrixFactory.getInstance().create("test1",
127                 new int[] { 3, 2 }, new String[] { "col1", "col2" });
128         matrix1.setValue(new int[] { 0, 0 }, 1);
129         matrix1.setValue(new int[] { 0, 1 }, -14);
130         matrix1.setValue(new int[] { 1, 0 }, 21);
131         matrix1.setValue(new int[] { 1, 1 }, 2);
132         matrix1.setValue(new int[] { 2, 0 }, 3);
133         matrix1.setValue(new int[] { 2, 1 }, -1);
134 
135         // factor
136         Factor factor2 = new Factor("tes tmatrix unifpc");
137         factor2.setCardinality(3);
138         ContinuousDomain domain2 = new ContinuousDomain(Distribution.QUNIFPC);
139         domain2.addDistributionParam("reference", matrix1);
140         domain2.addDistributionParam("coefficient", 0.1);
141         factor2.setDomain(domain2);
142         factor2.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim");
143         return factor2;
144     }*/
145     
146     protected Factor getContinuousDoubleCauchyFactor() {
147         // factor 1, min/max on int
148         Factor factor2 = new Factor("test cauchy");
149         factor2.setCardinality(2);
150         ContinuousDomain domain2 = new ContinuousDomain(Distribution.DCAUCHY);
151         domain2.addDistributionParam("location", 0.0);
152         domain2.addDistributionParam("scale", 1.0);
153         factor2.setDomain(domain2);
154         factor2.setPath("org.nuiton.factor#1234567890#0.12242345354#name");
155         return factor2;
156     }
157 
158     protected Factor getContinuousDoubleChisqFactor() {
159         // factor 1, min/max on int
160         Factor factor1 = new Factor("test dchisq");
161         factor1.setCardinality(2);
162         ContinuousDomain domain1 = new ContinuousDomain(Distribution.DCHISQ);
163         domain1.addDistributionParam("df", 1.0);
164         factor1.setDomain(domain1);
165         factor1.setPath("org.nuiton.factor#1234567890#0.12242345354#name");
166         return factor1;
167     }
168 
169     protected Factor getDiscreteIntFactor() {
170         // factor 1, min/max on int
171         Factor factor1 = new Factor("test int");
172         DiscreteDomain domain1 = new DiscreteDomain();
173         domain1.getValues().put("1", 42.0);
174         domain1.getValues().put("2", 43.0);
175         domain1.getValues().put("3", 44.0);
176         factor1.setDomain(domain1);
177         factor1.setPath("org.nuiton.factor#1234567890#0.12242345354#name");
178         return factor1;
179     }
180 
181     protected void displayScenarios(SensitivityScenarios scenarii) {
182         if (log.isDebugEnabled()) {
183             int scIndex = 1;
184             for (Scenario scenario : scenarii.getScenarios()) {
185                 log.debug("Scenario " + scIndex++);
186                 for (Factor factor : scenario.getFactors()) {
187                     log.debug("Factor " + factor.getName() + " = " + factor.getValue());
188                 }
189             }
190         }
191     }
192 
193     /**
194      * Test tmp files/dir.
195      * 
196      * @throws IOException 
197      */
198     @After
199     public void clear() throws IOException {
200         if (simulationsDir != null) {
201             FileUtils.deleteDirectory(simulationsDir);
202         }
203     }
204 
205     /**
206      * Test de génération des scenarios via la methode Morris.
207      * 
208      * @throws IsisFishException 
209      * @throws SensitivityException 
210      */
211     @Test
212     public void testMorris() throws IsisFishException, SensitivityException {
213         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("Morris").getNewInstance();
214         Assert.assertNotNull("Morris script not found in test data", script);
215 
216         // uniform min/max
217         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
218         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
219         Assert.assertTrue(scenarii.getScenarios().size() >= 3); // random, can be 9, 12
220         for (Scenario scenario : scenarii.getScenarios()) {
221             for (Factor factor : scenario.getFactors()) {
222                 double value = (Double)factor.getValue();
223                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
224             }
225         }
226 
227         // uniform pc
228         designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
229         scenarii = script.compute(designPlan, simulationsDir);
230         Assert.assertTrue(scenarii.getScenarios().size() >= 3); // random, can be 9, 12
231         for (Scenario scenario : scenarii.getScenarios()) {
232             for (Factor factor : scenario.getFactors()) {
233                 double value = (Double)factor.getValue();
234                 Assert.assertTrue(value >= 30.0 && value <= 50.0);
235             }
236         }
237 
238         /* matrix uniform
239         designPlan = getDesignPlan(getContinuousMatrixUniformPCFactor(), getContinuousMatrixUniformPCFactor());
240         scenarii = script.compute(designPlan, simulationsDir);
241         Assert.assertTrue(scenarii.getScenarios().size() >= 3); // random, can be 9, 12
242         for (Scenario scenario : scenarii.getScenarios()) {
243             for (Factor factor : scenario.getFactors()) {
244                 MatrixND value = (MatrixND)factor.getValue();
245                 Assert.assertTrue(value.getValue(0, 0) >= 0.9 && value.getValue(0, 0) <= 1.1);
246             }
247         }*/
248 
249         // check fail is discrete
250         designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor());
251         try {
252             script.compute(designPlan, simulationsDir);
253             Assert.fail("Exception should have been thrown at this stage");
254         } catch (SensitivityException eee){
255             //do nothing
256         }
257 
258     }
259 
260     /**
261      * Test de génération des scenarios via la methode DOptimal.
262      * 
263      * This method accept discretes factors.
264      * 
265      * @throws IsisFishException 
266      * @throws SensitivityException 
267      */
268     @Test
269     @Ignore
270     public void testDOptimal() throws IsisFishException, SensitivityException {
271         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("DOptimal").getNewInstance();
272         Assert.assertNotNull("DOptimal script not found in test data", script);
273 
274         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
275         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
276         for (Scenario scenario : scenarii.getScenarios()) {
277             for (Factor factor : scenario.getFactors()) {
278                 double value = (Double)factor.getValue();
279                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
280             }
281         }
282         
283         // test discretes
284         designPlan = getDesignPlan(getDiscreteIntFactor(), getDiscreteIntFactor());
285         scenarii = script.compute(designPlan, simulationsDir);
286         displayScenarios(scenarii);
287     }
288     
289     /**
290      * Test de génération des scenarios via la methode Fast.
291      * 
292      * @throws IsisFishException 
293      * @throws SensitivityException 
294      */
295     @Test
296     public void testFast() throws IsisFishException, SensitivityException {
297         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("Fast").getNewInstance();
298         Assert.assertNotNull("Fast script not found in test data", script);
299 
300         // uniform min/max
301         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
302         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
303         Assert.assertEquals(40, scenarii.getScenarios().size());
304         for (Scenario scenario : scenarii.getScenarios()) {
305             for (Factor factor : scenario.getFactors()) {
306                 double value = (Double)factor.getValue();
307                 // TODO: fix NaN values here
308                 //Assert.assertTrue(value >= 0.0 && value <= 2.0);
309             }
310         }
311 
312         // uniform pc
313         designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
314         scenarii = script.compute(designPlan, simulationsDir);
315         Assert.assertEquals(40, scenarii.getScenarios().size());
316         displayScenarios(scenarii);
317 
318         // check fail is discrete
319         designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor());
320         try {
321             script.compute(designPlan, simulationsDir);
322             Assert.fail("Exception should have been thrown at this stage");
323         } catch (SensitivityException eee){
324             //do nothing
325         }
326         
327     }
328     
329     /**
330      * Test de génération des scenarios via la methode OptimumLHS.
331      * 
332      * @throws IsisFishException 
333      * @throws SensitivityException 
334      */
335     @Test
336     public void testOptimumLHS() throws IsisFishException, SensitivityException {
337         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("OptimumLHS").getNewInstance();
338         Assert.assertNotNull("OptimumLHS script not found in test data", script);
339 
340         // uniform min/max
341         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
342         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
343         Assert.assertEquals(10, scenarii.getScenarios().size());
344         for (Scenario scenario : scenarii.getScenarios()) {
345             for (Factor factor : scenario.getFactors()) {
346                 double value = (Double)factor.getValue();
347                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
348             }
349         }
350 
351         // uniform pc
352         designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
353         scenarii = script.compute(designPlan, simulationsDir);
354         Assert.assertEquals(10, scenarii.getScenarios().size());
355         displayScenarios(scenarii);
356 
357         // check fail is discrete
358         designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor());
359         try {
360             script.compute(designPlan, simulationsDir);
361             Assert.fail("Exception should have been thrown at this stage");
362         } catch (SensitivityException eee){
363             //do nothing
364         }
365         
366     }
367     
368     /**
369      * Test de génération des scenarios via la methode RandomLHS.
370      * 
371      * @throws IsisFishException 
372      * @throws SensitivityException 
373      */
374     @Test
375     public void testRandomLHS() throws IsisFishException, SensitivityException {
376         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RandomLHS").getNewInstance();
377         Assert.assertNotNull("RandomLHS script not found in test data", script);
378 
379         // uniform min/max
380         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
381         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
382         Assert.assertEquals(10, scenarii.getScenarios().size());
383         for (Scenario scenario : scenarii.getScenarios()) {
384             for (Factor factor : scenario.getFactors()) {
385                 double value = (Double)factor.getValue();
386                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
387             }
388         }
389 
390         // uniform pc
391         designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
392         scenarii = script.compute(designPlan, simulationsDir);
393         Assert.assertEquals(10, scenarii.getScenarios().size());
394         displayScenarios(scenarii);
395 
396         // check fail is discrete
397         designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor());
398         try {
399             script.compute(designPlan, simulationsDir);
400             Assert.fail("Exception should have been thrown at this stage");
401         } catch (SensitivityException eee){
402             //do nothing
403         }
404         
405     }
406     
407     /**
408      * Test de génération des scenarios via la methode RegularExpandGrid.
409      * 
410      * This method accept discretes factors.
411      * 
412      * @throws IsisFishException 
413      * @throws SensitivityException 
414      */
415     @Test
416     @Ignore
417     public void testRegularExpandGrid() throws IsisFishException, SensitivityException {
418         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RegularExpandGrid").getNewInstance();
419         Assert.assertNotNull("RegularExpandGrid script not found in test data", script);
420 
421         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
422         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
423         for (Scenario scenario : scenarii.getScenarios()) {
424             for (Factor factor : scenario.getFactors()) {
425                 double value = (Double)factor.getValue();
426                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
427             }
428         }
429         
430         // test discretes
431         designPlan = getDesignPlan(getDiscreteIntFactor(), getDiscreteIntFactor());
432         scenarii = script.compute(designPlan, simulationsDir);
433         displayScenarios(scenarii);
434     }
435     
436     /**
437      * Test de génération des scenarios via la methode RegularFractions.
438      * 
439      * @throws IsisFishException 
440      * @throws SensitivityException 
441      */
442     @Test
443     public void testRegularFractions() throws IsisFishException, SensitivityException {
444         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RegularFractions").getNewInstance();
445         // this script need pathToFunction parameter to find R script in current directory
446         SensitivityAnalysisStorage.setParameterValue(script,"pathToFunction",
447                 IsisFish.config.getDatabaseDirectory().getAbsolutePath() + File.separator + "sensitivityanalysis");
448         Assert.assertNotNull("RegularFractions script not found in test data", script);
449 
450         // test continuous
451         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
452         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
453         displayScenarios(scenarii);
454 
455     }
456     
457     /**
458      * Test de génération des scenarios via la methode Sobol.
459      * 
460      * @throws IsisFishException 
461      * @throws SensitivityException 
462      */
463     @Test
464     public void testSobol() throws IsisFishException, SensitivityException {
465         SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("Sobol").getNewInstance();
466         Assert.assertNotNull("Sobol script not found in test data", script);
467 
468         // sobol avec uniform MM
469         DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
470         SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
471         Assert.assertEquals(80, scenarii.getScenarios().size());
472         for (Scenario scenario : scenarii.getScenarios()) {
473             for (Factor factor : scenario.getFactors()) {
474                 double value = (Double)factor.getValue();
475                 Assert.assertTrue(value >= 0.0 && value <= 2.0);
476             }
477         }
478 
479         // sobol avec cauchy/chisq
480         designPlan = getDesignPlan(getContinuousDoubleCauchyFactor(), getContinuousDoubleChisqFactor());
481         scenarii = script.compute(designPlan, simulationsDir);
482         Assert.assertEquals(80, scenarii.getScenarios().size());
483         for (Scenario scenario : scenarii.getScenarios()) {
484             for (Factor factor : scenario.getFactors()) {
485                 double value = (Double)factor.getValue();
486                 Assert.assertTrue(value != 0.0);
487             }
488         }
489 
490         // check fail is discrete
491         designPlan = getDesignPlan(getDiscreteIntFactor(),getContinuousDoubleUniformMMFactor());
492         try {
493             script.compute(designPlan, simulationsDir);
494             Assert.fail("Exception should have been thrown at this stage");
495         } catch (SensitivityException eee){
496             //do nothing
497         }
498 
499     }
500 }