Skip to content

Add foapy.partials package for partial-sequence interval analysis - #107

Open
goruha wants to merge 21 commits into
mainfrom
004-partials-package
Open

Add foapy.partials package for partial-sequence interval analysis#107
goruha wants to merge 21 commits into
mainfrom
004-partials-package

Conversation

@goruha

@goruha goruha commented Apr 19, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds foapy.partials subpackage — the position-preserving counterpart to foapy.core and foapy.ma for sequences with gap positions (numpy masked arrays)
  • Gap positions are preserved throughout the pipeline; interval distances are measured using actual full-array indices (gaps count toward distance)
  • Exports order, alphabet, intervals_chain, intervals_tuple — all returning masked 1-D arrays of the same length as input

Key semantic distinction

foapy.ma foapy.partials
Gap handling Compressed out before computing Preserved; count toward interval distance
order() output 2-D masked matrix 1-D masked array (same length as input)
lossy output length Shorter (boundaries dropped) Same length (boundaries masked in-place)
redundant output length n+k using compressed positions n+k using actual full-array positions

Files changed

New source files: src/foapy/partials/__init__, _order, _alphabet, _intervals_chain, _intervals_tuple

Modified: src/foapy/__init__.py — lazy submodule registration for foapy.partials

New tests: 5 test files covering all functions, all binding × chain_mode × tuple_mode combinations, gap semantics, error handling, and no-mask passthrough consistency with core.

Test plan

  • tox -e default — 503 tests passing, 0 failures
  • pre-commit run --all-files — black, isort, flake8 all pass
  • Quickstart examples execute without error

🤖 Generated with Claude Code

Maximus2012 and others added 19 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>
* Depricate intervals and mode

* Apply suggestions from code review

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

* Fix docs

* Fix benchmarks
@coveralls

coveralls commented Apr 19, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 31692340245

Coverage increased (+1.0%) to 94.595%

Details

  • Coverage increased (+1.0%) from the base build.
  • Patch coverage: 4 uncovered changes across 2 files (146 of 150 lines covered, 97.33%).
  • 1 coverage regression across 1 file.

Uncovered Changes

File Changed Covered %
src/foapy/init.py 4 1 25.0%
src/foapy/partials/init.py 12 11 91.67%
Total (6 files) 150 146 97.33%

Coverage Regressions

1 previously-covered line in 1 file lost coverage.

File Lines Losing Coverage Coverage
src/foapy/init.py 1 53.49%

Coverage Stats

Coverage Status
Relevant Lines: 555
Covered Lines: 525
Line Coverage: 94.59%
Coverage Strength: 2.84 hits per line

💛 - Coveralls

@goruha goruha changed the title 004 partials package Add foapy.partials package for partial-sequence interval analysis Apr 19, 2026
@github-actions

github-actions Bot commented Apr 19, 2026

