@@ -90,6 +90,35 @@ function TO.tensortrace!(
9090end
9191
9292# tensorcontract!
93+ function spacecheck_contract (
94+ C:: AbstractTensorMap ,
95+ A:: AbstractTensorMap , pA:: Index2Tuple , conjA:: Bool ,
96+ B:: AbstractTensorMap , pB:: Index2Tuple , conjB:: Bool ,
97+ pAB:: Index2Tuple
98+ )
99+ return spacecheck_contract (space (C), space (A), pA, conjA, space (B), pB, conjB, pAB)
100+ end
101+ @noinline function spacecheck_contract (
102+ VC:: TensorMapSpace ,
103+ VA:: TensorMapSpace , pA:: Index2Tuple , conjA:: Bool ,
104+ VB:: TensorMapSpace , pB:: Index2Tuple , conjB:: Bool ,
105+ pAB:: Index2Tuple
106+ )
107+ spacetype (VC) == spacetype (VA) == spacetype (VB) || throw (SectorMismatch (" incompatible sector types" ))
108+ TO. tensorcontract (VA, pA, conjA, VB, pB, conjB, pAB) == VC ||
109+ throw (
110+ SpaceMismatch (
111+ lazy """
112+ incompatible spaces for `tensorcontract(VA, $pA, $conjA, VB, $pB, $conjB, $pAB) -> VC`
113+ VA = $VA
114+ VB = $VB
115+ VC = $VC
116+ """
117+ )
118+ )
119+ return nothing
120+ end
121+
93122function TO. tensorcontract! (
94123 C:: AbstractTensorMap ,
95124 A:: AbstractTensorMap , pA:: Index2Tuple , conjA:: Bool ,
@@ -98,6 +127,7 @@ function TO.tensorcontract!(
98127 backend, allocator
99128 )
100129 pAB′ = _canonicalize (pAB, C)
130+ @boundscheck spacecheck_contract (C, A, pA, conjA, B, pB, conjB, pAB′)
101131 if conjA && conjB
102132 A′ = A'
103133 pA′ = adjointtensorindices (A, pA)
0 commit comments