Skip to content

Commit 6de3144

Browse files
Strilancbabbush
authored andcommitted
Cleanup a few methods that aggregate FermionOperators (#40)
* Add annihilate_create factory method to FermionOperator * Drop annihilate_create
1 parent b35aa99 commit 6de3144

File tree

3 files changed

+54
-60
lines changed

3 files changed

+54
-60
lines changed

src/fermilib/ops/_fermion_operator_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def test_add(self):
427427
def test_add_bad_addend(self):
428428
op = FermionOperator((), 1.0)
429429
with self.assertRaises(TypeError):
430-
op = op + "0.5"
430+
_ = op + "0.5"
431431

432432
def test_sub(self):
433433
term_a = ((1, 1), (3, 1), (8, 1))
@@ -446,7 +446,7 @@ def test_sub(self):
446446
def test_sub_bad_subtrahend(self):
447447
op = FermionOperator((), 1.0)
448448
with self.assertRaises(TypeError):
449-
op = op - "0.5"
449+
_ = op - "0.5"
450450

451451
def test_isub_different_term(self):
452452
term_a = ((1, 1), (3, 1), (8, 0))
@@ -468,7 +468,7 @@ def test_isub_bad_addend(self):
468468

469469
def test_neg(self):
470470
op = FermionOperator(((1, 1), (3, 1), (8, 1)), 0.5)
471-
-op
471+
_ = -op
472472
# out of place
473473
self.assertTrue(op.isclose(FermionOperator(((1, 1), (3, 1), (8, 1)),
474474
0.5)))

src/fermilib/transforms/_conversion.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,22 @@
1212

1313
"""Transformations acting on operators and RDMs."""
1414
from __future__ import absolute_import
15-
from future.utils import iteritems
1615

17-
import copy
1816
import itertools
17+
1918
import numpy
19+
from future.utils import iteritems
20+
from projectq.ops import QubitOperator
2021

2122
from fermilib.ops import (FermionOperator,
2223
normal_ordered,
23-
number_operator,
2424
InteractionOperator,
2525
InteractionRDM)
2626
from fermilib.ops._interaction_operator import InteractionOperatorError
2727
from fermilib.utils import (count_qubits,
2828
jordan_wigner_sparse,
2929
qubit_operator_sparse)
3030

31-
from projectq.ops import QubitOperator
32-
3331

3432
def get_sparse_operator(operator, n_qubits=None):
3533
"""Map a Fermion, Qubit, or InteractionOperator to a SparseOperator."""
@@ -161,17 +159,15 @@ def get_fermion_operator(interaction_operator):
161159
n_qubits = count_qubits(interaction_operator)
162160

163161
# Add one-body terms.
164-
for p in range(n_qubits):
165-
for q in range(n_qubits):
166-
coefficient = interaction_operator[p, q]
167-
fermion_operator += FermionOperator(((p, 1), (q, 0)), coefficient)
168-
169-
# Add two-body terms.
170-
for r in range(n_qubits):
171-
for s in range(n_qubits):
172-
coefficient = interaction_operator[p, q, r, s]
173-
fermion_operator += FermionOperator(((p, 1), (q, 1),
174-
(r, 0), (s, 0)),
175-
coefficient)
162+
for p, q in itertools.product(range(n_qubits), repeat=2):
163+
fermion_operator += FermionOperator(
164+
((p, 1), (q, 0)), coefficient=interaction_operator[p, q])
165+
166+
# Add two-body terms.
167+
for p, q, r, s in itertools.product(range(n_qubits), repeat=4):
168+
coefficient = interaction_operator[p, q, r, s]
169+
fermion_operator += FermionOperator(((p, 1), (q, 1),
170+
(r, 0), (s, 0)),
171+
coefficient)
176172

177173
return fermion_operator

src/fermilib/utils/_unitary_cc.py

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ def uccsd_operator(single_amplitudes, double_amplitudes, anti_hermitian=True):
6060
for i, j in itertools.product(range(n_orbitals), repeat=2):
6161
if single_amplitudes[i, j] == 0.:
6262
continue
63-
uccsd_generator += FermionOperator(
64-
((i, 1), (j, 0)), single_amplitudes[i, j])
65-
if (anti_hermitian):
66-
uccsd_generator += FermionOperator(
67-
((j, 1), (i, 0)), -single_amplitudes[i, j])
63+
uccsd_generator += FermionOperator(((i, 1), (j, 0)),
64+
single_amplitudes[i, j])
65+
if anti_hermitian:
66+
uccsd_generator += FermionOperator(((j, 1), (i, 0)),
67+
-single_amplitudes[i, j])
6868

6969
# Add double excitations
7070
for i, j, k, l in itertools.product(range(n_orbitals), repeat=4):
@@ -73,11 +73,10 @@ def uccsd_operator(single_amplitudes, double_amplitudes, anti_hermitian=True):
7373
uccsd_generator += FermionOperator(
7474
((i, 1), (j, 0), (k, 1), (l, 0)),
7575
double_amplitudes[i, j, k, l])
76-
if (anti_hermitian):
76+
if anti_hermitian:
7777
uccsd_generator += FermionOperator(
7878
((l, 1), (k, 0), (j, 1), (i, 0)),
7979
-double_amplitudes[i, j, k, l])
80-
8180
return uccsd_generator
8281

8382

@@ -126,7 +125,6 @@ def uccsd_singlet_operator(packed_amplitudes,
126125
n_occupied = int(numpy.ceil(n_electrons / 2.))
127126
n_virtual = int(n_qubits / 2 - n_occupied) # Virtual Spatial Orbitals
128127
n_t1 = int(n_occupied * n_virtual)
129-
n_t2 = int(n_t1 ** 2)
130128

131129
t1 = packed_amplitudes[:n_t1]
132130
t2 = packed_amplitudes[n_t1:]
@@ -142,38 +140,38 @@ def t2_ind(i, j, k, l):
142140

143141
uccsd_generator = FermionOperator()
144142

145-
for i in range(n_virtual):
146-
for j in range(n_occupied):
147-
for s1 in range(2):
148-
uccsd_generator += FermionOperator((
149-
(2 * (i + n_occupied) + s1, 1),
150-
(2 * j + s1, 0)),
151-
t1[t1_ind(i, j)])
152-
153-
uccsd_generator += FermionOperator((
154-
(2 * j + s1, 1),
155-
(2 * (i + n_occupied) + s1, 0)),
156-
-t1[t1_ind(i, j)])
157-
158-
for i in range(n_virtual):
159-
for j in range(n_occupied):
160-
for s1 in range(2):
161-
for k in range(n_virtual):
162-
for l in range(n_occupied):
163-
for s2 in range(2):
164-
uccsd_generator += FermionOperator((
165-
(2 * (i + n_occupied) + s1, 1),
166-
(2 * j + s1, 0),
167-
(2 * (k + n_occupied) + s2, 1),
168-
(2 * l + s2, 0)),
169-
t2[t2_ind(i, j, k, l)])
170-
171-
uccsd_generator += FermionOperator((
172-
(2 * l + s2, 1),
173-
(2 * (k + n_occupied) + s2, 0),
174-
(2 * j + s1, 1),
175-
(2 * (i + n_occupied) + s1, 0)),
176-
-t2[t2_ind(i, j, k, l)])
143+
spaces = range(n_virtual), range(n_occupied), range(2)
144+
145+
for i, j, s in itertools.product(*spaces):
146+
uccsd_generator += FermionOperator(
147+
(
148+
(2 * (i + n_occupied) + s, 1),
149+
(2 * j + s, 0),
150+
),
151+
coefficient=t1[t1_ind(i, j)])
152+
153+
uccsd_generator += FermionOperator(
154+
(
155+
(2 * j + s, 1),
156+
(2 * (i + n_occupied) + s, 0),
157+
),
158+
coefficient=-t1[t1_ind(i, j)])
159+
160+
for i, j, s, i2, j2, s2 in itertools.product(*spaces, repeat=2):
161+
uccsd_generator += FermionOperator((
162+
(2 * (i + n_occupied) + s, 1),
163+
(2 * j + s, 0),
164+
(2 * (i2 + n_occupied) + s2, 1),
165+
(2 * j2 + s2, 0)),
166+
t2[t2_ind(i, j, i2, j2)])
167+
168+
uccsd_generator += FermionOperator((
169+
(2 * j2 + s2, 1),
170+
(2 * (i2 + n_occupied) + s2, 0),
171+
(2 * j + s, 1),
172+
(2 * (i + n_occupied) + s, 0)),
173+
-t2[t2_ind(i, j, i2, j2)])
174+
177175
return uccsd_generator
178176

179177

0 commit comments

Comments
 (0)