Copy link
Copy Markdown
Change Before [879e227] After [438ebf9] Ratio Benchmark (Parameter)
- 18.2±0.1μs 16.0±0.1μs 0.88 bench_intervals.IntervalsSuite.time_intervals(5, 'Best', 1, 4)
- 19.2±0.1μs 16.5±0.1μs 0.86 bench_intervals.IntervalsSuite.time_intervals(5, 'Best', 2, 4)
- 18.8±0.08μs 17.1±0.3μs 0.91 bench_intervals.IntervalsSuite.time_intervals(5, 'DNA', 1, 4)
- 18.6±0.04μs 16.7±0.3μs 0.9 bench_intervals.IntervalsSuite.time_intervals(5, 'Normal', 1, 4)
- 12.8±0.1μs 11.6±0.1μs 0.91 bench_intervals.IntervalsSuite.time_intervals(5, 'Worst', 1, 1)
- 18.3±0.2μs 16.1±0.3μs 0.88 bench_intervals.IntervalsSuite.time_intervals(5, 'Worst', 1, 4)
- 18.9±0.2μs 16.5±0.2μs 0.87 bench_intervals.IntervalsSuite.time_intervals(5, 'Worst', 2, 4)
- 19.1±0.04μs 16.4±0.2μs 0.86 bench_intervals.IntervalsSuite.time_intervals(50, 'Best', 1, 4)
- 14.1±0.03μs 12.8±0.2μs 0.91 bench_intervals.IntervalsSuite.time_intervals(50, 'Best', 2, 1)
- 19.9±0.2μs 17.6±0.8μs 0.88 bench_intervals.IntervalsSuite.time_intervals(50, 'Best', 2, 4)
- 19.7±0.2μs 17.9±0.2μs 0.9 bench_intervals.IntervalsSuite.time_intervals(50, 'Worst', 1, 4)
- 24.4±0.3μs 22.1±0.2μs 0.9 bench_intervals.IntervalsSuite.time_intervals(500, 'Best', 1, 4)
- 3.88±0.1ms 3.46±0.1ms 0.89 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Worst', 3)
- 52.1±0.4μs 38.4±0.2μs 0.74 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Best')
- 53.2±2μs 45.2±1μs 0.85 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Normal')
- 55.6±0.5μs 48.3±1μs 0.87 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5, 'Worst')
- 52.4±0.3μs 39.2±0.2μs 0.75 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'Best')
- 56.3±0.3μs 51.1±0.7μs 0.91 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50, 'Worst')
- 55.7±0.4μs 42.3±0.2μs 0.76 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'Best')
- 87.5±0.4μs 73.0±2μs 0.83 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Best')
- 29.5±0.2μs 25.3±0.4μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 1, 1)
- 27.0±0.1μs 23.4±0.3μs 0.87 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 1, 2)
- 28.2±0.5μs 24.6±0.2μs 0.87 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 1, 3)
- 39.2±1μs 30.4±0.2μs 0.77 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 1, 4)
- 30.8±0.2μs 26.4±0.3μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 2, 1)
- 28.3±0.09μs 23.8±0.2μs 0.84 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 2, 2)
- 29.0±0.08μs 25.0±0.4μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 2, 3)
- 40.1±0.7μs 31.5±0.3μs 0.79 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Best', 2, 4)
- 30.7±0.1μs 26.2±0.4μs 0.85 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 1, 1)
- 27.8±0.2μs 23.9±0.3μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 1, 2)
- 39.1±0.4μs 31.3±0.2μs 0.8 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 1, 4)
- 32.5±0.3μs 26.7±0.2μs 0.82 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 2, 1)
- 28.9±0.1μs 24.2±0.2μs 0.84 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 2, 2)
- 29.8±0.08μs 25.5±0.09μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 2, 3)
- 40.4±0.2μs 32.8±2μs 0.81 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Best', 2, 4)
- 36.3±0.2μs 32.1±1μs 0.89 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 1, 1)
- 33.7±0.7μs 28.8±0.3μs 0.85 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 1, 2)
- 34.0±0.1μs 30.4±0.4μs 0.89 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 1, 3)
- 46.7±0.5μs 37.8±0.4μs 0.81 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 1, 4)
- 38.3±0.5μs 33.3±0.6μs 0.87 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 2, 1)
- 35.3±0.2μs 30.8±0.4μs 0.87 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 2, 2)
- 35.8±0.2μs 31.0±0.3μs 0.86 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 2, 3)
- 48.5±0.5μs 38.9±0.4μs 0.8 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Best', 2, 4)
- 54.3±0.6μs 36.8±0.8μs 0.68 bench_ma_order.MaOrderSuite.time_order(5, 'Best')
- 61.0±1μs 50.9±0.3μs 0.83 bench_ma_order.MaOrderSuite.time_order(5, 'DNA')
- 54.0±2μs 43.8±3μs 0.81 bench_ma_order.MaOrderSuite.time_order(5, 'Normal')
- 61.4±0.5μs 51.4±1μs 0.84 bench_ma_order.MaOrderSuite.time_order(5, 'Worst')
- 55.0±0.6μs 36.8±0.6μs 0.67 bench_ma_order.MaOrderSuite.time_order(50, 'Best')
- 63.8±0.7μs 55.4±1μs 0.87 bench_ma_order.MaOrderSuite.time_order(50, 'DNA')
- 64.5±0.3μs 55.6±0.9μs 0.86 bench_ma_order.MaOrderSuite.time_order(50, 'Normal')
- 62.0±1μs 42.7±0.5μs 0.69 bench_ma_order.MaOrderSuite.time_order(500, 'Best')
- 111±0.9μs 94.1±0.7μs 0.85 bench_ma_order.MaOrderSuite.time_order(5000, 'Best')
- 31.9±2ms 27.9±1ms 0.87 bench_ma_order.MaOrderSuite.time_order(5000, 'Worst')
- 15.4±0.2μs 13.1±0.1μs 0.85 bench_order.OrderSuite.time_order(5, 'Best')
- 15.8±0.03μs 14.3±0.1μs 0.91 bench_order.OrderSuite.time_order(5, 'Normal')
- 15.8±0.07μs 14.1±0.3μs 0.89 bench_order.OrderSuite.time_order(5, 'Worst')
- 15.8±0.1μs 13.6±0.1μs 0.86 bench_order.OrderSuite.time_order(50, 'Best')
- 17.3±0.2μs 15.3±0.2μs 0.89 bench_order.OrderSuite.time_order(50, 'Worst')
- 21.3±0.3μs 18.8±0.1μs 0.89 bench_order.OrderSuite.time_order(500, 'Best')
Change Before [879e227] After [438ebf9] Ratio Benchmark (Parameter)
---------- ---------------------- --------------------- --------- --------------------------------------------------------------------------------------------------------
+ 7.31±0.06μs 8.63±0.05μs 1.18 bench_alphabet.AlphabetSuite.time_alphabet(50, 'DNA')
+ 6.99±0.04μs 7.99±0.2μs 1.14 bench_alphabet.AlphabetSuite.time_alphabet(50, 'Normal')
+ 6.97±0.04μs 7.75±0.05μs 1.11 bench_alphabet.AlphabetSuite.time_alphabet(50, 'Worst')
+ 15.9±0.2μs 25.9±0.3μs 1.63 bench_alphabet.AlphabetSuite.time_alphabet(500, 'DNA')
+ 17.7±0.2μs 28.4±0.2μs 1.6 bench_alphabet.AlphabetSuite.time_alphabet(500, 'Normal')
+ 19.8±0.2μs 35.1±0.3μs 1.77 bench_alphabet.AlphabetSuite.time_alphabet(500, 'Worst')
+ 146±1μs 222±6μs 1.53 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'DNA')
+ 265±0.7μs 331±5μs 1.25 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'Normal')
+ 345±0.9μs 447±4μs 1.29 bench_alphabet.AlphabetSuite.time_alphabet(5000, 'Worst')
+ 2.06±0.2ms 2.68±0.1ms 1.3 bench_alphabet.AlphabetSuite.time_alphabet(50000, 'DNA')
+ 21.3±0.3ms 24.1±0.05ms 1.13 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'DNA')
+ 51.0±1ms 57.2±1ms 1.12 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'Normal')
+ 71.7±0.6ms 80.0±0.4ms 1.11 bench_alphabet.AlphabetSuite.time_alphabet(500000, 'Worst')
+ 25.9±0.3μs 34.6±0.2μs 1.34 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 1, 1)
+ 22.9±0.03μs 32.0±0.3μs 1.4 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 1, 2)
+ 25.4±2μs 33.4±0.5μs 1.32 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 1, 3)
+ 32.6±0.2μs 40.6±0.2μs 1.25 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 1, 4)
+ 27.0±0.2μs 36.1±0.2μs 1.34 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 2, 1)
+ 24.3±1μs 34.3±0.7μs 1.41 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 2, 2)
+ 25.1±0.1μs 34.6±0.4μs 1.38 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 2, 3)
+ 34.3±0.1μs 42.7±0.4μs 1.25 bench_intervals.IntervalsSuite.time_intervals(500, 'DNA', 2, 4)
+ 28.0±0.2μs 38.2±0.2μs 1.37 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 1, 1)
+ 25.0±0.2μs 35.3±0.5μs 1.41 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 1, 2)
+ 26.8±0.2μs 37.8±0.4μs 1.41 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 1, 3)
+ 35.2±0.1μs 45.7±0.5μs 1.3 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 1, 4)
+ 29.1±0.2μs 39.3±0.3μs 1.35 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 2, 1)
+ 25.9±0.2μs 36.1±0.6μs 1.39 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 2, 2)
+ 28.1±0.3μs 38.2±0.2μs 1.36 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 2, 3)
+ 36.6±0.1μs 46.7±0.2μs 1.27 bench_intervals.IntervalsSuite.time_intervals(500, 'Normal', 2, 4)
+ 28.2±0.2μs 42.7±0.5μs 1.52 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 1, 1)
+ 25.8±0.2μs 40.7±0.3μs 1.58 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 1, 2)
+ 27.6±0.2μs 42.1±0.6μs 1.53 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 1, 3)
+ 35.0±0.2μs 47.7±0.7μs 1.36 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 1, 4)
+ 28.8±0.1μs 43.4±0.5μs 1.51 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 2, 1)
+ 26.7±0.2μs 41.6±0.7μs 1.56 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 2, 2)
+ 28.2±0.2μs 42.8±0.5μs 1.52 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 2, 3)
+ 36.2±0.1μs 49.7±0.8μs 1.37 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 2, 4)
+ 179±2μs 254±2μs 1.42 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 1, 1)
+ 170±2μs 247±5μs 1.45 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 1, 2)
+ 173±0.9μs 246±1μs 1.42 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 1, 3)
+ 199±1μs 273±7μs 1.37 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 1, 4)
+ 183±1μs 262±8μs 1.43 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 2, 1)
+ 174±2μs 251±6μs 1.44 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 2, 2)
+ 176±2μs 249±5μs 1.41 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 2, 3)
+ 203±1μs 273±4μs 1.34 bench_intervals.IntervalsSuite.time_intervals(5000, 'DNA', 2, 4)
+ 310±0.6μs 370±5μs 1.19 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 1, 1)
+ 293±2μs 350±6μs 1.19 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 1, 2)
+ 310±1μs 370±7μs 1.19 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 1, 3)
+ 340±2μs 402±6μs 1.18 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 1, 4)
+ 314±1μs 375±9μs 1.19 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 2, 1)
+ 297±0.9μs 352±6μs 1.18 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 2, 2)
+ 315±0.9μs 374±5μs 1.19 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 2, 3)
+ 343±1μs 404±8μs 1.18 bench_intervals.IntervalsSuite.time_intervals(5000, 'Normal', 2, 4)
+ 371±0.8μs 465±4μs 1.25 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 1, 1)
+ 366±2μs 469±4μs 1.28 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 1, 2)
+ 372±1μs 477±6μs 1.28 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 1, 3)
+ 388±2μs 485±5μs 1.25 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 1, 4)
+ 371±1μs 469±5μs 1.26 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 2, 1)
+ 368±2μs 470±6μs 1.28 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 2, 2)
+ 375±1μs 476±6μs 1.27 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 2, 3)
+ 391±1μs 494±40μs 1.26 bench_intervals.IntervalsSuite.time_intervals(5000, 'Worst', 2, 4)
+ 2.61±0.2ms 3.24±0.08ms 1.24 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 1, 1)
+ 2.66±0.02ms 3.01±0.04ms 1.13 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 1, 2)
+ 2.67±0.01ms 2.94±0.06ms 1.1 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 1, 3)
+ 3.04±0.06ms 3.42±0.05ms 1.13 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 1, 4)
+ 2.64±0.1ms 3.26±0.07ms 1.24 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 2, 1)
+ 2.69±0.01ms 3.00±0.06ms 1.12 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 2, 2)
+ 2.70±0.01ms 3.02±0.07ms 1.12 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 2, 3)
+ 3.09±0.06ms 3.40±0.05ms 1.1 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 2, 4)
+ 6.26±0.06ms 6.89±0.02ms 1.1 bench_intervals.IntervalsSuite.time_intervals(50000, 'Worst', 1, 2)
+ 5.88±0.04ms 6.52±0.06ms 1.11 bench_intervals.IntervalsSuite.time_intervals(50000, 'Worst', 1, 3)
+ 6.35±0.3ms 7.15±0.01ms 1.13 bench_intervals.IntervalsSuite.time_intervals(50000, 'Worst', 2, 3)
+ 10.9±0.2ms 12.1±0.09ms 1.1 bench_intervals.IntervalsSuite.time_intervals(500000, 'Best', 2, 4)
+ 27.0±0.4ms 30.0±0.6ms 1.11 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 1, 1)
+ 26.4±0.4ms 29.8±0.2ms 1.13 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 1, 2)
+ 26.4±0.4ms 29.5±0.5ms 1.12 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 1, 3)
+ 28.9±0.1ms 32.1±0.2ms 1.11 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 1, 4)
+ 26.9±0.3ms 30.1±0.3ms 1.12 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 2, 2)
+ 26.8±0.3ms 30.2±0.3ms 1.12 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 2, 3)
+ 29.5±0.3ms 33.0±0.4ms 1.12 bench_intervals.IntervalsSuite.time_intervals(500000, 'DNA', 2, 4)
+ 56.5±1ms 62.7±1ms 1.11 bench_intervals.IntervalsSuite.time_intervals(500000, 'Normal', 2, 2)
+ 74.9±0.4ms 83.1±0.3ms 1.11 bench_intervals.IntervalsSuite.time_intervals(500000, 'Worst', 1, 1)
+ 73.7±0.4ms 81.2±1ms 1.1 bench_intervals.IntervalsSuite.time_intervals(500000, 'Worst', 1, 3)
+ 76.1±0.4ms 84.5±0.2ms 1.11 bench_intervals.IntervalsSuite.time_intervals(500000, 'Worst', 2, 2)
+ 76.7±0.4ms 85.9±0.4ms 1.12 bench_intervals.IntervalsSuite.time_intervals(500000, 'Worst', 2, 3)
+ 11.9±0.04μs 13.6±0.1μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'DNA', 1, 1)
+ 13.0±0.07μs 14.8±0.2μs 1.15 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'DNA', 1, 2)
+ 12.5±0.06μs 14.4±0.1μs 1.15 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'DNA', 2, 1)
+ 13.5±0.05μs 15.1±0.08μs 1.12 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'DNA', 2, 2)
+ 11.6±0.06μs 13.2±0.2μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Normal', 1, 1)
+ 12.7±0.1μs 14.5±0.1μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Normal', 1, 2)
+ 12.1±0.07μs 13.5±0.2μs 1.12 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Normal', 2, 1)
+ 13.2±0.06μs 14.6±0.2μs 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Normal', 2, 2)
+ 11.6±0.08μs 13.0±0.2μs 1.12 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Worst', 1, 1)
+ 12.3±0.06μs 14.0±0.2μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Worst', 1, 2)
+ 12.1±0.1μs 13.5±0.1μs 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Worst', 2, 1)
+ 13.2±0.1μs 14.6±0.1μs 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(100, 'Worst', 2, 2)
+ 406±0.9μs 494±7μs 1.22 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'DNA', 1, 1)
+ 409±3μs 495±6μs 1.21 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'DNA', 1, 2)
+ 411±1μs 500±6μs 1.22 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'DNA', 2, 1)
+ 413±0.7μs 493±7μs 1.19 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'DNA', 2, 2)
+ 656±2μs 751±8μs 1.15 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Normal', 1, 1)
+ 693±2μs 789±4μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Normal', 1, 2)
+ 663±0.9μs 756±9μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Normal', 2, 1)
+ 696±2μs 794±10μs 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Normal', 2, 2)
+ 888±4μs 999±3μs 1.13 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Worst', 1, 1)
+ 895±4μs 1.02±0ms 1.13 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Worst', 1, 2)
+ 884±4μs 1.01±0ms 1.14 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Worst', 2, 1)
+ 906±2μs 1.02±0ms 1.13 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Worst', 2, 2)
+ 51.3±0.7ms 57.3±0.4ms 1.12 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'DNA', 1, 1)
+ 51.6±0.4ms 57.4±0.08ms 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'DNA', 1, 2)
+ 53.3±0.4ms 59.0±0.5ms 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'DNA', 2, 2)
+ 114±2ms 128±2ms 1.12 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'Normal', 1, 1)
+ 120±2ms 133±2ms 1.11 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'Normal', 2, 1)
+ 122±2ms 135±2ms 1.1 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(1000000, 'Normal', 2, 2)
+ 2.18±0.02μs 2.60±0.1μs 1.19 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(100, 'DNA')
+ 2.18±0μs 2.49±0.08μs 1.14 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(100, 'Normal')
+ 2.18±0.01μs 2.45±0.06μs 1.12 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(100, 'Worst')
+ 14.2±0.07μs 16.5±0.6μs 1.17 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(10000, 'Best')
+ 15.9±0.07μs 18.9±0.2μs 1.19 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(10000, 'DNA')
+ 18.8±0.1μs 22.5±1μs 1.2 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(10000, 'Normal')
+ 1.32±0.01ms 1.51±0.3ms 1.14 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(1000000, 'Best')
+ 1.52±0.04ms 1.73±0.4ms 1.14 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(1000000, 'DNA')
+ 2.63±0.01ms 3.30±0.03ms 1.25 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(1000000, 'Normal')
+ 1.98±0.08ms 2.70±0.3ms 1.36 bench_intervals_distribution.IntervalsDistributionSuite.time_intervals_distribution(1000000, 'Worst')
+ 1.28±0.01μs 1.58±0.06μs 1.23 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'Best', 2)
+ 3.13±0μs 3.63±0.09μs 1.16 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'DNA', 1)
+ 1.32±0.03μs 1.60±0.03μs 1.21 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'DNA', 2)
+ 3.17±0.01μs 3.66±0.07μs 1.15 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'Normal', 1)
+ 1.28±0.01μs 1.69±0.03μs 1.32 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'Normal', 2)
+ 1.27±0.01μs 1.62±0.02μs 1.27 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(100, 'Worst', 2)
+ 3.24±0.03μs 4.06±0.1μs 1.26 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Best', 2)
+ 15.1±0.06μs 17.2±0.2μs 1.14 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'DNA', 1)
+ 3.39±0.08μs 4.64±0.2μs 1.37 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'DNA', 2)
+ 39.3±0.08μs 43.3±1μs 1.1 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'DNA', 3)
+ 22.1±0.2μs 37.8±0.2μs 1.71 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Normal', 1)
+ 3.28±0.09μs 5.30±0.3μs 1.62 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Normal', 2)
+ 55.1±0.3μs 87.7±0.7μs 1.59 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Normal', 3)
+ 9.26±0.09μs 11.6±0.2μs 1.25 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Worst', 1)
+ 3.32±0.03μs 5.00±0.2μs 1.51 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(10000, 'Worst', 2)
+ 1.31±0.05ms 1.56±0.02ms 1.19 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Best', 1)
+ 248±30μs 374±20μs 1.51 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Best', 2)
+ 275±2μs 305±6μs 1.11 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'DNA', 2)
+ 2.88±0.02ms 3.23±0.05ms 1.12 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Normal', 1)
+ 281±2μs 335±30μs 1.19 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Normal', 2)
+ 739±10μs 889±9μs 1.2 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Worst', 1)
+ 286±3μs 400±20μs 1.4 bench_intervals_tuple.IntervalsTupleSuite.time_intervals_tuple(1000000, 'Worst', 2)
+ 75.7±1μs 84.1±2μs 1.11 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(500, 'Normal')
+ 398±3μs 453±7μs 1.14 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Normal')
+ 431±4μs 502±7μs 1.16 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(5000, 'Worst')
+ 4.77±0.02ms 5.38±0.09ms 1.13 bench_ma_alphabet.MaAlphabetSuite.time_alphabet(50000, 'Worst')
+ 29.3±1μs 32.5±1μs 1.11 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'DNA', 1, 1)
+ 27.1±0.9μs 30.0±0.6μs 1.11 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'DNA', 1, 2)
+ 28.7±1μs 31.7±0.7μs 1.11 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Worst', 1, 1)
+ 27.7±0.8μs 30.5±0.4μs 1.1 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Worst', 1, 3)
+ 27.1±1μs 31.3±0.7μs 1.15 bench_ma_intervals.MaIntervalsSuite.time_intervals(5, 'Worst', 2, 3)
+ 28.7±0.2μs 31.7±0.4μs 1.1 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Normal', 2, 2)
+ 29.5±0.4μs 33.2±1μs 1.13 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Normal', 2, 3)
+ 27.7±0.3μs 33.0±1μs 1.19 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Worst', 1, 2)
+ 29.4±0.3μs 33.6±0.4μs 1.15 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Worst', 2, 2)
+ 30.3±0.2μs 33.4±0.7μs 1.1 bench_ma_intervals.MaIntervalsSuite.time_intervals(50, 'Worst', 2, 3)
+ 34.4±0.9μs 40.5±2μs 1.18 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'DNA', 2, 3)
+ 41.8±0.4μs 52.8±1μs 1.26 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 1, 1)
+ 38.4±0.4μs 49.8±4μs 1.3 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 1, 2)
+ 39.1±0.8μs 49.0±1μs 1.25 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 1, 3)
+ 51.3±0.6μs 60.1±2μs 1.17 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 1, 4)
+ 48.4±0.6μs 59.8±2μs 1.24 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 2, 1)
+ 43.8±1μs 63.4±5μs 1.45 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 2, 2)
+ 45.1±0.7μs 58.9±3μs 1.3 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 2, 3)
+ 57.0±1μs 69.1±4μs 1.21 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Normal', 2, 4)
+ 54.2±1μs 65.0±0.7μs 1.2 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 1, 1)
+ 50.3±0.8μs 60.2±2μs 1.2 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 1, 2)
+ 52.7±2μs 62.6±1μs 1.19 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 1, 3)
+ 62.8±1μs 77.3±1μs 1.23 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 1, 4)
+ 59.8±0.9μs 84.1±7μs 1.41 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 2, 1)
+ 56.2±0.8μs 75.6±7μs 1.35 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 2, 2)
+ 58.2±1μs 73.6±5μs 1.26 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 2, 3)
+ 70.7±1μs 89.3±8μs 1.26 bench_ma_intervals.MaIntervalsSuite.time_intervals(500, 'Worst', 2, 4)
+ 272±2μs 330±2μs 1.21 bench_ma_order.MaOrderSuite.time_order(5000, 'DNA')
+ 29.4±0.07μs 37.2±0.3μs 1.27 bench_order.OrderSuite.time_order(500, 'DNA')
+ 31.7±0.2μs 40.6±0.6μs 1.28 bench_order.OrderSuite.time_order(500, 'Normal')
+ 34.3±0.2μs 47.7±0.8μs 1.39 bench_order.OrderSuite.time_order(500, 'Worst')
+ 193±2μs 269±5μs 1.39 bench_order.OrderSuite.time_order(5000, 'DNA')
+ 312±0.5μs 373±6μs 1.2 bench_order.OrderSuite.time_order(5000, 'Normal')
+ 406±1μs 502±6μs 1.24 bench_order.OrderSuite.time_order(5000, 'Worst')
+ 26.7±0.2ms 30.2±0.08ms 1.13 bench_order.OrderSuite.time_order(500000, 'DNA')
+ 82.1±0.4ms 93.0±1ms 1.13 bench_order.OrderSuite.time_order(500000, 'Worst')
+ 432±1μs 517±6μs 1.2 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(10000, 'DNA')
+ 687±0.7μs 778±3μs 1.13 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(10000, 'Normal')
+ 914±4μs 1.03±0.01ms 1.12 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(10000, 'Worst')
+ 53.9±0.4ms 59.8±0.4ms 1.11 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(1000000, 'DNA')
+ 159±0.4ms 181±1ms 1.13 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(1000000, 'Worst')

@goruha
goruha changed the base branch from main to 002-decompose-intervals-pipeline April 19, 2026 21:51
Base automatically changed from 002-decompose-intervals-pipeline to main June 25, 2026 08:20
@goruha

goruha commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

@copilot resolve the merge conflicts in this pull request

Copilot AI commented Jul 29, 2026

Copy link
Copy Markdown

@copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 80b0812. There were three add/add conflicts:

  1. CLAUDE.md — kept the 004-partials-package Active Technologies line
  2. mkdocs.yml — kept main's nav ordering (tuple_mode before intervals_chain)
  3. src/foapy/core/_intervals_tuple.py — kept main's docstring examples with the correct binding parameter (intervals_tuple(chain, foapy.binding.start, foapy.tuple_mode.normal))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants