1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
53
54
55
56 public class SensitivityAnalysisTest extends AbstractIsisFishTest {
57
58 private static final Log log = LogFactory.getLog(SensitivityAnalysisTest.class);
59
60
61 protected File simulationsDir;
62
63
64
65
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
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
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 protected Factor getContinuousDoubleCauchyFactor() {
147
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
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
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
195
196
197
198 @After
199 public void clear() throws IOException {
200 if (simulationsDir != null) {
201 FileUtils.deleteDirectory(simulationsDir);
202 }
203 }
204
205
206
207
208
209
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
217 DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
218 SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
219 Assert.assertTrue(scenarii.getScenarios().size() >= 3);
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
228 designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
229 scenarii = script.compute(designPlan, simulationsDir);
230 Assert.assertTrue(scenarii.getScenarios().size() >= 3);
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
239
240
241
242
243
244
245
246
247
248
249
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
256 }
257
258 }
259
260
261
262
263
264
265
266
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
284 designPlan = getDesignPlan(getDiscreteIntFactor(), getDiscreteIntFactor());
285 scenarii = script.compute(designPlan, simulationsDir);
286 displayScenarios(scenarii);
287 }
288
289
290
291
292
293
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
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
308
309 }
310 }
311
312
313 designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
314 scenarii = script.compute(designPlan, simulationsDir);
315 Assert.assertEquals(40, scenarii.getScenarios().size());
316 displayScenarios(scenarii);
317
318
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
325 }
326
327 }
328
329
330
331
332
333
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
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
352 designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
353 scenarii = script.compute(designPlan, simulationsDir);
354 Assert.assertEquals(10, scenarii.getScenarios().size());
355 displayScenarios(scenarii);
356
357
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
364 }
365
366 }
367
368
369
370
371
372
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
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
391 designPlan = getDesignPlan(getContinuousDoubleUniformPcFactor(), getContinuousDoubleUniformPcFactor());
392 scenarii = script.compute(designPlan, simulationsDir);
393 Assert.assertEquals(10, scenarii.getScenarios().size());
394 displayScenarios(scenarii);
395
396
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
403 }
404
405 }
406
407
408
409
410
411
412
413
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
431 designPlan = getDesignPlan(getDiscreteIntFactor(), getDiscreteIntFactor());
432 scenarii = script.compute(designPlan, simulationsDir);
433 displayScenarios(scenarii);
434 }
435
436
437
438
439
440
441
442 @Test
443 public void testRegularFractions() throws IsisFishException, SensitivityException {
444 SensitivityAnalysis script = SensitivityAnalysisStorage.getSensitivityAnalysis("RegularFractions").getNewInstance();
445
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
451 DesignPlan designPlan = getDesignPlan(getContinuousDoubleUniformMMFactor(), getContinuousDoubleUniformMMFactor());
452 SensitivityScenarios scenarii = script.compute(designPlan, simulationsDir);
453 displayScenarios(scenarii);
454
455 }
456
457
458
459
460
461
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
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
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
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
497 }
498
499 }
500 }