Skip to content

Add axis support to alphabet and order - #112

Open
goruha wants to merge 16 commits into
mainfrom
goruha/openspec-explore-v1
Open

goruha wants to merge 16 commits into
mainfrom
goruha/openspec-explore-v1

Conversation

@goruha

@goruha goruha commented Sep 8, 2026

Copy link
Copy Markdown
Member

Summary

  • add stable slice-as-element factorization along an explicit axis for core alphabet and order
  • keep order one-dimensional while preserving alphabet rank and axis placement for numpy.take reconstruction
  • extend partials alphabet and order with whole-slice gap handling and mixed-mask validation
  • add multidimensional tests, documentation, ASV benchmarks, and the completed OpenSpec change
  • include the earlier archive of the completed refactor-congeneric-characteristics OpenSpec change

Verification

  • 510 pytest tests passed
  • Black, isort, and flake8 passed
  • MkDocs build succeeded
  • ASV benchmark validation and smoke tests passed
  • OpenSpec strict validation passed

@coveralls

coveralls commented Sep 8, 2026 •

Copy link
Copy Markdown

Coverage Report for CI Build 34821860873

Coverage increased (+0.8%) to 96.748%

Details

  • Coverage increased (+0.8%) from the base build.
  • Patch coverage: 6 uncovered changes across 4 files (424 of 430 lines covered, 98.6%).
  • No coverage regressions found.

Uncovered Changes

File Changed Covered %
src/foapy/core/_factorize.py 101 98 97.03%
src/foapy/core/_axis_transform.py 41 40 97.56%
src/foapy/core/_intervals_chain_validation.py 19 18 94.74%
src/foapy/core/_intervals_distribution.py 35 34 97.14%
Total (13 files) 430 424 98.6%

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines: 984
Covered Lines: 952
Line Coverage: 96.75%
Coverage Strength: 2.9 hits per line

💛 - Coveralls

@github-actions

github-actions Bot commented Sep 8, 2026 •

