Skip to content

Commit bbe99bb

Browse files
Strilancbabbush
authored andcommitted
Extract common helper from fourier_transform / inverse_fourier_transform (#39)
1 parent cd63b3b commit bbe99bb

File tree

1 file changed

+29
-58
lines changed

1 file changed

+29
-58
lines changed

src/fermilib/utils/_plane_wave_hamiltonian.py

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -175,54 +175,14 @@ def fourier_transform(hamiltonian, n_dimensions, grid_length, length_scale,
175175
Returns:
176176
hamiltonian_t: An instance of the FermionOperator class.
177177
"""
178-
hamiltonian_t = None
179-
180-
for term in hamiltonian.terms:
181-
transformed_term = None
182-
for ladder_operator in term:
183-
momentum_indices = grid_indices(ladder_operator[0], n_dimensions,
184-
grid_length, spinless)
185-
momentum_vec = momentum_vector(momentum_indices, grid_length,
186-
length_scale)
187-
new_basis = None
188-
for position_indices in itertools.product(range(grid_length),
189-
repeat=n_dimensions):
190-
position_vec = position_vector(position_indices, grid_length,
191-
length_scale)
192-
if spinless:
193-
spin = None
194-
else:
195-
spin = ladder_operator[0] % 2
196-
orbital = orbital_id(grid_length, position_indices, spin)
197-
exp_index = 1.0j * numpy.dot(momentum_vec, position_vec)
198-
if ladder_operator[1] == 1:
199-
exp_index *= -1.0
200-
201-
element = FermionOperator(((orbital, ladder_operator[1]),),
202-
numpy.exp(exp_index))
203-
if new_basis is None:
204-
new_basis = element
205-
else:
206-
new_basis += element
207-
208-
new_basis *= numpy.sqrt(1.0/float(grid_length**n_dimensions))
209-
210-
if transformed_term is None:
211-
transformed_term = new_basis
212-
else:
213-
transformed_term *= new_basis
214-
if transformed_term is None:
215-
continue
216-
217-
# Coefficient.
218-
transformed_term *= hamiltonian.terms[term]
219-
220-
if hamiltonian_t is None:
221-
hamiltonian_t = transformed_term
222-
else:
223-
hamiltonian_t += transformed_term
224-
225-
return hamiltonian_t
178+
return _fourier_transform_helper(hamiltonian=hamiltonian,
179+
n_dimensions=n_dimensions,
180+
grid_length=grid_length,
181+
length_scale=length_scale,
182+
spinless=spinless,
183+
factor=+1,
184+
vec_func_1=momentum_vector,
185+
vec_func_2=position_vector)
226186

227187

228188
def inverse_fourier_transform(hamiltonian, n_dimensions, grid_length,
@@ -244,26 +204,37 @@ def inverse_fourier_transform(hamiltonian, n_dimensions, grid_length,
244204
Returns:
245205
hamiltonian_t: An instance of the FermionOperator class.
246206
"""
207+
return _fourier_transform_helper(hamiltonian=hamiltonian,
208+
n_dimensions=n_dimensions,
209+
grid_length=grid_length,
210+
length_scale=length_scale,
211+
spinless=spinless,
212+
factor=-1,
213+
vec_func_1=position_vector,
214+
vec_func_2=momentum_vector)
215+
216+
217+
def _fourier_transform_helper(hamiltonian, n_dimensions, grid_length,
218+
length_scale, spinless, factor,
219+
vec_func_1, vec_func_2):
247220
hamiltonian_t = None
248221

249222
for term in hamiltonian.terms:
250223
transformed_term = None
251224
for ladder_operator in term:
252-
position_indices = grid_indices(ladder_operator[0], n_dimensions,
253-
grid_length, spinless)
254-
position_vec = position_vector(position_indices, grid_length,
255-
length_scale)
225+
indices_1 = grid_indices(ladder_operator[0], n_dimensions,
226+
grid_length, spinless)
227+
vec_1 = vec_func_1(indices_1, grid_length, length_scale)
256228
new_basis = None
257-
for momentum_indices in itertools.product(range(grid_length),
258-
repeat=n_dimensions):
259-
momentum_vec = momentum_vector(momentum_indices, grid_length,
260-
length_scale)
229+
for indices_2 in itertools.product(range(grid_length),
230+
repeat=n_dimensions):
231+
vec_2 = vec_func_2(indices_2, grid_length, length_scale)
261232
if spinless:
262233
spin = None
263234
else:
264235
spin = ladder_operator[0] % 2
265-
orbital = orbital_id(grid_length, momentum_indices, spin)
266-
exp_index = -1.0j * numpy.dot(position_vec, momentum_vec)
236+
orbital = orbital_id(grid_length, indices_2, spin)
237+
exp_index = factor * 1.0j * numpy.dot(vec_1, vec_2)
267238
if ladder_operator[1] == 1:
268239
exp_index *= -1.0
269240

0 commit comments

Comments
 (0)