Skip to content

Unwrap PermutedDimsArray sources in bipermutedimsopadd!#178

Merged
mtfishman merged 2 commits into
mainfrom
mf/permuteddims-unwrap
Jun 17, 2026
Merged

Unwrap PermutedDimsArray sources in bipermutedimsopadd!#178
mtfishman merged 2 commits into
mainfrom
mf/permuteddims-unwrap

Conversation

@mtfishman

@mtfishman mtfishman commented Jun 17, 2026

Copy link
Copy Markdown
Member

Summary

Adds a bipermutedimsopadd! method for PermutedDimsArray sources that rewrites each entry of the bipartitioned permutation through the wrapper's own permutation and recurses on parent(src). The underlying array then dispatches its own bipermutedimsopadd!, so a graded or block-sparse backend reached through a PermutedDimsArray wrapper hits its block-wise overload rather than the generic body falling through on the wrapper and re-entering broadcasting. This is what lets a permuted source produced by NamedDimsArrays broadcast alignment lower to the backend primitive.

Adds a bipermutedimsopadd! method for PermutedDimsArray sources that
rewrites each entry of the bipartitioned permutation through the
wrapper's own permutation and recurses on parent(src), so the
underlying array dispatches its own bipermutedimsopadd! rather than
the generic body falling through on the wrapper.

Also adds permuteddims(a, perm), defaulting to PermutedDimsArray and
overloadable downstream, replacing the FunctionImplementations.permuteddims
used internally.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 81.07%. Comparing base (71b8d7c) to head (da0f4a6).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #178      +/-   ##
==========================================
+ Coverage   80.97%   81.07%   +0.09%     
==========================================
  Files          26       26              
  Lines        1041     1046       +5     
==========================================
+ Hits          843      848       +5     
  Misses        198      198              
Flag Coverage Δ
docs 26.23% <0.00%> (-0.14%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

permuteddims is a FunctionImplementations verb that backends overload to
supply a more efficient lazy permute (KroneckerArrays permutes each
Kronecker factor and recombines). Owning it in TensorAlgebra and calling
that owned version in the bipermutedimsopadd! body bypassed those
overloads, so a KroneckerArray reached the generic body wrapped in a plain
PermutedDimsArray instead of its native permute. Import it from
FunctionImplementations again so the body respects the overloads. The
PermutedDimsArray unwrap method is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mtfishman mtfishman merged commit 83979cf into main Jun 17, 2026
26 checks passed
@mtfishman mtfishman deleted the mf/permuteddims-unwrap branch June 17, 2026 22:33
mtfishman added a commit to ITensor/NamedDimsArrays.jl that referenced this pull request Jun 17, 2026
## Summary

Routes linear broadcasting of `AbstractNamedDimsArray`s through
TensorAlgebra's `bipermutedimsopadd!`. `copyto!` and `copy` now run the
denamed broadcast through `tryflattenlinear`, and the linear case lowers
to `permutedimsopadd!` on the name-aligned operands, where each
operand's `PermutedDimsArray` alignment is unwrapped down to the
backend's own `bipermutedimsopadd!` (the unwrap added in
ITensor/TensorAlgebra.jl#178). Nonlinear
broadcasts fall back to the existing denamed Base broadcast. For a
graded or block-sparse backing, a permuted broadcast now reaches the
block-wise primitive and the result keeps its backend type rather than
densifying.

Out-of-place results allocate from a bare operand prototype with the
broadcast result axes, since `similar` of a permuted wrapper drops the
backend.

Drops the `FunctionImplementations` dependency: `aligneddims` now gets
its lazy permute through `TensorAlgebra.permuteddims`, and the now-dead
`ImplementationStyle` trait that routed it is removed.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
mtfishman added a commit to ITensor/GradedArrays.jl that referenced this pull request Jun 17, 2026
…h bipermutedimsopadd! (#177)

## Summary

Removes the eager `FunctionImplementations.permuteddims` overloads on
`AbstractGradedArray`, `AbstractSectorArray`, and `AbstractSectorDelta`.
These existed only to align graded operands during `NamedDimsArrays`
broadcasting by materializing a permuted copy. `NamedDimsArrays` now
aligns lazily and lowers linear broadcasts through `bipermutedimsopadd!`
(ITensor/TensorAlgebra.jl#178,
ITensor/NamedDimsArrays.jl#232), so a permuted
graded operand reaches the block-wise `bipermutedimsopadd!` without the
eager copy.

Bumps the `TensorAlgebra` and `NamedDimsArrays` compat floors to the
versions that introduce that path.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant