Skip to content

Commit

Permalink
sany: without pg
Browse files Browse the repository at this point in the history
  • Loading branch information
hczhai committed Aug 7, 2024
1 parent 93cef00 commit 0e7b312
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 56 deletions.
32 changes: 31 additions & 1 deletion pyblock2/driver/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -878,7 +878,37 @@ def initialize_system(
self.n_elec = n_elec

if target is None and bw.qargs is not None:
if bw.qargs == ("U1Fermi", "AbelianPG"):
if bw.qargs == ("U1Fermi", ):
self.vacuum = bw.SX(0)
self.target = bw.SX(n_elec)
self.left_vacuum = self.vacuum if left_vacuum is None else left_vacuum
elif bw.qargs == ("U1Fermi", "U1"):
self.vacuum = bw.SX(0, 0)
if left_vacuum is None:
self.target = bw.SX(n_elec, spin)
self.left_vacuum = (
self.vacuum if left_vacuum is None else left_vacuum
)
else:
self.target = bw.SX(
n_elec + left_vacuum.n, spin - left_vacuum.twos
)
self.left_vacuum = left_vacuum
elif bw.qargs == ("U1Fermi", "SU2", "SU2"):
self.vacuum = bw.SX(0, 0, 0)
if singlet_embedding and left_vacuum is None:
self.target = bw.SX(n_elec + spin % 2, 0, 0)
self.left_vacuum = bw.SX(spin % 2, spin, spin)
elif singlet_embedding and left_vacuum is not None:
assert spin == left_vacuum.twos
self.target = bw.SX(n_elec + left_vacuum.n, 0, 0)
self.left_vacuum = left_vacuum
else:
self.target = bw.SX(n_elec, spin, spin)
self.left_vacuum = (
self.vacuum if left_vacuum is None else left_vacuum
)
elif bw.qargs == ("U1Fermi", "AbelianPG"):
self.vacuum = bw.SX(0, 0)
self.target = bw.SX(n_elec, pg_irrep)
self.left_vacuum = self.vacuum if left_vacuum is None else left_vacuum
Expand Down
126 changes: 71 additions & 55 deletions src/core/state_info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,63 +640,79 @@ struct TransStateInfo<S, S, typename S::is_sany_t, typename S::is_sany_t> {
for (int i = 0; i < si->n; i++) {
S q = si->quanta[i];
S z = ref;
if (q.symm_len() == 4 && q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::SU2 &&
q.types[2] == SAnySymmTypes::SU2 &&
q.types[3] == SAnySymmTypes::AbelianPG) {
if (ref.symm_len() == 3 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1 &&
ref.types[2] == SAnySymmTypes::AbelianPG) {
assert(q.values[1] == q.values[2]);
z.values[0] = q.values[0];
z.values[2] = q.values[3];
for (int j = -q.values[2]; j <= q.values[2]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
}
} else
throw runtime_error("TransStateInfo::forward: Unsupported "
"target symm type: " +
Parsing::to_string(q) + " -> " +
Parsing::to_string(ref));
} else if (q.symm_len() == 3 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::U1 &&
q.types[2] == SAnySymmTypes::AbelianPG) {
if (ref.symm_len() == 2 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::AbelianPG) {
z.values[0] = q.values[0];
z.values[1] = q.values[2];
if ((q.symm_len() == 3 && q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::SU2 &&
q.types[2] == SAnySymmTypes::SU2) &&
(ref.symm_len() == 2 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1)) {
assert(q.values[1] == q.values[2]);
z.values[0] = q.values[0];
for (int j = -q.values[2]; j <= q.values[2]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
} else
throw runtime_error("TransStateInfo::forward: Unsupported "
"target symm type: " +
Parsing::to_string(q) + " -> " +
Parsing::to_string(ref));
} else if (q.symm_len() == 2 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::AbelianPG) {
if (ref.symm_len() == 3 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1 &&
ref.types[2] == SAnySymmTypes::AbelianPG) {
z.values[0] = q.values[0];
z.values[2] = q.values[1];
for (int j = -q.values[0]; j <= q.values[0]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
}
} else
throw runtime_error("TransStateInfo::forward: Unsupported "
"target symm type: " +
Parsing::to_string(q) + " -> " +
Parsing::to_string(ref));
}
} else if ((q.symm_len() == 2 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::U1) &&
((ref.symm_len() == 1 &&
ref.types[0] == SAnySymmTypes::U1Fermi))) {
z.values[0] = q.values[0];
mp[z] += si->n_states[i];
} else if ((q.symm_len() == 1 &&
q.types[0] == SAnySymmTypes::U1Fermi) &&
(ref.symm_len() == 2 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1)) {
z.values[0] = q.values[0];
for (int j = -q.values[0]; j <= q.values[0]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
}
} else if ((q.symm_len() == 4 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::SU2 &&
q.types[2] == SAnySymmTypes::SU2 &&
q.types[3] == SAnySymmTypes::AbelianPG) &&
(ref.symm_len() == 3 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1 &&
ref.types[2] == SAnySymmTypes::AbelianPG)) {
assert(q.values[1] == q.values[2]);
z.values[0] = q.values[0];
z.values[2] = q.values[3];
for (int j = -q.values[2]; j <= q.values[2]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
}
} else if ((q.symm_len() == 3 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::U1 &&
q.types[2] == SAnySymmTypes::AbelianPG) &&
((ref.symm_len() == 2 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::AbelianPG))) {
z.values[0] = q.values[0];
z.values[1] = q.values[2];
mp[z] += si->n_states[i];
} else if ((q.symm_len() == 2 &&
q.types[0] == SAnySymmTypes::U1Fermi &&
q.types[1] == SAnySymmTypes::AbelianPG) &&
(ref.symm_len() == 3 &&
ref.types[0] == SAnySymmTypes::U1Fermi &&
ref.types[1] == SAnySymmTypes::U1 &&
ref.types[2] == SAnySymmTypes::AbelianPG)) {
z.values[0] = q.values[0];
z.values[2] = q.values[1];
for (int j = -q.values[0]; j <= q.values[0]; j += 2) {
z.values[1] = j;
mp[z] += si->n_states[i];
}
} else
throw runtime_error(
"TransStateInfo::forward: Unsupported source symm type: " +
Parsing::to_string(q));
throw runtime_error("TransStateInfo::forward: Unsupported "
"source -> target symm type: " +
Parsing::to_string(q) + " -> " +
Parsing::to_string(ref));
}
shared_ptr<StateInfo<S>> so = make_shared<StateInfo<S>>();
so->allocate((int)mp.size());
Expand Down

0 comments on commit 0e7b312

Please sign in to comment.