1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.misc.math;
17
18 import java.util.Collection;
19 import java.util.List;
20
21 import org.jamesii.core.math.random.generators.IRandom;
22
23 import p3j.gui.P3J;
24 import p3j.misc.Misc;
25 import p3j.misc.errors.GeneratorError;
26 import p3j.misc.errors.ProbabilityError;
27 import p3j.misc.gui.GUI;
28 import p3j.pppm.IStochasticOccurrence;
29
30
31
32
33
34
35
36
37
38
39
40
41 public final class RandomNumberChecks {
42
43
44 private static RandomNumberChecks instance = new RandomNumberChecks();
45
46
47 static final String PROB_SUM = "Probability sum of ";
48
49
50
51
52 private RandomNumberChecks() {
53 }
54
55
56
57
58
59
60 public static RandomNumberChecks getInstance() {
61 return instance;
62 }
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public <V extends IStochasticOccurrence> void checkProbabilitySetting(
79 String name, Collection<V> objects, List<GeneratorError> errors) {
80
81 if (objects == null || objects.size() == 0) {
82 GUI.printErrorMessage(P3J.getInstance(), "Missing parameter assignment",
83 "No assumptions are defined for parameter: " + name);
84 throw new IllegalArgumentException(
85 "There are no assignments for variable '" + name + "'!");
86 }
87
88 final Double probSum = getProbSum(objects);
89
90
91 if (Misc.numEqual(probSum, 0)) {
92 final double uniformProb = 1.0 / objects.size();
93 for (V object : objects) {
94 object.setProbability(uniformProb);
95 }
96 errors.add(new ProbabilityError(true, PROB_SUM + name
97 + " is zero. Probabilities have been distributed equally."));
98 }
99
100 else if (!Misc.numEqual(probSum, 1.0)) {
101 final double probFactor = 1 / probSum;
102 for (V object : objects) {
103 object.setProbability(object.getProbability() * probFactor);
104 }
105 errors
106 .add(new ProbabilityError(
107 true,
108 PROB_SUM
109 + name
110 + " does not equal 100%. Probabilities have been normalized accordingly."));
111 }
112
113 }
114
115
116
117
118
119
120
121
122
123
124
125
126 public <V extends IStochasticOccurrence> V chooseNormalizedRandomObject(
127 Collection<V> objects, IRandom rand) {
128 return chooseRandomObject(objects, rand, getProbSum(objects));
129 }
130
131
132
133
134
135
136
137
138
139
140
141
142 public <V extends IStochasticOccurrence> V chooseRandomObject(
143 Collection<V> objects, IRandom rand) {
144 return chooseRandomObject(objects, rand, getProbSum(objects));
145 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 protected <V extends IStochasticOccurrence> V chooseRandomObject(
161 Collection<V> objects, IRandom rand, double overallProbSum) {
162 double prob = rand.nextDouble();
163 double currentProbSum = 0;
164 for (V object : objects) {
165 currentProbSum += object.getProbability() / overallProbSum;
166 if (prob < currentProbSum) {
167 return object;
168 }
169 }
170 return null;
171 }
172
173
174
175
176
177
178
179
180
181 public double getProbSum(Collection<? extends IStochasticOccurrence> objects) {
182 double probSum = 0;
183 for (IStochasticOccurrence object : objects) {
184 probSum += object.getProbability();
185 }
186 return probSum;
187 }
188
189 }