394394# -------------------------------------
395395# Full implementations based on `add`
396396# -------------------------------------
397+ spacecheck_transform (f, tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , args... ) =
398+ spacecheck_transform (f, space (tdst), space (tsrc), args... )
399+ @noinline function spacecheck_transform (f, Vdst:: TensorMapSpace , Vsrc:: TensorMapSpace , p:: Index2Tuple )
400+ spacetype (Vdst) == spacetype (Vsrc) || throw (SectorMismatch (" incompatible sector types" ))
401+ f (Vsrc, p) == Vdst ||
402+ throw (
403+ SpaceMismatch (
404+ lazy """
405+ incompatible spaces for `$f(Vsrc, $p) -> Vdst`
406+ Vsrc = $Vsrc
407+ Vdst = $Vdst
408+ """
409+ )
410+ )
411+ return nothing
412+ end
413+ @noinline function spacecheck_transform (:: typeof (braid), Vdst:: TensorMapSpace , Vsrc:: TensorMapSpace , p:: Index2Tuple , lvls:: IndexTuple )
414+ spacetype (Vdst) == spacetype (Vsrc) || throw (SectorMismatch (" incompatible sector types" ))
415+ braid (Vsrc, p, lvls) == Vdst ||
416+ throw (
417+ SpaceMismatch (
418+ lazy """
419+ incompatible spaces for `braid(Vsrc, $p, $lvls) -> Vdst`
420+ Vsrc = $Vsrc
421+ Vdst = $Vdst
422+ """
423+ )
424+ )
425+ return nothing
426+ end
427+
428+
397429"""
398430 add_permute!(tdst::AbstractTensorMap, tsrc::AbstractTensorMap, (p₁, p₂)::Index2Tuple,
399431 α::Number, β::Number, backend::AbstractBackend...)
@@ -407,8 +439,9 @@ See also [`permute`](@ref), [`permute!`](@ref), [`add_braid!`](@ref), [`add_tran
407439 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple ,
408440 α:: Number , β:: Number , backend:: AbstractBackend...
409441 )
442+ @boundscheck spacecheck_transform (permute, tdst, tsrc, p)
410443 transformer = treepermuter (tdst, tsrc, p)
411- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
444+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
412445end
413446
414447"""
@@ -424,14 +457,12 @@ See also [`braid`](@ref), [`braid!`](@ref), [`add_permute!`](@ref), [`add_transp
424457 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple , levels:: IndexTuple ,
425458 α:: Number , β:: Number , backend:: AbstractBackend...
426459 )
427- length (levels) == numind (tsrc) ||
428- throw (ArgumentError (" incorrect levels $levels for tensor map $(codomain (tsrc)) ← $(domain (tsrc)) " ))
429-
460+ @boundscheck spacecheck_transform (braid, tdst, tsrc, p, levels)
430461 levels1 = TupleTools. getindices (levels, codomainind (tsrc))
431462 levels2 = TupleTools. getindices (levels, domainind (tsrc))
432463 # TODO : arg order for tensormaps is different than for fusiontrees
433464 transformer = treebraider (tdst, tsrc, p, (levels1, levels2))
434- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
465+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
435466end
436467
437468"""
@@ -447,19 +478,16 @@ See also [`transpose`](@ref), [`transpose!`](@ref), [`add_permute!`](@ref), [`ad
447478 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple ,
448479 α:: Number , β:: Number , backend:: AbstractBackend...
449480 )
481+ @boundscheck spacecheck_transform (transpose, tdst, tsrc, p)
450482 transformer = treetransposer (tdst, tsrc, p)
451- return add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
483+ return @inbounds add_transform! (tdst, tsrc, p, transformer, α, β, backend... )
452484end
453485
454486function add_transform! (
455487 tdst:: AbstractTensorMap , tsrc:: AbstractTensorMap , p:: Index2Tuple , transformer,
456488 α:: Number , β:: Number , backend:: AbstractBackend...
457489 )
458- @boundscheck begin
459- permute (space (tsrc), p) == space (tdst) ||
460- throw (SpaceMismatch (" source = $(codomain (tsrc)) ←$(domain (tsrc)) ,
461- dest = $(codomain (tdst)) ←$(domain (tdst)) , p₁ = $(p[1 ]) , p₂ = $(p[2 ]) " ))
462- end
490+ @boundscheck spacecheck_transform (permute, tdst, tsrc, p)
463491
464492 if p[1 ] === codomainind (tsrc) && p[2 ] === domainind (tsrc)
465493 add! (tdst, tsrc, α, β)
0 commit comments