1616
1717import numpy
1818
19+ from fermilib .ops import FermionOperator
1920from fermilib .transforms import jordan_wigner
2021from fermilib .utils import count_qubits , eigenspectrum , Grid
2122from fermilib .utils ._jellium import (
23+ dual_basis_jellium_model ,
2224 dual_basis_kinetic ,
2325 dual_basis_potential ,
2426 jellium_model ,
3133 position_vector ,
3234)
3335
36+ from projectq .ops import QubitOperator
37+
3438
3539class JelliumTest (unittest .TestCase ):
3640
@@ -169,6 +173,31 @@ def test_model_integration(self):
169173 numpy .absolute (momentum_spectrum - position_spectrum ))
170174 self .assertAlmostEqual (difference , 0. )
171175
176+ def test_model_integration_with_constant (self ):
177+ # Compute Hamiltonian in both momentum and position space.
178+ length_scale = 0.7
179+
180+ grid = Grid (dimensions = 2 , length = 3 , scale = length_scale )
181+ spinless = True
182+
183+ # Include the Madelung constant in the momentum but not the position
184+ # Hamiltonian.
185+ momentum_hamiltonian = jellium_model (grid , spinless , True ,
186+ include_constant = True )
187+ position_hamiltonian = jellium_model (grid , spinless , False )
188+
189+ # Diagonalize and confirm the same energy.
190+ jw_momentum = jordan_wigner (momentum_hamiltonian )
191+ jw_position = jordan_wigner (position_hamiltonian )
192+ momentum_spectrum = eigenspectrum (jw_momentum )
193+ position_spectrum = eigenspectrum (jw_position )
194+
195+ # Confirm momentum spectrum is shifted 2.8372 / length_scale higher.
196+ max_difference = numpy .amax (momentum_spectrum - position_spectrum )
197+ min_difference = numpy .amax (momentum_spectrum - position_spectrum )
198+ self .assertAlmostEqual (max_difference , 2.8372 / length_scale )
199+ self .assertAlmostEqual (min_difference , 2.8372 / length_scale )
200+
172201 def test_coefficients (self ):
173202
174203 # Test that the coefficients post-JW transform are as claimed in paper.
@@ -278,9 +307,11 @@ def test_jordan_wigner_dual_basis_jellium(self):
278307 grid = Grid (dimensions = 2 , length = 3 , scale = 1. )
279308 spinless = True
280309
281- # Compute fermionic Hamiltonian.
282- fermion_hamiltonian = jellium_model (grid , spinless , False )
310+ # Compute fermionic Hamiltonian. Include then subtract constant.
311+ fermion_hamiltonian = dual_basis_jellium_model (
312+ grid , spinless , include_constant = True )
283313 qubit_hamiltonian = jordan_wigner (fermion_hamiltonian )
314+ qubit_hamiltonian -= QubitOperator ((), 2.8372 )
284315
285316 # Compute Jordan-Wigner Hamiltonian.
286317 test_hamiltonian = jordan_wigner_dual_basis_jellium (grid , spinless )
@@ -296,3 +327,18 @@ def test_jordan_wigner_dual_basis_jellium(self):
296327 num_nonzeros = sum (1 for coeff in qubit_hamiltonian .terms .values () if
297328 coeff != 0.0 )
298329 self .assertTrue (num_nonzeros <= paper_n_terms )
330+
331+ def test_jordan_wigner_dual_basis_jellium_constant_shift (self ):
332+ length_scale = 0.6
333+ grid = Grid (dimensions = 2 , length = 3 , scale = length_scale )
334+ spinless = True
335+
336+ hamiltonian_without_constant = jordan_wigner_dual_basis_jellium (
337+ grid , spinless , include_constant = False )
338+ hamiltonian_with_constant = jordan_wigner_dual_basis_jellium (
339+ grid , spinless , include_constant = True )
340+
341+ difference = hamiltonian_with_constant - hamiltonian_without_constant
342+ expected = FermionOperator .identity () * (2.8372 / length_scale )
343+
344+ self .assertTrue (expected .isclose (difference ))
0 commit comments