def _interactionSeries(self):
        """
        Final Method.!!
        C_[X](n1,n2, l1,l2, (n1,n2, l1,l2)' L, L', ..., p)
        carry valid values, call delta and common constants
        """
        bmb_bra = BM_Bracket(self._n, self._l, self._N, self._L, self.bra.n1,
                             self.bra.l1, self.bra.n2, self.bra.l2, self.L_bra)
        if self.isNullValue(bmb_bra):
            return 0.0

        bmb_ket = BM_Bracket(self._n_q, self._l_q, self._N, self._L,
                             self.ket.n1, self.ket.l1, self.ket.n2,
                             self.ket.l2, self.L_ket)
        if self.isNullValue(bmb_ket):
            return 0.0

        _b_coeff = self._B_coefficient()
        _com_coeff = self._interactionConstantsForCOM_Iteration()

        # TODO: comment when not debugging
        # if self.DEBUG_MODE:
        #     self._debbugingTable(bmb_bra, bmb_ket, _com_coeff, _b_coeff)

        return _com_coeff * bmb_bra * bmb_ket * _b_coeff
    def _interactionSeries(self):

        sum_ = 0.0
        if self.DEBUG_MODE:
            XLog.write('intSer')

        for qqnn_bra in self._validCOM_Bra_qqnn():

            self._n, self._l, self._N, self._L = qqnn_bra

            bmb_bra = BM_Bracket(self._n, self._l, self._N, self._L,
                                 self.bra.n1, self.bra.l1, self.bra.n2,
                                 self.bra.l2, self.L_bra)
            if self.isNullValue(bmb_bra):
                continue

            for l_q in self._validKet_relativeAngularMomentums():
                self._l_q = l_q

                self._n_q = self._n
                self._n_q += (self.rho_ket - self.rho_bra + self._l -
                              self._l_q) // 2

                if self._n_q < 0 or not self._deltaConditionsForCOM_Iteration(
                ):
                    continue

                bmb_ket = BM_Bracket(self._n_q, self._l_q, self._N, self._L,
                                     self.ket.n1, self.ket.l1, self.ket.n2,
                                     self.ket.l2, self.L_ket)
                if self.isNullValue(bmb_ket):
                    continue

                _b_coeff = self._B_coefficient(
                    self.PARAMS_SHO.get(SHO_Parameters.b_length))
                _com_coeff = self._interactionConstantsForCOM_Iteration()

                aux = _com_coeff * bmb_bra * bmb_ket * _b_coeff
                sum_ += aux

                # TODO: comment when not debugging
                if self.DEBUG_MODE:
                    XLog.write('intSer',
                               bmbs=bmb_bra * bmb_ket,
                               B=_b_coeff,
                               comCoeff=_com_coeff,
                               aux=aux)
                #     self._debbugingTable(bmb_bra, bmb_ket, _com_coeff, _b_coeff)
        if self.DEBUG_MODE:
            XLog.write('intSer', value=sum_)
        return sum_
    def _check_InverseCompletnessConditionForBMB(self, rho):
        """ 
            Inverse 
        For all n,  l, N, L compatible with a certain rho, evaluate 
        same/different COM quantum numbers for two states and verify orthogonality
        """
        max_lambda = 6
        
        fails = []
        _fail_msg_template = "[!= {}] (lambda={}) nlNL{} nlNL_prima{}, got: [{}]"
        for lambda_ in range(max_lambda):
            for n1l1n2l2 in self._allPossibleQNforARho(rho, lambda_):
                for n1l1n2l2_prima in self._allPossibleQNforARho(rho, lambda_):
                    
                    orthogonality = []
                    for nlNL in self._allPossibleQNforARho(rho, lambda_):

                        aux = BM_Bracket(*nlNL, *n1l1n2l2, lambda_) \
                            * BM_Bracket(*nlNL, *n1l1n2l2_prima, lambda_)
                        
                        self._numberBMBs += 2
                        
                        orthogonality.append(aux)
                    
                    _angular_cond_1 = angular_condition(n1l1n2l2[1], 
                                                        n1l1n2l2[3], lambda_)
                    _angular_cond_2 = angular_condition(n1l1n2l2_prima[1], 
                                                        n1l1n2l2_prima[3], lambda_)
                    _same_qns = n1l1n2l2 == n1l1n2l2_prima
                    _result   = sum(orthogonality)
                    
                    if _angular_cond_1 and _angular_cond_2:
                        if _same_qns:
                            if abs(_result - 1)  > self.TOLERANCE:
                                fails.append(_fail_msg_template.format(
                                    1, lambda_, n1l1n2l2, n1l1n2l2_prima, _result))
                        else:
                            if abs(_result)  > self.TOLERANCE:
                                fails.append(_fail_msg_template.format(
                                    0, lambda_, n1l1n2l2, n1l1n2l2_prima, _result))
                    else:
                        if abs(_result) != 0:
                            fails.append(_fail_msg_template.format(
                                0, lambda_, n1l1n2l2, n1l1n2l2_prima, _result))
                            
        self.assertTrue(len(fails) == 0, "\n"+"\n".join(fails))
 def _checkSpecificBMBs(self, list_bmbs):
     """
     :list_bmbs = <list>( <tuple>:(qq.nn args, correct_value))
     """
     
     fails = []
     _fail_msg_template = "n1l1n2l2{} (lambda={}) nlNL{} got [{}] != [{}]"
     
     for qq_nn, correct_value in list_bmbs:
         result_ = BM_Bracket(*qq_nn)
         if abs(correct_value - result_) > self.TOLERANCE_BMB_BOOK:
             fails.append(_fail_msg_template.format(qq_nn[4:8], qq_nn[-1],  
                                                    qq_nn[:4], 
                                                    result_, correct_value))
         
     self.assertTrue(len(fails) == 0, "\n"+"\n".join(fails))
     
     self._numberBMBs = len(list_bmbs)
 def test_timeBMB_rho12(self):
     
     for _ in range(100):
         BM_Bracket(1,2,3,2, 3,0,3,0, 0)
         self._numberBMBs += 1
 def test_timeBMB_rho11(self):
     
     for _ in range(100):
         BM_Bracket(2,4,0,3, 1,3,1,4, 7)
         self._numberBMBs += 1
 def test_timeBMB_rho7(self):
     
     for _ in range(1000):
         BM_Bracket(1,1,2,0, 0,1,2,2, 1)
         self._numberBMBs += 1
 def test_timeBMB_rho6(self):
     
     for _ in range(100):
         BM_Bracket(1,1,0,3, 0,1,1,3, 2)
         self._numberBMBs += 1