@@ -438,7 +438,9 @@ def calc_reduced_overlap(self, other: AngularKetBase | AngularState[Any]) -> flo
438438 # - KS overlaps
439439 if any (isinstance (s , AngularKetKS ) for s in kets ):
440440 ks = next (s for s in kets if isinstance (s , AngularKetKS ))
441- return clebsch_gordan_6j (ks .s_r , ks .l_r , ks .j_c , jj .j_r , ks .k , ks .j_tot )
441+ # we have some gauge degree of freedom, which one must use to get consistent matrix elements
442+ prefactor = - 1 if (jj .j_r + jj .j_c ) % 2 == 0 else 1 # TODO not quite correct yet
443+ return prefactor * clebsch_gordan_6j (ks .s_r , ks .l_r , ks .j_c , jj .j_r , ks .k , ks .j_tot )
442444
443445 raise NotImplementedError (f"calc_reduced_overlap not implemented for { kets !r} ." )
444446
@@ -594,8 +596,12 @@ def _calc_prefactor_of_operator_in_coupled_scheme(
594596 f1 , f2 , f_tot = (self .get_qn (qn1 ), self .get_qn (qn2 ), self .get_qn (qn_combined ))
595597 i1 , i2 , i_tot = (other .get_qn (qn1 ), other .get_qn (qn2 ), other .get_qn (qn_combined ))
596598
599+ # this should already been taken care of by _kronecker_delta_non_involved_spins
600+ # TODO alternatively, remove _kronecker_delta_non_involved_spins,
601+ # and check here a descending qns from qn1 or qn2
597602 if (operator_acts_on == "first" and f2 != i2 ) or (operator_acts_on == "second" and f1 != i1 ):
598603 return 0
604+
599605 prefactor = calc_prefactor_of_operator_in_coupled_scheme (f1 , f2 , f_tot , i1 , i2 , i_tot , kappa , operator_acts_on )
600606 return prefactor * self ._calc_prefactor_of_operator_in_coupled_scheme (other , qn_combined , kappa )
601607
0 commit comments