Copy link
Copy Markdown
Change Before [ee4b10a] After [12a24c5] Ratio Benchmark (Parameter)
- 15.7±0.6μs 13.7±0.2μs 0.87 bench_congenerics_order.CongenericsOrderSuite.time_order(10000, 'DNA')
- 48.0±0.6μs 34.9±0.8μs 0.73 bench_congenerics_sequences.CongenericsSequencesSuite.time_sequences(100, 'Best')
- 66.5±3μs 46.0±1μs 0.69 bench_congenerics_sequences.CongenericsSequencesSuite.time_sequences(1000, 'Best')
- 198±4μs 155±8μs 0.79 bench_congenerics_sequences.CongenericsSequencesSuite.time_sequences(1000, 'Normal')
- 510±8μs 458±6μs 0.9 bench_congenerics_sequences.CongenericsSequencesSuite.time_sequences(1000, 'Worst')
- 226±2μs 136±2μs 0.6 bench_congenerics_sequences.CongenericsSequencesSuite.time_sequences(10000, 'Best')
- 38.2±0.7μs 33.2±0.3μs 0.87 bench_intervals.IntervalsSuite.time_intervals(500, 'Worst', 1, 2)
- 2.80±0.04ms 2.49±0.04ms 0.89 bench_intervals.IntervalsSuite.time_intervals(50000, 'DNA', 2, 1)
- 97.7±30μs 70.5±0.6μs 0.72 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Best', 2, 1)
- 106±30μs 70.4±0.4μs 0.67 bench_intervals_chain.IntervalsChainSuite.time_intervals_chain(10000, 'Best', 2, 2)
- 62.8M 51.8M 0.82 bench_order.OrderSuite.peakmem_order(500000, 'Best')
- 66.3M 58.2M 0.88 bench_order.OrderSuite.peakmem_order(500000, 'Normal')
- 73.3M 66.3M 0.9 bench_order.OrderSuite.peakmem_order(500000, 'Worst')
- 11.8±0.2μs 3.93±0.09μs 0.33 bench_order.OrderSuite.time_order(5, 'Best')
- 12.9±0.1μs 11.4±0.2μs 0.89 bench_order.OrderSuite.time_order(5, 'DNA')
- 12.5±0.4μs 4.17±0.2μs 0.33 bench_order.OrderSuite.time_order(5, 'Normal')
- 12.5±0.2μs 4.00±0.1μs 0.32 bench_order.OrderSuite.time_order(50, 'Best')
- 15.1±0.5μs 12.7±0.5μs 0.85 bench_order.OrderSuite.time_order(50, 'Normal')
- 14.6±0.7μs 12.5±0.2μs 0.86 bench_order.OrderSuite.time_order(50, 'Worst')
- 17.8±0.3μs 5.48±0.06μs 0.31 bench_order.OrderSuite.time_order(500, 'Best')
- 40.7±2μs 24.0±0.8μs 0.59 bench_order.OrderSuite.time_order(500, 'Normal')
- 44.2±1μs 23.4±0.4μs 0.53 bench_order.OrderSuite.time_order(500, 'Worst')
- 65.1±0.4μs 19.7±0.3μs 0.3 bench_order.OrderSuite.time_order(5000, 'Best')
- 401±4μs 141±3μs 0.35 bench_order.OrderSuite.time_order(5000, 'Normal')
- 408±10μs 145±2μs 0.35 bench_order.OrderSuite.time_order(5000, 'Worst')
- 1.13±0.03ms 296±40μs 0.26 bench_order.OrderSuite.time_order(50000, 'Best')
- 5.26±0.1ms 1.67±0.05ms 0.32 bench_order.OrderSuite.time_order(50000, 'Normal')
- 6.30±0.03ms 2.19±0.03ms 0.35 bench_order.OrderSuite.time_order(50000, 'Worst')
- 10.6±0.3ms 2.95±0.3ms 0.28 bench_order.OrderSuite.time_order(500000, 'Best')
- 29.8±0.1ms 26.7±0.5ms 0.9 bench_order.OrderSuite.time_order(500000, 'DNA')
- 70.7±0.4ms 22.7±0.3ms 0.32 bench_order.OrderSuite.time_order(500000, 'Normal')
- 84.8±1ms 31.6±0.2ms 0.37 bench_order.OrderSuite.time_order(500000, 'Worst')
- 104M 79.8M 0.77 bench_partials_intervals_chain.PartialsIntervalsChainSuite.peakmem_intervals_chain(1000000, 'Dense', 1, 1)
- 104M 79.9M 0.77 bench_partials_intervals_chain.PartialsIntervalsChainSuite.peakmem_intervals_chain(1000000, 'Dense', 1, 2)
- 112M 79.7M 0.71 bench_partials_intervals_chain.PartialsIntervalsChainSuite.peakmem_intervals_chain(1000000, 'Dense', 2, 1)
- 112M 79.8M 0.71 bench_partials_intervals_chain.PartialsIntervalsChainSuite.peakmem_intervals_chain(1000000, 'Dense', 2, 2)
- 24.0±0.2μs 13.8±0.3μs 0.58 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(100, 'Dense', 1, 1)
- 24.7±1μs 14.7±0.2μs 0.59 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(100, 'Dense', 1, 2)
- 26.0±0.3μs 15.1±0.4μs 0.58 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(100, 'Dense', 2, 1)
- 27.3±0.7μs 15.5±0.4μs 0.57 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(100, 'Dense', 2, 2)
- 123±3μs 73.6±1μs 0.6 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(10000, 'Dense', 1, 1)
- 124±3μs 76.5±2μs 0.62 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(10000, 'Dense', 1, 2)
- 275±9μs 80.6±0.2μs 0.29 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(10000, 'Dense', 2, 1)
- 293±7μs 82.4±0.9μs 0.28 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(10000, 'Dense', 2, 2)
- 21.8±0.8ms 12.2±0.8ms 0.56 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(1000000, 'Dense', 1, 1)
- 22.2±0.8ms 13.4±0.4ms 0.6 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(1000000, 'Dense', 1, 2)
- 26.8±1ms 14.7±1ms 0.55 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(1000000, 'Dense', 2, 1)
- 27.5±2ms 16.2±1ms 0.59 bench_partials_intervals_chain.PartialsIntervalsChainSuite.time_intervals_chain(1000000, 'Dense', 2, 2)
- 64.3M 51.7M 0.8 bench_partials_order.PartialsOrderSuite.peakmem_order(500000, 'Unmasked')
- 34.2±0.4μs 22.7±0.7μs 0.66 bench_partials_order.PartialsOrderSuite.time_order(5, 'PartialNormal')
- 28.5±1μs 18.2±0.3μs 0.64 bench_partials_order.PartialsOrderSuite.time_order(5, 'Unmasked')
- 29.2±0.9μs 17.6±0.6μs 0.6 bench_partials_order.PartialsOrderSuite.time_order(50, 'Unmasked')
- 56.1±3μs 42.8±1μs 0.76 bench_partials_order.PartialsOrderSuite.time_order(500, 'PartialNormal')
- 35.1±1μs 20.6±0.4μs 0.59 bench_partials_order.PartialsOrderSuite.time_order(500, 'Unmasked')
- 268±7μs 132±3μs 0.49 bench_partials_order.PartialsOrderSuite.time_order(5000, 'PartialNormal')
- 89.8±0.7μs 40.0±0.5μs 0.44 bench_partials_order.PartialsOrderSuite.time_order(5000, 'Unmasked')
- 2.92±0.1ms 1.13±0.06ms 0.39 bench_partials_order.PartialsOrderSuite.time_order(50000, 'PartialNormal')
- 1.26±0.02ms 442±40μs 0.35 bench_partials_order.PartialsOrderSuite.time_order(50000, 'Unmasked')
- 39.4±2ms 14.1±1ms 0.36 bench_partials_order.PartialsOrderSuite.time_order(500000, 'PartialNormal')
- 11.5±1ms 3.88±0.1ms 0.34 bench_partials_order.PartialsOrderSuite.time_order(500000, 'Unmasked')
- 163±1μs 108±2μs 0.66 bench_pipeline_full.PipelineFullSuite.time_pipeline_full(10000, 'Best')

This branch has not been deployed

No deployments
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.

2 participants