@@ -25,6 +25,9 @@ var tape = require( 'tape' );
2525var  tryRequire  =  require (  '@stdlib/utils/try-require'  ) ; 
2626var  isnan  =  require (  '@stdlib/math/base/assert/is-nan'  ) ; 
2727var  abs  =  require (  '@stdlib/math/base/special/abs'  ) ; 
28+ var  PINF  =  require (  '@stdlib/constants/float64/pinf'  ) ; 
29+ var  NINF  =  require (  '@stdlib/constants/float64/ninf'  ) ; 
30+ var  EPS  =  require (  '@stdlib/constants/float64/eps'  ) ; 
2831
2932
3033// VARIABLES // 
@@ -35,85 +38,145 @@ var opts = {
3538} ; 
3639
3740
41+ // FIXTURES // 
42+ 
43+ var  data  =  require (  './fixtures/julia/data.json'  ) ; 
44+ 
45+ 
3846// TESTS // 
3947
40- tape ( 'main export is a function' ,  opts ,  function  test ( t )  { 
41- 	t . ok ( true ,  __filename ) ; 
42- 	t . strictEqual ( typeof  pmf ,  'function' ,  'main export is a function' ) ; 
48+ tape (   'main export is a function' ,  opts ,  function  test (   t   )  { 
49+ 	t . ok (   true ,  __filename   ) ; 
50+ 	t . strictEqual (   typeof  pmf ,  'function' ,  'main export is a function'   ) ; 
4351	t . end ( ) ; 
4452} ) ; 
4553
46- tape ( 'if provided `NaN` for any parameter, the function returns `NaN`' ,  opts ,  function  test ( t )  { 
47- 	var  v ; 
54+ tape (  'if provided `NaN` for any parameter, the function returns `NaN`' ,  opts ,  function  test (  t  )  { 
55+ 	var  y  =  pmf (  NaN ,  10 ,  10 ,  5  ) ; 
56+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
57+ 	y  =  pmf (  0.0 ,  NaN ,  10 ,  5  ) ; 
58+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
59+ 	y  =  pmf (  0.0 ,  10 ,  NaN ,  5  ) ; 
60+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
61+ 	y  =  pmf (  0.0 ,  10 ,  10 ,  NaN  ) ; 
62+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
63+ 	t . end ( ) ; 
64+ } ) ; 
4865
49- 	v  =  pmf ( NaN ,  10 ,  5 ,  2 ) ; 
50- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
66+ tape (  'if provided an integer `x` greater than `min( n, K )`, the function returns `0` (provided all parameters are valid)' ,  opts ,  function  test (  t  )  { 
67+ 	var  y  =  pmf (  PINF ,  20 ,  20 ,  10  ) ; 
68+ 	t . equal (  y ,  0.0 ,  'returns 0'  ) ; 
5169
52- 	v  =  pmf ( 2 ,   NaN ,   5 ,   2 ) ; 
53- 	t . equal ( isnan ( v ) ,   true ,  'returns NaN'  ) ; 
70+ 	y  =  pmf (   11 ,   20 ,   20 ,   10   ) ; 
71+ 	t . equal (   y ,   0.0 ,  'returns 0'    ) ; 
5472
55- 	v  =  pmf ( 2 ,   10 ,   NaN ,   2 ) ; 
56- 	t . equal ( isnan ( v ) ,   true ,  'returns NaN'  ) ; 
73+ 	y  =  pmf (   100 ,   20 ,   20 ,   10   ) ; 
74+ 	t . equal (   y ,   0.0 ,  'returns 0'    ) ; 
5775
58- 	v  =  pmf ( 2 ,  10 ,  5 ,  NaN ) ; 
59- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
76+ 	t . end ( ) ; 
77+ } ) ; 
78+ 
79+ tape (  'if provided an integer for `x` smaller than `max( 0, n + K - N )`, the function returns `0`' ,  opts ,  function  test (  t  )  { 
80+ 	var  y  =  pmf (  NINF ,  40 ,  20 ,  10  ) ; 
81+ 	t . equal (  y ,  0.0 ,  'returns 0'  ) ; 
82+ 
83+ 	y  =  pmf (  - 1.0 ,  40 ,  20 ,  10  ) ; 
84+ 	t . equal (  y ,  0.0 ,  'returns 0'  ) ; 
85+ 
86+ 	y  =  pmf (  - 2.0 ,  30 ,  20 ,  20  ) ; 
87+ 	t . equal (  y ,  0.0 ,  'returns 0'  ) ; 
6088
6189	t . end ( ) ; 
6290} ) ; 
6391
64- tape ( 'if provided invalid inputs, the function returns `NaN`' ,  opts ,  function  test ( t )  { 
65- 	var  v ; 
92+ tape (  'if provided an `N` which is not a nonnegative integer, the function returns `NaN`' ,  opts ,  function  test (  t  )  { 
93+ 	var  y ; 
94+ 
95+ 	y  =  pmf (  2.0 ,  30.5 ,  20 ,  10  ) ; 
96+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
97+ 
98+ 	y  =  pmf (  2.0 ,  - 2 ,  20 ,  10  ) ; 
99+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
100+ 
101+ 	y  =  pmf (  2.0 ,  - 1 ,  20 ,  10  ) ; 
102+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
66103
67- 	v  =  pmf ( 2 ,   - 10 ,   5 ,  2 ) ; 
68- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
104+ 	y  =  pmf (   0.0 ,   20. 5,  20 ,   10   ) ; 
105+ 	t . equal (   isnan (   y   ) ,  true ,  'returns NaN'   ) ; 
69106
70- 	v  =  pmf ( 2 ,   10.5 ,   5 ,   2 ) ; 
71- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
107+ 	y  =  pmf (   0.0 ,   PINF ,   20 ,   10   ) ; 
108+ 	t . equal (   isnan (   y   ) ,  true ,  'returns NaN'   ) ; 
72109
73- 	v  =  pmf ( 2 ,  10 ,  - 5 ,  2 ) ; 
74- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
110+ 	t . end ( ) ; 
111+ } ) ; 
112+ 
113+ tape (  'if provided a `K` which is not a nonnegative integer, the function returns `NaN`' ,  opts ,  function  test (  t  )  { 
114+ 	var  y ; 
115+ 
116+ 	y  =  pmf (  2.0 ,  20 ,  3.5 ,  10  ) ; 
117+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
75118
76- 	v  =  pmf ( 2 ,   10 ,   5.5 ,   2 ) ; 
77- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
119+ 	y  =  pmf (   2.0 ,   20 ,   - 2 ,   10   ) ; 
120+ 	t . equal (   isnan (   y   ) ,  true ,  'returns NaN'   ) ; 
78121
79- 	v  =  pmf ( 2 ,   10 ,   5 ,   - 2 ) ; 
80- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
122+ 	y  =  pmf (   2.0 ,   20 ,   - 1 ,   10   ) ; 
123+ 	t . equal (   isnan (   y   ) ,  true ,  'returns NaN'   ) ; 
81124
82- 	v  =  pmf ( 2 ,  10 ,  5 ,  2.5 ) ; 
83- 	t . equal ( isnan ( v ) ,  true ,  'returns NaN' ) ; 
125+ 	y  =  pmf (  0.0 ,  20 ,  2.5 ,  10  ) ; 
126+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
127+ 
128+ 	y  =  pmf (  0.0 ,  20 ,  PINF ,  10  ) ; 
129+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
84130
85131	t . end ( ) ; 
86132} ) ; 
87133
88- tape ( 'the function evaluates the PMF for a hypergeometric distribution' ,  opts ,  function  test ( t )  { 
89- 	var  testCases  =  [ { 
90- 		'x' : 1.0 , 
91- 		'N' : 8 , 
92- 		'K' : 4 , 
93- 		'n' : 2 , 
94- 		'expected' : 0.571 
95- 	} , 
96- 	{ 
97- 		'x' : 2.0 , 
98- 		'N' : 8 , 
99- 		'K' : 4 , 
100- 		'n' : 2 , 
101- 		'expected' : 0.214 
102- 	} , 
103- 	{ 
104- 		'x' : 0.0 , 
105- 		'N' : 8 , 
106- 		'K' : 4 , 
107- 		'n' : 2 , 
108- 		'expected' : 0.214 
109- 	} ] ; 
110- 	var  tol  =  1e-3 ; 
111- 
112- 	testCases . forEach ( function  evaluateTestCase ( testCase )  { 
113- 		var  computedPMF  =  pmf ( testCase . x ,  testCase . N ,  testCase . K ,  testCase . n ) ; 
114- 		var  delta  =  abs ( computedPMF  -  testCase . expected ) ; 
115- 		t . ok ( delta  <=  tol ,  'within tolerance. x: '  +  testCase . x  +  ', N: '  +  testCase . N  +  ', K: '  +  testCase . K  +  ', n: '  +  testCase . n  +  ', y: '  +  computedPMF  +  ', expected: '  +  testCase . expected  +  ', Δ: '  +  delta  +  ', tol: '  +  tol ) ; 
116- 	} ) ; 
134+ tape (  'if provided an `n` which is not a nonnegative integer, the function returns `NaN`' ,  opts ,  function  test (  t  )  { 
135+ 	var  y ; 
136+ 
137+ 	y  =  pmf (  2.0 ,  40 ,  20 ,  3.5  ) ; 
138+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
139+ 
140+ 	y  =  pmf (  2.0 ,  40 ,  20 ,  - 2  ) ; 
141+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
142+ 
143+ 	y  =  pmf (  2.0 ,  40 ,  20 ,  - 1  ) ; 
144+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
145+ 
146+ 	y  =  pmf (  0.0 ,  40 ,  20 ,  2.5  ) ; 
147+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
148+ 
149+ 	y  =  pmf (  0.0 ,  40 ,  20 ,  PINF  ) ; 
150+ 	t . equal (  isnan (  y  ) ,  true ,  'returns NaN'  ) ; 
151+ 
152+ 	t . end ( ) ; 
153+ } ) ; 
117154
155+ tape (  'the function evaluates the pmf for `x`' ,  opts ,  function  test (  t  )  { 
156+ 	var  expected ; 
157+ 	var  delta ; 
158+ 	var  tol ; 
159+ 	var  x ; 
160+ 	var  N ; 
161+ 	var  K ; 
162+ 	var  n ; 
163+ 	var  y ; 
164+ 	var  i ; 
165+ 
166+ 	expected  =  data . expected ; 
167+ 	x  =  data . x ; 
168+ 	N  =  data . N ; 
169+ 	K  =  data . K ; 
170+ 	n  =  data . n ; 
171+ 	for  (  i  =  0 ;  i  <  x . length ;  i ++  )  { 
172+ 		y  =  pmf (  x [ i ] ,  N [ i ] ,  K [ i ] ,  n [ i ]  ) ; 
173+ 		if  (  y  ===  expected [ i ]  )  { 
174+ 			t . equal (  y ,  expected [ i ] ,  'x: ' + x [ i ] + ', N: ' + N [ i ] + ', K: ' + K [ i ] + ', n: ' + n [ i ] + ', y: ' + y + ', expected: ' + expected [ i ]  ) ; 
175+ 		}  else  { 
176+ 			delta  =  abs (  y  -  expected [  i  ]  ) ; 
177+ 			tol  =  1040.0  *  EPS  *  abs (  expected [  i  ]  ) ; 
178+ 			t . ok (  delta  <=  tol ,  'within tolerance. x: ' + x [ i ] + '. N: ' + N [ i ] + '. K: ' + K [ i ] + '. n: ' + n [ i ] + '. y: ' + y + '. E: ' + expected [  i  ] + '. Δ: ' + delta + '. tol: ' + tol + '.'  ) ; 
179+ 		} 
180+ 	} 
118181	t . end ( ) ; 
119182} ) ; 
0 commit comments