Skip to content

Commit 0a3a61b

Browse files
committed
allow multiple npdm_expr in su2 mode
1 parent 71ba0e9 commit 0a3a61b

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

pyblock2/driver/core.py

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)