22
22
23
23
var resolve = require ( 'path' ) . resolve ;
24
24
var tape = require ( 'tape' ) ;
25
- var abs = require ( '@stdlib/math/base/special/abs' ) ;
26
25
var isnan = require ( '@stdlib/math/base/assert/is-nan' ) ;
27
26
var tryRequire = require ( '@stdlib/utils/try-require' ) ;
28
27
var PINF = require ( '@stdlib/constants/float64/pinf' ) ;
29
28
var NINF = require ( '@stdlib/constants/float64/ninf' ) ;
30
29
var EPS = require ( '@stdlib/constants/float64/eps' ) ;
31
- var randu = require ( '@stdlib/random/base/randu' ) ;
30
+ var abs = require ( '@stdlib/math/base/special/abs' ) ;
31
+ var uniform = require ( '@stdlib/random/base/uniform' ) ;
32
32
var ln = require ( '@stdlib/math/base/special/ln' ) ;
33
33
var cdf = require ( '@stdlib/stats/base/dists/gamma/cdf' ) ;
34
34
@@ -53,64 +53,76 @@ tape( 'if provided `NaN` for any parameter, the function returns `NaN`', opts, f
53
53
var y ;
54
54
55
55
y = logcdf ( NaN , 1.0 , 1.0 ) ;
56
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
56
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
57
57
58
58
y = logcdf ( 0.0 , NaN , 1.0 ) ;
59
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
59
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
60
60
61
61
y = logcdf ( 0.0 , 1.0 , NaN ) ;
62
- t . equal ( isnan ( y ) , true , 'returns NaN' ) ;
62
+ t . equal ( isnan ( y ) , true , 'returns expected value' ) ;
63
+
64
+ t . end ( ) ;
65
+ } ) ;
63
66
67
+ tape ( 'if provided `+infinity` for `x` and a finite `alpha` and `beta`, the function returns `1`' , opts , function test ( t ) {
68
+ var y = logcdf ( PINF , 0.5 , 1.0 ) ;
69
+ t . equal ( y , 0.0 , 'returns expected value' ) ;
64
70
t . end ( ) ;
65
71
} ) ;
66
72
67
- tape ( 'if provided a negative `alpha`, the function returns `NaN`' , opts , function test ( t ) {
73
+ tape ( 'if provided `-infinity` for `x` and a finite `alpha` and `beta`, the function returns `0`' , opts , function test ( t ) {
74
+ var y = logcdf ( NINF , 0.5 , 1.0 ) ;
75
+ t . equal ( y , NINF , 'returns expected value' ) ;
76
+ t . end ( ) ;
77
+ } ) ;
78
+
79
+ tape ( 'if provided `alpha < 0`, the function returns `NaN`' , opts , function test ( t ) {
68
80
var y ;
69
81
70
82
y = logcdf ( 2.0 , - 1.0 , 2.0 ) ;
71
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
83
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
72
84
73
85
y = logcdf ( 0.0 , - 1.0 , 2.0 ) ;
74
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
86
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
75
87
76
88
y = logcdf ( 2.0 , NINF , 1.0 ) ;
77
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
89
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
78
90
79
91
y = logcdf ( 2.0 , NINF , PINF ) ;
80
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
92
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
81
93
82
94
y = logcdf ( 2.0 , NINF , NINF ) ;
83
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
95
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
84
96
85
97
y = logcdf ( 2.0 , NINF , NaN ) ;
86
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
98
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
87
99
88
100
t . end ( ) ;
89
101
} ) ;
90
102
91
- tape ( 'if provided a nonpositive `beta`, the function returns `NaN`' , opts , function test ( t ) {
103
+ tape ( 'if provided `beta <= 0 `, the function returns `NaN`' , opts , function test ( t ) {
92
104
var y ;
93
105
94
106
y = logcdf ( 2.0 , 2.0 , 0.0 ) ;
95
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
107
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
96
108
97
109
y = logcdf ( 2.0 , 2.0 , - 1.0 ) ;
98
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
110
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
99
111
100
112
y = logcdf ( 0.0 , 2.0 , - 1.0 ) ;
101
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
113
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
102
114
103
115
y = logcdf ( 2.0 , 1.0 , NINF ) ;
104
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
116
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
105
117
106
118
y = logcdf ( 2.0 , PINF , NINF ) ;
107
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
119
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
108
120
109
121
y = logcdf ( 2.0 , NINF , NINF ) ;
110
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
122
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
111
123
112
124
y = logcdf ( 2.0 , NaN , NINF ) ;
113
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
125
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
114
126
115
127
t . end ( ) ;
116
128
} ) ;
@@ -119,22 +131,22 @@ tape( 'if provided an `alpha` equal to `0` and `beta` is positive, the function
119
131
var y ;
120
132
121
133
y = logcdf ( PINF , 0.0 , 2.0 ) ;
122
- t . equal ( y , 0.0 , 'returns 0 for x greater than 0 ' ) ;
134
+ t . equal ( y , 0.0 , 'returns expected value ' ) ;
123
135
124
136
y = logcdf ( 2.5 , 0.0 , 2.0 ) ;
125
- t . equal ( y , 0.0 , 'returns 0 for x greater than 0 ' ) ;
137
+ t . equal ( y , 0.0 , 'returns expected value ' ) ;
126
138
127
139
y = logcdf ( 0.0 , 0.0 , 2.0 ) ;
128
- t . equal ( y , 0.0 , 'returns 0 for x equal to 0 ' ) ;
140
+ t . equal ( y , 0.0 , 'returns expected value ' ) ;
129
141
130
142
y = logcdf ( - 2.0 , 0.0 , 2.0 ) ;
131
- t . equal ( y , NINF , 'returns -Infinity for x smaller than 0 ' ) ;
143
+ t . equal ( y , NINF , 'returns expected value ' ) ;
132
144
133
145
y = logcdf ( NINF , 0.0 , 2.0 ) ;
134
- t . equal ( y , NINF , 'returns -Infinity for x smaller than 0 ' ) ;
146
+ t . equal ( y , NINF , 'returns expected value ' ) ;
135
147
136
148
y = logcdf ( NaN , 0.0 , 2.0 ) ;
137
- t . equal ( isnan ( y ) , true , 'returns NaN ' ) ;
149
+ t . equal ( isnan ( y ) , true , 'returns expected value ' ) ;
138
150
139
151
t . end ( ) ;
140
152
} ) ;
@@ -145,21 +157,22 @@ tape( 'the function evaluates the logarithm of the CDF', opts, function test( t
145
157
var alpha ;
146
158
var beta ;
147
159
var tol ;
160
+ var i ;
148
161
var x ;
149
162
var y ;
150
- var i ;
151
163
152
164
for ( i = 0 ; i < 1000 ; i ++ ) {
153
- x = ( randu ( ) * 10.0 ) + EPS ;
154
- alpha = ( randu ( ) * 10.0 ) + EPS ;
155
- beta = ( randu ( ) * 10.0 ) + EPS ;
165
+ x = uniform ( EPS , 10.0 ) ;
166
+ alpha = uniform ( EPS , 10.0 ) ;
167
+ beta = uniform ( EPS , 10.0 ) ;
156
168
y = logcdf ( x , alpha , beta ) ;
157
169
expected = ln ( cdf ( x , alpha , beta ) ) ;
158
170
if ( y === expected ) {
159
171
t . equal ( y , expected , 'x: ' + x + ', alpha: ' + alpha + ', beta: ' + beta + ', y: ' + y + ', expected: ' + expected ) ;
160
172
} else {
173
+ // NOTE: increased test tolerance due to differences in accumulated error between JavaScript and C, especially as we are wrapping `cdf` which relies on `gammainc`, where compiler optimizations can result in different error propagation
161
174
delta = abs ( y - expected ) ;
162
- tol = 150 .0 * EPS * abs ( expected ) ;
175
+ tol = 100 .0 * EPS * abs ( expected ) ;
163
176
t . ok ( delta <= tol , 'within tolerance. x: ' + x + '. alpha: ' + alpha + '. beta: ' + beta + '. y: ' + y + '. E: ' + expected + '. Δ: ' + delta + '. tol: ' + tol + '.' ) ;
164
177
}
165
178
}
0 commit comments