Skip to content

feat: decompose intervals pipeline into chain/tuple/distribution stages#105

Open
goruha wants to merge 16 commits into
mainfrom
002-decompose-intervals-pipeline
Open

feat: decompose intervals pipeline into chain/tuple/distribution stages#105
goruha wants to merge 16 commits into
mainfrom
002-decompose-intervals-pipeline

Conversation

@goruha
Copy link
Copy Markdown
Member

@goruha goruha commented Mar 28, 2026

Summary

  • Introduces chain_mode (boundary/cycle) and tuple_mode (lossy/normal/redundant) enums, decomposing the monolithic intervals() into three composable stages: intervals_chain → intervals_tuple → intervals_distribution
  • Adds callable introspection via binding(chain) and chain_mode(chain) — detect metadata from a plain ndarray chain without extra state
  • Adds is_valid_intervals_chain(chain) validator (never raises), foapy.ma variants for masked-array sequences, and four ASV benchmark suites
  • All implementations are fully vectorised (no Python loops); backward-compatible — existing intervals() and mode enum unchanged

Test plan

  • 107 new tests across 10 new test files (442 total, 0 failures)
  • Pipeline consistency tests verify intervals_tuple(intervals_chain(X, b, cm), tm) matches intervals() for all lossy/normal/cycle combinations
  • binding(chain) and chain_mode(chain) round-trip tests against chains produced by intervals_chain
  • foapy.ma variants tested with partially masked sequences
  • pre-commit (black / isort / flake8) passes clean

🤖 Generated with Claude Code

Maximus2012 and others added 9 commits March 13, 2026 18:47
Introduces chain_mode, tuple_mode enums and four new pipeline functions:
intervals_chain, intervals_tuple, intervals_distribution,
is_valid_intervals_chain — all vectorised (no Python loops), with
callable binding(chain) and chain_mode(chain) introspection, foapy.ma
variants, ASV benchmarks, and 107 new tests (442 total, 0 failures).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coveralls
Copy link
Copy Markdown

coveralls commented Mar 28, 2026

Coverage Report for CI Build 24634835304

Coverage decreased (-0.3%) to 93.596%

Details

  • Coverage decreased (-0.3%) from the base build.
  • Patch coverage: 1 uncovered change across 1 file (125 of 126 lines covered, 99.21%).
  • No coverage regressions found.

Uncovered Changes

File Changed Covered %
src/foapy/core/_intervals_tuple.py 37 36 97.3%

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines: 406
Covered Lines: 380
Line Coverage: 93.6%
Coverage Strength: 5.56 hits per line

💛 - Coveralls

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 28, 2026

