@@ -175,8 +175,8 @@ the permutation `(p₁..., reverse(p₂)...)` should constitute a cyclic permuta
175175
176176See [`transpose`](@ref) for creating a new tensor and [`add_transpose!`](@ref) for a more general version.
177177"""
178- function LinearAlgebra. transpose! (
179- tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , (p₁, p₂):: Index2Tuple = _transpose_indices (t )
178+ @propagate_inbounds function LinearAlgebra. transpose! (
179+ tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , (p₁, p₂):: Index2Tuple = _transpose_indices (tsrc )
180180 )
181181 return add_transpose! (tdst, tsrc, (p₁, p₂), One (), Zero ())
182182end
@@ -229,7 +229,7 @@ case of a transposition that only changes the number of in- and outgoing indices
229229
230230See [`repartition`](@ref) for creating a new tensor.
231231"""
232- function repartition! (tdst:: AbstractTensorMap{S} , tsrc:: AbstractTensorMap{S} ) where {S}
232+ @propagate_inbounds function repartition! (tdst:: AbstractTensorMap{S} , tsrc:: AbstractTensorMap{S} ) where {S}
233233 numind (tsrc) == numind (tdst) ||
234234 throw (ArgumentError (" tsrc and tdst should have an equal amount of indices" ))
235235 all_inds = (codomainind (tsrc)... , reverse (domainind (tsrc))... )
410410# -------------------------------------
411411# Full implementations based on `add`
412412# -------------------------------------
413+ spacecheck_transform (f, tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , args... ) =
414+ spacecheck_transform (f, space (tdst), space (tsrc), args... )
415+ @noinline function spacecheck_transform (f, Vdst:: TensorMapSpace , Vsrc:: TensorMapSpace , p:: Index2Tuple )
416+ spacetype (Vdst) == spacetype (Vsrc) || throw (SectorMismatch (" incompatible sector types" ))
417+ f (Vsrc, p) == Vdst ||
418+ throw (
419+ SpaceMismatch (
420+ lazy """
421+ incompatible spaces for `$f(Vsrc, $p) -> Vdst`
422+ Vsrc = $Vsrc
423+ Vdst = $Vdst
424+ """
425+ )
426+ )
427+ return nothing
428+ end
429+ @noinline function spacecheck_transform (:: typeof (braid), Vdst:: TensorMapSpace , Vsrc:: TensorMapSpace , p:: Index2Tuple , levels:: IndexTuple )
430+ spacetype (Vdst) == spacetype (Vsrc) || throw (SectorMismatch (" incompatible sector types" ))
431+ braid (Vsrc, p, levels) == Vdst ||
432+ throw (
433+ SpaceMismatch (
434+ lazy """
435+ incompatible spaces for `braid(Vsrc, $p, $levels) -> Vdst`
436+ Vsrc = $Vsrc
437+ Vdst = $Vdst
438+ """
439+ )
440+ )
441+ return nothing
442+ end
443+
444+
413445"""
414446 add_permute!(tdst::AbstractTensorMap, tsrc::AbstractTensorMap, (p₁, p₂)::Index2Tuple,
415447 α::Number, β::Number, backend::AbstractBackend...)
@@ -423,8 +455,9 @@ See also [`permute`](@ref), [`permute!`](@ref), [`add_braid!`](@ref), [`add_tran
423455 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple ,
424456 α:: Number , β:: Number , backend:: AbstractBackend...
425457 )
458+ @boundscheck spacecheck_transform (permute, tdst, tsrc, p)
426459 transformer = treepermuter (tdst, tsrc, p)
427- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
460+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
428461end
429462
430463"""
@@ -440,14 +473,12 @@ See also [`braid`](@ref), [`braid!`](@ref), [`add_permute!`](@ref), [`add_transp
440473 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple , levels:: IndexTuple ,
441474 α:: Number , β:: Number , backend:: AbstractBackend...
442475 )
443- length (levels) == numind (tsrc) ||
444- throw (ArgumentError (" incorrect levels $levels for tensor map $(codomain (tsrc)) ← $(domain (tsrc)) " ))
445-
476+ @boundscheck spacecheck_transform (braid, tdst, tsrc, p, levels)
446477 levels1 = TupleTools. getindices (levels, codomainind (tsrc))
447478 levels2 = TupleTools. getindices (levels, domainind (tsrc))
448479 # TODO : arg order for tensormaps is different than for fusiontrees
449480 transformer = treebraider (tdst, tsrc, p, (levels1, levels2))
450- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
481+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
451482end
452483
453484"""
@@ -463,19 +494,16 @@ See also [`transpose`](@ref), [`transpose!`](@ref), [`add_permute!`](@ref), [`ad
463494 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple ,
464495 α:: Number , β:: Number , backend:: AbstractBackend...
465496 )
497+ @boundscheck spacecheck_transform (transpose, tdst, tsrc, p)
466498 transformer = treetransposer (tdst, tsrc, p)
467- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
499+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
468500end
469501
470- function add_transform! (
502+ @propagate_inbounds function add_transform! (
471503 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple , transformer,
472504 α:: Number , β:: Number , backend:: AbstractBackend...
473505 )
474- @boundscheck begin
475- permute (space (tsrc), p) == space (tdst) ||
476- throw (SpaceMismatch (" source = $(codomain (tsrc)) ←$(domain (tsrc)) ,
477- dest = $(codomain (tdst)) ←$(domain (tdst)) , p₁ = $(p[1 ]) , p₂ = $(p[2 ]) " ))
478- end
506+ @boundscheck spacecheck_transform (permute, tdst, tsrc, p)
479507
480508 if p[1 ] === codomainind (tsrc) && p[2 ] === domainind (tsrc)
481509 add! (tdst, tsrc, α, β)
0 commit comments