]> gerrit.simantics Code Review - simantics/sysdyn.git/blob
68c3e5b2e55d1eb8fd635429772a9644367e9655
[simantics/sysdyn.git] /
1 /*******************************************************************************\r
2  * Copyright (c) 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Semantum Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.sysdyn.adapter.distribution;\r
13 \r
14 import java.util.Random;\r
15 \r
16 import org.simantics.databoard.Bindings;\r
17 import org.simantics.db.ReadGraph;\r
18 import org.simantics.db.Resource;\r
19 import org.simantics.db.exception.DatabaseException;\r
20 import org.simantics.layer0.Layer0;\r
21 import org.simantics.sysdyn.SysdynResource;\r
22 \r
23 public class UniformDistribution implements IDistribution {\r
24     \r
25     \r
26     private Random random;\r
27     \r
28     private double min;\r
29     private double max;\r
30     private int numberOfValues = 10;\r
31     private int seed = 123;\r
32     private int index = 0;\r
33     \r
34     public UniformDistribution(ReadGraph graph, Resource distribution) {\r
35 \r
36         try {\r
37             SysdynResource SR = SysdynResource.getInstance(graph);\r
38 \r
39             Double minValue = graph.getPossibleRelatedValue(distribution, SR.UniformDistribution_minValue, Bindings.DOUBLE);\r
40             if(minValue != null)\r
41                 this.min = minValue;\r
42             \r
43             Double maxValue = graph.getPossibleRelatedValue(distribution, SR.UniformDistribution_maxValue, Bindings.DOUBLE);\r
44             if(maxValue != null)\r
45                 this.max = maxValue;\r
46             \r
47             \r
48             Resource parameter = graph.getPossibleObject(distribution, SR.SensitivityAnalysisExperiment_Parameter_propabilityDistribution_Inverse);\r
49 \r
50             Integer numberOfValues = graph.getPossibleRelatedValue(parameter, SR.SensitivityAnalysisExperiment_Parameter_numberOfValues, Bindings.INTEGER);\r
51             if(numberOfValues != null)\r
52                 this.numberOfValues = numberOfValues;\r
53             \r
54 \r
55             \r
56             Resource experiment = graph.getPossibleObject(parameter, Layer0.getInstance(graph).PartOf);\r
57 \r
58             Integer seed =  graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_randomSeed, Bindings.INTEGER);\r
59             if(seed != null)\r
60                 this.seed = seed;\r
61             \r
62         } catch (DatabaseException e) {\r
63 \r
64         }\r
65         initialize();\r
66     }\r
67     \r
68     public Random getRandom() {\r
69         return random;\r
70     }\r
71 \r
72     public double getMin() {\r
73         return min;\r
74     }\r
75 \r
76     public double getMax() {\r
77         return max;\r
78     }\r
79 \r
80     public int getNumberOfValues() {\r
81         return numberOfValues;\r
82     }\r
83 \r
84     public int getSeed() {\r
85         return seed;\r
86     }\r
87     \r
88     \r
89 \r
90     \r
91     @Override\r
92     public double next() {\r
93         index++;\r
94         double d = min + ((double)random.nextInt(101) / 100.0) * (max-min); \r
95         return d;\r
96     }\r
97     \r
98 \r
99     @Override\r
100     public void initialize() {\r
101         random = new Random(this.seed);\r
102         index = 0;\r
103     }\r
104 \r
105     @Override\r
106     public boolean hasNext() {\r
107         return index < numberOfValues;\r
108     }\r
109 \r
110 }\r