Skip to content

refactor: add isnan guards#13362

Merged
kgryte merged 1 commit into
developfrom
philipp/fix-propagation-2026-07-07
Jul 7, 2026
Merged

refactor: add isnan guards#13362
kgryte merged 1 commit into
developfrom
philipp/fix-propagation-2026-07-07

Conversation

@Planeshifter

Copy link
Copy Markdown
Member

Description

Propagating fixes merged to develop between 2026-07-06 15:53 -0700 and 2026-07-07 00:50 -0700 to sibling packages.

refactor: add explicit isnan guards2671115

Propagates the explicit isnan guard pattern from 2671115 ("refactor: add explicit isnan guards" in pareto-type1/{mean,median}) to sibling distribution packages, replacing implicit reliance on NaN <= 0.0 evaluating to false with explicit isnan( alpha ) || isnan( beta ) rejection. For betaprime/mode, the fix is not defensive-only: with the old guard, mode( 0.5, NaN ) returned 0.0 instead of NaN, because the follow-up alpha < 1.0 branch fired past the failed rejection.

Target packages:

  • stats/base/dists/gamma/{mean,mode,variance,stdev,entropy}
  • stats/base/dists/beta/{mean,median,mode,variance,stdev,skewness,kurtosis,entropy}
  • stats/base/dists/f/{mode,variance,stdev,skewness,kurtosis}
  • stats/base/dists/invgamma/{mean,mode,variance,stdev,entropy}
  • stats/base/dists/betaprime/{mean,mode}

Related Issues

No.

Questions

No.

Other

