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 , lvls:: IndexTuple )
430+ spacetype (Vdst) == spacetype (Vsrc) || throw (SectorMismatch (" incompatible sector types" ))
431+ braid (Vsrc, p, lvls) == Vdst ||
432+ throw (
433+ SpaceMismatch (
434+ lazy """
435+ incompatible spaces for `braid(Vsrc, $p, $lvls) -> 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
470502function 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