@@ -12,39 +12,28 @@ function tensor_product(
1212 return foldl (tensor_product, (a1, a2, a3, a_rest... ))
1313end
1414
15- function tensor_product (:: AbstractUnitRange , :: AbstractUnitRange )
16- return error (" Not implemented yet." )
15+ flip_dual (r:: AbstractUnitRange ) = r
16+ flip_dual (r:: GradedUnitRangeDual ) = flip (r)
17+ function tensor_product (a1:: AbstractUnitRange , a2:: AbstractUnitRange )
18+ return tensor_product (flip_dual (a1), flip_dual (a2))
1719end
1820
1921function tensor_product (a1:: Base.OneTo , a2:: Base.OneTo )
2022 return Base. OneTo (length (a1) * length (a2))
2123end
2224
23- function tensor_product (:: OneToOne , a2:: AbstractBlockedUnitRange )
25+ function tensor_product (:: OneToOne , a2:: AbstractUnitRange )
2426 return a2
2527end
2628
27- function tensor_product (a1:: AbstractBlockedUnitRange , :: OneToOne )
29+ function tensor_product (a1:: AbstractUnitRange , :: OneToOne )
2830 return a1
2931end
3032
3133function tensor_product (:: OneToOne , :: OneToOne )
3234 return OneToOne ()
3335end
3436
35- # Handle dual. Always return a non-dual GradedUnitRange.
36- function tensor_product (a1:: AbstractBlockedUnitRange , a2:: GradedUnitRangeDual )
37- return tensor_product (a1, flip (a2))
38- end
39-
40- function tensor_product (a1:: GradedUnitRangeDual , a2:: AbstractBlockedUnitRange )
41- return tensor_product (flip (a1), a2)
42- end
43-
44- function tensor_product (a1:: GradedUnitRangeDual , a2:: GradedUnitRangeDual )
45- return tensor_product (flip (a1), flip (a2))
46- end
47-
4837function fuse_labels (x, y)
4938 return error (
5039 " `fuse_labels` not implemented for object of type `$(typeof (x)) ` and `$(typeof (y)) `."
9887# Used by `TensorAlgebra.splitdims` in `BlockSparseArraysGradedAxesExt`.
9988# Get the permutation for sorting, then group by common elements.
10089# groupsortperm([2, 1, 2, 3]) == [[2], [1, 3], [4]]
101- function blockmergesortperm (a:: AbstractBlockedUnitRange )
90+ blockmergesort (g:: AbstractUnitRange ) = g
91+ function blockmergesortperm (a:: AbstractUnitRange )
10292 return Block .(groupsortperm (blocklabels (a)))
10393end
10494
@@ -120,7 +110,6 @@ function blockmergesort(g::AbstractGradedUnitRange)
120110end
121111
122112blockmergesort (g:: GradedUnitRangeDual ) = dual (blockmergesort (flip (g)))
123- blockmergesort (g:: OneToOne ) = g
124113
125114# fusion_product produces a sorted, non-dual GradedUnitRange
126115function fusion_product (g1, g2)
0 commit comments