Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b679e63
feat: implement Wald distribution PDF #209
manit2004 Dec 23, 2025
3f7b53f
chore: add native.js content for Wald PDF #209
manit2004 Dec 23, 2025
c082919
fix: update copyright year to 2025 and add include.gypi #209
manit2004 Dec 23, 2025
1414bd3
chore: add manifest.json for C build configuration #209
manit2004 Dec 23, 2025
cc278e6
chore: add binding.gyp for native addon build #209
manit2004 Dec 23, 2025
e211cdb
added examples, package.json and fixed if statement flow #209
manit2004 Dec 24, 2025
0eeb7b7
added docs #209
manit2004 Dec 24, 2025
f5e2021
feat: add tests for Wald distribution PDF and fix infinity handling #209
manit2004 Dec 25, 2025
e368f23
feat: add tests for Wald distribution PDF with infinity handling fixes
manit2004 Dec 25, 2025
9cf909e
Add README and benchmarks, combine infinity checks in PDF implementation
manit2004 Dec 26, 2025
c049660
Refactor tests to use ULP-based tolerance and improve numerical stabi…
manit2004 Dec 29, 2025
90e01d1
removed unused pow func to fix linting issue
manit2004 Dec 29, 2025
27b3285
linting fixed in benchmark.js
manit2004 Dec 29, 2025
57a20cf
linting fixed in benchmark.js
manit2004 Dec 29, 2025
07b8345
suggestions implemented
manit2004 Jan 1, 2026
6b73c9e
benchmark fixed
manit2004 Jan 1, 2026
bf6cc88
Update copyright year to 2026
manit2004 Jan 1, 2026
f4dab14
Updated copyright year
manit2004 Jan 1, 2026
cd47482
linting fixed
manit2004 Jan 1, 2026
5010216
updated index.js in ./examples
manit2004 Jan 4, 2026
f51ec44
sugesstions implemented
manit2004 Jan 5, 2026
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
170 changes: 170 additions & 0 deletions lib/node_modules/@stdlib/stats/base/dists/wald/pdf/binding.gyp
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
# @license Apache-2.0
#
# Copyright (c) 2025 The Stdlib Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# A `.gyp` file for building a Node.js native add-on.
#
# [1]: https://gyp.gsrc.io/docs/InputFormatReference.md
# [2]: https://gyp.gsrc.io/docs/UserDocumentation.md
{
# List of files to include in this file:
'includes': [
'./include.gypi',
],

# Define variables to be used throughout the configuration for all targets:
'variables': {
# Target name should match the add-on export name:
'addon_target_name%': 'addon',

# Set variables based on the host OS:
'conditions': [
[
'OS=="win"',
{
# Define the object file suffix:
'obj': 'obj',
},
{
# Define the object file suffix:
'obj': 'o',
}
], # end condition (OS=="win")
], # end conditions
}, # end variables

# Define compile targets:
'targets': [

# Target to generate an add-on:
{
# The target name should match the add-on export name:
'target_name': '<(addon_target_name)',

# Define dependencies:
'dependencies': [],

# Define directories which contain relevant include headers:
'include_dirs': [
# Local include directory:
'<@(include_dirs)',
],

# List of source files:
'sources': [
'<@(src_files)',
],

# Settings which should be applied when a target's object files are used as linker input:
'link_settings': {
# Define libraries:
'libraries': [
'<@(libraries)',
],

# Define library directories:
'library_dirs': [
'<@(library_dirs)',
],
},

# C/C++ compiler flags:
'cflags': [
# Enable commonly used warning options:
'-Wall',

# Aggressive optimization:
'-O3',
],

# C specific compiler flags:
'cflags_c': [
# Specify the C standard to which a program is expected to conform:
'-std=c99',
],

# C++ specific compiler flags:
'cflags_cpp': [
# Specify the C++ standard to which a program is expected to conform:
'-std=c++11',
],

# Linker flags:
'ldflags': [],

# Apply conditions based on the host OS:
'conditions': [
[
'OS=="mac"',
{
# Linker flags:
'ldflags': [
'-undefined dynamic_lookup',
'-Wl,-no-pie',
'-Wl,-search_paths_first',
],
},
], # end condition (OS=="mac")
[
'OS!="win"',
{
# C/C++ flags:
'cflags': [
# Generate platform-independent code:
'-fPIC',
],
},
], # end condition (OS!="win")
], # end conditions
}, # end target <(addon_target_name)

# Target to copy a generated add-on to a standard location:
{
'target_name': 'copy_addon',

# Declare that the output of this target is not linked:
'type': 'none',

# Define dependencies:
'dependencies': [
# Require that the add-on be generated before building this target:
'<(addon_target_name)',
],

# Define a list of actions:
'actions': [
{
'action_name': 'copy_addon',
'message': 'Copying addon...',

# Explicitly list the inputs in the command-line invocation below:
'inputs': [],

# Declare the expected outputs:
'outputs': [
'<(addon_output_dir)/<(addon_target_name).node',
],

# Define the command-line invocation:
'action': [
'cp',
'<(PRODUCT_DIR)/<(addon_target_name).node',
'<(addon_output_dir)/<(addon_target_name).node',
],
},
], # end actions
}, # end target copy_addon
], # end targets
}
53 changes: 53 additions & 0 deletions lib/node_modules/@stdlib/stats/base/dists/wald/pdf/include.gypi
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# @license Apache-2.0
#
# Copyright (c) 2025 The Stdlib Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# A GYP include file for building a Node.js native add-on.
#
# Main documentation:
#
# [1]: https://gyp.gsrc.io/docs/InputFormatReference.md
# [2]: https://gyp.gsrc.io/docs/UserDocumentation.md
{
# Define variables to be used throughout the configuration for all targets:
'variables': {
# Source directory:
'src_dir': './src',

# Include directories:
'include_dirs': [
'<!@(node -e "var arr = require(\'@stdlib/utils/library-manifest\')(\'./manifest.json\',{},{\'basedir\':process.cwd(),\'paths\':\'posix\'}).include; for ( var i = 0; i < arr.length; i++ ) { console.log( arr[ i ] ); }")',
],

# Add-on destination directory:
'addon_output_dir': './src',

# Source files:
'src_files': [
'<(src_dir)/addon.c',
'<!@(node -e "var arr = require(\'@stdlib/utils/library-manifest\')(\'./manifest.json\',{},{\'basedir\':process.cwd(),\'paths\':\'posix\'}).src; for ( var i = 0; i < arr.length; i++ ) { console.log( arr[ i ] ); }")',
],

# Library dependencies:
'libraries': [
'<!@(node -e "var arr = require(\'@stdlib/utils/library-manifest\')(\'./manifest.json\',{},{\'basedir\':process.cwd(),\'paths\':\'posix\'}).libraries; for ( var i = 0; i < arr.length; i++ ) { console.log( arr[ i ] ); }")',
],

# Library directories:
'library_dirs': [
'<!@(node -e "var arr = require(\'@stdlib/utils/library-manifest\')(\'./manifest.json\',{},{\'basedir\':process.cwd(),\'paths\':\'posix\'}).libpath; for ( var i = 0; i < arr.length; i++ ) { console.log( arr[ i ] ); }")',
],
}, # end variables
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2025 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef STDLIB_STATS_BASE_DISTS_WALD_PDF_H
#define STDLIB_STATS_BASE_DISTS_WALD_PDF_H

/*
* If C++, prevent name mangling so that the compiler emits a binary file having undecorated names, thus mirroring the behavior of a C compiler.
*/
#ifdef __cplusplus
extern "C" {
#endif

/**
* Evaluates the probability density function (PDF) for a Wald distribution with mean `mu` and shape parameter `lambda` at a value `x`.
*/
double stdlib_base_dists_wald_pdf( const double x, const double mu, const double lambda );

#ifdef __cplusplus
}
#endif

#endif // !STDLIB_STATS_BASE_DISTS_WALD_PDF_H
96 changes: 96 additions & 0 deletions lib/node_modules/@stdlib/stats/base/dists/wald/pdf/lib/factory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2025 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var constantFunction = require( '@stdlib/utils/constant-function' );
var degenerate = require( '@stdlib/stats/base/dists/degenerate/pdf' ).factory;
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var sqrt = require( '@stdlib/math/base/special/sqrt' );
var exp = require( '@stdlib/math/base/special/exp' );
var pow = require( '@stdlib/math/base/special/pow' );
var TWO_PI = require( '@stdlib/constants/float64/two-pi' );


// MAIN //

/**
* Returns a function for evaluating the probability density function (PDF) for a Wald distribution.
*
* @param {PositiveNumber} mu - mean
* @param {PositiveNumber} lambda - shape parameter
* @returns {Function} function to evaluate the probability density function
*
* @example
* var pdf = factory( 1.0, 1.0 );
* var y = pdf( 2.0 );
* // returns ~0.110
*
* y = pdf( 0.5 );
* // returns ~0.879
*/
function factory( mu, lambda ) {
var A;
var B;
if (
isnan( mu ) ||
isnan( lambda )
) {
return constantFunction( NaN );
}
if ( mu <= 0.0 ) {
return constantFunction( NaN );
}
if ( lambda < 0.0 ) {
return constantFunction( NaN );
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can go ahead and consolidate these into a single if condition, given that all result in constantFunction( NaN ).

if ( lambda === 0.0 ) {
return degenerate( mu );
}
A = sqrt( lambda / TWO_PI );
B = -lambda / ( 2.0 * pow( mu, 2.0 ) );
return pdf;

/**
* Evaluates the probability density function (PDF) for a Wald distribution.
*
* @private
* @param {number} x - input value
* @returns {number} evaluated probability density function
*
* @example
* var y = pdf( 2.0 );
* // returns <number>
*/
function pdf( x ) {
if ( isnan( x ) ) {
return NaN;
}
if ( x <= 0.0 ) {
return 0.0;
}
return A / sqrt( pow( x, 3.0 ) ) * exp( B * pow( x - mu, 2.0 ) / x );
}
}


// EXPORTS //

module.exports = factory;
Loading
Loading