Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,19 @@ double stdlib_base_dists_hypergeometric_logpmf( const double x, const int32_t N,
double lnum;
double maxs;
double mins;
double dn;
double dK;
double dN;

if ( stdlib_base_is_nan( x ) || N < 0 || K < 0 || n < 0 || K > N || n > N ) {
return 0.0/0.0; // NaN
}

mins = stdlib_base_max( 0, n+K-N );
maxs = stdlib_base_min( K, n );
dn = (double)n;
dN = (double)N;
dK = (double)K;
mins = stdlib_base_max( 0.0, dn+dK-dN );
maxs = stdlib_base_min( dK, dn );

if ( stdlib_base_is_nonnegative_integer( x ) && mins <= x && x <= maxs ) {
lnum = stdlib_base_factorialln( n ) + stdlib_base_factorialln( K ) + stdlib_base_factorialln( N-n ) + stdlib_base_factorialln( N-K );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,19 @@ double stdlib_base_dists_hypergeometric_pmf( const double x, const int32_t N, co
double lpmf;
double maxs;
double mins;
double dn;
double dK;
double dN;

if ( stdlib_base_is_nan( x ) || N < 0 || K < 0 || n < 0 || K > N || n > N ) {
return 0.0/0.0; // NaN
}

mins = stdlib_base_max( 0, n+K-N );
maxs = stdlib_base_min( K, n );
dn = (double)n;
dN = (double)N;
dK = (double)K;
mins = stdlib_base_max( 0.0, dn+dK-dN );
maxs = stdlib_base_min( dK, dn );

if ( stdlib_base_is_nonnegative_integer( x ) && mins <= x && x <= maxs ) {
lnum = stdlib_base_factorialln( n ) + stdlib_base_factorialln( K ) + stdlib_base_factorialln( N-n ) + stdlib_base_factorialln( N-K );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,14 @@
* double y = stdlib_base_dists_hypergeometric_quantile( 0.4, 40, 20, 10 );
* // returns 5
*/
double stdlib_base_dists_hypergeometric_quantile(
const double p,
const int32_t N,
const int32_t K,
const int32_t n
) {
double stdlib_base_dists_hypergeometric_quantile( const double p, const int32_t N, const int32_t K, const int32_t n ) {
double upper;
double lower;
double prob;
int32_t upper;
int32_t lower;
int32_t x;
double dn;
double dK;
double dN;
double x;

if (
stdlib_base_is_nan( p ) ||
Expand All @@ -60,23 +58,26 @@ double stdlib_base_dists_hypergeometric_quantile(
return 0.0 / 0.0;
}

lower = stdlib_base_max( 0, n + K - N );
upper = stdlib_base_min( n, K );
dn = (double)n;
dN = (double)N;
dK = (double)K;
lower = stdlib_base_max( 0.0, dn+dK-dN );
upper = stdlib_base_min( dn, dK );

if ( p == 0.0 ) {
return (double)lower;
return lower;
}
if ( p == 1.0 ) {
return (double)upper;
return upper;
}

x = lower;
while ( x <= upper ) {
prob = stdlib_base_dists_hypergeometric_cdf( (double)x, N, K, n );
prob = stdlib_base_dists_hypergeometric_cdf( x, N, K, n );
if ( prob > p ) {
break;
}
x += 1;
x += 1.0;
}
return (double)x;
return x;
}