Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
7d7b203
Expose derived u-node sizing for the JAX fallback cell, and state the…
oshaughnessy-junior Sep 3, 2026
ec8e333
Correct the stale 'can only add nodes' claim in the JAX fallback comment
oshaughnessy-junior Sep 3, 2026
91f523f
jax gate: set the collection floor to the MEASURED 311, not the arith…
oshaughnessy-junior Sep 3, 2026
5676d66
Design note: promote two measured failures to stated anti-goals
oshaughnessy-junior Sep 3, 2026
1a4ce1a
jax gate: 310, read from the CI job's own log
oshaughnessy-junior Sep 3, 2026
fc892a2
A certified-complete cover was 0.36 nats wrong INSIDE it, on the prod…
oshaughnessy-junior Sep 3, 2026
0892746
Two stale comments beside working code, both found by a reader and no…
oshaughnessy-junior Sep 3, 2026
1af3497
Scope the 1.335 crossover ratio: my own replacement comment overclaim…
oshaughnessy-junior Sep 3, 2026
d8f390e
Rung 1 measured: exact at BOTH caps -- and my new counter overstated …
oshaughnessy-junior Sep 3, 2026
a73fa10
Two SECOND COPIES of claims I corrected earlier today, one of them 14…
oshaughnessy-junior Sep 3, 2026
bcc0946
Design note: the operational form of the stale-comment rule
oshaughnessy-junior Sep 3, 2026
0661048
Name the denominator on 7.07x -- the defect that block exists to guar…
oshaughnessy-junior Sep 3, 2026
7129f6e
Counting, not rereading: the sweep found a split spelling that defeat…
oshaughnessy-junior Sep 3, 2026
406fbf0
Sweep by VALUE: a string-grouped sweep hides multi-spelling from itself
oshaughnessy-junior Sep 3, 2026
21fc9e6
Design note: one rule behind three of this week's failures
oshaughnessy-junior Sep 3, 2026
6f86239
Design note: a compression of verified facts is a new claim
oshaughnessy-junior Sep 3, 2026
d4db43b
Remove a benchmark against a RETRACTED number from a shipped docstring
oshaughnessy-junior Sep 3, 2026
28fcd5e
Address automated review findings for PR #246
Sep 3, 2026
9f72a94
Review P1s: revert an automated wiring that broke CI, and fix the gua…
oshaughnessy-junior Sep 3, 2026
f3aaaec
Fix the three tests the CI census found BROKEN, and gate the two that…
oshaughn Sep 4, 2026
e26fc9a
Review P2: make the single source of truth actually read by both sides
oshaughnessy-junior Sep 4, 2026
d88b30b
jax_gp: let the package import without jax, so the skip guards can fire
oshaughn Sep 5, 2026
30705bb
Resolve production fallback quadrature without growing live memory
oshaughnessy-junior Sep 5, 2026
d830f37
jax_gp: make the package importable without jax, so the skip guards c…
oshaughn Sep 5, 2026
d819208
Merge pull request #246 from oshaughnessy-junior/rift_O4d_joint_u_fal…
oshaughnessy-junior Sep 5, 2026
314d53a
Merge pull request #248 from oshaughnessy-junior/claude/fix-broken-ro…
oshaughnessy-junior Sep 5, 2026
413936a
anglemarg: derive the eval-buffer cap from the device instead of assu…
oshaughnessy-junior Sep 5, 2026
3df59bd
Merge rift_O4d: keep #246's n_u_live sizing and the device-aware buff…
oshaughnessy-junior Sep 5, 2026
c209368
anglemarg: relax the buffer fraction to 0.5 and make it overridable
oshaughnessy-junior Sep 5, 2026
e13f2d3
anglemarg: bound Laplace sample-time working slab
oshaughn Sep 5, 2026
1aa03e9
jax_ile: prototype primitive-first time peak-local cover
oshaughn Sep 5, 2026
5c91968
jax_ile: add opt-in budgeted marginalization planner
oshaughn Sep 5, 2026
43f0066
ci: gate direct marginalization planner tests
oshaughn Sep 5, 2026
04cc6b0
Register the buffer-cap test with the job that actually runs it
oshaughnessy-junior Sep 5, 2026
cd9a3c5
time marg: reduce bandlimited AV CPU overhead
oshaughn Sep 5, 2026
8941cda
JAX phi-localization: both axes local, jittable, and the wall clock g…
oshaughnessy-junior Sep 3, 2026
2396a1d
JAX phi merge: split at the seam, as the numpy path had to
oshaughnessy-junior Sep 3, 2026
6ad2968
Review P1: u_profile classified a CLIPPED Newton point as a peak from…
oshaughnessy-junior Sep 3, 2026
de8f1b5
Review P1: give phi_local_lnI a real certificate -- and it shows the …
oshaughnessy-junior Sep 4, 2026
1213c4f
Correct the open question I recorded an hour ago: the grid is the pro…
oshaughnessy-junior Sep 4, 2026
aac945d
Correct the symmetry mechanism I shipped: it is k-odd and (phi+pi, u)…
oshaughnessy-junior Sep 4, 2026
c603bb9
Third correction to the same claim: the group is order 4, generated b…
oshaughnessy-junior Sep 4, 2026
4461bfc
Withdraw the phi cost conclusion: this localizes on F, but g has an e…
oshaughnessy-junior Sep 5, 2026
11a195f
phi DOES have an algebraic warrant -- via g, not via F. Exact 2-D en…
oshaughnessy-junior Sep 5, 2026
1a80a50
JAX algebraic phi seeds: complete, validated on Blackwell -- and DEFA…
oshaughnessy-junior Sep 5, 2026
bd5c0b2
A full cover is not a correct answer: gate the accept on measured con…
oshaughnessy-junior Sep 5, 2026
4cff518
jax gate: floor to the MEASURED 324 after rebasing onto the streaming…
oshaughnessy-junior Sep 5, 2026
8d52b52
Address automated review findings for PR #252
Sep 5, 2026
9494b11
Address automated review findings for PR #252
Sep 5, 2026
bf4ab47
Wiring suite: 1006s -> 376s by dropping a boost that bought no wiring…
oshaughnessy-junior Sep 5, 2026
70599f1
time marginalization: refine only unresolved AV rows
oshaughn Sep 5, 2026
d9a42dc
jax_ile: resolve method declines with explicit fallback
oshaughn Sep 5, 2026
19da0e8
jax_ile: algebraically enumerate joint angle maxima
oshaughn Sep 5, 2026
50f470f
docs: qualify JAX anglemarg allocation model
oshaughn Sep 5, 2026
dfe1d3a
Register the algebraic tests with a CI job: they existed and never ran
oshaughnessy-junior Sep 5, 2026
b810cf9
ci: include planner fallback regressions
oshaughn Sep 5, 2026
47ddb50
Merge commit '9494b1183e97d567a5f5d713d8085d02ff59cee8' into codex/ma…
oshaughn Sep 5, 2026
7c0962b
ci: account for planner review regressions
oshaughn Sep 5, 2026
476145c
ile: make phase-mode guard GPU representation independent
oshaughn Sep 5, 2026
0104ebb
Address review of #250: the floor, the override, and a test that coul…
oshaughn Sep 5, 2026
27b7514
Adversarial review: it was not an enumeration. FFT sign, and six more
oshaughnessy-junior Sep 5, 2026
ac58aef
Mutation sweep on the #250 guards: one survivor, now killed
oshaughn Sep 5, 2026
489ec31
jax_ile: fail closed on unfit angle batches
oshaughn Sep 5, 2026
6e2e4e2
Guard peak-local fallback certification
oshaughn Sep 5, 2026
b395979
Merge remote-tracking branch 'refs/remotes/github/rift_O4d_anglemarg_…
oshaughn Sep 5, 2026
be93e26
time marg: prune reflected FFT to retained grid
oshaughn Sep 5, 2026
f609223
time marg: record retained FFT production validation
oshaughn Sep 5, 2026
0357e3f
Adversarial review round 2: the halving check could not see its own e…
oshaughnessy-junior Sep 5, 2026
0cf4c03
Review P1/P2 on #250: the bound was not a bound, and the CI floor was…
oshaughn Sep 5, 2026
37f0f98
Confirm the 369 floor off the gate's own collection line
oshaughn Sep 5, 2026
1aafa69
Address automated review findings for PR #250
Sep 5, 2026
336bb2c
NoLoop: hoist source-only geometry out of the detector loop (-22% at …
oshaughnessy-junior Sep 5, 2026
3e263c5
Merge latest device-aware cap into marginalization integration
oshaughn Sep 5, 2026
703007e
Merge refreshed marginalization integration into retained FFT validation
oshaughn Sep 5, 2026
14d1efd
Merge pull request #252 from oshaughnessy-junior/codex/marginalizatio…
oshaughnessy-junior Sep 5, 2026
21893fa
Merge pull request #254 from oshaughnessy-junior/codex/bandlimited-re…
oshaughnessy-junior Sep 5, 2026
515f027
CI: enroll marginalization tests in integration gates
oshaughn Sep 5, 2026
9b100b8
Nest the phi grid, and stop calling the phi gates a certificate
oshaughnessy-junior Sep 5, 2026
5c74dc9
NoLoop: stop materializing rho_sq and stop zero-filling kappa_sq (-15…
oshaughnessy-junior Sep 5, 2026
ebb4b58
Address automated review findings for PR #255
Sep 5, 2026
2cf87e1
NoLoop: evaluate the time integral as a cached weight matvec (-15% more)
oshaughnessy-junior Sep 5, 2026
a04caef
test: check physical amplitude invariance
oshaughn Sep 5, 2026
397273b
Merge pull request #250 from oshaughnessy-junior/rift_O4d_anglemarg_d…
oshaughnessy-junior Sep 5, 2026
74e05b9
Merge PR 250 and drop the duplicate enumerator it supersedes
oshaughnessy-junior Sep 5, 2026
ce5b504
angle marg: finish QZ root polishing
oshaughn Sep 5, 2026
da8de00
Merge pull request #257 from oshaughnessy-junior/codex/pr250-newton-cap
oshaughnessy-junior Sep 5, 2026
2febe7d
Merge remote-tracking branch 'origin/rift_O4d' into rift_O4d_joint_ph…
oshaughnessy-junior Sep 5, 2026
0baf4fd
Merge pull request #247 from oshaughnessy-junior/rift_O4d_joint_phi_l…
oshaughnessy-junior Sep 5, 2026
91f62c9
Merge pull request #255 from oshaughnessy-junior/claude/noloop-hoist-…
oshaughnessy-junior Sep 5, 2026
b7d1e72
Merge remote-tracking branch 'junior/rift_O4d' into claude/noloop-rho…
oshaughnessy-junior Sep 5, 2026
6570f7d
Register test_noloop_accumulator_shapes.py with core-unit-check
oshaughnessy-junior Sep 5, 2026
70421ea
q-window-stencil-check: exclude the accumulator test, with the reason
oshaughnessy-junior Sep 5, 2026
32b3a63
Address the adversarial review: the tests could not fail, and one all…
oshaughnessy-junior Sep 5, 2026
eedf7a8
Merge pull request #256 from oshaughnessy-junior/claude/noloop-rho-sq…
oshaughnessy-junior Sep 5, 2026
964cb4e
Add opt-in reflected Q time pregrid
oshaughn Sep 6, 2026
9a6ef84
Harden reflected Q pregrid failover and phase handling
oshaughn Sep 6, 2026
7a42bf0
Release pregrid OOM traceback state
oshaughn Sep 6, 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
34 changes: 17 additions & 17 deletions .travis/ci_roster.txt
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ MonteCarloMarginalizeCode/Code/demo/rift/export_likelihoods/head_to_head/run_tes
# The two jax_gp files are the strongest candidates for promotion: jax-ile-check already
# installs a CPU jax stack, so adding them there costs only optax and a raised EXPECTED_TESTS.
# Not done here because that job's counts are pinned and this PR does not own them.
MonteCarloMarginalizeCode/Code/RIFT/interpolators/jax_gp/test_coordinates.py OPTDEP needs jax; belongs in jax-ile-check, which already installs a CPU jax stack
MonteCarloMarginalizeCode/Code/RIFT/interpolators/jax_gp/test_interpolators.py OPTDEP needs jax and optax; 10 collected, all 10 error on ModuleNotFoundError optax rather than skipping
MonteCarloMarginalizeCode/Code/RIFT/interpolators/jax_gp/test_coordinates.py OPTDEP needs jax; skips cleanly without it, 2 tests with it; belongs in jax-ile-check, which already installs a CPU jax stack
MonteCarloMarginalizeCode/Code/RIFT/interpolators/jax_gp/test_interpolators.py OPTDEP needs jax and optax; skips cleanly without either, 10 tests where both are installed
# The two cupy parity legs are NOT listed here. PR #242 landed, and its
# .travis/test-q-window-stencil.sh names both in an EXCLUDED array -- with the same reason,
# and with its own fail-closed check that an EXCLUDED path still exists and does not carry
Expand All @@ -114,23 +114,23 @@ MonteCarloMarginalizeCode/Code/test/integrators/test_mcsamp_vegas.py O
MonteCarloMarginalizeCode/Code/test/integrators/test_mcsampler_rosenbrock.py HANDRUN Rosenbrock sampler study; its docstring pairs it with plot_posterior_corner.py by hand
MonteCarloMarginalizeCode/Code/test/test_eosmanager_misc.py OPTDEP needs LALSIMULATION_DATADIR set; raises KeyError at import without it
MonteCarloMarginalizeCode/Code/test/test_skysamp.py LEGACY imports lalinference.bayestar.fits, removed upstream; cannot be imported
MonteCarloMarginalizeCode/Code/test/test_mcsampler_foridiots.py BROKEN NameError int_vals at import; a plotting demo that no longer runs at all
# test_mcsampler_foridiots.py is HANDRUN rather than BROKEN because it is a demo script with no
# test functions -- it was never going to be gated. But it fails for a reason that is NOT the
# demo's: it dies in RIFT/integrators/mcsamplerGPU.py:1324, inside integrate(), on
#
# weights_alt = int_vals**tempering_exp # NameError: int_vals is not defined
#
# the `not save_intg` branch of the adaptation weighting. `int_vals` exists nowhere in that
# scope; the sibling branches use self._rvs["integrand"][-n_history:], and the local holding the
# same values when nothing is being saved is `fval` (a commented-out line two above prints it),
# so `fval**tempering_exp` is the near-certain intent. This branch cannot ever have run.
#
# NOT FIXED HERE: that is core sampler code, and guessing the intended expression is exactly the
# kind of change that should be RO'S call rather than a side effect of a test-hygiene PR.
# Reported instead. Reachable on CPU -- this demo hit it with no GPU involved.
MonteCarloMarginalizeCode/Code/test/test_mcsampler_foridiots.py HANDRUN plotting demo with no test functions; dies in mcsamplerGPU.integrate on an undefined int_vals (see note above)

# ---------------------------------------------------------------------------------------
# EXPENSIVE -- correctly gated already, by an env var rather than by CI membership.
MonteCarloMarginalizeCode/Code/test/expensive_before_merging/integrators/test_shape_recovery.py EXPENSIVE 4 collected, all skip unless RIFT_RUN_EXPENSIVE=1
MonteCarloMarginalizeCode/Code/test/expensive_before_merging/integrators/test_escaped_mass_diagnostic.py EXPENSIVE 5 collected, all skip unless RIFT_RUN_EXPENSIVE=1

# ---------------------------------------------------------------------------------------
# BROKEN -- collects and FAILS on rift_O4d today. Found only because this audit ran them.
#
# test_replica_pooling.py is the clearest argument for the census. It loads six helpers out of
# bin/integrate_likelihood_extrinsic_batchmode by REGEX and exec()s them into a synthetic
# module. The driver has since been refactored so that _lnZ_of_rvs and _kish_neff_of_rvs
# delegate to a seventh helper, _lw_of, which the regex list does not extract. Inside the
# exec'd module _lw_of is undefined; the driver's own `except Exception: return None` swallows
# the NameError, both helpers return None, and 10 of 15 tests die on `None - float`. Adding
# "_lw_of" to the slice list in the test is the immediate fix. The reimplemented-harness shape
# is the real problem and outlives that fix.
MonteCarloMarginalizeCode/Code/test/integrators/test_replica_pooling.py BROKEN 10 of 15 fail; its regex helper-slicer misses _lw_of, added to the driver after the test was written
MonteCarloMarginalizeCode/Code/test/hyperpipe/tests/test_marg_list.py BROKEN 2 of 3 fail; _stage_event_file writes event-N.net into base_dir while the test and assemble_marg_list's own run_dir docstring say run_dir
33 changes: 27 additions & 6 deletions .travis/test-core-units.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@
# distance grid, a container manifest, a parameter port. A wrong number there is still a
# plausible number.
#
# Every file listed here was run individually on CIT (IGWN conda python 3.11, numpy 1.26.4,
# lal 7.7.0) before it was added; the measured collection counts are the floors below.
# The original manifest was run file by file on CIT (IGWN conda python 3.11, numpy 1.26.4,
# lal 7.7.0) before it was added; the measured collection counts are the floors below. Later
# entries are verified by this gate itself, which collects every file individually before the
# combined run, so an addition that collects nothing or fails is caught here rather than
# trusted on a quoted number.
#
# SHAPE. Modelled on .travis/test-slowrot.sh, and it keeps that script's defences, because
# the trap it documents is live in this very set: several files elsewhere in these directories
Expand Down Expand Up @@ -58,11 +61,14 @@ FILES=(
"$C/RIFT/likelihood/test_td_dispatch_epoch.py"
"$C/test/test_ile_scalar_edge_cases.py"
"$C/test/test_srate_resample_time_marginalization.py"
"$C/test/test_vectorized_lal_tools_split.py"
"$C/test/test_noloop_accumulator_shapes.py"
# -- integrators: seeding, allocation, weight derivation
"$C/test/integrators/test_convergence_sample_order.py"
"$C/test/integrators/test_gmm_adaptive.py"
"$C/test/integrators/test_portfolio_gmm_member_trains.py"
"$C/test/integrators/test_portfolio_restrict_and_warm.py"
"$C/test/integrators/test_replica_pooling.py"
"$C/test/integrators/test_rvs_weight_derivation.py"
"$C/test/integrators/test_seeding_public_paths.py"
"$C/test/integrators/test_seeding_reproducibility.py"
Expand All @@ -77,6 +83,7 @@ FILES=(
"$C/test/hyperpipe/tests/test_config.py"
"$C/test/hyperpipe/tests/test_coords.py"
"$C/test/hyperpipe/tests/test_drivers.py"
"$C/test/hyperpipe/tests/test_marg_list.py"
"$C/test/test_hyperpipeline_io.py"
# -- packaging / config contracts / waveform conventions
"$C/test/test_advanced_parameter_ports.py"
Expand Down Expand Up @@ -113,9 +120,23 @@ done

# Pinned TOTAL floor, so a renamed file or a dropped test_* entry point goes red rather than
# green-on-fewer-tests. MEASURED 2026-09-03 on CIT with the IGWN conda python (3.11, numpy
# 1.26.4, scipy 1.14.1, lal 7.7.0), whole manifest in one run: 278 collected, 266 passed,
# 12 skipped (11 pytest.skip + 1 xfail), 49 s.
EXPECTED_TESTS=278
# 1.26.4, scipy 1.14.1, lal 7.7.0), whole manifest in one run: 296 collected, 284 passed,
# 12 skipped (11 pytest.skip + 1 xfail), ~55 s. (Was 278/266 before test_replica_pooling.py
# and test_marg_list.py joined the manifest -- both were rostered BROKEN until their defects
# were fixed. RAISE these when files are added: a floor left at the old value passes while
# covering less, which is the failure this gate exists to catch.)
#
# +3/+3 for test_vectorized_lal_tools_split.py: three unconditional test functions, no skip
# and no xfail, numpy / lal / lalsimulation only, so both floors move by the same amount and
# MAX_SKIPPED does not.
#
# +8/+8 for test_noloop_accumulator_shapes.py: two parametrized over three detector networks
# (1/2/3 IFOs) plus two unconditional, so 8 collected and 8 passed, no skip and no xfail.
# numpy / lal / lalsimulation only -- it builds synthetic inputs and calls the NoLoop
# likelihood on the CPU backend, so it needs no cupy and no GPU, and both floors move by the
# same amount while MAX_SKIPPED does not. MEASURED 2026-09-05 on CIT with the same conda
# python as the line above: 8 collected, 8 passed, 0 skipped, 4.9 s.
EXPECTED_TESTS=307
# Outcomes, not just exit status: a collection floor cannot see a test that collects, runs and
# asserts nothing, and a pytest.skip can quietly absorb a lost gate. The 12 skips are
# environment legs -- cupy in test_seeding_reproducibility, device legs in
Expand All @@ -126,7 +147,7 @@ EXPECTED_TESTS=278
# editable install) reported the same 278 / 266 / 12, in 24.7 s. So these floors are exact on
# both stacks, not merely the CIT numbers copied across, and a future divergence is a real
# change rather than an environment difference to be explained away.
EXPECTED_PASSED=266
EXPECTED_PASSED=295
MAX_SKIPPED=12

junit="$(mktemp -t core-units-junit-XXXXXX.xml)"
Expand Down
11 changes: 7 additions & 4 deletions .travis/test-integrate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ _TMARG_TESTS=(
# catches a total collection failure (pytest exits 5), but a silent shrink from 60
# tests to 3 -- a rename, a stale -k, a decorator that stops matching -- reads as
# green. Raise EXPECTED by RUNNING collection, never by arithmetic.
_TMARG_EXPECTED=161
_TMARG_EXPECTED=171
_TMARG_FOUND=$(python -m pytest -q --collect-only "${_TMARG_TESTS[@]}" 2>/dev/null | grep -c '::' || true)
if [ "$_TMARG_FOUND" -ne "$_TMARG_EXPECTED" ]; then
echo "time-marginalization gate: collected $_TMARG_FOUND tests, expected $_TMARG_EXPECTED" >&2
Expand Down Expand Up @@ -137,11 +137,14 @@ fi
# protect: that the outside supremum is CERTIFIED (a straddling cell must count as
# outside -- classifying grid centres once returned "nothing uncovered" and accepted
# unconditionally), that a distance node is only dropped when the drop is provable
# against the computed value, and that an undersized region is DECLINED rather than
# returned.
# against the computed value, and that an undersized region is routed to the finite
# dense fallback rather than returned locally. The algebraic follow-up also pins
# the BKK/resultant enumerator on co-dominant, near-annihilating, exactly degenerate,
# and amplitude-scaled systems, requires inside-cover convergence even after a
# complete enumeration, and keeps the NumPy fallback independent of optional JAX.
_JOINT_PL_TESTS=MonteCarloMarginalizeCode/Code/test/test_joint_angle_peak_local.py
# Raise EXPECTED by RUNNING collection, never by arithmetic.
_JOINT_PL_EXPECTED=26
_JOINT_PL_EXPECTED=36
_JOINT_PL_FOUND=$(python -m pytest -q --collect-only "$_JOINT_PL_TESTS" 2>/dev/null | grep -c '::' || true)
if [ "$_JOINT_PL_FOUND" -ne "$_JOINT_PL_EXPECTED" ]; then
echo "joint peak-local gate: collected $_JOINT_PL_FOUND tests, expected $_JOINT_PL_EXPECTED" >&2
Expand Down
36 changes: 35 additions & 1 deletion .travis/test-jax.sh
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ FILES=(
"${JAXDIR}/test_jax_stencil_parity.py"
"${JAXDIR}/test_flow_reuse_default.py"
"${JAXDIR}/test_angle_marg_sizing_rule.py"
"${JAXDIR}/test_anglemarg_buffer_cap.py"
"${JAXDIR}/test_angle_marg_smoke.py"
"${JAXDIR}/test_angle_marg_compile_cost.py"
"${JAXDIR}/test_angle_marg_block_dispatch.py"
Expand All @@ -349,6 +350,8 @@ FILES=(
"${JAXDIR}/test_joint_anglemarg_peaklocal.py"
"${JAXDIR}/test_angle_marg_peaklocal_wiring.py"
"${JAXDIR}/test_limit_distance_jax.py"
"${JAXDIR}/test_direct_marginalization_planner.py"
"${JAXDIR}/test_time_first_peaklocal.py"
)

# EXCLUDED: files in JAXDIR matching test_*.py that are deliberately NOT gated. The
Expand Down Expand Up @@ -477,7 +480,38 @@ fi
# test_joint_anglemarg_peaklocal.py (twice differentiable, and the gradient stays
# finite as the quartic leading coefficient vanishes). 293 + 13 = 306, re-derived
# by RUNNING the gate's own collection after rebasing over #221/#238/#223.
EXPECTED_TESTS=306
#
# The u-FALLBACK branch adds 2 in test_joint_anglemarg_peaklocal.py (required_u_nodes
# is derived and follows the sqrt-A law under a cap, and a whole-cell integration sized
# by it agrees with a 4x finer one). The floor is 310, READ FROM THIS JOB'S OWN LOG.
# Two wrong numbers preceded it, failing in opposite directions:
# 308 -- by adding 2 to the previous 306, which is exactly what the paragraph above
# says not to do. The base is 309 after #239 merged, so 308 would still have
# PASSED while silently under-promising three tests.
# 311 -- by running the collection on a dev host. Wrong by exactly one, because the
# harness sliced this script by line number to reuse FILES and stopped before
# the loop that populates DESELECT from DESELECTED_TESTS -- so it counted
# test_gpu_gather_parity_against_numpy_window, which THIS job deselects.
# Arithmetic lands below the truth and passes; a mis-set-up local collection lands above
# it and fails. Read the floor off this job's "collected N tests from 27 files" line --
# the only source that is not a guess.
# The production-policy follow-up adds one mutation-bearing streaming test; this job's
# own collection reports 312.
# PR #250 adds test_anglemarg_buffer_cap.py, test_direct_marginalization_planner.py and
# test_time_first_peaklocal.py; 247 adds four tests to test_joint_anglemarg_peaklocal.py
# and REMOVES test_joint_angle_algebraic.py with the duplicate enumerator it covered.
# Neither branch guessed well: 250 derived a provisional 408 from arithmetic and said to
# replace it with a real collection, and 247 measured 329 against a different file set.
# This number is the MERGED collection, run over this job own FILES/DESELECT with the
# DESELECT loop actually applied (the run reports "424/425 tests collected (1 deselected)").
#
# 250 also inferred a standing "this environment collects one more than CI" offset and
# subtracted it. There is no such offset: the 311 case documented above was wrong by one
# because a harness sliced this script by line number and never ran the DESELECT loop, so
# it counted the one test this job deselects. That was a one-off setup bug, not a property
# of the environment, and subtracting for it would under-promise by one -- which is the
# failure direction this whole comment exists to warn about, because a low floor PASSES.
EXPECTED_TESTS=424

echo "== collection floor check (expect >= ${EXPECTED_TESTS} tests) =="
collect_out="$("${PYTHON_BIN}" -m pytest --collect-only -q -p no:cacheprovider "${DESELECT[@]}" "${FILES[@]}" 2>&1)"
Expand Down
18 changes: 15 additions & 3 deletions .travis/test-q-window-stencil.sh
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,21 @@ SCOPE_GLOBS=(
# skips as a failure. Run by hand on a GPU node; the
# numbers are in PR #97. Same treatment as the GPU files
# in slowrot-check.
#
# test_noloop_accumulator_ Belongs to another job, not to a GPU. It matches the
# shapes.py test_noloop_* pattern by NAME but not by subject: it pins
# NoLoop's rho_sq and kappa_sq ACCUMULATOR shapes against a
# reference, and its time-integral test is about the
# quadrature rule, not about sub-sample interpolation of
# Q_lm. It is registered with core-unit-check, whose FILES
# manifest carries it and whose floors count it. Listed
# here rather than renamed so the decision is recorded where
# the next such file will hit it: renaming to dodge a
# manifest is how these gates quietly stop covering things.
EXCLUDED=(
"${CODEDIR}/RIFT/likelihood/test_q_window_interp_gpu.py"
"${CODEDIR}/RIFT/likelihood/test_noloop_gpu_stencils.py"
"${CODEDIR}/test/test_noloop_accumulator_shapes.py"
)

echo "== registered files (marker: ${MARKER}) =="
Expand Down Expand Up @@ -210,15 +222,15 @@ fi
# EXPECTED_TESTS `pytest --collect-only -q` over the registered files.
# EXPECTED_PASSED the "N passed" from a full run (tests minus skips).
# Never lower either without saying why in the commit message.
EXPECTED_TESTS=69
EXPECTED_PASSED=67
EXPECTED_TESTS=78
EXPECTED_PASSED=75

# The only legitimate skips here are the two cupy legs -- one in
# test_noloop_time_marg_row_offset.py, one in test_calmarg_running_max_row_offset.py --
# which pytest.importorskip's away on these GPU-less runners. A THIRD skip means a gate
# was disabled, which is the exact shape this script exists to prevent, so cap it rather
# than letting skips absorb losses silently.
MAX_SKIPS=2
MAX_SKIPS=3

# PER-FILE collection floor. A registered file that collects nothing contributes zero
# gates while looking like membership; on its own pytest would exit 5 on it, and inside a
Expand Down
14 changes: 12 additions & 2 deletions MonteCarloMarginalizeCode/Code/RIFT/hyperpipe/marg_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,19 +155,29 @@ def _stage_event_file(
base_dir: str,
run_dir: str,
) -> Tuple[str, bool]:
"""Materialize this entry's event file at base_dir/event-<indx>.net.
"""Materialize this entry's event file at run_dir/event-<indx>.net.

Returns ``(abs_path, is_empty_sentinel)``. If the entry has no
``event-file`` set, we write a sentinel file with the single token
``empty_event_file`` so the downstream pipeline still sees a
well-formed input.

Sources resolve against ``base_dir`` (where the user's config paths are
relative to); the staged copy is written to ``run_dir``. That split is
what :func:`assemble_marg_list` documents, and what the exe staging a
few lines below already does. The destination used to be ``base_dir``,
with ``run_dir`` accepted and unused: under hydra those are different
directories -- ``base_dir`` is the ORIGINAL cwd the user launched from,
``run_dir`` the per-run output dir -- so the staged files landed in the
launch directory, and two runs started from one directory overwrote each
other's ``event-<i>.net``.
"""
src = None
if hasattr(entry, "get"):
src = entry.get("event-file") or entry.get("event_file")
elif "event-file" in entry:
src = entry["event-file"]
dest = os.path.join(base_dir, f"event-{indx}.net")
dest = os.path.join(run_dir, f"event-{indx}.net")
if src:
src = os.path.expanduser(src)
if not os.path.isabs(src):
Expand Down
Loading
Loading