1+
2+ <!doctype html>
3+ < html lang ="en ">
4+
5+ < head >
6+ < title > Code coverage report for stats/base/dists/hypergeometric/logpmf/lib/factory.js</ title >
7+ < meta charset ="utf-8 " />
8+ < link rel ="stylesheet " href ="../../../../../../prettify.css " />
9+ < link rel ="stylesheet " href ="../../../../../../base.css " />
10+ < link rel ="shortcut icon " type ="image/x-icon " href ="../../../../../../favicon.png " />
11+ < meta name ="viewport " content ="width=device-width, initial-scale=1 " />
12+ < style type ='text/css '>
13+ .coverage-summary .sorter {
14+ background-image : url(../ ../ ../ ../ ../ ../ sor t-arrow-sprite.png);
15+ }
16+ </ style >
17+ </ head >
18+
19+ < body >
20+ < div class ='wrapper '>
21+ < div class ='pad1 '>
22+ < h1 > < a href ="../../../../../../index.html "> All files</ a > / < a href ="index.html "> stats/base/dists/hypergeometric/logpmf/lib</ a > factory.js</ h1 >
23+ < div class ='clearfix '>
24+
25+ < div class ='fl pad1y space-right2 '>
26+ < span class ="strong "> 100% </ span >
27+ < span class ="quiet "> Statements</ span >
28+ < span class ='fraction '> 103/103</ span >
29+ </ div >
30+
31+
32+ < div class ='fl pad1y space-right2 '>
33+ < span class ="strong "> 100% </ span >
34+ < span class ="quiet "> Branches</ span >
35+ < span class ='fraction '> 19/19</ span >
36+ </ div >
37+
38+
39+ < div class ='fl pad1y space-right2 '>
40+ < span class ="strong "> 100% </ span >
41+ < span class ="quiet "> Functions</ span >
42+ < span class ='fraction '> 2/2</ span >
43+ </ div >
44+
45+
46+ < div class ='fl pad1y space-right2 '>
47+ < span class ="strong "> 100% </ span >
48+ < span class ="quiet "> Lines</ span >
49+ < span class ='fraction '> 103/103</ span >
50+ </ div >
51+
52+
53+ </ div >
54+ < p class ="quiet ">
55+ Press < em > n</ em > or < em > j</ em > to go to the next uncovered block, < em > b</ em > , < em > p</ em > or < em > k</ em > for the previous block.
56+ </ p >
57+ < template id ="filterTemplate ">
58+ < div class ="quiet ">
59+ Filter:
60+ < input type ="search " id ="fileSearch ">
61+ </ div >
62+ </ template >
63+ </ div >
64+ < div class ='status-line high '> </ div >
65+ < pre > < table class ="coverage ">
66+ < tr > < td class ="line-count quiet "> < a name ='L1 '> </ a > < a href ='#L1 '> 1</ a >
67+ < a name ='L2 '> </ a > < a href ='#L2 '> 2</ a >
68+ < a name ='L3 '> </ a > < a href ='#L3 '> 3</ a >
69+ < a name ='L4 '> </ a > < a href ='#L4 '> 4</ a >
70+ < a name ='L5 '> </ a > < a href ='#L5 '> 5</ a >
71+ < a name ='L6 '> </ a > < a href ='#L6 '> 6</ a >
72+ < a name ='L7 '> </ a > < a href ='#L7 '> 7</ a >
73+ < a name ='L8 '> </ a > < a href ='#L8 '> 8</ a >
74+ < a name ='L9 '> </ a > < a href ='#L9 '> 9</ a >
75+ < a name ='L10 '> </ a > < a href ='#L10 '> 10</ a >
76+ < a name ='L11 '> </ a > < a href ='#L11 '> 11</ a >
77+ < a name ='L12 '> </ a > < a href ='#L12 '> 12</ a >
78+ < a name ='L13 '> </ a > < a href ='#L13 '> 13</ a >
79+ < a name ='L14 '> </ a > < a href ='#L14 '> 14</ a >
80+ < a name ='L15 '> </ a > < a href ='#L15 '> 15</ a >
81+ < a name ='L16 '> </ a > < a href ='#L16 '> 16</ a >
82+ < a name ='L17 '> </ a > < a href ='#L17 '> 17</ a >
83+ < a name ='L18 '> </ a > < a href ='#L18 '> 18</ a >
84+ < a name ='L19 '> </ a > < a href ='#L19 '> 19</ a >
85+ < a name ='L20 '> </ a > < a href ='#L20 '> 20</ a >
86+ < a name ='L21 '> </ a > < a href ='#L21 '> 21</ a >
87+ < a name ='L22 '> </ a > < a href ='#L22 '> 22</ a >
88+ < a name ='L23 '> </ a > < a href ='#L23 '> 23</ a >
89+ < a name ='L24 '> </ a > < a href ='#L24 '> 24</ a >
90+ < a name ='L25 '> </ a > < a href ='#L25 '> 25</ a >
91+ < a name ='L26 '> </ a > < a href ='#L26 '> 26</ a >
92+ < a name ='L27 '> </ a > < a href ='#L27 '> 27</ a >
93+ < a name ='L28 '> </ a > < a href ='#L28 '> 28</ a >
94+ < a name ='L29 '> </ a > < a href ='#L29 '> 29</ a >
95+ < a name ='L30 '> </ a > < a href ='#L30 '> 30</ a >
96+ < a name ='L31 '> </ a > < a href ='#L31 '> 31</ a >
97+ < a name ='L32 '> </ a > < a href ='#L32 '> 32</ a >
98+ < a name ='L33 '> </ a > < a href ='#L33 '> 33</ a >
99+ < a name ='L34 '> </ a > < a href ='#L34 '> 34</ a >
100+ < a name ='L35 '> </ a > < a href ='#L35 '> 35</ a >
101+ < a name ='L36 '> </ a > < a href ='#L36 '> 36</ a >
102+ < a name ='L37 '> </ a > < a href ='#L37 '> 37</ a >
103+ < a name ='L38 '> </ a > < a href ='#L38 '> 38</ a >
104+ < a name ='L39 '> </ a > < a href ='#L39 '> 39</ a >
105+ < a name ='L40 '> </ a > < a href ='#L40 '> 40</ a >
106+ < a name ='L41 '> </ a > < a href ='#L41 '> 41</ a >
107+ < a name ='L42 '> </ a > < a href ='#L42 '> 42</ a >
108+ < a name ='L43 '> </ a > < a href ='#L43 '> 43</ a >
109+ < a name ='L44 '> </ a > < a href ='#L44 '> 44</ a >
110+ < a name ='L45 '> </ a > < a href ='#L45 '> 45</ a >
111+ < a name ='L46 '> </ a > < a href ='#L46 '> 46</ a >
112+ < a name ='L47 '> </ a > < a href ='#L47 '> 47</ a >
113+ < a name ='L48 '> </ a > < a href ='#L48 '> 48</ a >
114+ < a name ='L49 '> </ a > < a href ='#L49 '> 49</ a >
115+ < a name ='L50 '> </ a > < a href ='#L50 '> 50</ a >
116+ < a name ='L51 '> </ a > < a href ='#L51 '> 51</ a >
117+ < a name ='L52 '> </ a > < a href ='#L52 '> 52</ a >
118+ < a name ='L53 '> </ a > < a href ='#L53 '> 53</ a >
119+ < a name ='L54 '> </ a > < a href ='#L54 '> 54</ a >
120+ < a name ='L55 '> </ a > < a href ='#L55 '> 55</ a >
121+ < a name ='L56 '> </ a > < a href ='#L56 '> 56</ a >
122+ < a name ='L57 '> </ a > < a href ='#L57 '> 57</ a >
123+ < a name ='L58 '> </ a > < a href ='#L58 '> 58</ a >
124+ < a name ='L59 '> </ a > < a href ='#L59 '> 59</ a >
125+ < a name ='L60 '> </ a > < a href ='#L60 '> 60</ a >
126+ < a name ='L61 '> </ a > < a href ='#L61 '> 61</ a >
127+ < a name ='L62 '> </ a > < a href ='#L62 '> 62</ a >
128+ < a name ='L63 '> </ a > < a href ='#L63 '> 63</ a >
129+ < a name ='L64 '> </ a > < a href ='#L64 '> 64</ a >
130+ < a name ='L65 '> </ a > < a href ='#L65 '> 65</ a >
131+ < a name ='L66 '> </ a > < a href ='#L66 '> 66</ a >
132+ < a name ='L67 '> </ a > < a href ='#L67 '> 67</ a >
133+ < a name ='L68 '> </ a > < a href ='#L68 '> 68</ a >
134+ < a name ='L69 '> </ a > < a href ='#L69 '> 69</ a >
135+ < a name ='L70 '> </ a > < a href ='#L70 '> 70</ a >
136+ < a name ='L71 '> </ a > < a href ='#L71 '> 71</ a >
137+ < a name ='L72 '> </ a > < a href ='#L72 '> 72</ a >
138+ < a name ='L73 '> </ a > < a href ='#L73 '> 73</ a >
139+ < a name ='L74 '> </ a > < a href ='#L74 '> 74</ a >
140+ < a name ='L75 '> </ a > < a href ='#L75 '> 75</ a >
141+ < a name ='L76 '> </ a > < a href ='#L76 '> 76</ a >
142+ < a name ='L77 '> </ a > < a href ='#L77 '> 77</ a >
143+ < a name ='L78 '> </ a > < a href ='#L78 '> 78</ a >
144+ < a name ='L79 '> </ a > < a href ='#L79 '> 79</ a >
145+ < a name ='L80 '> </ a > < a href ='#L80 '> 80</ a >
146+ < a name ='L81 '> </ a > < a href ='#L81 '> 81</ a >
147+ < a name ='L82 '> </ a > < a href ='#L82 '> 82</ a >
148+ < a name ='L83 '> </ a > < a href ='#L83 '> 83</ a >
149+ < a name ='L84 '> </ a > < a href ='#L84 '> 84</ a >
150+ < a name ='L85 '> </ a > < a href ='#L85 '> 85</ a >
151+ < a name ='L86 '> </ a > < a href ='#L86 '> 86</ a >
152+ < a name ='L87 '> </ a > < a href ='#L87 '> 87</ a >
153+ < a name ='L88 '> </ a > < a href ='#L88 '> 88</ a >
154+ < a name ='L89 '> </ a > < a href ='#L89 '> 89</ a >
155+ < a name ='L90 '> </ a > < a href ='#L90 '> 90</ a >
156+ < a name ='L91 '> </ a > < a href ='#L91 '> 91</ a >
157+ < a name ='L92 '> </ a > < a href ='#L92 '> 92</ a >
158+ < a name ='L93 '> </ a > < a href ='#L93 '> 93</ a >
159+ < a name ='L94 '> </ a > < a href ='#L94 '> 94</ a >
160+ < a name ='L95 '> </ a > < a href ='#L95 '> 95</ a >
161+ < a name ='L96 '> </ a > < a href ='#L96 '> 96</ a >
162+ < a name ='L97 '> </ a > < a href ='#L97 '> 97</ a >
163+ < a name ='L98 '> </ a > < a href ='#L98 '> 98</ a >
164+ < a name ='L99 '> </ a > < a href ='#L99 '> 99</ a >
165+ < a name ='L100 '> </ a > < a href ='#L100 '> 100</ a >
166+ < a name ='L101 '> </ a > < a href ='#L101 '> 101</ a >
167+ < a name ='L102 '> </ a > < a href ='#L102 '> 102</ a >
168+ < a name ='L103 '> </ a > < a href ='#L103 '> 103</ a >
169+ < a name ='L104 '> </ a > < a href ='#L104 '> 104</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 3x</ span >
170+ < span class ="cline-any cline-yes "> 3x</ span >
171+ < span class ="cline-any cline-yes "> 3x</ span >
172+ < span class ="cline-any cline-yes "> 3x</ span >
173+ < span class ="cline-any cline-yes "> 3x</ span >
174+ < span class ="cline-any cline-yes "> 3x</ span >
175+ < span class ="cline-any cline-yes "> 3x</ span >
176+ < span class ="cline-any cline-yes "> 3x</ span >
177+ < span class ="cline-any cline-yes "> 3x</ span >
178+ < span class ="cline-any cline-yes "> 3x</ span >
179+ < span class ="cline-any cline-yes "> 3x</ span >
180+ < span class ="cline-any cline-yes "> 3x</ span >
181+ < span class ="cline-any cline-yes "> 3x</ span >
182+ < span class ="cline-any cline-yes "> 3x</ span >
183+ < span class ="cline-any cline-yes "> 3x</ span >
184+ < span class ="cline-any cline-yes "> 3x</ span >
185+ < span class ="cline-any cline-yes "> 3x</ span >
186+ < span class ="cline-any cline-yes "> 3x</ span >
187+ < span class ="cline-any cline-yes "> 3x</ span >
188+ < span class ="cline-any cline-yes "> 3x</ span >
189+ < span class ="cline-any cline-yes "> 3x</ span >
190+ < span class ="cline-any cline-yes "> 3x</ span >
191+ < span class ="cline-any cline-yes "> 3x</ span >
192+ < span class ="cline-any cline-yes "> 3x</ span >
193+ < span class ="cline-any cline-yes "> 3x</ span >
194+ < span class ="cline-any cline-yes "> 3x</ span >
195+ < span class ="cline-any cline-yes "> 3x</ span >
196+ < span class ="cline-any cline-yes "> 3x</ span >
197+ < span class ="cline-any cline-yes "> 3x</ span >
198+ < span class ="cline-any cline-yes "> 3x</ span >
199+ < span class ="cline-any cline-yes "> 3x</ span >
200+ < span class ="cline-any cline-yes "> 3x</ span >
201+ < span class ="cline-any cline-yes "> 3x</ span >
202+ < span class ="cline-any cline-yes "> 3x</ span >
203+ < span class ="cline-any cline-yes "> 3x</ span >
204+ < span class ="cline-any cline-yes "> 3x</ span >
205+ < span class ="cline-any cline-yes "> 3x</ span >
206+ < span class ="cline-any cline-yes "> 3x</ span >
207+ < span class ="cline-any cline-yes "> 3x</ span >
208+ < span class ="cline-any cline-yes "> 3x</ span >
209+ < span class ="cline-any cline-yes "> 3x</ span >
210+ < span class ="cline-any cline-yes "> 3x</ span >
211+ < span class ="cline-any cline-yes "> 3x</ span >
212+ < span class ="cline-any cline-yes "> 3x</ span >
213+ < span class ="cline-any cline-yes "> 3x</ span >
214+ < span class ="cline-any cline-yes "> 3x</ span >
215+ < span class ="cline-any cline-yes "> 3x</ span >
216+ < span class ="cline-any cline-yes "> 3x</ span >
217+ < span class ="cline-any cline-yes "> 3x</ span >
218+ < span class ="cline-any cline-yes "> 3x</ span >
219+ < span class ="cline-any cline-yes "> 1023x</ span >
220+ < span class ="cline-any cline-yes "> 1023x</ span >
221+ < span class ="cline-any cline-yes "> 1023x</ span >
222+ < span class ="cline-any cline-yes "> 1023x</ span >
223+ < span class ="cline-any cline-yes "> 1023x</ span >
224+ < span class ="cline-any cline-yes "> 1023x</ span >
225+ < span class ="cline-any cline-yes "> 1023x</ span >
226+ < span class ="cline-any cline-yes "> 1023x</ span >
227+ < span class ="cline-any cline-yes "> 1023x</ span >
228+ < span class ="cline-any cline-yes "> 1023x</ span >
229+ < span class ="cline-any cline-yes "> 1023x</ span >
230+ < span class ="cline-any cline-yes "> 1023x</ span >
231+ < span class ="cline-any cline-yes "> 1023x</ span >
232+ < span class ="cline-any cline-yes "> 1005x</ span >
233+ < span class ="cline-any cline-yes "> 1023x</ span >
234+ < span class ="cline-any cline-yes "> 19x</ span >
235+ < span class ="cline-any cline-yes "> 19x</ span >
236+ < span class ="cline-any cline-yes "> 1004x</ span >
237+ < span class ="cline-any cline-yes "> 1004x</ span >
238+ < span class ="cline-any cline-yes "> 1004x</ span >
239+ < span class ="cline-any cline-yes "> 1004x</ span >
240+ < span class ="cline-any cline-yes "> 1004x</ span >
241+ < span class ="cline-any cline-yes "> 1004x</ span >
242+ < span class ="cline-any cline-yes "> 1004x</ span >
243+ < span class ="cline-any cline-yes "> 1004x</ span >
244+ < span class ="cline-any cline-yes "> 1004x</ span >
245+ < span class ="cline-any cline-yes "> 1004x</ span >
246+ < span class ="cline-any cline-yes "> 1004x</ span >
247+ < span class ="cline-any cline-yes "> 1004x</ span >
248+ < span class ="cline-any cline-yes "> 1004x</ span >
249+ < span class ="cline-any cline-yes "> 1006x</ span >
250+ < span class ="cline-any cline-yes "> 1006x</ span >
251+ < span class ="cline-any cline-yes "> 1006x</ span >
252+ < span class ="cline-any cline-yes "> 1x</ span >
253+ < span class ="cline-any cline-yes "> 1x</ span >
254+ < span class ="cline-any cline-yes "> 1005x</ span >
255+ < span class ="cline-any cline-yes "> 1005x</ span >
256+ < span class ="cline-any cline-yes "> 1006x</ span >
257+ < span class ="cline-any cline-yes "> 839x</ span >
258+ < span class ="cline-any cline-yes "> 1006x</ span >
259+ < span class ="cline-any cline-yes "> 836x</ span >
260+ < span class ="cline-any cline-yes "> 836x</ span >
261+ < span class ="cline-any cline-yes "> 836x</ span >
262+ < span class ="cline-any cline-yes "> 836x</ span >
263+ < span class ="cline-any cline-yes "> 836x</ span >
264+ < span class ="cline-any cline-yes "> 169x</ span >
265+ < span class ="cline-any cline-yes "> 1006x</ span >
266+ < span class ="cline-any cline-yes "> 1023x</ span >
267+ < span class ="cline-any cline-yes "> 3x</ span >
268+ < span class ="cline-any cline-yes "> 3x</ span >
269+ < span class ="cline-any cline-yes "> 3x</ span >
270+ < span class ="cline-any cline-yes "> 3x</ span >
271+ < span class ="cline-any cline-yes "> 3x</ span >
272+ < span class ="cline-any cline-neutral "> </ span > </ td > < td class ="text "> < pre class ="prettyprint lang-js "> /**
273+ * @license Apache-2.0
274+ *
275+ * Copyright (c) 2018 The Stdlib Authors.
276+ *
277+ * Licensed under the Apache License, Version 2.0 (the "License");
278+ * you may not use this file except in compliance with the License.
279+ * You may obtain a copy of the License at
280+ *
281+ * http://www.apache.org/licenses/LICENSE-2.0
282+ *
283+ * Unless required by applicable law or agreed to in writing, software
284+ * distributed under the License is distributed on an "AS IS" BASIS,
285+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
286+ * See the License for the specific language governing permissions and
287+ * limitations under the License.
288+ */
289+
290+ 'use strict';
291+
292+ // MODULES //
293+
294+ var isNonNegativeInteger = require( '@stdlib/math/base/assert/is-nonnegative-integer' );
295+ var constantFunction = require( '@stdlib/utils/constant-function' );
296+ var isnan = require( '@stdlib/math/base/assert/is-nan' );
297+ var fln = require( '@stdlib/math/base/special/factorialln' );
298+ var max = require( '@stdlib/math/base/special/max' );
299+ var min = require( '@stdlib/math/base/special/min' );
300+ var NINF = require( '@stdlib/constants/float64/ninf' );
301+ var PINF = require( '@stdlib/constants/float64/pinf' );
302+
303+
304+ // MAIN //
305+
306+ /**
307+ * Returns a function for evaluating the natural logarithm of the probability mass function (PMF) for a hypergeometric distribution with population size `N`, subpopulation size `K` and number of draws `n`.
308+ *
309+ * @param {NonNegativeInteger} N - population size
310+ * @param {NonNegativeInteger} K - subpopulation size
311+ * @param {NonNegativeInteger} n - number of draws
312+ * @returns {Function} logPMF
313+ *
314+ * @example
315+ * var mylogpmf = factory( 30, 20, 5 );
316+ * var y = mylogpmf( 4.0 );
317+ * // returns ~-1.079
318+ *
319+ * y = mylogpmf( 1.0 );
320+ * // returns ~-3.524
321+ */
322+ function factory( N, K, n ) {
323+ var maxs;
324+ var mins;
325+ if (
326+ isnan( N ) ||
327+ isnan( K ) ||
328+ isnan( n ) ||
329+ !isNonNegativeInteger( N ) ||
330+ !isNonNegativeInteger( K ) ||
331+ !isNonNegativeInteger( n ) ||
332+ N === PINF ||
333+ K === PINF ||
334+ K > N ||
335+ n > N
336+ ) {
337+ return constantFunction( NaN );
338+ }
339+
340+ mins = max( 0, n + K - N );
341+ maxs = min( K, n );
342+ return logpmf;
343+
344+ /**
345+ * Evaluates the natural logarithm of the probability mass function (PMF) for a hypergeometric distribution.
346+ *
347+ * @private
348+ * @param {number} x - input value
349+ * @returns {number} evaluated logPMF
350+ */
351+ function logpmf( x ) {
352+ var ldenom;
353+ var lnum;
354+ if ( isnan( x ) ) {
355+ return NaN;
356+ }
357+ if (
358+ isNonNegativeInteger( x ) &&
359+ mins <= x &&
360+ x <= maxs
361+ ) {
362+ lnum = fln( n ) + fln( K ) + fln( N - n ) + fln( N - K );
363+ ldenom = fln( N ) + fln( x ) + fln( n - x );
364+ ldenom += fln( K - x ) + fln( N - K + x - n );
365+ return lnum - ldenom;
366+ }
367+ return NINF;
368+ }
369+ }
370+
371+
372+ // EXPORTS //
373+
374+ module.exports = factory;
375+ </ pre > </ td > </ tr > </ table > </ pre >
376+
377+ < div class ='push '> </ div > <!-- for sticky footer -->
378+ </ div > <!-- /wrapper -->
379+ < div class ='footer quiet pad2 space-top1 center small '>
380+ Code coverage generated by
381+ < a href ="https://istanbul.js.org/ " target ="_blank " rel ="noopener noreferrer "> istanbul</ a >
382+ at 2025-03-02T01:35:36.836Z
383+ </ div >
384+ < script src ="../../../../../../prettify.js "> </ script >
385+ < script >
386+ window . onload = function ( ) {
387+ prettyPrint ( ) ;
388+ } ;
389+ </ script >
390+ < script src ="../../../../../../sorter.js "> </ script >
391+ < script src ="../../../../../../block-navigation.js "> </ script >
392+ </ body >
393+ </ html >
394+
0 commit comments