Validation

  • Pattern search scoped to lib/node_modules/@stdlib/stats/base/dists/*/{mean,median,mode,variance,stdev,skewness,kurtosis,entropy,mgf}/lib/main.js.
  • Two independent opus validation agents read each candidate file end-to-end and confirmed the defect present, the fix applies verbatim, and no upstream validator already rejects NaN.
  • Sonnet style-consistency pass confirmed each patch's isnan require placement (first in // MODULES //), guard-block indentation, parameter-order preservation, and threshold preservation match the source commit and the existing already-fixed sibling files (t/entropy, rayleigh/entropy, triangular/entropy, weibull/entropy).
  • Each modified file re-read after patching to confirm exact match with the approved diff.

Deliberately excluded

  • Sites where the guard uses >= (arcsine, uniform) — 9 files. The pattern signature differs from the source commit and the maintainer intent for >= bounds is not established by 2671115.
  • Sites already delegating to a NaN-safe sibling (e.g. lognormal/stdev, t/stdev, chisquare/median).
  • Sites already guarding with !isInteger(...) / !isNonNegativeInteger(...) (hypergeometric, discrete-uniform families), which reject NaN inherently.
  • stats/base/dists/pareto-type1/* — source of the fix; already covered.
  • All other source commits from the 24h window: grammar-fix propagation (547176ec, 9c313057) had zero remaining unfixed sites in the repo; ternary-parens propagation (563772fc) had zero remaining unfixed sites; dlast-index-of/slast-index-of collapse (ba80db9c) — sibling last-index-of packages already use return N - 1 - idx;; Float16Array index-signature fix (6b88a637) — pattern does not extend to Complex64Array/Complex128Array/BooleanArray (non-native, no numeric index access).

Checklist

AI Assistance

  • Yes
  • No

If you answered "yes" above, how did you use AI assistance?

  • Code generation (e.g., when writing an implementation or fixing a bug)
  • Test/benchmark generation
  • Documentation (including examples)
  • Research and understanding

Disclosure

This PR was authored by an automated stdlib fix-propagation routine: the last 24h of commits merged to develop were parsed for propagatable fix patterns; each candidate pattern's structural signature was searched across sibling packages; each candidate site was reviewed by two independent opus validation agents and a sonnet style-consistency agent, with only sites passing all three advancing to the propagation branch. Each patch was hand-verified against the approved diff before commit.



Generated by Claude Code

Propagates fix from 2671115 ("refactor: add explicit `isnan` guards")
to sibling distribution packages that guard `<=` on shape/rate
parameters but do not explicitly reject `NaN`. Applied verbatim
across `gamma`, `beta`, `betaprime`, `f`, and `invgamma` summary
statistics (`mean`, `median`, `mode`, `variance`, `stdev`,
`skewness`, `kurtosis`, `entropy` — where present).

Ref: 2671115
@stdlib-bot stdlib-bot added the Statistics Issue or pull request related to statistical functionality. label Jul 7, 2026
@stdlib-bot

Copy link
Copy Markdown
Contributor

Coverage Report

Package Statements Branches Functions Lines
stats/base/dists/beta/entropy $\\color{green}202/202$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}202/202$
$\\color{green}+100.00\\%$
stats/base/dists/beta/kurtosis $\\color{green}207/207$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}207/207$
$\\color{green}+100.00\\%$
stats/base/dists/beta/mean $\\color{green}195/195$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}195/195$
$\\color{green}+100.00\\%$
stats/base/dists/beta/median $\\color{green}125/125$
$\\color{green}+100.00\\%$
$\\color{green}8/8$
$\\color{green}+100.00\\%$
$\\color{green}1/1$
$\\color{green}+100.00\\%$
$\\color{green}125/125$
$\\color{green}+100.00\\%$
stats/base/dists/beta/mode $\\color{green}192/192$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}192/192$
$\\color{green}+100.00\\%$
stats/base/dists/beta/skewness $\\color{green}201/201$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}201/201$
$\\color{green}+100.00\\%$
stats/base/dists/beta/stdev $\\color{green}201/201$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}201/201$
$\\color{green}+100.00\\%$
stats/base/dists/beta/variance $\\color{green}200/200$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}200/200$
$\\color{green}+100.00\\%$
stats/base/dists/betaprime/mean $\\color{green}203/203$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}203/203$
$\\color{green}+100.00\\%$
stats/base/dists/betaprime/mode $\\color{green}206/206$
$\\color{green}+100.00\\%$
$\\color{green}12/12$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}206/206$
$\\color{green}+100.00\\%$
stats/base/dists/f/kurtosis $\\color{green}210/210$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}210/210$
$\\color{green}+100.00\\%$
stats/base/dists/f/mode $\\color{green}195/195$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}195/195$
$\\color{green}+100.00\\%$
stats/base/dists/f/skewness $\\color{green}207/207$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}207/207$
$\\color{green}+100.00\\%$
stats/base/dists/f/stdev $\\color{green}208/208$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}208/208$
$\\color{green}+100.00\\%$
stats/base/dists/f/variance $\\color{green}207/207$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}207/207$
$\\color{green}+100.00\\%$
stats/base/dists/gamma/entropy $\\color{green}202/202$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}202/202$
$\\color{green}+100.00\\%$
stats/base/dists/gamma/mean $\\color{green}195/195$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}195/195$
$\\color{green}+100.00\\%$
stats/base/dists/gamma/mode $\\color{green}203/203$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}203/203$
$\\color{green}+100.00\\%$
stats/base/dists/gamma/stdev $\\color{green}196/196$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}196/196$
$\\color{green}+100.00\\%$
stats/base/dists/gamma/variance $\\color{green}192/192$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}192/192$
$\\color{green}+100.00\\%$
stats/base/dists/invgamma/entropy $\\color{green}201/201$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}201/201$
$\\color{green}+100.00\\%$
stats/base/dists/invgamma/mean $\\color{green}192/192$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}192/192$
$\\color{green}+100.00\\%$
stats/base/dists/invgamma/mode $\\color{green}195/195$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}195/195$
$\\color{green}+100.00\\%$
stats/base/dists/invgamma/stdev $\\color{green}196/196$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}196/196$
$\\color{green}+100.00\\%$
stats/base/dists/invgamma/variance $\\color{green}196/196$
$\\color{green}+100.00\\%$
$\\color{green}10/10$
$\\color{green}+100.00\\%$
$\\color{green}2/2$
$\\color{green}+100.00\\%$
$\\color{green}196/196$
$\\color{green}+100.00\\%$

The above coverage report was generated for the changes in this PR.

@Planeshifter Planeshifter marked this pull request as ready for review July 7, 2026 16:43
@Planeshifter Planeshifter requested review from a team and kgryte July 7, 2026 16:43
@stdlib-bot stdlib-bot added the Needs Review A pull request which needs code review. label Jul 7, 2026
@kgryte kgryte removed the Needs Review A pull request which needs code review. label Jul 7, 2026
@kgryte kgryte changed the title refactor: propagate isnan guards across stats/base/dists distributions refactor: add isnan guards Jul 7, 2026
@kgryte kgryte merged commit b5b7b4c into develop Jul 7, 2026
54 checks passed
@kgryte kgryte deleted the philipp/fix-propagation-2026-07-07 branch July 7, 2026 21:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Statistics Issue or pull request related to statistical functionality.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants