1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.statistics.distribution;
18
19 import java.util.stream.Stream;
20 import org.junit.jupiter.params.ParameterizedTest;
21 import org.junit.jupiter.params.provider.Arguments;
22 import org.junit.jupiter.params.provider.CsvSource;
23 import org.junit.jupiter.params.provider.MethodSource;
24
25
26
27
28
29 class NakagamiDistributionTest extends BaseContinuousDistributionTest {
30 @Override
31 ContinuousDistribution makeDistribution(Object... parameters) {
32 final double mu = (Double) parameters[0];
33 final double omega = (Double) parameters[1];
34 return NakagamiDistribution.of(mu, omega);
35 }
36
37 @Override
38 Object[][] makeInvalidParameters() {
39 return new Object[][] {
40 {0.0, 1.0},
41 {-0.1, 1.0},
42 {0.5, 0.0},
43 {0.5, -0.1}
44 };
45 }
46
47 @Override
48 String[] getParameterNames() {
49 return new String[] {"Shape", "Scale"};
50 }
51
52 @Override
53 protected double getRelativeTolerance() {
54 return 5e-15;
55 }
56
57
58
59
60
61
62
63
64 @ParameterizedTest
65 @CsvSource({
66
67 "175, 0.75, 0.86540703592357171, 0.0010706621739778321",
68 "175, 1, 0.99928597029814059, 0.0014275495653037762",
69 "175, 1.25, 1.1172356792742391, 0.0017844369566297202",
70 "175, 3.75, 1.9351089605317091, 0.0053533108698891607",
71 "205.25, 0.75, 0.86549814380218737, 0.00091296307496802065",
72 "205.25, 1, 0.99939117261462862, 0.0012172840999573609",
73 "205.25, 1.25, 1.1173532990397681, 0.0015216051249467011",
74 "205.25, 3.75, 1.9353126839415795, 0.0045648153748401032",
75 "305.25, 0.75, 0.865670838787722, 0.00061399887256183283",
76 "305.25, 1.75, 1.32233404855355, 0.0014326640359776099",
77 "305.25, 3.75, 1.9356988416686078, 0.0030699943628091642",
78 "305.25, 12.75, 3.5692523053388152, 0.010437980833551158",
79 "305.25, 25.25, 5.0228805186490098, 0.020671295376248372",
80 })
81 void testAdditionalMoments(double mu, double omega, double mean, double variance) {
82
83
84
85
86
87
88 final DoubleTolerance tolerance = createRelTolerance(2e-10);
89 final NakagamiDistribution dist = NakagamiDistribution.of(mu, omega);
90 testMoments(dist, mean, variance, tolerance);
91 }
92
93
94
95
96 @ParameterizedTest
97 @CsvSource({
98
99
100
101
102
103
104
105 "175, 0.75, 0.865407035923572335404337637742305354, 0.00107066217397678136642741884083229635",
106 "175, 1, 0.999285970298141244170512691211913862, 0.0014275495653023751552365584544430618",
107 "175, 1.25, 1.11723567927423980521693795242933784, 0.00178443695662796894404569806805382725",
108 "175, 3.75, 1.93510896053171023839534780723184735, 0.00535331086988390683213709420416109656",
109 "205.25, 0.75, 0.865498143802251959479795150977083271, 0.000912963074856388060643895128688537674",
110 "205.25, 1, 0.999391172614703197622376095323984551, 0.0012172840998085174141918601715848132",
111 "205.25, 1.25, 1.11735329903985129515900415713529348, 0.00152160512476064676773982521448079983",
112 "205.25, 3.75, 1.93531268394172368161190235734322469, 0.00456481537428194030321947564344316985",
113 "305.25, 0.75, 0.865670838787713729127832304174216151, 0.000613998872576147383115881187594898943",
114 "305.25, 1.75, 1.32233404855353739372707758901129787, 0.00143266403601101056060372277105460371",
115 "305.25, 3.75, 1.93569884166858953645398412102636382, 0.00306999436288073691557940593797382064",
116 "305.25, 12.75, 3.56925230533878138370667203279492999, 0.010437980833794505512969980189112608",
117 "305.25, 25.25, 5.02288051864896241877391197174369638, 0.0206712953767302952315679999823609879",
118 })
119 void testAdditionalMoments2(double mu, double omega, double mean, double variance) {
120
121
122
123 final DoubleTolerance tolerance = createRelTolerance(1e-12);
124 final NakagamiDistribution dist = NakagamiDistribution.of(mu, omega);
125 testMoments(dist, mean, variance, tolerance);
126 }
127
128
129
130
131 @ParameterizedTest
132 @MethodSource
133 void testAdditionalLogDensity(double mu, double omega, double[] x, double[] expected) {
134 final NakagamiDistribution dist = NakagamiDistribution.of(mu, omega);
135 testLogDensity(dist, x, expected, DoubleTolerances.relative(1e-15));
136 }
137
138 static Stream<Arguments> testAdditionalLogDensity() {
139 final double[] x = {50, 55, 60, 80, 120};
140 return Stream.of(
141
142
143 Arguments.of(0.5, 1, x,
144 new double[]{-1250.2257913526448, -1512.7257913526448, -1800.2257913526448,
145 -3200.2257913526446, -7200.225791352645}),
146
147 Arguments.of(1.5, 1, x,
148 new double[]{-3740.7538269087863, -4528.063206549177, -5390.389183795199,
149 -9589.813819650295, -21589.00288943408}),
150
151
152 Arguments.of(0.5, 2, x,
153 new double[]{-625.57236494292476, -756.82236494292465, -900.57236494292465,
154 -1600.57236494292442, -3600.57236494292420}),
155
156 Arguments.of(0.5, 0.75, x,
157 new double[]{-1666.7486169830854, -2016.7486169830854, -2400.0819503164184,
158 -4266.7486169830854, -9600.0819503164203}),
159
160 Arguments.of(1.5, 0.75, x,
161 new double[]{-4990.3223038001088, -6040.1316834404988, -7189.9576606865212,
162 -12789.3822965416184, -28788.5713663254028}),
163
164 Arguments.of(1.5, 1.75, x,
165 new double[]{-2134.4503934478316, -2584.2597730882230, -3076.9428931913867,
166 -5476.3675290464835, -12332.6994559731247}),
167
168 Arguments.of(1.5, 7.75, x,
169 new double[]{-477.69633391576963, -579.11861678196749, -690.23491660863317,
170 -1231.59503633469740, -2779.17120289267450})
171 );
172 }
173 }