@tangle-network/agent-eval 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -27
- package/dist/adapters/http.d.ts +2 -2
- package/dist/{agent-profile-CPv4tENR.d.ts → agent-profile-BO8ruI6R.d.ts} +3 -3
- package/dist/{agent-profile-CPv4tENR.d.ts.map → agent-profile-BO8ruI6R.d.ts.map} +1 -1
- package/dist/analyst/index.d.ts +14 -14
- package/dist/analyst/index.js +11 -12
- package/dist/analyst/index.js.map +1 -1
- package/dist/{analyze-runs-pJ4fhnYg.d.ts → analyze-runs-DYYe18Gw.d.ts} +4 -4
- package/dist/{analyze-runs-pJ4fhnYg.d.ts.map → analyze-runs-DYYe18Gw.d.ts.map} +1 -1
- package/dist/{analyze-runs-C7vWBDhl.js → analyze-runs-jLTRKuoK.js} +6 -110
- package/dist/analyze-runs-jLTRKuoK.js.map +1 -0
- package/dist/app-grade/index.d.ts +4 -4
- package/dist/app-grade/index.js +3 -3
- package/dist/{benchmark-command-DSJQeYom.js → benchmark-command-CoNndRCk.js} +13 -14
- package/dist/benchmark-command-CoNndRCk.js.map +1 -0
- package/dist/benchmarks/index.d.ts +4 -4
- package/dist/benchmarks/index.js +4 -5
- package/dist/benchmarks/index.js.map +1 -1
- package/dist/builder-eval/index.js +1 -1
- package/dist/{calibration-CbZPApIO.js → calibration-Cf-wpqqO.js} +2 -2
- package/dist/{calibration-CbZPApIO.js.map → calibration-Cf-wpqqO.js.map} +1 -1
- package/dist/campaign/index.d.ts +7 -7
- package/dist/campaign/index.js +10 -10
- package/dist/{campaign-BABipFel.js → campaign-Bl07uIaf.js} +14 -15
- package/dist/{campaign-BABipFel.js.map → campaign-Bl07uIaf.js.map} +1 -1
- package/dist/{campaign-evidence-DONEWvVY.js → campaign-evidence-NtH29ctt.js} +3 -3
- package/dist/{campaign-evidence-DONEWvVY.js.map → campaign-evidence-NtH29ctt.js.map} +1 -1
- package/dist/{chat-client-D0me8iwq.js → chat-client-Zz97O3NB.js} +2 -2
- package/dist/{chat-client-D0me8iwq.js.map → chat-client-Zz97O3NB.js.map} +1 -1
- package/dist/{chat-json-call-C473CwTt.js → chat-json-call-Dgi7-RH-.js} +2 -2
- package/dist/{chat-json-call-C473CwTt.js.map → chat-json-call-Dgi7-RH-.js.map} +1 -1
- package/dist/cli.js +7 -7
- package/dist/{types-0KglnQ9o.d.ts → cluster-Cd0MRbr9.d.ts} +44 -2
- package/dist/cluster-Cd0MRbr9.d.ts.map +1 -0
- package/dist/cluster-bootstrap-B0MTOBRU.js +24 -0
- package/dist/cluster-bootstrap-B0MTOBRU.js.map +1 -0
- package/dist/{completion-verifier-7KEfroqx.d.ts → completion-verifier-BEpsr3N4.d.ts} +2 -2
- package/dist/{completion-verifier-7KEfroqx.d.ts.map → completion-verifier-BEpsr3N4.d.ts.map} +1 -1
- package/dist/{completion-verifier-ClmJV_Yc.js → completion-verifier-DFyYFezn.js} +3 -3
- package/dist/{completion-verifier-ClmJV_Yc.js.map → completion-verifier-DFyYFezn.js.map} +1 -1
- package/dist/contract/index.d.ts +10 -10
- package/dist/contract/index.js +14 -15
- package/dist/contract/index.js.map +1 -1
- package/dist/{cost-ledger-CS8R3IZj.js → cost-ledger-DfhStGcZ.js} +2 -2
- package/dist/{cost-ledger-CS8R3IZj.js.map → cost-ledger-DfhStGcZ.js.map} +1 -1
- package/dist/{decision-point-CNyoKOkz.js → decision-point-Di2LATNH.js} +4 -4
- package/dist/{decision-point-CNyoKOkz.js.map → decision-point-Di2LATNH.js.map} +1 -1
- package/dist/{default-registry-BB9_jzyH.js → default-registry-CdFbxPnr.js} +5 -5
- package/dist/{default-registry-BB9_jzyH.js.map → default-registry-CdFbxPnr.js.map} +1 -1
- package/dist/{default-registry-BbXr18AT.d.ts → default-registry-aPvwtzEM.d.ts} +7 -7
- package/dist/{default-registry-BbXr18AT.d.ts.map → default-registry-aPvwtzEM.d.ts.map} +1 -1
- package/dist/{define-agent-eval-Q4FdXGj7.js → define-agent-eval-BROmIwn1.js} +6 -6
- package/dist/{define-agent-eval-Q4FdXGj7.js.map → define-agent-eval-BROmIwn1.js.map} +1 -1
- package/dist/{define-agent-eval-D_DQMH04.d.ts → define-agent-eval-Bx3b9B01.d.ts} +7 -7
- package/dist/{define-agent-eval-D_DQMH04.d.ts.map → define-agent-eval-Bx3b9B01.d.ts.map} +1 -1
- package/dist/diagnosis/index.d.ts +2 -2
- package/dist/diagnosis/index.js +1 -1
- package/dist/{dspy-rlm-engine-CqQc0R2l.js → dspy-rlm-engine-cWyn8G1a.js} +4 -4
- package/dist/{dspy-rlm-engine-CqQc0R2l.js.map → dspy-rlm-engine-cWyn8G1a.js.map} +1 -1
- package/dist/{engine-rfV8Ff8V.d.ts → engine-BF8naBn7.d.ts} +2 -2
- package/dist/{engine-rfV8Ff8V.d.ts.map → engine-BF8naBn7.d.ts.map} +1 -1
- package/dist/{eval-campaign-CZSCjxVb.js → eval-campaign-Dq8DEKmy.js} +2 -2
- package/dist/{eval-campaign-CZSCjxVb.js.map → eval-campaign-Dq8DEKmy.js.map} +1 -1
- package/dist/{evaluation-SDXKL6Fx.d.ts → evaluation-CFKj_IlJ.d.ts} +4 -4
- package/dist/{evaluation-SDXKL6Fx.d.ts.map → evaluation-CFKj_IlJ.d.ts.map} +1 -1
- package/dist/{evaluation-BBI37mRe.js → evaluation-bU_bhlv-.js} +2 -2
- package/dist/{evaluation-BBI37mRe.js.map → evaluation-bU_bhlv-.js.map} +1 -1
- package/dist/evaluation.d.ts +1 -1
- package/dist/evaluation.js +1 -1
- package/dist/{exact-types-CaLLU1Pz.d.ts → exact-types-VAFjtOQN.d.ts} +2 -2
- package/dist/{exact-types-CaLLU1Pz.d.ts.map → exact-types-VAFjtOQN.d.ts.map} +1 -1
- package/dist/experiment/index.d.ts +3 -5
- package/dist/experiment/index.d.ts.map +1 -1
- package/dist/experiment/index.js +7 -12
- package/dist/experiment/index.js.map +1 -1
- package/dist/{exporters-BYBG9b1n.d.ts → exporters-dQKYD_Zo.d.ts} +2 -2
- package/dist/{exporters-BYBG9b1n.d.ts.map → exporters-dQKYD_Zo.d.ts.map} +1 -1
- package/dist/{external-optimizer-process-CfrY-nJT.js → external-optimizer-process-2ImGH_LR.js} +2 -2
- package/dist/{external-optimizer-process-CfrY-nJT.js.map → external-optimizer-process-2ImGH_LR.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-BtJk8UcU.js → external-optimizer-subprocess-_C_2yriN.js} +3 -3
- package/dist/{external-optimizer-subprocess-BtJk8UcU.js.map → external-optimizer-subprocess-_C_2yriN.js.map} +1 -1
- package/dist/{feedback-trajectory-P37ju-gW.d.ts → feedback-trajectory-DTj8eVTR.d.ts} +3 -3
- package/dist/{feedback-trajectory-P37ju-gW.d.ts.map → feedback-trajectory-DTj8eVTR.d.ts.map} +1 -1
- package/dist/{findings-store-BnYN57-h.js → findings-store-BSuaV3dN.js} +7 -24
- package/dist/findings-store-BSuaV3dN.js.map +1 -0
- package/dist/fuzz.js +2 -2
- package/dist/{index-D4lT7aFu.d.ts → index-7tWvC0aW.d.ts} +28 -128
- package/dist/index-7tWvC0aW.d.ts.map +1 -0
- package/dist/{index-C3t17kHu.d.ts → index-B62BaRzH.d.ts} +7 -100
- package/dist/index-B62BaRzH.d.ts.map +1 -0
- package/dist/{index-HuSMvqR2.d.ts → index-BlTbxHlY.d.ts} +5 -5
- package/dist/{index-HuSMvqR2.d.ts.map → index-BlTbxHlY.d.ts.map} +1 -1
- package/dist/{index-AmfM3usI.d.ts → index-CM12lr9E.d.ts} +8 -8
- package/dist/{index-AmfM3usI.d.ts.map → index-CM12lr9E.d.ts.map} +1 -1
- package/dist/{index-DLVbfss9.d.ts → index-DFso1b2W.d.ts} +8 -8
- package/dist/{index-DLVbfss9.d.ts.map → index-DFso1b2W.d.ts.map} +1 -1
- package/dist/index-DNXFzSpc.d.ts +1101 -0
- package/dist/index-DNXFzSpc.d.ts.map +1 -0
- package/dist/{index-BPmj-_ta.d.ts → index-DfqAy8ct.d.ts} +10 -9
- package/dist/index-DfqAy8ct.d.ts.map +1 -0
- package/dist/index.d.ts +29 -31
- package/dist/index.js +28 -164
- package/dist/index.js.map +1 -1
- package/dist/{integrity-BAdVzT8u.d.ts → integrity-CrmnGB2T.d.ts} +2 -2
- package/dist/{integrity-BAdVzT8u.d.ts.map → integrity-CrmnGB2T.d.ts.map} +1 -1
- package/dist/{judge-gate-CIlBrn6q.js → judge-gate-CrN0PaAL.js} +3 -3
- package/dist/{judge-gate-CIlBrn6q.js.map → judge-gate-CrN0PaAL.js.map} +1 -1
- package/dist/{kind-factory-Cfz8DUCc.js → kind-factory-CV0FNCMM.js} +2 -2
- package/dist/{kind-factory-Cfz8DUCc.js.map → kind-factory-CV0FNCMM.js.map} +1 -1
- package/dist/{llm-client-BdSiZ4qz.js → llm-client-DMMSg-Ro.js} +2 -2
- package/dist/{llm-client-BdSiZ4qz.js.map → llm-client-DMMSg-Ro.js.map} +1 -1
- package/dist/{llm-judge-VD_MI6kd.js → llm-judge-C813vmpc.js} +13 -14
- package/dist/{llm-judge-VD_MI6kd.js.map → llm-judge-C813vmpc.js.map} +1 -1
- package/dist/{matrix-Yg1lHIGI.d.ts → matrix-C-GxIgeJ.d.ts} +2 -2
- package/dist/{matrix-Yg1lHIGI.d.ts.map → matrix-C-GxIgeJ.d.ts.map} +1 -1
- package/dist/meta-eval/index.d.ts +2 -2
- package/dist/meta-eval/index.js +7 -7
- package/dist/{metrics-DNCAUtuB.js → metrics-zALlR17s.js} +16 -17
- package/dist/metrics-zALlR17s.js.map +1 -0
- package/dist/multishot/golden/index.d.ts +1 -1
- package/dist/multishot/index.d.ts +2 -2
- package/dist/multishot/index.js +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{outcome-observations-DZu5hLYF.js → outcome-observations-DPkH-LHQ.js} +2 -3
- package/dist/{outcome-observations-DZu5hLYF.js.map → outcome-observations-DPkH-LHQ.js.map} +1 -1
- package/dist/paired-arms-DjMEtYI9.js +338 -0
- package/dist/paired-arms-DjMEtYI9.js.map +1 -0
- package/dist/{paired-promotion-decision-CiueaTTj.js → paired-promotion-decision-Bi9__RQS.js} +2 -3
- package/dist/{paired-promotion-decision-CiueaTTj.js.map → paired-promotion-decision-Bi9__RQS.js.map} +1 -1
- package/dist/{paired-promotion-decision-BDnqepZ1.d.ts → paired-promotion-decision-DJU3fZxH.d.ts} +3 -113
- package/dist/paired-promotion-decision-DJU3fZxH.d.ts.map +1 -0
- package/dist/{pareto-a3EOmjfe.js → pareto-fJZg8pXm.js} +3 -6
- package/dist/{pareto-a3EOmjfe.js.map → pareto-fJZg8pXm.js.map} +1 -1
- package/dist/pipelines/index.js +1 -1
- package/dist/{prime-protocol-DKRk4l4U.d.ts → prime-protocol-D1NkJRuD.d.ts} +2 -2
- package/dist/{prime-protocol-DKRk4l4U.d.ts.map → prime-protocol-D1NkJRuD.d.ts.map} +1 -1
- package/dist/{promotion-gate-DOkgJcLW.d.ts → promotion-gate-Da0xV4sa.d.ts} +3 -67
- package/dist/promotion-gate-Da0xV4sa.d.ts.map +1 -0
- package/dist/{promotion-policy-DLPcEnCf.js → promotion-policy-DCgftbnd.js} +4 -4
- package/dist/{promotion-policy-DLPcEnCf.js.map → promotion-policy-DCgftbnd.js.map} +1 -1
- package/dist/{proposal-findings-BfzzZ_lN.js → proposal-findings-DWs94yT8.js} +2 -2
- package/dist/{proposal-findings-BfzzZ_lN.js.map → proposal-findings-DWs94yT8.js.map} +1 -1
- package/dist/{registry-Ck7w-rr5.d.ts → registry-BAcEbzKm.d.ts} +4 -4
- package/dist/{registry-Ck7w-rr5.d.ts.map → registry-BAcEbzKm.d.ts.map} +1 -1
- package/dist/{release-confidence-nfQNh3eb.js → release-confidence-DGtuPDxJ.js} +2 -2
- package/dist/{release-confidence-nfQNh3eb.js.map → release-confidence-DGtuPDxJ.js.map} +1 -1
- package/dist/reporting.d.ts +4 -5
- package/dist/reporting.d.ts.map +1 -1
- package/dist/reporting.js +5 -7
- package/dist/reporting.js.map +1 -1
- package/dist/{researcher-CLnNJ7Or.d.ts → researcher-CSlc84Bp.d.ts} +4 -4
- package/dist/{researcher-CLnNJ7Or.d.ts.map → researcher-CSlc84Bp.d.ts.map} +1 -1
- package/dist/{reward-hacking-B88f-Kh7.js → reward-hacking-BYiDFbIl.js} +2 -3
- package/dist/{reward-hacking-B88f-Kh7.js.map → reward-hacking-BYiDFbIl.js.map} +1 -1
- package/dist/rl.d.ts +9 -8
- package/dist/rl.d.ts.map +1 -1
- package/dist/rl.js +8 -10
- package/dist/rl.js.map +1 -1
- package/dist/rollout/index.d.ts +4 -4
- package/dist/rollout/index.js +1 -1
- package/dist/{rollout-Cu7kHGIe.js → rollout-DKa54qer.js} +2 -2
- package/dist/{rollout-Cu7kHGIe.js.map → rollout-DKa54qer.js.map} +1 -1
- package/dist/{rubric-predictive-validity-D_6ZPTNR.js → rubric-predictive-validity-DL7gJ51F.js} +2 -2
- package/dist/{rubric-predictive-validity-D_6ZPTNR.js.map → rubric-predictive-validity-DL7gJ51F.js.map} +1 -1
- package/dist/{run-record-CbUi2adH.js → run-record-CFbnkE1K.js} +2 -2
- package/dist/{run-record-CbUi2adH.js.map → run-record-CFbnkE1K.js.map} +1 -1
- package/dist/{runtime-rollouts-kGn1K5ut.js → runtime-rollouts-BNrm5nC_.js} +2 -2
- package/dist/{runtime-rollouts-kGn1K5ut.js.map → runtime-rollouts-BNrm5nC_.js.map} +1 -1
- package/dist/{schema-CfoA9U_U.d.ts → schema-PDKQ_iNE.d.ts} +2 -131
- package/dist/schema-PDKQ_iNE.d.ts.map +1 -0
- package/dist/search/index.d.ts +2 -2
- package/dist/search/index.js +2 -2
- package/dist/{search-kernel-DjqaPJqL.d.ts → search-kernel-CQGLbmgn.d.ts} +3 -3
- package/dist/{search-kernel-DjqaPJqL.d.ts.map → search-kernel-CQGLbmgn.d.ts.map} +1 -1
- package/dist/{search-summary-RJ5zXjHN.js → search-summary-sPWiYtSl.js} +4 -4
- package/dist/{search-summary-RJ5zXjHN.js.map → search-summary-sPWiYtSl.js.map} +1 -1
- package/dist/{sequential-BPbvgzfe.js → sequential-9TVb5Nu5.js} +3 -3
- package/dist/{sequential-BPbvgzfe.js.map → sequential-9TVb5Nu5.js.map} +1 -1
- package/dist/{sequential-Bb_pdTqG.d.ts → sequential-B9p6uoV8.d.ts} +9 -2
- package/dist/{sequential-Bb_pdTqG.d.ts.map → sequential-B9p6uoV8.d.ts.map} +1 -1
- package/dist/{sequential-Bjs5roiK.js → sequential-CAksw6EU.js} +32 -2
- package/dist/{sequential-Bjs5roiK.js.map → sequential-CAksw6EU.js.map} +1 -1
- package/dist/{server-CPKyf3bz.js → server-DFVwfoZq.js} +3 -3
- package/dist/{server-CPKyf3bz.js.map → server-DFVwfoZq.js.map} +1 -1
- package/dist/{skillopt-optimization-method-D9Hlmhjg.js → skillopt-optimization-method-QO1nU8Kz.js} +9 -9
- package/dist/{skillopt-optimization-method-D9Hlmhjg.js.map → skillopt-optimization-method-QO1nU8Kz.js.map} +1 -1
- package/dist/{statistical-heldout-C-tgpUuu.d.ts → statistical-heldout-CvOwNqt9.d.ts} +6 -282
- package/dist/statistical-heldout-CvOwNqt9.d.ts.map +1 -0
- package/dist/{statistical-heldout-NBxC7jGo.js → statistical-heldout-DLO4Ebos.js} +3 -3
- package/dist/{statistical-heldout-NBxC7jGo.js.map → statistical-heldout-DLO4Ebos.js.map} +1 -1
- package/dist/statistics-CvvC-MPv.js +2634 -0
- package/dist/statistics-CvvC-MPv.js.map +1 -0
- package/dist/statistics.d.ts +3 -0
- package/dist/statistics.js +3 -0
- package/dist/{store-otlp-BfPRa2p8.js → store-otlp-C-jyj3WX.js} +2 -2
- package/dist/{store-otlp-BfPRa2p8.js.map → store-otlp-C-jyj3WX.js.map} +1 -1
- package/dist/{store-tool-spans-BgwVHXma.d.ts → store-tool-spans-B3z_Qb5u.d.ts} +5 -5
- package/dist/{store-tool-spans-BgwVHXma.d.ts.map → store-tool-spans-B3z_Qb5u.d.ts.map} +1 -1
- package/dist/{store-tool-spans-BrSWHB9O.js → store-tool-spans-DalWlKY8.js} +3 -3
- package/dist/{store-tool-spans-BrSWHB9O.js.map → store-tool-spans-DalWlKY8.js.map} +1 -1
- package/dist/{summary-report-C3IJvp0i.js → summary-report-BEhqoxrA.js} +4 -52
- package/dist/summary-report-BEhqoxrA.js.map +1 -0
- package/dist/{summary-report-0La5vejY.d.ts → summary-report-DyZquTaH.d.ts} +2 -2
- package/dist/{summary-report-0La5vejY.d.ts.map → summary-report-DyZquTaH.d.ts.map} +1 -1
- package/dist/supervisor-run/index.d.ts +2 -2
- package/dist/supervisor-run/index.js +1 -1
- package/dist/{systemone-CpDppX8s.d.ts → systemone-DVk-Crtu.d.ts} +7 -7
- package/dist/{systemone-CpDppX8s.d.ts.map → systemone-DVk-Crtu.d.ts.map} +1 -1
- package/dist/{systemone-review-nbuMxxmi.d.ts → systemone-review-CToBl1oa.d.ts} +2 -2
- package/dist/{systemone-review-nbuMxxmi.d.ts.map → systemone-review-CToBl1oa.d.ts.map} +1 -1
- package/dist/systemone.d.ts +3 -3
- package/dist/systemone.js +2 -2
- package/dist/{tool-groups-BQsjZD9F.d.ts → tool-groups-R5RO9OHn.d.ts} +3 -3
- package/dist/tool-groups-R5RO9OHn.d.ts.map +1 -0
- package/dist/{tool-waste-Czt3aWID.js → tool-waste-BqSmmPUz.js} +2 -3
- package/dist/{tool-waste-Czt3aWID.js.map → tool-waste-BqSmmPUz.js.map} +1 -1
- package/dist/{trace-questions-CpTrtEcm.d.ts → trace-questions-BY6taxnl.d.ts} +3 -3
- package/dist/{trace-questions-CpTrtEcm.d.ts.map → trace-questions-BY6taxnl.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +1 -1
- package/dist/trace-repair/index.js +1 -2
- package/dist/trace-repair/index.js.map +1 -1
- package/dist/traces.d.ts +5 -5
- package/dist/traces.js +3 -3
- package/dist/{tree-DIHp6UQ0.js → tree-C-N2kP-8.js} +4 -6
- package/dist/{tree-DIHp6UQ0.js.map → tree-C-N2kP-8.js.map} +1 -1
- package/dist/{types-DsuOcYsE.d.ts → types-BsdcSWnf.d.ts} +2 -2
- package/dist/{types-DsuOcYsE.d.ts.map → types-BsdcSWnf.d.ts.map} +1 -1
- package/dist/{types-DNB9hIXa.d.ts → types-DUVhW5V1.d.ts} +3 -2
- package/dist/types-DUVhW5V1.d.ts.map +1 -0
- package/dist/{types-wDBk14lj.d.ts → types-ip2D3-Ib.d.ts} +5 -4
- package/dist/types-ip2D3-Ib.d.ts.map +1 -0
- package/dist/{types-B9s9Xo5_.d.ts → types-kBMNdo1X.d.ts} +3 -9
- package/dist/types-kBMNdo1X.d.ts.map +1 -0
- package/dist/wire/index.d.ts +4 -4
- package/dist/wire/index.js +1 -1
- package/docs/design/statistics-decisions.md +45 -364
- package/docs/design.md +1 -1
- package/docs/research-report-methodology.md +1 -1
- package/package.json +6 -1
- package/dist/agreement-irr-DXcXEt4I.js +0 -182
- package/dist/agreement-irr-DXcXEt4I.js.map +0 -1
- package/dist/analyze-runs-C7vWBDhl.js.map +0 -1
- package/dist/benchmark-command-DSJQeYom.js.map +0 -1
- package/dist/cluster-bootstrap-BteuR1hg.js +0 -65
- package/dist/cluster-bootstrap-BteuR1hg.js.map +0 -1
- package/dist/descriptive-B3Eb7tX0.js +0 -229
- package/dist/descriptive-B3Eb7tX0.js.map +0 -1
- package/dist/findings-store-BnYN57-h.js.map +0 -1
- package/dist/index-BPmj-_ta.d.ts.map +0 -1
- package/dist/index-C3t17kHu.d.ts.map +0 -1
- package/dist/index-D4lT7aFu.d.ts.map +0 -1
- package/dist/judge-calibration-DKR6Xi-w.js +0 -319
- package/dist/judge-calibration-DKR6Xi-w.js.map +0 -1
- package/dist/judge-calibration-DnrbQaXI.d.ts +0 -144
- package/dist/judge-calibration-DnrbQaXI.d.ts.map +0 -1
- package/dist/mean-D1d6gedE.js +0 -284
- package/dist/mean-D1d6gedE.js.map +0 -1
- package/dist/metrics-DNCAUtuB.js.map +0 -1
- package/dist/multiplicity-DAd4xaDC.js +0 -100
- package/dist/multiplicity-DAd4xaDC.js.map +0 -1
- package/dist/multiplicity-D_SEsc5j.d.ts +0 -41
- package/dist/multiplicity-D_SEsc5j.d.ts.map +0 -1
- package/dist/paired-arms-3-tsXvvC.js +0 -740
- package/dist/paired-arms-3-tsXvvC.js.map +0 -1
- package/dist/paired-binary-CMzmSSd5.js +0 -372
- package/dist/paired-binary-CMzmSSd5.js.map +0 -1
- package/dist/paired-promotion-decision-BDnqepZ1.d.ts.map +0 -1
- package/dist/paired-tests-Buh6feJ4.js +0 -211
- package/dist/paired-tests-Buh6feJ4.js.map +0 -1
- package/dist/power-and-mde-g3vOn0XK.js +0 -99
- package/dist/power-and-mde-g3vOn0XK.js.map +0 -1
- package/dist/promotion-gate-DOkgJcLW.d.ts.map +0 -1
- package/dist/random-BN150Q_X.d.ts +0 -79
- package/dist/random-BN150Q_X.d.ts.map +0 -1
- package/dist/schema-CfoA9U_U.d.ts.map +0 -1
- package/dist/sequential-eprocess-C1YLwFaz.js +0 -129
- package/dist/sequential-eprocess-C1YLwFaz.js.map +0 -1
- package/dist/statistical-heldout-C-tgpUuu.d.ts.map +0 -1
- package/dist/summary-report-C3IJvp0i.js.map +0 -1
- package/dist/tool-groups-BQsjZD9F.d.ts.map +0 -1
- package/dist/types-0KglnQ9o.d.ts.map +0 -1
- package/dist/types-B9s9Xo5_.d.ts.map +0 -1
- package/dist/types-DNB9hIXa.d.ts.map +0 -1
- package/dist/types-wDBk14lj.d.ts.map +0 -1
package/dist/mean-D1d6gedE.js
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { s as ValidationError } from "./errors-DeEEV9Vx.js";
|
|
2
|
-
import { t as interpolatedQuantile } from "./quantile-CncXP-Ss.js";
|
|
3
|
-
import { t as mulberry32 } from "./random-DrzcgC7F.js";
|
|
4
|
-
// src/math/special-functions.ts
|
|
5
|
-
/** Lanczos approximation to ln Gamma(z). */
|
|
6
|
-
function lnGamma(z) {
|
|
7
|
-
const g = 7;
|
|
8
|
-
const coefficients = [
|
|
9
|
-
.9999999999998099,
|
|
10
|
-
676.5203681218851,
|
|
11
|
-
-1259.1392167224028,
|
|
12
|
-
771.3234287776531,
|
|
13
|
-
-176.6150291621406,
|
|
14
|
-
12.507343278686905,
|
|
15
|
-
-.13857109526572012,
|
|
16
|
-
9984369578019572e-21,
|
|
17
|
-
1.5056327351493116e-7
|
|
18
|
-
];
|
|
19
|
-
if (z < .5) return Math.log(Math.PI / Math.sin(Math.PI * z)) - lnGamma(1 - z);
|
|
20
|
-
z -= 1;
|
|
21
|
-
let x = coefficients[0];
|
|
22
|
-
for (let i = 1; i < 9; i++) x += coefficients[i] / (z + i);
|
|
23
|
-
const t = z + g + .5;
|
|
24
|
-
return .5 * Math.log(2 * Math.PI) + (z + .5) * Math.log(t) - t + Math.log(x);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Regularized incomplete beta function I_x(a, b).
|
|
28
|
-
*
|
|
29
|
-
* The Lentz continued fraction converges only for `x < (a+1)/(a+b+2)`; outside
|
|
30
|
-
* that domain it must be reached through the symmetry `I_x(a,b) = 1 −
|
|
31
|
-
* I_{1−x}(b,a)`. `studentTCdf` drives `x → 1` as `|t| → 0`, so the mirrored
|
|
32
|
-
* branch is the one every near-null t-statistic takes.
|
|
33
|
-
*/
|
|
34
|
-
function regularizedIncompleteBeta(x, a, b) {
|
|
35
|
-
if (x <= 0) return 0;
|
|
36
|
-
if (x >= 1) return 1;
|
|
37
|
-
const logBeta = lnGamma(a) + lnGamma(b) - lnGamma(a + b);
|
|
38
|
-
const front = Math.exp(Math.log(x) * a + Math.log(1 - x) * b - logBeta);
|
|
39
|
-
if (x < (a + 1) / (a + b + 2)) return front * betaContinuedFraction(x, a, b) / a;
|
|
40
|
-
return 1 - front * betaContinuedFraction(1 - x, b, a) / b;
|
|
41
|
-
}
|
|
42
|
-
/** Modified Lentz evaluation of the beta continued fraction at `x`. */
|
|
43
|
-
function betaContinuedFraction(x, a, b) {
|
|
44
|
-
const maxIterations = 300;
|
|
45
|
-
const epsilon = 3e-15;
|
|
46
|
-
let c = 1;
|
|
47
|
-
let d = 1 - (a + b) * x / (a + 1);
|
|
48
|
-
if (Math.abs(d) < 1e-30) d = 1e-30;
|
|
49
|
-
d = 1 / d;
|
|
50
|
-
let fraction = d;
|
|
51
|
-
for (let m = 1; m <= maxIterations; m++) {
|
|
52
|
-
const m2 = 2 * m;
|
|
53
|
-
let numerator = m * (b - m) * x / ((a + m2 - 1) * (a + m2));
|
|
54
|
-
d = 1 + numerator * d;
|
|
55
|
-
if (Math.abs(d) < 1e-30) d = 1e-30;
|
|
56
|
-
c = 1 + numerator / c;
|
|
57
|
-
if (Math.abs(c) < 1e-30) c = 1e-30;
|
|
58
|
-
d = 1 / d;
|
|
59
|
-
fraction *= d * c;
|
|
60
|
-
numerator = -((a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1));
|
|
61
|
-
d = 1 + numerator * d;
|
|
62
|
-
if (Math.abs(d) < 1e-30) d = 1e-30;
|
|
63
|
-
c = 1 + numerator / c;
|
|
64
|
-
if (Math.abs(c) < 1e-30) c = 1e-30;
|
|
65
|
-
d = 1 / d;
|
|
66
|
-
const delta = d * c;
|
|
67
|
-
fraction *= delta;
|
|
68
|
-
if (Math.abs(delta - 1) < epsilon) break;
|
|
69
|
-
}
|
|
70
|
-
return fraction;
|
|
71
|
-
}
|
|
72
|
-
// src/math/student-t.ts
|
|
73
|
-
/**
|
|
74
|
-
* Student-t CDF via the regularized incomplete beta function.
|
|
75
|
-
*/
|
|
76
|
-
function studentTCdf(t, degreesOfFreedom) {
|
|
77
|
-
if (degreesOfFreedom <= 0) return .5;
|
|
78
|
-
const beta = regularizedIncompleteBeta(degreesOfFreedom / (degreesOfFreedom + t * t), degreesOfFreedom / 2, .5);
|
|
79
|
-
return t >= 0 ? 1 - .5 * beta : .5 * beta;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Inverse Student-t CDF, solved against {@link studentTCdf}.
|
|
83
|
-
*
|
|
84
|
-
* The CDF is monotone, so bracket expansion followed by bisection is stable
|
|
85
|
-
* across fractional degrees of freedom and does not need a separate
|
|
86
|
-
* approximation with a different error profile.
|
|
87
|
-
*/
|
|
88
|
-
function studentTQuantile(probability, degreesOfFreedom) {
|
|
89
|
-
if (!Number.isFinite(probability) || probability < 0 || probability > 1) throw new RangeError(`studentTQuantile: probability must be in [0,1], got ${probability}`);
|
|
90
|
-
if (!Number.isFinite(degreesOfFreedom) || degreesOfFreedom <= 0) throw new RangeError(`studentTQuantile: degreesOfFreedom must be positive and finite, got ${degreesOfFreedom}`);
|
|
91
|
-
if (probability === 0) return Number.NEGATIVE_INFINITY;
|
|
92
|
-
if (probability === 1) return Number.POSITIVE_INFINITY;
|
|
93
|
-
if (probability === .5) return 0;
|
|
94
|
-
if (probability < .5) return -studentTQuantile(1 - probability, degreesOfFreedom);
|
|
95
|
-
let low = 0;
|
|
96
|
-
let high = 1;
|
|
97
|
-
while (studentTCdf(high, degreesOfFreedom) < probability) high *= 2;
|
|
98
|
-
for (let iteration = 0; iteration < 64; iteration++) {
|
|
99
|
-
const middle = (low + high) / 2;
|
|
100
|
-
if (studentTCdf(middle, degreesOfFreedom) < probability) low = middle;
|
|
101
|
-
else high = middle;
|
|
102
|
-
}
|
|
103
|
-
return (low + high) / 2;
|
|
104
|
-
}
|
|
105
|
-
// src/statistics/internal.ts
|
|
106
|
-
/**
|
|
107
|
-
* Shared internals for the statistics modules. Nothing here is part of the
|
|
108
|
-
* public statistics surface — `./index` does not re-export this module.
|
|
109
|
-
*/
|
|
110
|
-
/** Every rank test refuses non-finite input. Beyond the arithmetic being
|
|
111
|
-
* undefined, the tie-grouping scan compares values with `===`, and
|
|
112
|
-
* `NaN === NaN` is false, so a NaN would leave the group boundary unable to
|
|
113
|
-
* advance and spin the loop forever. */
|
|
114
|
-
function assertFiniteSample(fn, label, xs) {
|
|
115
|
-
for (let i = 0; i < xs.length; i++) if (!Number.isFinite(xs[i])) throw new ValidationError(`${fn}: ${label}[${i}] must be finite, got ${xs[i]}`);
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Two-sided exact p-value for b successes out of (b + c) Bernoulli(0.5) trials —
|
|
119
|
-
* the exact-binomial core of {@link mcnemar}. `min(1, 2·P(X ≤ min(b,c)))`. No
|
|
120
|
-
* discordant pairs ⇒ no evidence ⇒ p = 1. Summed in log space (lnGamma) so it
|
|
121
|
-
* stays exact at large discordant counts without overflow.
|
|
122
|
-
*/
|
|
123
|
-
function binomialSignTwoSided(b, c) {
|
|
124
|
-
const nd = b + c;
|
|
125
|
-
if (nd === 0) return 1;
|
|
126
|
-
return Math.min(1, 2 * binomialHalfLowerTail(Math.min(b, c), nd));
|
|
127
|
-
}
|
|
128
|
-
/** P(X >= successes) for X ~ Binomial(n, 0.5). */
|
|
129
|
-
function binomialHalfUpperTail(successes, n) {
|
|
130
|
-
if (successes <= 0) return 1;
|
|
131
|
-
if (successes > n) return 0;
|
|
132
|
-
if (successes <= n / 2) return Math.max(0, 1 - binomialHalfLowerTail(successes - 1, n));
|
|
133
|
-
return binomialHalfLowerTail(n - successes, n);
|
|
134
|
-
}
|
|
135
|
-
/** P(X <= maxSuccesses) for X ~ Binomial(n, 0.5), accumulated in log space. */
|
|
136
|
-
function binomialHalfLowerTail(maxSuccesses, n) {
|
|
137
|
-
if (maxSuccesses < 0) return 0;
|
|
138
|
-
if (maxSuccesses >= n) return 1;
|
|
139
|
-
if (maxSuccesses === 0) return 2 ** -n;
|
|
140
|
-
const logHalfN = n * Math.log(.5);
|
|
141
|
-
let logTail = Number.NEGATIVE_INFINITY;
|
|
142
|
-
for (let i = 0; i <= maxSuccesses; i++) {
|
|
143
|
-
const logChoose = lnGamma(n + 1) - lnGamma(i + 1) - lnGamma(n - i + 1);
|
|
144
|
-
logTail = logAddExp(logTail, logChoose + logHalfN);
|
|
145
|
-
}
|
|
146
|
-
return Math.min(1, Math.exp(logTail));
|
|
147
|
-
}
|
|
148
|
-
function logAddExp(a, b) {
|
|
149
|
-
if (a === Number.NEGATIVE_INFINITY) return b;
|
|
150
|
-
if (b === Number.NEGATIVE_INFINITY) return a;
|
|
151
|
-
const max = Math.max(a, b);
|
|
152
|
-
return max + Math.log1p(Math.exp(Math.min(a, b) - max));
|
|
153
|
-
}
|
|
154
|
-
/** Standard-normal inverse CDF (Acklam approximation). */
|
|
155
|
-
function zQuantile(p) {
|
|
156
|
-
if (p <= 0 || p >= 1) {
|
|
157
|
-
if (p === 0) return -Infinity;
|
|
158
|
-
if (p === 1) return Infinity;
|
|
159
|
-
return NaN;
|
|
160
|
-
}
|
|
161
|
-
const a = [
|
|
162
|
-
-39.69683028665376,
|
|
163
|
-
220.9460984245205,
|
|
164
|
-
-275.9285104469687,
|
|
165
|
-
138.357751867269,
|
|
166
|
-
-30.66479806614716,
|
|
167
|
-
2.506628277459239
|
|
168
|
-
];
|
|
169
|
-
const b = [
|
|
170
|
-
-54.47609879822406,
|
|
171
|
-
161.5858368580409,
|
|
172
|
-
-155.6989798598866,
|
|
173
|
-
66.80131188771972,
|
|
174
|
-
-13.28068155288572
|
|
175
|
-
];
|
|
176
|
-
const c = [
|
|
177
|
-
-.007784894002430293,
|
|
178
|
-
-.3223964580411365,
|
|
179
|
-
-2.400758277161838,
|
|
180
|
-
-2.549732539343734,
|
|
181
|
-
4.374664141464968,
|
|
182
|
-
2.938163982698783
|
|
183
|
-
];
|
|
184
|
-
const d = [
|
|
185
|
-
.007784695709041462,
|
|
186
|
-
.3224671290700398,
|
|
187
|
-
2.445134137142996,
|
|
188
|
-
3.754408661907416
|
|
189
|
-
];
|
|
190
|
-
const pLow = .02425;
|
|
191
|
-
const pHigh = .97575;
|
|
192
|
-
let q;
|
|
193
|
-
let r;
|
|
194
|
-
if (p < pLow) {
|
|
195
|
-
q = Math.sqrt(-2 * Math.log(p));
|
|
196
|
-
return (((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);
|
|
197
|
-
}
|
|
198
|
-
if (p <= pHigh) {
|
|
199
|
-
q = p - .5;
|
|
200
|
-
r = q * q;
|
|
201
|
-
return (((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q / (((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1);
|
|
202
|
-
}
|
|
203
|
-
q = Math.sqrt(-2 * Math.log(1 - p));
|
|
204
|
-
return -(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);
|
|
205
|
-
}
|
|
206
|
-
function medianInPlace(xs) {
|
|
207
|
-
if (xs.length === 0) return 0;
|
|
208
|
-
xs.sort((a, b) => a - b);
|
|
209
|
-
return interpolatedQuantile(xs, .5);
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* PRNG for every resampling path in this module.
|
|
213
|
-
*
|
|
214
|
-
* With no caller seed the seed is DERIVED FROM THE DATA rather than taken from
|
|
215
|
-
* `Math.random`, so re-running the same input reproduces the same interval —
|
|
216
|
-
* a gate verdict that cannot be re-derived is not evidence. Distinct data
|
|
217
|
-
* still gets a distinct stream. Same pattern as `promotion-gate.ts`.
|
|
218
|
-
*/
|
|
219
|
-
function makeRng(seed, ...series) {
|
|
220
|
-
return mulberry32(seed ?? seedFromData(series));
|
|
221
|
-
}
|
|
222
|
-
/** FNV-1a over the IEEE-754 bytes of every observation. */
|
|
223
|
-
function seedFromData(series) {
|
|
224
|
-
const view = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(8));
|
|
225
|
-
let hash = 2166136261;
|
|
226
|
-
for (const xs of series) {
|
|
227
|
-
for (const x of xs) {
|
|
228
|
-
view.setFloat64(0, x);
|
|
229
|
-
for (let byte = 0; byte < 8; byte++) hash = Math.imul(hash ^ view.getUint8(byte), 16777619);
|
|
230
|
-
}
|
|
231
|
-
hash = Math.imul(hash ^ 255, 16777619);
|
|
232
|
-
}
|
|
233
|
-
return hash | 0;
|
|
234
|
-
}
|
|
235
|
-
/** Order-independent seed for a symmetric two-sample statistic. */
|
|
236
|
-
function symmetricTwoSampleSeed(a, b) {
|
|
237
|
-
const sortedA = [...a].sort((left, right) => left - right);
|
|
238
|
-
const sortedB = [...b].sort((left, right) => left - right);
|
|
239
|
-
const forward = seedFromData([sortedA, sortedB]) >>> 0;
|
|
240
|
-
const reversed = seedFromData([sortedB, sortedA]) >>> 0;
|
|
241
|
-
return Math.min(forward, reversed);
|
|
242
|
-
}
|
|
243
|
-
const DEFAULT_BOOTSTRAP_SEED = 12648430;
|
|
244
|
-
/** Seeded percentile bootstrap over clusters: each resample redraws whole clusters with replacement, so
|
|
245
|
-
* observations sharing a source move together. Non-finite statistics are dropped; none left gives NaN bounds. */
|
|
246
|
-
function clusterBootstrap(items, cluster, statistic, { resamples = 2e3, seed = DEFAULT_BOOTSTRAP_SEED, level = .95 } = {}) {
|
|
247
|
-
const groups = /* @__PURE__ */ new Map();
|
|
248
|
-
items.forEach((item, index) => {
|
|
249
|
-
const key = cluster(item, index);
|
|
250
|
-
if (!groups.has(key)) groups.set(key, []);
|
|
251
|
-
groups.get(key).push(item);
|
|
252
|
-
});
|
|
253
|
-
const clusters = [...groups.values()];
|
|
254
|
-
const rng = mulberry32(seed);
|
|
255
|
-
const values = [];
|
|
256
|
-
for (let b = 0; b < resamples; b++) {
|
|
257
|
-
const draw = () => clusters[Math.floor(rng() * clusters.length)];
|
|
258
|
-
const value = statistic(Array.from({ length: clusters.length }, draw).flat());
|
|
259
|
-
if (Number.isFinite(value)) values.push(value);
|
|
260
|
-
}
|
|
261
|
-
const q = (p) => interpolatedQuantile(values.sort((a, b) => a - b), p);
|
|
262
|
-
return {
|
|
263
|
-
low: q((1 - level) / 2),
|
|
264
|
-
high: q((1 + level) / 2),
|
|
265
|
-
resamples,
|
|
266
|
-
clusters: clusters.length
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
// src/statistics/mean.ts
|
|
270
|
-
/** Arithmetic mean. An empty input has no mean and returns NaN. */
|
|
271
|
-
function mean(values) {
|
|
272
|
-
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
273
|
-
}
|
|
274
|
-
/** Arithmetic mean, or null for an empty input. */
|
|
275
|
-
function meanOrNull(values) {
|
|
276
|
-
return values.length === 0 ? null : mean(values);
|
|
277
|
-
}
|
|
278
|
-
/** Arithmetic mean, or 0 for an empty input. */
|
|
279
|
-
function meanOrZero(values) {
|
|
280
|
-
return values.length === 0 ? 0 : mean(values);
|
|
281
|
-
}
|
|
282
|
-
export { assertFiniteSample as a, clusterBootstrap as c, symmetricTwoSampleSeed as d, zQuantile as f, regularizedIncompleteBeta as g, lnGamma as h, DEFAULT_BOOTSTRAP_SEED as i, makeRng as l, studentTQuantile as m, meanOrNull as n, binomialHalfUpperTail as o, studentTCdf as p, meanOrZero as r, binomialSignTwoSided as s, mean as t, medianInPlace as u };
|
|
283
|
-
|
|
284
|
-
//# sourceMappingURL=mean-D1d6gedE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mean-D1d6gedE.js","names":[],"sources":["../src/math/special-functions.ts","../src/math/student-t.ts","../src/statistics/internal.ts","../src/statistics/mean.ts"],"sourcesContent":["/** Lanczos approximation to ln Gamma(z). */\nexport function lnGamma(z: number): number {\n const g = 7\n const coefficients = [\n 0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313,\n -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6,\n 1.5056327351493116e-7,\n ]\n if (z < 0.5) {\n return Math.log(Math.PI / Math.sin(Math.PI * z)) - lnGamma(1 - z)\n }\n z -= 1\n let x = coefficients[0]!\n for (let i = 1; i < g + 2; i++) x += coefficients[i]! / (z + i)\n const t = z + g + 0.5\n return 0.5 * Math.log(2 * Math.PI) + (z + 0.5) * Math.log(t) - t + Math.log(x)\n}\n\n/**\n * Regularized incomplete beta function I_x(a, b).\n *\n * The Lentz continued fraction converges only for `x < (a+1)/(a+b+2)`; outside\n * that domain it must be reached through the symmetry `I_x(a,b) = 1 −\n * I_{1−x}(b,a)`. `studentTCdf` drives `x → 1` as `|t| → 0`, so the mirrored\n * branch is the one every near-null t-statistic takes.\n */\nexport function regularizedIncompleteBeta(x: number, a: number, b: number): number {\n if (x <= 0) return 0\n if (x >= 1) return 1\n const logBeta = lnGamma(a) + lnGamma(b) - lnGamma(a + b)\n // x^a·(1−x)^b / B(a,b) — symmetric under (x,a,b) → (1−x,b,a), so the\n // mirrored branch reuses it unchanged.\n const front = Math.exp(Math.log(x) * a + Math.log(1 - x) * b - logBeta)\n if (x < (a + 1) / (a + b + 2)) {\n return (front * betaContinuedFraction(x, a, b)) / a\n }\n return 1 - (front * betaContinuedFraction(1 - x, b, a)) / b\n}\n\n/** Modified Lentz evaluation of the beta continued fraction at `x`. */\nfunction betaContinuedFraction(x: number, a: number, b: number): number {\n const maxIterations = 300\n const epsilon = 3e-15\n let c = 1\n let d = 1 - ((a + b) * x) / (a + 1)\n if (Math.abs(d) < 1e-30) d = 1e-30\n d = 1 / d\n let fraction = d\n for (let m = 1; m <= maxIterations; m++) {\n const m2 = 2 * m\n let numerator = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n fraction *= d * c\n numerator = -((a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n const delta = d * c\n fraction *= delta\n if (Math.abs(delta - 1) < epsilon) break\n }\n return fraction\n}\n","import { regularizedIncompleteBeta } from './special-functions'\n\n/**\n * Student-t CDF via the regularized incomplete beta function.\n */\nexport function studentTCdf(t: number, degreesOfFreedom: number): number {\n if (degreesOfFreedom <= 0) return 0.5\n\n const x = degreesOfFreedom / (degreesOfFreedom + t * t)\n const beta = regularizedIncompleteBeta(x, degreesOfFreedom / 2, 0.5)\n return t >= 0 ? 1 - 0.5 * beta : 0.5 * beta\n}\n\n/**\n * Inverse Student-t CDF, solved against {@link studentTCdf}.\n *\n * The CDF is monotone, so bracket expansion followed by bisection is stable\n * across fractional degrees of freedom and does not need a separate\n * approximation with a different error profile.\n */\nexport function studentTQuantile(probability: number, degreesOfFreedom: number): number {\n if (!Number.isFinite(probability) || probability < 0 || probability > 1) {\n throw new RangeError(`studentTQuantile: probability must be in [0,1], got ${probability}`)\n }\n if (!Number.isFinite(degreesOfFreedom) || degreesOfFreedom <= 0) {\n throw new RangeError(\n `studentTQuantile: degreesOfFreedom must be positive and finite, got ${degreesOfFreedom}`,\n )\n }\n if (probability === 0) return Number.NEGATIVE_INFINITY\n if (probability === 1) return Number.POSITIVE_INFINITY\n if (probability === 0.5) return 0\n if (probability < 0.5) return -studentTQuantile(1 - probability, degreesOfFreedom)\n\n let low = 0\n let high = 1\n while (studentTCdf(high, degreesOfFreedom) < probability) high *= 2\n for (let iteration = 0; iteration < 64; iteration++) {\n const middle = (low + high) / 2\n if (studentTCdf(middle, degreesOfFreedom) < probability) low = middle\n else high = middle\n }\n return (low + high) / 2\n}\n","/**\n * Shared internals for the statistics modules. Nothing here is part of the\n * public statistics surface — `./index` does not re-export this module.\n */\n\nimport { ValidationError } from '../errors'\nimport { interpolatedQuantile } from '../math/quantile'\nimport { lnGamma } from '../math/special-functions'\nimport { mulberry32 } from './random'\n\n/** Every rank test refuses non-finite input. Beyond the arithmetic being\n * undefined, the tie-grouping scan compares values with `===`, and\n * `NaN === NaN` is false, so a NaN would leave the group boundary unable to\n * advance and spin the loop forever. */\nexport function assertFiniteSample(fn: string, label: string, xs: readonly number[]): void {\n for (let i = 0; i < xs.length; i++) {\n if (!Number.isFinite(xs[i])) {\n throw new ValidationError(`${fn}: ${label}[${i}] must be finite, got ${xs[i]}`)\n }\n }\n}\n\n/**\n * Two-sided exact p-value for b successes out of (b + c) Bernoulli(0.5) trials —\n * the exact-binomial core of {@link mcnemar}. `min(1, 2·P(X ≤ min(b,c)))`. No\n * discordant pairs ⇒ no evidence ⇒ p = 1. Summed in log space (lnGamma) so it\n * stays exact at large discordant counts without overflow.\n */\nexport function binomialSignTwoSided(b: number, c: number): number {\n const nd = b + c\n if (nd === 0) return 1\n return Math.min(1, 2 * binomialHalfLowerTail(Math.min(b, c), nd))\n}\n\n/** P(X >= successes) for X ~ Binomial(n, 0.5). */\nexport function binomialHalfUpperTail(successes: number, n: number): number {\n if (successes <= 0) return 1\n if (successes > n) return 0\n\n // Use the smaller side of the distribution. For lower thresholds the\n // complement sums at most half the mass; for upper thresholds symmetry\n // maps the upper tail to a lower tail without subtraction.\n if (successes <= n / 2) {\n return Math.max(0, 1 - binomialHalfLowerTail(successes - 1, n))\n }\n return binomialHalfLowerTail(n - successes, n)\n}\n\n/** P(X <= maxSuccesses) for X ~ Binomial(n, 0.5), accumulated in log space. */\nfunction binomialHalfLowerTail(maxSuccesses: number, n: number): number {\n if (maxSuccesses < 0) return 0\n if (maxSuccesses >= n) return 1\n if (maxSuccesses === 0) return 2 ** -n\n\n const logHalfN = n * Math.log(0.5)\n let logTail = Number.NEGATIVE_INFINITY\n for (let i = 0; i <= maxSuccesses; i++) {\n const logChoose = lnGamma(n + 1) - lnGamma(i + 1) - lnGamma(n - i + 1)\n logTail = logAddExp(logTail, logChoose + logHalfN)\n }\n return Math.min(1, Math.exp(logTail))\n}\n\nfunction logAddExp(a: number, b: number): number {\n if (a === Number.NEGATIVE_INFINITY) return b\n if (b === Number.NEGATIVE_INFINITY) return a\n const max = Math.max(a, b)\n const min = Math.min(a, b)\n return max + Math.log1p(Math.exp(min - max))\n}\n\n/** Standard-normal inverse CDF (Acklam approximation). */\nexport function zQuantile(p: number): number {\n if (p <= 0 || p >= 1) {\n if (p === 0) return -Infinity\n if (p === 1) return Infinity\n return NaN\n }\n const a = [\n -3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2,\n -3.066479806614716e1, 2.506628277459239,\n ]\n const b = [\n -5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1,\n -1.328068155288572e1,\n ]\n const c = [\n -7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734,\n 4.374664141464968, 2.938163982698783,\n ]\n const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416]\n const pLow = 0.02425\n const pHigh = 1 - pLow\n let q: number\n let r: number\n if (p < pLow) {\n q = Math.sqrt(-2 * Math.log(p))\n return (\n (((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n }\n if (p <= pHigh) {\n q = p - 0.5\n r = q * q\n return (\n ((((((a[0]! * r + a[1]!) * r + a[2]!) * r + a[3]!) * r + a[4]!) * r + a[5]!) * q) /\n (((((b[0]! * r + b[1]!) * r + b[2]!) * r + b[3]!) * r + b[4]!) * r + 1)\n )\n }\n q = Math.sqrt(-2 * Math.log(1 - p))\n return (\n -(((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n}\n\nexport function medianInPlace(xs: number[]): number {\n if (xs.length === 0) return 0\n xs.sort((a, b) => a - b)\n return interpolatedQuantile(xs, 0.5)\n}\n\n/**\n * PRNG for every resampling path in this module.\n *\n * With no caller seed the seed is DERIVED FROM THE DATA rather than taken from\n * `Math.random`, so re-running the same input reproduces the same interval —\n * a gate verdict that cannot be re-derived is not evidence. Distinct data\n * still gets a distinct stream. Same pattern as `promotion-gate.ts`.\n */\nexport function makeRng(\n seed: number | undefined,\n ...series: readonly (readonly number[])[]\n): () => number {\n return mulberry32(seed ?? seedFromData(series))\n}\n\n/** FNV-1a over the IEEE-754 bytes of every observation. */\nfunction seedFromData(series: readonly (readonly number[])[]): number {\n const view = new DataView(new ArrayBuffer(8))\n // 32-bit FNV-1a over the IEEE-754 BYTES of each observation, not over a\n // string. Frozen: it seeds the unseeded bootstrap from the data itself, so a\n // change moves every interval this package has already published. The\n // string-input variants elsewhere cannot be substituted here.\n let hash = 0x811c9dc5\n for (const xs of series) {\n for (const x of xs) {\n view.setFloat64(0, x)\n for (let byte = 0; byte < 8; byte++) {\n hash = Math.imul(hash ^ view.getUint8(byte), 0x01000193)\n }\n }\n // Separator, so ([1],[2]) and ([1,2],[]) do not collide.\n hash = Math.imul(hash ^ 0xff, 0x01000193)\n }\n return hash | 0\n}\n\n/** Order-independent seed for a symmetric two-sample statistic. */\nexport function symmetricTwoSampleSeed(a: readonly number[], b: readonly number[]): number {\n const sortedA = [...a].sort((left, right) => left - right)\n const sortedB = [...b].sort((left, right) => left - right)\n const forward = seedFromData([sortedA, sortedB]) >>> 0\n const reversed = seedFromData([sortedB, sortedA]) >>> 0\n return Math.min(forward, reversed)\n}\n\nexport const DEFAULT_BOOTSTRAP_SEED = 0xc0ffee\nexport type BootstrapInterval = { low: number; high: number; resamples: number; clusters: number }\n\n/** Seeded percentile bootstrap over clusters: each resample redraws whole clusters with replacement, so\n * observations sharing a source move together. Non-finite statistics are dropped; none left gives NaN bounds. */\nexport function clusterBootstrap<T>(\n items: readonly T[],\n cluster: (item: T, index: number) => string,\n statistic: (sample: T[]) => number,\n { resamples = 2000, seed = DEFAULT_BOOTSTRAP_SEED, level = 0.95 } = {},\n): BootstrapInterval {\n const groups = new Map<string, T[]>()\n items.forEach((item, index) => {\n const key = cluster(item, index)\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(item)\n })\n const clusters = [...groups.values()]\n const rng = mulberry32(seed)\n const values: number[] = []\n for (let b = 0; b < resamples; b++) {\n const draw = () => clusters[Math.floor(rng() * clusters.length)]!\n const value = statistic(Array.from({ length: clusters.length }, draw).flat())\n if (Number.isFinite(value)) values.push(value)\n }\n const q = (p: number) =>\n interpolatedQuantile(\n values.sort((a, b) => a - b),\n p,\n )\n return { low: q((1 - level) / 2), high: q((1 + level) / 2), resamples, clusters: clusters.length }\n}\n","/** Arithmetic mean. An empty input has no mean and returns NaN. */\nexport function mean(values: readonly number[]): number {\n return values.reduce((sum, value) => sum + value, 0) / values.length\n}\n\n/** Arithmetic mean, or null for an empty input. */\nexport function meanOrNull(values: readonly number[]): number | null {\n return values.length === 0 ? null : mean(values)\n}\n\n/** Arithmetic mean, or 0 for an empty input. */\nexport function meanOrZero(values: readonly number[]): number {\n return values.length === 0 ? 0 : mean(values)\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-DNCAUtuB.js","names":[],"sources":["../src/metrics.ts"],"sourcesContent":["interface TokenPrice {\n input: number\n output: number\n}\n\n/** Per-1K token pricing for exact model ids. */\nexport const MODEL_PRICING: Record<string, TokenPrice> = {\n 'gpt-4o': { input: 0.0025, output: 0.01 },\n 'gpt-4o-mini': { input: 0.00015, output: 0.0006 },\n 'gpt-4-turbo': { input: 0.01, output: 0.03 },\n 'claude-sonnet-4-20250514': { input: 0.003, output: 0.015 },\n 'claude-opus-4-20250514': { input: 0.015, output: 0.075 },\n 'claude-3-haiku-20240307': { input: 0.00025, output: 0.00125 },\n // Router response-header rates observed for the exact served model on\n // 2026-08-15. Keep this exact row ahead of the deliberately coarse family\n // fallback so glm-5.3 campaign costs are not understated by ~2.5x.\n 'glm-5.3': { input: 0.00168, output: 0.00528 },\n // Tangle Router's published rate (`GET /v1/models`) on 2026-10-09:\n // $0.10 / $0.50 per Mtok. Exact, because the coarse gpt-5 family row would\n // overstate it 12x on input and 20x on output.\n 'gpt-6-luna': { input: 0.0001, output: 0.0005 },\n}\n\n/** Family-level pricing fallbacks (per-1K), matched against a normalized id\n * after exact lookup misses. Ordered — first match wins. Covers the model\n * ids actually used through the Tangle router + cli-bridge harnesses\n * (`claude-code/sonnet`, `opencode/zai-coding-plan/glm-5.1`,\n * `kimi-code/kimi-k2.6`, `deepseek-v4-pro`, `anthropic/claude-sonnet-4-6`, …),\n * none of which appear in the exact table above — without this they priced\n * to a silent $0, blanking every cost/Pareto axis downstream. */\nconst FAMILY_PRICING: Array<[RegExp, TokenPrice]> = [\n // OpenRouter stealth previews (`stealth/union-alpha`, …) bill $0 during\n // their preview window. A real zero row lets the budget ledger admit them;\n // an unpriced id is refused before the first call.\n [/^stealth\\//, { input: 0, output: 0 }],\n [/claude.*opus/, { input: 0.015, output: 0.075 }],\n [/claude.*haiku/, { input: 0.0008, output: 0.004 }],\n [/claude.*sonnet|claude-code|claude-sonnet/, { input: 0.003, output: 0.015 }],\n [/gpt-4o-mini/, { input: 0.00015, output: 0.0006 }],\n [/gpt-5|gpt-4\\.1|o[134]\\b/, { input: 0.00125, output: 0.01 }],\n [/gpt-4o|gpt-4/, { input: 0.0025, output: 0.01 }],\n [/deepseek/, { input: 0.0003, output: 0.0011 }],\n [/glm|zhipu|zai/, { input: 0.0006, output: 0.0022 }],\n [/kimi|moonshot/, { input: 0.0006, output: 0.0025 }],\n [/qwen/, { input: 0.0004, output: 0.0012 }],\n [/gemini.*flash/, { input: 0.0001, output: 0.0004 }],\n [/gemini/, { input: 0.00125, output: 0.005 }],\n [/llama/, { input: 0.0002, output: 0.0006 }],\n]\n\n/** Normalize a model id for pricing: drop a `@snapshot` suffix, lowercase,\n * and return both the complete harness/provider-prefixed id and its final\n * served-model segment (`opencode/zai-coding-plan/glm-5.3` → full id plus\n * `glm-5.3`). Exact rows are checked against both before family fallback. */\nfunction normalizedModelIds(model: string): string[] {\n const id = (model.split('@')[0] ?? model).trim().toLowerCase()\n const finalSegment = id.slice(id.lastIndexOf('/') + 1)\n return finalSegment === id ? [id] : [id, finalSegment]\n}\n\n/** Resolve pricing for a model id: exact table, then family fallback.\n * Returns null when the id matches nothing (caller decides — never a\n * silent-zero masquerading as a real $0 cost). */\nexport function resolveModelPricing(model: string): TokenPrice | null {\n if (MODEL_PRICING[model]) return MODEL_PRICING[model]\n const ids = normalizedModelIds(model)\n for (const id of ids) {\n if (MODEL_PRICING[id]) return MODEL_PRICING[id]\n }\n for (const [pattern, price] of FAMILY_PRICING) {\n if (ids.some((id) => pattern.test(id))) return price\n }\n return null\n}\n\n/** True when `model` has known pricing (exact or family). Lets cost-aware\n * callers distinguish a real $0 from an unpriced model. */\nexport function isModelPriced(model: string): boolean {\n return resolveModelPricing(model) !== null\n}\n\nconst warnedUnpricedModels = new Set<string>()\n\n/** Estimate token count from string length (chars / 4 approximation) */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\n/** Calculate cost in USD from token counts and model. Unknown models warn\n * once (not a silent zero) and return 0 so callers that ignore pricing keep\n * working; cost-sensitive callers should gate on {@link isModelPriced}. */\nexport function estimateCost(inputTokens: number, outputTokens: number, model: string): number {\n const pricing = resolveModelPricing(model)\n if (!pricing) {\n if (!warnedUnpricedModels.has(model)) {\n warnedUnpricedModels.add(model)\n console.warn(\n `estimateCost: no pricing for model \"${model}\" — returning 0; add it to ` +\n 'MODEL_PRICING/FAMILY_PRICING (cost/Pareto axes will be blank until then)',\n )\n }\n return 0\n }\n return (inputTokens / 1000) * pricing.input + (outputTokens / 1000) * pricing.output\n}\n"],"mappings":";;AAMA,MAAa,gBAA4C;CACvD,UAAU;EAAE,OAAO;EAAQ,QAAQ;CAAK;CACxC,eAAe;EAAE,OAAO;EAAS,QAAQ;CAAO;CAChD,eAAe;EAAE,OAAO;EAAM,QAAQ;CAAK;CAC3C,4BAA4B;EAAE,OAAO;EAAO,QAAQ;CAAM;CAC1D,0BAA0B;EAAE,OAAO;EAAO,QAAQ;CAAM;CACxD,2BAA2B;EAAE,OAAO;EAAS,QAAQ;CAAQ;CAI7D,WAAW;EAAE,OAAO;EAAS,QAAQ;CAAQ;CAI7C,cAAc;EAAE,OAAO;EAAQ,QAAQ;CAAO;AAChD;;;;;;;;AASA,MAAM,iBAA8C;CAIlD,CAAC,cAAc;EAAE,OAAO;EAAG,QAAQ;CAAE,CAAC;CACtC,CAAC,gBAAgB;EAAE,OAAO;EAAO,QAAQ;CAAM,CAAC;CAChD,CAAC,iBAAiB;EAAE,OAAO;EAAQ,QAAQ;CAAM,CAAC;CAClD,CAAC,4CAA4C;EAAE,OAAO;EAAO,QAAQ;CAAM,CAAC;CAC5E,CAAC,eAAe;EAAE,OAAO;EAAS,QAAQ;CAAO,CAAC;CAClD,CAAC,2BAA2B;EAAE,OAAO;EAAS,QAAQ;CAAK,CAAC;CAC5D,CAAC,gBAAgB;EAAE,OAAO;EAAQ,QAAQ;CAAK,CAAC;CAChD,CAAC,YAAY;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;CAC9C,CAAC,iBAAiB;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;CACnD,CAAC,iBAAiB;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;CACnD,CAAC,QAAQ;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;CAC1C,CAAC,iBAAiB;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;CACnD,CAAC,UAAU;EAAE,OAAO;EAAS,QAAQ;CAAM,CAAC;CAC5C,CAAC,SAAS;EAAE,OAAO;EAAQ,QAAQ;CAAO,CAAC;AAC7C;;;;;AAMA,SAAS,mBAAmB,OAAyB;CACnD,MAAM,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAA,CAAO,KAAK,CAAC,CAAC,YAAY;CAC7D,MAAM,eAAe,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;CACrD,OAAO,iBAAiB,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,YAAY;AACvD;;;;AAKA,SAAgB,oBAAoB,OAAkC;CACpE,IAAI,cAAc,QAAQ,OAAO,cAAc;CAC/C,MAAM,MAAM,mBAAmB,KAAK;CACpC,KAAK,MAAM,MAAM,KACf,IAAI,cAAc,KAAK,OAAO,cAAc;CAE9C,KAAK,MAAM,CAAC,SAAS,UAAU,gBAC7B,IAAI,IAAI,MAAM,OAAO,QAAQ,KAAK,EAAE,CAAC,GAAG,OAAO;CAEjD,OAAO;AACT;;;AAIA,SAAgB,cAAc,OAAwB;CACpD,OAAO,oBAAoB,KAAK,MAAM;AACxC;AAEA,MAAM,uCAAuB,IAAI,IAAY;;AAG7C,SAAgB,eAAe,MAAsB;CACnD,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAClC;;;;AAKA,SAAgB,aAAa,aAAqB,cAAsB,OAAuB;CAC7F,MAAM,UAAU,oBAAoB,KAAK;CACzC,IAAI,CAAC,SAAS;EACZ,IAAI,CAAC,qBAAqB,IAAI,KAAK,GAAG;GACpC,qBAAqB,IAAI,KAAK;GAC9B,QAAQ,KACN,uCAAuC,MAAM,oGAE/C;EACF;EACA,OAAO;CACT;CACA,OAAQ,cAAc,MAAQ,QAAQ,QAAS,eAAe,MAAQ,QAAQ;AAChF"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { s as ValidationError } from "./errors-DeEEV9Vx.js";
|
|
2
|
-
// src/statistics/multiplicity.ts
|
|
3
|
-
/**
|
|
4
|
-
* Multiple-comparison corrections: family-wise error (Bonferroni, Holm) and
|
|
5
|
-
* false discovery rate (Benjamini-Hochberg), with inclusive rejection
|
|
6
|
-
* boundaries throughout.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Bonferroni adjustment: multiply every p-value by the test count, clamp at 1.
|
|
10
|
-
*
|
|
11
|
-
* Rejects at `p_adjusted ≤ alpha` — the boundary is inclusive, matching
|
|
12
|
-
* {@link holm}, which uniformly dominates this correction and must therefore
|
|
13
|
-
* never reject less. Validates its inputs on the same terms.
|
|
14
|
-
*/
|
|
15
|
-
function bonferroni(pValues, alpha = .05) {
|
|
16
|
-
assertAlpha("bonferroni", "alpha", alpha);
|
|
17
|
-
assertPValues("bonferroni", pValues);
|
|
18
|
-
const k = pValues.length;
|
|
19
|
-
const adjusted = pValues.map((p) => Math.min(1, p * k));
|
|
20
|
-
return {
|
|
21
|
-
adjusted,
|
|
22
|
-
significant: adjusted.map((p) => p <= alpha)
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Holm step-down family-wise error adjustment.
|
|
27
|
-
*
|
|
28
|
-
* P-values are sorted from smallest to largest, multiplied by their remaining
|
|
29
|
-
* hypothesis count, and made monotonically non-decreasing before being mapped
|
|
30
|
-
* back to input order. This uniformly dominates plain Bonferroni while keeping
|
|
31
|
-
* strong family-wise error control under arbitrary dependence.
|
|
32
|
-
*/
|
|
33
|
-
function holm(pValues, alpha = .05) {
|
|
34
|
-
assertAlpha("holm", "alpha", alpha);
|
|
35
|
-
assertPValues("holm", pValues);
|
|
36
|
-
const count = pValues.length;
|
|
37
|
-
if (count === 0) return {
|
|
38
|
-
adjusted: [],
|
|
39
|
-
significant: []
|
|
40
|
-
};
|
|
41
|
-
const ordered = pValues.map((pValue, index) => ({
|
|
42
|
-
pValue,
|
|
43
|
-
index
|
|
44
|
-
})).sort((a, b) => a.pValue - b.pValue || a.index - b.index);
|
|
45
|
-
const adjusted = new Array(count);
|
|
46
|
-
let previous = 0;
|
|
47
|
-
for (let rank = 0; rank < count; rank++) {
|
|
48
|
-
const entry = ordered[rank];
|
|
49
|
-
const stepAdjusted = Math.min(1, entry.pValue * (count - rank));
|
|
50
|
-
previous = Math.max(previous, stepAdjusted);
|
|
51
|
-
adjusted[entry.index] = previous;
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
adjusted,
|
|
55
|
-
significant: adjusted.map((pValue) => pValue <= alpha)
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Benjamini–Hochberg false discovery rate. Returns adjusted q-values and
|
|
60
|
-
* significance at the target FDR; handles ties and preserves q monotonicity.
|
|
61
|
-
*
|
|
62
|
-
* Rejects at `q ≤ fdr` — the BH rule is inclusive at the boundary, so an
|
|
63
|
-
* exactly-`fdr` q-value is a discovery.
|
|
64
|
-
*/
|
|
65
|
-
function benjaminiHochberg(pValues, fdr = .05) {
|
|
66
|
-
assertAlpha("benjaminiHochberg", "fdr", fdr);
|
|
67
|
-
assertPValues("benjaminiHochberg", pValues);
|
|
68
|
-
const n = pValues.length;
|
|
69
|
-
if (n === 0) return {
|
|
70
|
-
qValues: [],
|
|
71
|
-
significant: []
|
|
72
|
-
};
|
|
73
|
-
const indexed = pValues.map((p, i) => ({
|
|
74
|
-
p,
|
|
75
|
-
i
|
|
76
|
-
})).sort((a, b) => a.p - b.p);
|
|
77
|
-
const q = new Array(n);
|
|
78
|
-
let minRight = 1;
|
|
79
|
-
for (let k = n - 1; k >= 0; k--) {
|
|
80
|
-
const rank = k + 1;
|
|
81
|
-
const entry = indexed[k];
|
|
82
|
-
const raw = n / rank * entry.p;
|
|
83
|
-
const bounded = Math.min(minRight, raw);
|
|
84
|
-
minRight = bounded;
|
|
85
|
-
q[entry.i] = Math.min(1, bounded);
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
qValues: q,
|
|
89
|
-
significant: q.map((v) => v <= fdr)
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function assertAlpha(fn, label, value) {
|
|
93
|
-
if (!Number.isFinite(value) || value <= 0 || value >= 1) throw new ValidationError(`${fn}: ${label} must be in (0,1), got ${value}`);
|
|
94
|
-
}
|
|
95
|
-
function assertPValues(fn, pValues) {
|
|
96
|
-
for (const [index, pValue] of pValues.entries()) if (!Number.isFinite(pValue) || pValue < 0 || pValue > 1) throw new ValidationError(`${fn}: pValues[${index}] must be in [0,1], got ${pValue}`);
|
|
97
|
-
}
|
|
98
|
-
export { bonferroni as n, holm as r, benjaminiHochberg as t };
|
|
99
|
-
|
|
100
|
-
//# sourceMappingURL=multiplicity-DAd4xaDC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multiplicity-DAd4xaDC.js","names":[],"sources":["../src/statistics/multiplicity.ts"],"sourcesContent":["/**\n * Multiple-comparison corrections: family-wise error (Bonferroni, Holm) and\n * false discovery rate (Benjamini-Hochberg), with inclusive rejection\n * boundaries throughout.\n */\n\nimport { ValidationError } from '../errors'\n\n/**\n * Bonferroni adjustment: multiply every p-value by the test count, clamp at 1.\n *\n * Rejects at `p_adjusted ≤ alpha` — the boundary is inclusive, matching\n * {@link holm}, which uniformly dominates this correction and must therefore\n * never reject less. Validates its inputs on the same terms.\n */\nexport function bonferroni(\n pValues: readonly number[],\n alpha = 0.05,\n): { adjusted: number[]; significant: boolean[] } {\n assertAlpha('bonferroni', 'alpha', alpha)\n assertPValues('bonferroni', pValues)\n const k = pValues.length\n const adjusted = pValues.map((p) => Math.min(1, p * k))\n return { adjusted, significant: adjusted.map((p) => p <= alpha) }\n}\n\n/**\n * Holm step-down family-wise error adjustment.\n *\n * P-values are sorted from smallest to largest, multiplied by their remaining\n * hypothesis count, and made monotonically non-decreasing before being mapped\n * back to input order. This uniformly dominates plain Bonferroni while keeping\n * strong family-wise error control under arbitrary dependence.\n */\nexport function holm(\n pValues: readonly number[],\n alpha = 0.05,\n): { adjusted: number[]; significant: boolean[] } {\n assertAlpha('holm', 'alpha', alpha)\n assertPValues('holm', pValues)\n const count = pValues.length\n if (count === 0) return { adjusted: [], significant: [] }\n\n const ordered = pValues\n .map((pValue, index) => ({ pValue, index }))\n .sort((a, b) => a.pValue - b.pValue || a.index - b.index)\n const adjusted = new Array<number>(count)\n let previous = 0\n for (let rank = 0; rank < count; rank++) {\n const entry = ordered[rank]!\n const stepAdjusted = Math.min(1, entry.pValue * (count - rank))\n previous = Math.max(previous, stepAdjusted)\n adjusted[entry.index] = previous\n }\n // Holm's rejection rule is inclusive at the adjusted alpha boundary.\n return { adjusted, significant: adjusted.map((pValue) => pValue <= alpha) }\n}\n\n/**\n * Benjamini–Hochberg false discovery rate. Returns adjusted q-values and\n * significance at the target FDR; handles ties and preserves q monotonicity.\n *\n * Rejects at `q ≤ fdr` — the BH rule is inclusive at the boundary, so an\n * exactly-`fdr` q-value is a discovery.\n */\nexport function benjaminiHochberg(\n pValues: readonly number[],\n fdr = 0.05,\n): { qValues: number[]; significant: boolean[] } {\n assertAlpha('benjaminiHochberg', 'fdr', fdr)\n assertPValues('benjaminiHochberg', pValues)\n const n = pValues.length\n if (n === 0) return { qValues: [], significant: [] }\n const indexed = pValues.map((p, i) => ({ p, i })).sort((a, b) => a.p - b.p)\n const q = new Array<number>(n)\n let minRight = 1\n for (let k = n - 1; k >= 0; k--) {\n const rank = k + 1\n const entry = indexed[k]!\n // (n/rank)·p, not (p·n)/rank: the latter lands one ULP above `fdr` at an\n // exact boundary (p = 0.05, n = 3, rank = 3 gives 0.05000000000000001),\n // which silently turns a discovery into a non-discovery. This is R's\n // `p.adjust(method = \"BH\")` formulation.\n const raw = (n / rank) * entry.p\n const bounded = Math.min(minRight, raw)\n minRight = bounded\n q[entry.i] = Math.min(1, bounded)\n }\n return { qValues: q, significant: q.map((v) => v <= fdr) }\n}\n\nfunction assertAlpha(fn: string, label: string, value: number): void {\n if (!Number.isFinite(value) || value <= 0 || value >= 1) {\n throw new ValidationError(`${fn}: ${label} must be in (0,1), got ${value}`)\n }\n}\n\nfunction assertPValues(fn: string, pValues: readonly number[]): void {\n for (const [index, pValue] of pValues.entries()) {\n if (!Number.isFinite(pValue) || pValue < 0 || pValue > 1) {\n throw new ValidationError(`${fn}: pValues[${index}] must be in [0,1], got ${pValue}`)\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,WACd,SACA,QAAQ,KACwC;CAChD,YAAY,cAAc,SAAS,KAAK;CACxC,cAAc,cAAc,OAAO;CACnC,MAAM,IAAI,QAAQ;CAClB,MAAM,WAAW,QAAQ,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;CACtD,OAAO;EAAE;EAAU,aAAa,SAAS,KAAK,MAAM,KAAK,KAAK;CAAE;AAClE;;;;;;;;;AAUA,SAAgB,KACd,SACA,QAAQ,KACwC;CAChD,YAAY,QAAQ,SAAS,KAAK;CAClC,cAAc,QAAQ,OAAO;CAC7B,MAAM,QAAQ,QAAQ;CACtB,IAAI,UAAU,GAAG,OAAO;EAAE,UAAU,CAAC;EAAG,aAAa,CAAC;CAAE;CAExD,MAAM,UAAU,QACb,KAAK,QAAQ,WAAW;EAAE;EAAQ;CAAM,EAAE,CAAC,CAC3C,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK;CAC1D,MAAM,WAAW,IAAI,MAAc,KAAK;CACxC,IAAI,WAAW;CACf,KAAK,IAAI,OAAO,GAAG,OAAO,OAAO,QAAQ;EACvC,MAAM,QAAQ,QAAQ;EACtB,MAAM,eAAe,KAAK,IAAI,GAAG,MAAM,UAAU,QAAQ,KAAK;EAC9D,WAAW,KAAK,IAAI,UAAU,YAAY;EAC1C,SAAS,MAAM,SAAS;CAC1B;CAEA,OAAO;EAAE;EAAU,aAAa,SAAS,KAAK,WAAW,UAAU,KAAK;CAAE;AAC5E;;;;;;;;AASA,SAAgB,kBACd,SACA,MAAM,KACyC;CAC/C,YAAY,qBAAqB,OAAO,GAAG;CAC3C,cAAc,qBAAqB,OAAO;CAC1C,MAAM,IAAI,QAAQ;CAClB,IAAI,MAAM,GAAG,OAAO;EAAE,SAAS,CAAC;EAAG,aAAa,CAAC;CAAE;CACnD,MAAM,UAAU,QAAQ,KAAK,GAAG,OAAO;EAAE;EAAG;CAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;CAC1E,MAAM,IAAI,IAAI,MAAc,CAAC;CAC7B,IAAI,WAAW;CACf,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;EAC/B,MAAM,OAAO,IAAI;EACjB,MAAM,QAAQ,QAAQ;EAKtB,MAAM,MAAO,IAAI,OAAQ,MAAM;EAC/B,MAAM,UAAU,KAAK,IAAI,UAAU,GAAG;EACtC,WAAW;EACX,EAAE,MAAM,KAAK,KAAK,IAAI,GAAG,OAAO;CAClC;CACA,OAAO;EAAE,SAAS;EAAG,aAAa,EAAE,KAAK,MAAM,KAAK,GAAG;CAAE;AAC3D;AAEA,SAAS,YAAY,IAAY,OAAe,OAAqB;CACnE,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS,GACpD,MAAM,IAAI,gBAAgB,GAAG,GAAG,IAAI,MAAM,yBAAyB,OAAO;AAE9E;AAEA,SAAS,cAAc,IAAY,SAAkC;CACnE,KAAK,MAAM,CAAC,OAAO,WAAW,QAAQ,QAAQ,GAC5C,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,KAAK,SAAS,GACrD,MAAM,IAAI,gBAAgB,GAAG,GAAG,YAAY,MAAM,0BAA0B,QAAQ;AAG1F"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multiple-comparison corrections: family-wise error (Bonferroni, Holm) and
|
|
3
|
-
* false discovery rate (Benjamini-Hochberg), with inclusive rejection
|
|
4
|
-
* boundaries throughout.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Bonferroni adjustment: multiply every p-value by the test count, clamp at 1.
|
|
8
|
-
*
|
|
9
|
-
* Rejects at `p_adjusted ≤ alpha` — the boundary is inclusive, matching
|
|
10
|
-
* {@link holm}, which uniformly dominates this correction and must therefore
|
|
11
|
-
* never reject less. Validates its inputs on the same terms.
|
|
12
|
-
*/
|
|
13
|
-
declare function bonferroni(pValues: readonly number[], alpha?: number): {
|
|
14
|
-
adjusted: number[];
|
|
15
|
-
significant: boolean[];
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Holm step-down family-wise error adjustment.
|
|
19
|
-
*
|
|
20
|
-
* P-values are sorted from smallest to largest, multiplied by their remaining
|
|
21
|
-
* hypothesis count, and made monotonically non-decreasing before being mapped
|
|
22
|
-
* back to input order. This uniformly dominates plain Bonferroni while keeping
|
|
23
|
-
* strong family-wise error control under arbitrary dependence.
|
|
24
|
-
*/
|
|
25
|
-
declare function holm(pValues: readonly number[], alpha?: number): {
|
|
26
|
-
adjusted: number[];
|
|
27
|
-
significant: boolean[];
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Benjamini–Hochberg false discovery rate. Returns adjusted q-values and
|
|
31
|
-
* significance at the target FDR; handles ties and preserves q monotonicity.
|
|
32
|
-
*
|
|
33
|
-
* Rejects at `q ≤ fdr` — the BH rule is inclusive at the boundary, so an
|
|
34
|
-
* exactly-`fdr` q-value is a discovery.
|
|
35
|
-
*/
|
|
36
|
-
declare function benjaminiHochberg(pValues: readonly number[], fdr?: number): {
|
|
37
|
-
qValues: number[];
|
|
38
|
-
significant: boolean[];
|
|
39
|
-
};
|
|
40
|
-
export { bonferroni as n, holm as r, benjaminiHochberg as t };
|
|
41
|
-
//# sourceMappingURL=multiplicity-D_SEsc5j.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multiplicity-D_SEsc5j.d.ts","names":[],"sources":["../src/statistics/multiplicity.ts"],"mappings":";;;;;;;;;;;;iBAegB,WACd,4BACA;EACG;EAAoB;;;;;;;;;;iBAgBT,KACd,4BACA;EACG;EAAoB;;;;;;;;;iBA4BT,kBACd,4BACA;EACG;EAAmB"}
|