Skip to content
This repository was archived by the owner on Dec 7, 2021. It is now read-only.

Commit 3a9d680

Browse files
authored
HartreeFock and UCCSD num qubit param removal. (#939)
1 parent 7d495f0 commit 3a9d680

18 files changed

+66
-97
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ Changed
9595
in addition to the existing Operators (#852).
9696
- The `BaseOperator` was renamed `LegacyBaseOperator` to avoid confusion with the new
9797
Operator flow `OperatorBase` (#852).
98+
- HartreeFock initial state and UCCSD variational form `num_qubits` parameter removed as it was
99+
only value checked against that computed internally from the other parameters. UCCSD `depth`
100+
parameter renamed to `reps` and moved in order so it can default to 1. (#939)
101+
98102

99103
Removed
100104
-------

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ optimizer = L_BFGS_B()
216216

217217
# setup the initial state for the variational form
218218
from qiskit.chemistry.components.initial_states import HartreeFock
219-
init_state = HartreeFock(num_qubits, num_spin_orbitals, num_particles)
219+
init_state = HartreeFock(num_spin_orbitals, num_particles)
220220

221221
# setup the variational form for VQE
222222
from qiskit.circuit.library import TwoLocal

qiskit/chemistry/applications/molecular_ground_state_energy.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,12 @@ def get_default_solver(quantum_instance: Union[QuantumInstance, BaseBackend]) ->
146146
Returns:
147147
Default solver callback
148148
"""
149-
# TODO num_qubits should be removed since they should be updated by VQE when operator is set
150149
def cb_default_solver(num_particles, num_orbitals,
151150
qubit_mapping, two_qubit_reduction, z2_symmetries):
152151
""" Default solver """
153-
initial_state = HartreeFock(2, num_orbitals, num_particles, qubit_mapping,
152+
initial_state = HartreeFock(num_orbitals, num_particles, qubit_mapping,
154153
two_qubit_reduction, z2_symmetries.sq_list)
155-
var_form = UCCSD(2, depth=1,
156-
num_orbitals=num_orbitals,
154+
var_form = UCCSD(num_orbitals=num_orbitals,
157155
num_particles=num_particles,
158156
initial_state=initial_state,
159157
qubit_mapping=qubit_mapping,

qiskit/chemistry/components/initial_states/hartree_fock.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,14 @@
2727
class HartreeFock(InitialState):
2828
"""A Hartree-Fock initial state."""
2929

30-
def __init__(self, num_qubits: int,
30+
def __init__(self,
3131
num_orbitals: int,
3232
num_particles: Union[List[int], int],
3333
qubit_mapping: str = 'parity',
3434
two_qubit_reduction: bool = True,
3535
sq_list: Optional[List[int]] = None) -> None:
36-
"""Constructor.
37-
36+
"""
3837
Args:
39-
num_qubits: number of qubits, has a min. value of 1.
4038
num_orbitals: number of spin orbitals, has a min. value of 1.
4139
num_particles: number of particles, if it is a list, the first number
4240
is alpha and the second number if beta.
@@ -49,7 +47,6 @@ def __init__(self, num_qubits: int,
4947
ValueError: wrong setting in num_particles and num_orbitals.
5048
ValueError: wrong setting for computed num_qubits and supplied num_qubits.
5149
"""
52-
validate_min('num_qubits', num_qubits, 1)
5350
validate_min('num_orbitals', num_orbitals, 1)
5451
if isinstance(num_particles, list) and len(num_particles) != 2:
5552
raise ValueError('Num particles value {}. Number of values allowed is 2'.format(
@@ -85,9 +82,6 @@ def __init__(self, num_qubits: int,
8582
self._num_qubits = num_orbitals - 2 if self._two_qubit_reduction else self._num_orbitals
8683
self._num_qubits = self._num_qubits \
8784
if not self._qubit_tapering else self._num_qubits - len(sq_list)
88-
if self._num_qubits != num_qubits:
89-
raise ValueError("Computed num qubits {} does not match "
90-
"actual {}".format(self._num_qubits, num_qubits))
9185

9286
self._bitstr = None
9387

qiskit/chemistry/components/variational_forms/uccsd.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ class UCCSD(VariationalForm):
4848
And for the singlet q-UCCD (full) and pair q-UCCD) see: https://arxiv.org/abs/1911.10864
4949
"""
5050

51-
def __init__(self, num_qubits: int,
52-
depth: int,
51+
def __init__(self,
5352
num_orbitals: int,
5453
num_particles: Union[List[int], int],
54+
reps: int = 1,
5555
active_occupied: Optional[List[int]] = None,
5656
active_unoccupied: Optional[List[int]] = None,
5757
initial_state: Optional[InitialState] = None,
@@ -68,11 +68,10 @@ def __init__(self, num_qubits: int,
6868
"""Constructor.
6969
7070
Args:
71-
num_qubits: number of qubits, has a min. value of 1.
72-
depth: number of replica of basic module, has a min. value of 1.
7371
num_orbitals: number of spin orbitals, has a min. value of 1.
7472
num_particles: number of particles, if it is a list,
7573
the first number is alpha and the second number if beta.
74+
reps: number of repetitions of basic module, has a min. value of 1.
7675
active_occupied: list of occupied orbitals to consider as active space.
7776
active_unoccupied: list of unoccupied orbitals to consider as active space.
7877
initial_state: An initial state object.
@@ -98,14 +97,13 @@ def __init__(self, num_qubits: int,
9897
9998
10099
Raises:
101-
ValueError: Computed qubits do not match actual value
100+
ValueError: Num particles list is not 2 entries
102101
"""
103-
validate_min('num_qubits', num_qubits, 1)
104-
validate_min('depth', depth, 1)
105102
validate_min('num_orbitals', num_orbitals, 1)
106103
if isinstance(num_particles, list) and len(num_particles) != 2:
107104
raise ValueError('Num particles value {}. Number of values allowed is 2'.format(
108105
num_particles))
106+
validate_min('reps', reps, 1)
109107
validate_in_set('qubit_mapping', qubit_mapping,
110108
{'jordan_wigner', 'parity', 'bravyi_kitaev'})
111109
validate_min('num_time_slices', num_time_slices, 1)
@@ -120,10 +118,7 @@ def __init__(self, num_qubits: int,
120118
self._num_qubits = num_orbitals if not two_qubit_reduction else num_orbitals - 2
121119
self._num_qubits = self._num_qubits if self._z2_symmetries.is_empty() \
122120
else self._num_qubits - len(self._z2_symmetries.sq_list)
123-
if self._num_qubits != num_qubits:
124-
raise ValueError('Computed num qubits {} does not match actual {}'
125-
.format(self._num_qubits, num_qubits))
126-
self._depth = depth
121+
self._reps = reps
127122
self._num_orbitals = num_orbitals
128123
if isinstance(num_particles, list):
129124
self._num_alpha = num_particles[0]
@@ -266,7 +261,7 @@ def _build_hopping_operators(self):
266261
self._single_excitations = s_e_list
267262
self._double_excitations = d_e_list
268263

269-
num_parameters = len(hopping_ops) * self._depth
264+
num_parameters = len(hopping_ops) * self._reps
270265
return hopping_ops, num_parameters
271266

272267
@staticmethod
@@ -339,14 +334,14 @@ def manage_hopping_operators(self):
339334
self._excitation_pool = self._hopping_ops.copy()
340335

341336
# check depth parameter
342-
if self._depth != 1:
343-
logger.warning('The depth of the variational form was not 1 but %i which does not work \
337+
if self._reps != 1:
338+
logger.warning('The reps of the variational form was not 1 but %i which does not work \
344339
in the adaptive VQE algorithm. Thus, it has been reset to 1.')
345-
self._depth = 1
340+
self._reps = 1
346341

347342
# reset internal excitation list to be empty
348343
self._hopping_ops = []
349-
self._num_parameters = len(self._hopping_ops) * self._depth
344+
self._num_parameters = len(self._hopping_ops) * self._reps
350345
self._bounds = [(-np.pi, np.pi) for _ in range(self._num_parameters)]
351346

352347
def push_hopping_operator(self, excitation):
@@ -357,15 +352,15 @@ def push_hopping_operator(self, excitation):
357352
excitation (WeightedPauliOperator): the new hopping operator to be added
358353
"""
359354
self._hopping_ops.append(excitation)
360-
self._num_parameters = len(self._hopping_ops) * self._depth
355+
self._num_parameters = len(self._hopping_ops) * self._reps
361356
self._bounds = [(-np.pi, np.pi) for _ in range(self._num_parameters)]
362357

363358
def pop_hopping_operator(self):
364359
"""
365360
Pops the hopping operator that was added last.
366361
"""
367362
self._hopping_ops.pop()
368-
self._num_parameters = len(self._hopping_ops) * self._depth
363+
self._num_parameters = len(self._hopping_ops) * self._reps
369364
self._bounds = [(-np.pi, np.pi) for _ in range(self._num_parameters)]
370365

371366
def construct_circuit(self, parameters, q=None):
@@ -402,11 +397,11 @@ def construct_circuit(self, parameters, q=None):
402397
if not self.uccd_singlet:
403398
list_excitation_operators = [
404399
(self._hopping_ops[index % num_excitations], parameters[index])
405-
for index in range(self._depth * num_excitations)]
400+
for index in range(self._reps * num_excitations)]
406401
else:
407402
list_excitation_operators = []
408403
counter = 0
409-
for i in range(int(self._depth * self.num_groups)):
404+
for i in range(int(self._reps * self.num_groups)):
410405
for _ in range(len(self._double_excitations_grouped[i % self.num_groups])):
411406
list_excitation_operators.append((self._hopping_ops[counter],
412407
parameters[i]))

qiskit/chemistry/core/hamiltonian.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,7 @@ def _process_z2symmetry_reduction(self, qubit_op, aux_ops):
300300
aux_ops[i] = None # Discard since no meaningful measurement can be done
301301

302302
if self._z2symmetry_reduction == 'auto':
303-
hf_state = HartreeFock(num_qubits=qubit_op.num_qubits,
304-
num_orbitals=self._molecule_info[self.INFO_NUM_ORBITALS],
303+
hf_state = HartreeFock(num_orbitals=self._molecule_info[self.INFO_NUM_ORBITALS],
305304
qubit_mapping=self._qubit_mapping,
306305
two_qubit_reduction=self._two_qubit_reduction,
307306
num_particles=self._molecule_info[self.INFO_NUM_PARTICLES])

test/chemistry/test_app_mgse.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def test_mgse_callback_ipqe(self):
9999

100100
def cb_create_solver(num_particles, num_orbitals,
101101
qubit_mapping, two_qubit_reduction, z2_symmetries):
102-
state_in = HartreeFock(2, num_orbitals, num_particles, qubit_mapping,
102+
state_in = HartreeFock(num_orbitals, num_particles, qubit_mapping,
103103
two_qubit_reduction, z2_symmetries.sq_list)
104104
iqpe = IQPE(None, state_in, num_time_slices=1, num_iterations=6,
105105
expansion_mode='suzuki', expansion_order=2,
@@ -117,10 +117,9 @@ def test_mgse_callback_vqe_uccsd(self):
117117

118118
def cb_create_solver(num_particles, num_orbitals,
119119
qubit_mapping, two_qubit_reduction, z2_symmetries):
120-
initial_state = HartreeFock(2, num_orbitals, num_particles, qubit_mapping,
120+
initial_state = HartreeFock(num_orbitals, num_particles, qubit_mapping,
121121
two_qubit_reduction, z2_symmetries.sq_list)
122-
var_form = UCCSD(2, depth=1,
123-
num_orbitals=num_orbitals,
122+
var_form = UCCSD(num_orbitals=num_orbitals,
124123
num_particles=num_particles,
125124
initial_state=initial_state,
126125
qubit_mapping=qubit_mapping,
@@ -161,10 +160,9 @@ def test_mgse_callback_vqe_uccsd_z2(self):
161160

162161
def cb_create_solver(num_particles, num_orbitals,
163162
qubit_mapping, two_qubit_reduction, z2_symmetries):
164-
initial_state = HartreeFock(6, num_orbitals, num_particles, qubit_mapping,
163+
initial_state = HartreeFock(num_orbitals, num_particles, qubit_mapping,
165164
two_qubit_reduction, z2_symmetries.sq_list)
166-
var_form = UCCSD(6, depth=1,
167-
num_orbitals=num_orbitals,
165+
var_form = UCCSD(num_orbitals=num_orbitals,
168166
num_particles=num_particles,
169167
initial_state=initial_state,
170168
qubit_mapping=qubit_mapping,

test/chemistry/test_core_hamiltonian_symmetries.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,9 @@ def test_vqe_auto_symmetry_freeze_core(self):
194194
qubit_mapping = 'jordan_wigner'
195195
two_qubit_reduction = core.molecule_info[core.INFO_TWO_QUBIT_REDUCTION]
196196
z2_symmetries = core.molecule_info[core.INFO_Z2SYMMETRIES]
197-
initial_state = HartreeFock(qubit_op.num_qubits, num_orbitals, num_particles,
197+
initial_state = HartreeFock(num_orbitals, num_particles,
198198
qubit_mapping, two_qubit_reduction, z2_symmetries.sq_list)
199-
var_form = UCCSD(qubit_op.num_qubits, depth=1,
200-
num_orbitals=num_orbitals,
199+
var_form = UCCSD(num_orbitals=num_orbitals,
201200
num_particles=num_particles,
202201
initial_state=initial_state,
203202
qubit_mapping=qubit_mapping,

test/chemistry/test_end2end_with_iqpe.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ def test_iqpe(self, distance):
6868

6969
num_time_slices = 1
7070
num_iterations = 6
71-
state_in = HartreeFock(qubit_op.num_qubits, num_orbitals,
72-
num_particles, qubit_mapping, two_qubit_reduction)
71+
state_in = HartreeFock(num_orbitals, num_particles, qubit_mapping, two_qubit_reduction)
7372
iqpe = IQPE(qubit_op, state_in, num_time_slices, num_iterations,
7473
expansion_mode='suzuki', expansion_order=2,
7574
shallow_circuit_concat=True)

test/chemistry/test_end2end_with_qpe.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ def test_qpe(self, distance, use_circuit_library):
8181
num_time_slices = 1
8282
n_ancillae = 6
8383

84-
state_in = HartreeFock(qubit_op.num_qubits, num_orbitals,
85-
num_particles, qubit_mapping, two_qubit_reduction)
84+
state_in = HartreeFock(num_orbitals, num_particles, qubit_mapping, two_qubit_reduction)
8685
if use_circuit_library:
8786
iqft = QFT(n_ancillae).inverse()
8887
else:

0 commit comments

Comments
 (0)