@@ -5599,14 +5599,15 @@ def get_npdm(
55995599 If None, this is set to ``NPDMAlgorithmTypes.Default``. Default is None.
56005600 npdm_expr : None or str or list[str]
56015601 The operator expression for the NPDM. If None, this will be determined
5602- automatically. Multiple operator expressions are allowed in the SZ and
5603- SGF modes. Default is None.
5602+ automatically. Multiple operator expressions are allowed. Default is None.
56045603 mask : None or list[int] or list[list[int]]
56055604 The mask for setting repeated indices for the operator expression.
56065605 Default is None, meaning that all indices can be different.
5606+ Multiple values can be given when npdm_expr is a list.
56075607 index_masks : None or list[list[int]] or list[list[list[int]]]
56085608 The list of allowed site indices for each operator in the operator expression.
56095609 Default is None, meaning that all site indices are allowed.
5610+ Multiple values can be given when npdm_expr is a list.
56105611 simulated_parallel : int
56115612 Number of processors for simulating parallel algorithm serially.
56125613 Default is zero, meaning that the serial algorithm is used if
@@ -5695,19 +5696,25 @@ def get_npdm(
56955696
56965697 if SymmetryTypes .SU2 in bw .symm_type :
56975698 assert fermionic_ops is None
5698- if npdm_expr is not None and "%s" not in npdm_expr :
5699+ if npdm_expr is not None and isinstance (npdm_expr , str ) and "%s" not in npdm_expr :
5700+ op_str = [npdm_expr ]
5701+ elif npdm_expr is not None and not isinstance (npdm_expr , str ):
56995702 op_str = npdm_expr
57005703 else :
57015704 su2_coupling = "((C+%s)1+D)0" if npdm_expr is None else npdm_expr
57025705 op_str = "(C+D)0"
57035706 for _ in range (pdm_type - 1 ):
57045707 op_str = su2_coupling % op_str
5705- perm = bw .b .SpinPermScheme .initialize_su2 (
5706- int (pdm_type * 2 ), op_str , True ,
5707- mask = bw .b .VectorUInt16 () if mask is None else bw .b .VectorUInt16 (mask ),
5708- max_n_sites = ket .n_sites ,
5709- )
5710- perms = bw .b .VectorSpinPermScheme ([perm ])
5708+ op_str = [op_str ]
5709+ perms = bw .b .VectorSpinPermScheme ([
5710+ bw .b .SpinPermScheme .initialize_su2 (
5711+ int (pdm_type * 2 ), cd , True ,
5712+ mask = bw .b .VectorUInt16 () if mask is None else (
5713+ bw .b .VectorUInt16 (mask [ixm ])
5714+ if len (mask ) != 0 and not isinstance (mask [0 ], int )
5715+ else bw .b .VectorUInt16 (mask )),
5716+ max_n_sites = ket .n_sites ) for ixm , cd in enumerate (op_str )
5717+ ])
57115718 elif SymmetryTypes .SZ in bw .symm_type :
57125719 if npdm_expr is not None and isinstance (npdm_expr , str ):
57135720 op_str = [npdm_expr ]
@@ -5886,9 +5893,9 @@ def get_npdm(
58865893 scheme = bw .b .NPDMScheme (perms )
58875894 opdq = (mbra .info .target - mket .info .target )[0 ]
58885895 if SymmetryTypes .SU2 in bw .symm_type :
5889- opdq . twos = opdq . twos_low = bw .b .SpinPermRecoupling .get_target_twos (
5890- op_str
5891- )
5896+ twoss = [ bw .b .SpinPermRecoupling .get_target_twos (x ) for x in op_str ]
5897+ assert min ( twoss ) == max ( twoss )
5898+ opdq . twos = opdq . twos_low = twoss [ 0 ]
58925899 if iprint >= 4 :
58935900 print ("NPDM dq =" , opdq )
58945901 print (scheme .to_str ())
@@ -6032,14 +6039,13 @@ def get_npdm(
60326039 if self .mpi is not None :
60336040 self .mpi .barrier ()
60346041
6035- if SymmetryTypes .SU2 in bw .symm_type :
6036- assert len (npdms ) == 1
6037- npdms = npdms [0 ]
6038- elif SymmetryTypes .SGF in bw .symm_type and (
6039- npdm_expr is None or isinstance (npdm_expr , str )
6040- ):
6041- assert len (npdms ) == 1
6042- npdms = npdms [0 ]
6042+ if npdm_expr is None or isinstance (npdm_expr , str ):
6043+ if SymmetryTypes .SU2 in bw .symm_type :
6044+ assert len (npdms ) == 1
6045+ npdms = npdms [0 ]
6046+ elif SymmetryTypes .SGF in bw .symm_type :
6047+ assert len (npdms ) == 1
6048+ npdms = npdms [0 ]
60436049
60446050 return npdms
60456051
0 commit comments