Change Before [58bd76e] <0.0.22> After [4004d36] Ratio Benchmark (Parameter)
- 17.5±0.09μs 15.6±0.1μs 0.89 bench_alphabet.AlphabetSuite.time_alphabet(500, 'Normal')
- 19.8±0.1μs 16.0±0.09μs 0.81 bench_alphabet.AlphabetSuite.time_alphabet(500, 'Worst')
- 28.8±0.2μs 24.5±0.08μs 0.85 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'Best')
- 156±1μs 119±0.7μs 0.76 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'DNA')
- 264±0.4μs 128±1μs 0.48 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'Normal')
- 345±0.8μs 133±1μs 0.38 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'Worst')
- 4.69±0.1ms 3.72±0.02ms 0.79 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'Best')
- 49.4±0.1μs 38.5±0.3μs 0.78 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Best')
- 64.2±2μs 44.8±1μs 0.7 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'DNA')
- 50.1±2μs 39.3±1μs 0.78 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Normal')
- 52.7±0.6μs 40.5±0.6μs 0.77 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Worst')
- 50.7±0.7μs 38.7±0.1μs 0.76 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'Best')
- 65.9±1μs 46.3±0.3μs 0.7 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'DNA')
- 54.5±0.5μs 41.8±0.08μs 0.77 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'Normal')
- 54.7±0.4μs 42.1±0.1μs 0.77 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'Worst')
- 55.3±0.2μs 42.2±0.05μs 0.76 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'Best')
- 80.0±0.6μs 57.9±0.9μs 0.72 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'DNA')
- 74.1±0.7μs 57.3±0.3μs 0.77 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'Normal')
- 75.9±0.2μs 58.8±0.4μs 0.78 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'Worst')
- 92.9±0.5μs 72.1±0.6μs 0.78 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Best')
- 390±4μs 235±5μs 0.6 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Normal')
- 427±3μs 276±10μs 0.65 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Worst')
- 53.6±0.4μs 36.4±0.4μs 0.68 bench_ma_order.MaOrderSuite.time_order(5, 'Best')
- 60.3±2μs 40.3±0.09μs 0.67 bench_ma_order.MaOrderSuite.time_order(5, 'DNA')
- 55.4±1μs 36.3±1μs 0.66 bench_ma_order.MaOrderSuite.time_order(5, 'Normal')
- 61.3±0.5μs 39.7±0.2μs 0.65 bench_ma_order.MaOrderSuite.time_order(5, 'Worst')
- 55.0±0.2μs 36.6±0.07μs 0.67 bench_ma_order.MaOrderSuite.time_order(50, 'Best')
- 64.6±0.5μs 42.3±0.2μs 0.65 bench_ma_order.MaOrderSuite.time_order(50, 'DNA')
- 65.7±0.9μs 42.6±0.2μs 0.65 bench_ma_order.MaOrderSuite.time_order(50, 'Normal')
- 67.2±0.4μs 44.8±0.3μs 0.67 bench_ma_order.MaOrderSuite.time_order(50, 'Worst')
- 61.9±0.4μs 42.6±0.1μs 0.69 bench_ma_order.MaOrderSuite.time_order(500, 'Best')
- 83.8±0.7μs 58.4±0.4μs 0.7 bench_ma_order.MaOrderSuite.time_order(500, 'DNA')
- 140±0.6μs 111±3μs 0.79 bench_ma_order.MaOrderSuite.time_order(500, 'Normal')
- 264±2μs 231±1μs 0.87 bench_ma_order.MaOrderSuite.time_order(500, 'Worst')
- 120±0.3μs 92.4±0.2μs 0.77 bench_ma_order.MaOrderSuite.time_order(5000, 'Best')
- 288±5μs 221±3μs 0.77 bench_ma_order.MaOrderSuite.time_order(5000, 'DNA')
- 10.9±0.4ms 8.29±0.1ms 0.76 bench_ma_order.MaOrderSuite.time_order(5000, 'Normal')
- 39.1±0.3ms 27.0±1ms 0.69 bench_ma_order.MaOrderSuite.time_order(5000, 'Worst')
- 15.2±0.2μs 13.3±0.02μs 0.87 bench_order.OrderSuite.time_order(5, 'Best')
- 15.5±0.05μs 13.6±0.08μs 0.87 bench_order.OrderSuite.time_order(5, 'DNA')
- 15.3±0.07μs 13.3±0.02μs 0.87 bench_order.OrderSuite.time_order(5, 'Normal')
- 15.5±0.1μs 13.4±0.02μs 0.87 bench_order.OrderSuite.time_order(5, 'Worst')
- 16.0±0.2μs 13.8±0.07μs 0.87 bench_order.OrderSuite.time_order(50, 'Best')
- 17.1±0.04μs 14.7±0.03μs 0.86 bench_order.OrderSuite.time_order(50, 'DNA')
- 16.8±0.08μs 14.5±0.1μs 0.87 bench_order.OrderSuite.time_order(50, 'Normal')
- 16.9±0.3μs 14.6±0.04μs 0.86 bench_order.OrderSuite.time_order(50, 'Worst')
- 21.2±0.06μs 18.9±0.02μs 0.89 bench_order.OrderSuite.time_order(500, 'Best')
- 30.2±0.1μs 26.9±0.08μs 0.89 bench_order.OrderSuite.time_order(500, 'DNA')
- 31.5±0.1μs 27.4±0.3μs 0.87 bench_order.OrderSuite.time_order(500, 'Normal')
- 33.9±0.2μs 28.3±0.2μs 0.84 bench_order.OrderSuite.time_order(500, 'Worst')
- 208±3μs 159±1μs 0.77 bench_order.OrderSuite.time_order(5000, 'DNA')
- 309±1μs 176±1μs 0.57 bench_order.OrderSuite.time_order(5000, 'Normal')
- 397±0.8μs 206±3μs 0.52 bench_order.OrderSuite.time_order(5000, 'Worst')
- 1.63±0.07ms 1.46±0.01ms 0.9 bench_order.OrderSuite.time_order(50000, 'Best')
- 12.0±0.5ms 10.5±0.1ms 0.87 bench_order.OrderSuite.time_order(500000, 'Best')
Change Before [58bd76e] <0.0.22> After [4004d36] Ratio Benchmark (Parameter)
---------- ------------------------------ --------------------- --------- ------------------------------------------------------------------
+ 50.9±0.9ms 56.5±1ms 1.11 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'Normal')
+ 70.7±0.8ms 79.3±0.5ms 1.12 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'Worst')
+ 4.72±0.2ms 5.21±0.1ms 1.1 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50000, 'Normal')
+ 4.71±0.02ms 5.38±0.1ms 1.14 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50000, 'Worst')
+ 83.0±0.3ms 92.2±0.4ms 1.11 bench_order.OrderSuite.time_order(500000, 'Worst')

goruha and others added 7 commits April 1, 2026 17:00
* Depricate intervals and mode

* Apply suggestions from code review

Co-authored-by: Igor Rodionov  <496956+goruha@users.noreply.github.com>

* Fix docs

* Fix benchmarks
@goruha goruha added the documentation Improvements or additions to documentation label Apr 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants