Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added vsqs ansatz #109

Merged
merged 10 commits into from
Jan 17, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/continuous_integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
pip install qiskit==0.33.1 # Due to strange behaviour of noise model
pip install qulacs
pip install amazon-braket-sdk
pip install cirq==0.12.0
pip install cirq
pip install projectq
if: always()

Expand Down
26 changes: 26 additions & 0 deletions tangelo/algorithms/variational/tests/test_vqe_solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import re
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
import unittest
import numpy as np

Expand Down Expand Up @@ -137,6 +138,31 @@ def test_simulate_qcc_h2(self):
energy = vqe_solver.simulate()
self.assertAlmostEqual(energy, -1.137270, delta=1e-4)

def test_simulate_vsqs_h2(self):
"""Run VQE on H2 molecule, with vsqs ansatz, JW qubit mapping, exact simulator for both molecule input and
qubit_hamiltonian/hini/reference_state input
"""
vqe_options = {"molecule": mol_H2_sto3g, "ansatz": BuiltInAnsatze.VSQS, "qubit_mapping": "jw",
"verbose": True, "ansatz_options": {"intervals": 3, "time": 3}}
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
vqe_solver = VQESolver(vqe_options)
vqe_solver.build()

energy = vqe_solver.simulate()
self.assertAlmostEqual(energy, -1.137270, delta=1e-4)

qubit_hamiltonian = vqe_solver.qubit_hamiltonian
hini = vqe_solver.ansatz.hini
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
reference_state = vqe_solver.ansatz.prepare_reference_state()

vqe_options = {"molecule": None, "qubit_hamiltonian": qubit_hamiltonian, "ansatz": BuiltInAnsatze.VSQS, "qubit_mapping": "jw",
"ansatz_options": {"intervals": 3, "time": 3, "qubit_hamiltonian": qubit_hamiltonian,
"hini": hini, "reference_state": reference_state}}
vqe_solver = VQESolver(vqe_options)
vqe_solver.build()

energy = vqe_solver.simulate()
self.assertAlmostEqual(energy, -1.137270, delta=1e-4)

def test_simulate_h2_qiskit(self):
"""Run VQE on H2 molecule, with UCCSD ansatz, JW qubit mapping, initial
parameters, exact qiskit simulator.
Expand Down
9 changes: 9 additions & 0 deletions tangelo/algorithms/variational/vqe_solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from tangelo.toolboxes.ansatz_generator.upccgsd import UpCCGSD
from tangelo.toolboxes.ansatz_generator.qmf import QMF
from tangelo.toolboxes.ansatz_generator.qcc import QCC
from tangelo.toolboxes.ansatz_generator.vsqs import VSQS
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
from tangelo.toolboxes.ansatz_generator.variational_circuit import VariationalCircuitAnsatz
from tangelo.toolboxes.ansatz_generator.penalty_terms import combined_penalty
from tangelo.toolboxes.post_processing.bootstrapping import get_resampled_frequencies
Expand All @@ -50,6 +51,7 @@ class BuiltInAnsatze(Enum):
UpCCGSD = 4
QMF = 5
QCC = 6
VSQS = 7


class VQESolver:
Expand Down Expand Up @@ -186,12 +188,19 @@ def build(self):
self.ansatz = QMF(self.molecule, self.qubit_mapping, self.up_then_down, **self.ansatz_options)
elif self.ansatz == BuiltInAnsatze.QCC:
self.ansatz = QCC(self.molecule, self.qubit_mapping, self.up_then_down, **self.ansatz_options)
elif self.ansatz == BuiltInAnsatze.VSQS:
self.ansatz = VSQS(self.molecule, self.qubit_mapping, self.up_then_down, **self.ansatz_options)
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
else:
raise ValueError(f"Unsupported ansatz. Built-in ansatze:\n\t{self.builtin_ansatze}")
elif not isinstance(self.ansatz, Ansatz):
raise TypeError(f"Invalid ansatz dataype. Expecting instance of Ansatz class, or one of built-in options:\n\t{self.builtin_ansatze}")

# Building with a qubit Hamiltonian.
elif self.ansatz in [BuiltInAnsatze.HEA, BuiltInAnsatze.VSQS]:
if self.ansatz == BuiltInAnsatze.HEA:
self.ansatz = HEA(self.molecule, self.qubit_mapping, self.up_then_down, **self.ansatz_options)
elif self.ansatz == BuiltInAnsatze.VSQS:
self.ansatz = VSQS(self.molecule, self.qubit_mapping, self.up_then_down, **self.ansatz_options)
elif not isinstance(self.ansatz, Ansatz):
raise TypeError(f"Invalid ansatz dataype. Expecting a custom Ansatz (Ansatz class).")

Expand Down
14 changes: 11 additions & 3 deletions tangelo/toolboxes/ansatz_generator/ansatz_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def exp_pauliword_to_gates(pauli_word, coef, variational=True, control=None):


def get_exponentiated_qubit_operator_circuit(qubit_op, time=1., variational=False, trotter_order=1, control=None,
return_phase=False):
return_phase=False, pauli_order=None):
"""Generate the exponentiation of a qubit operator in first- or second-order Trotterized form.
The algorithm is described in Whitfield 2010 https://arxiv.org/pdf/1001.3855.pdf

Expand All @@ -94,12 +94,20 @@ def get_exponentiated_qubit_operator_circuit(qubit_op, time=1., variational=Fals
variational (bool) : Whether the coefficients are variational
trotter_order (int): order of trotter approximation, only 1 or 2 are supported.
return_phase (bool): Return the global-phase generated
pauli_order (list): The desired pauli_word order for trotterization defined as a list of (pauli_word, coeff)
elements which have matching dictionary elements pauli_word: coeff in QubitOperator terms.items().
The coeff in pauli_order is used.

Returns:
Circuit: circuit corresponding to exponentiation of qubit operator
phase : The global phase of the time evolution if return_phase=True else not included
"""
pauli_words = list(qubit_op.terms.items())
if pauli_order is None:
pauli_words = list(qubit_op.terms.items())
elif isinstance(pauli_order, list):
pauli_words = deepcopy(pauli_order)
JamesB-1qbit marked this conversation as resolved.
Show resolved Hide resolved
else:
raise ValueError("ordered terms must be a list with elements (keys, values) of qubit_op.terms.items()")

if trotter_order > 2:
raise ValueError(f"Trotter order of >2 is not supported currently in Tangelo.")
Expand All @@ -118,7 +126,7 @@ def get_exponentiated_qubit_operator_circuit(qubit_op, time=1., variational=Fals
phase = 1.
exp_pauli_word_gates = list()
for i in range(trotter_order):
if i == 0:
if i == 1:
alexfleury-sb marked this conversation as resolved.
Show resolved Hide resolved
pauli_words.reverse()
for pauli_word, coef in pauli_words:
if pauli_word: # identity terms do not contribute to evolution outside of a phase
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
QubitOperator:
(-3.201203136341336+0j) [] +
(0.018922220448748025+0j) [X0 X1] +
(0.018922220448748025+0j) [Y0 Y1] +
(0.6887270305253504+0j) [Z0] +
(0.37691668685924784+0j) [Z1] +
(-0.02281117974146273+0j) [X2 X3] +
(-0.02281117974146273+0j) [Y2 Y3] +
(0.3753113309246301+0j) [Z2] +
(0.15964651986143952+0j) [Z3] +
(0.018922220448748025+0j) [X4 X5] +
(0.018922220448748025+0j) [Y4 Y5] +
(0.6887270305253504+0j) [Z4] +
(0.37691668685924784+0j) [Z5] +
(-0.02281117974146273+0j) [X6 X7] +
(-0.02281117974146273+0j) [Y6 Y7] +
(0.3753113309246301+0j) [Z6] +
(0.15964651986143952+0j) [Z7]
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
QubitOperator:
(-0.845088084959612+0j) [] +
(-0.0020776113200212075+0j) [X0 X1] +
(-0.011761015389060145+0j) [X0 X1 X2 X3] +
(-0.0003365342989052316+0j) [X0 X1 Y2 Y3] +
(0.002844217831601514+0j) [X0 X1 Z2] +
(0.005067140284950715+0j) [X0 X1 Z3] +
(0.02660445410908035+0j) [X0 X1 X4 X5] +
(0.02660445410908035+0j) [X0 X1 Y4 Y5] +
(0.009461086978084416+0j) [X0 X1 Z4] +
(-0.002045316086697597+0j) [X0 X1 Z5] +
(-0.024395190370696845+0j) [X0 X1 X6 X7] +
(-0.024395190370696845+0j) [X0 X1 Y6 Y7] +
(-0.007801932778402895+0j) [X0 X1 Z6] +
(0.013474635539233077+0j) [X0 X1 Z7] +
(-0.011424481090154913+0j) [X0 Y1 Y2 X3] +
(0.024934767638066777+0j) [X0 Z1 X2 X4 Z5 X6] +
(0.006238164536781785+0j) [X0 Z1 X2 X4 Z5 Z6 X7] +
(0.024934767638066777+0j) [X0 Z1 X2 Y4 Z5 Y6] +
(0.006238164536781785+0j) [X0 Z1 X2 Y4 Z5 Z6 Y7] +
(0.01064615061000441+0j) [X0 Z1 X2 X5 X6] +
(-0.02405865607179162+0j) [X0 Z1 X2 X5 Z6 X7] +
(0.01064615061000441+0j) [X0 Z1 X2 Y5 Y6] +
(-0.02405865607179162+0j) [X0 Z1 X2 Y5 Z6 Y7] +
(0.006238164536781785+0j) [X0 Z1 Z2 X3 X4 Z5 X6] +
(0.017676042848046+0j) [X0 Z1 Z2 X3 X4 Z5 Z6 X7] +
(0.006238164536781785+0j) [X0 Z1 Z2 X3 Y4 Z5 Y6] +
(0.017676042848046+0j) [X0 Z1 Z2 X3 Y4 Z5 Z6 Y7] +
(-0.012634174981636702+0j) [X0 Z1 Z2 X3 X5 X6] +
(-0.008407495254282365+0j) [X0 Z1 Z2 X3 X5 Z6 X7] +
(-0.012634174981636702+0j) [X0 Z1 Z2 X3 Y5 Y6] +
(-0.008407495254282365+0j) [X0 Z1 Z2 X3 Y5 Z6 Y7] +
(-0.011424481090154913+0j) [Y0 X1 X2 Y3] +
(-0.0020776113200212075+0j) [Y0 Y1] +
(-0.0003365342989052316+0j) [Y0 Y1 X2 X3] +
(-0.011761015389060145+0j) [Y0 Y1 Y2 Y3] +
(0.002844217831601514+0j) [Y0 Y1 Z2] +
(0.005067140284950715+0j) [Y0 Y1 Z3] +
(0.02660445410908035+0j) [Y0 Y1 X4 X5] +
(0.02660445410908035+0j) [Y0 Y1 Y4 Y5] +
(0.009461086978084416+0j) [Y0 Y1 Z4] +
(-0.002045316086697597+0j) [Y0 Y1 Z5] +
(-0.024395190370696845+0j) [Y0 Y1 X6 X7] +
(-0.024395190370696845+0j) [Y0 Y1 Y6 Y7] +
(-0.007801932778402895+0j) [Y0 Y1 Z6] +
(0.013474635539233077+0j) [Y0 Y1 Z7] +
(0.024934767638066777+0j) [Y0 Z1 Y2 X4 Z5 X6] +
(0.006238164536781785+0j) [Y0 Z1 Y2 X4 Z5 Z6 X7] +
(0.024934767638066777+0j) [Y0 Z1 Y2 Y4 Z5 Y6] +
(0.006238164536781785+0j) [Y0 Z1 Y2 Y4 Z5 Z6 Y7] +
(0.01064615061000441+0j) [Y0 Z1 Y2 X5 X6] +
(-0.02405865607179162+0j) [Y0 Z1 Y2 X5 Z6 X7] +
(0.01064615061000441+0j) [Y0 Z1 Y2 Y5 Y6] +
(-0.02405865607179162+0j) [Y0 Z1 Y2 Y5 Z6 Y7] +
(0.006238164536781785+0j) [Y0 Z1 Z2 Y3 X4 Z5 X6] +
(0.017676042848046+0j) [Y0 Z1 Z2 Y3 X4 Z5 Z6 X7] +
(0.006238164536781785+0j) [Y0 Z1 Z2 Y3 Y4 Z5 Y6] +
(0.017676042848046+0j) [Y0 Z1 Z2 Y3 Y4 Z5 Z6 Y7] +
(-0.012634174981636702+0j) [Y0 Z1 Z2 Y3 X5 X6] +
(-0.008407495254282365+0j) [Y0 Z1 Z2 Y3 X5 Z6 X7] +
(-0.012634174981636702+0j) [Y0 Z1 Z2 Y3 Y5 Y6] +
(-0.008407495254282365+0j) [Y0 Z1 Z2 Y3 Y5 Z6 Y7] +
(0.23477912416223978+0j) [Z0] +
(0.07755867751288839+0j) [Z0 Z1] +
(-0.0025837417313018998+0j) [Z0 X2 X3] +
(-0.0025837417313018998+0j) [Z0 Y2 Y3] +
(0.07733247653566544+0j) [Z0 Z2] +
(0.09333330628587891+0j) [Z0 Z3] +
(0.009461086978084416+0j) [Z0 X4 X5] +
(0.009461086978084416+0j) [Z0 Y4 Y5] +
(0.11171627890094822+0j) [Z0 Z4] +
(0.10416313162196875+0j) [Z0 Z5] +
(-0.008821906268083685+0j) [Z0 X6 X7] +
(-0.008821906268083685+0j) [Z0 Y6 Y7] +
(0.10226724417373223+0j) [Z0 Z6] +
(0.1110093491339249+0j) [Z0 Z7] +
(0.010646150610004408+0j) [X1 X2 X4 Z5 X6] +
(-0.012634174981636702+0j) [X1 X2 X4 Z5 Z6 X7] +
(0.010646150610004408+0j) [X1 X2 Y4 Z5 Y6] +
(-0.012634174981636702+0j) [X1 X2 Y4 Z5 Z6 Y7] +
(0.01934883030685017+0j) [X1 X2 X5 X6] +
(-0.008901638567159004+0j) [X1 X2 X5 Z6 X7] +
(0.01934883030685017+0j) [X1 X2 Y5 Y6] +
(-0.008901638567159004+0j) [X1 X2 Y5 Z6 Y7] +
(-0.02405865607179162+0j) [X1 Z2 X3 X4 Z5 X6] +
(-0.008407495254282365+0j) [X1 Z2 X3 X4 Z5 Z6 X7] +
(-0.02405865607179162+0j) [X1 Z2 X3 Y4 Z5 Y6] +
(-0.008407495254282365+0j) [X1 Z2 X3 Y4 Z5 Z6 Y7] +
(-0.008901638567159004+0j) [X1 Z2 X3 X5 X6] +
(0.02661467635818076+0j) [X1 Z2 X3 X5 Z6 X7] +
(-0.008901638567159004+0j) [X1 Z2 X3 Y5 Y6] +
(0.02661467635818076+0j) [X1 Z2 X3 Y5 Z6 Y7] +
(0.010646150610004408+0j) [Y1 Y2 X4 Z5 X6] +
(-0.012634174981636702+0j) [Y1 Y2 X4 Z5 Z6 X7] +
(0.010646150610004408+0j) [Y1 Y2 Y4 Z5 Y6] +
(-0.012634174981636702+0j) [Y1 Y2 Y4 Z5 Z6 Y7] +
(0.01934883030685017+0j) [Y1 Y2 X5 X6] +
(-0.008901638567159004+0j) [Y1 Y2 X5 Z6 X7] +
(0.01934883030685017+0j) [Y1 Y2 Y5 Y6] +
(-0.008901638567159004+0j) [Y1 Y2 Y5 Z6 Y7] +
(-0.02405865607179162+0j) [Y1 Z2 Y3 X4 Z5 X6] +
(-0.008407495254282365+0j) [Y1 Z2 Y3 X4 Z5 Z6 X7] +
(-0.02405865607179162+0j) [Y1 Z2 Y3 Y4 Z5 Y6] +
(-0.008407495254282365+0j) [Y1 Z2 Y3 Y4 Z5 Z6 Y7] +
(-0.008901638567159004+0j) [Y1 Z2 Y3 X5 X6] +
(0.02661467635818076+0j) [Y1 Z2 Y3 X5 Z6 X7] +
(-0.008901638567159004+0j) [Y1 Z2 Y3 Y5 Y6] +
(0.02661467635818076+0j) [Y1 Z2 Y3 Y5 Z6 Y7] +
(0.07873792608304384+0j) [Z1] +
(-0.00523830590529105+0j) [Z1 X2 X3] +
(-0.00523830590529105+0j) [Z1 Y2 Y3] +
(0.08417436673290517+0j) [Z1 Z2] +
(0.07928157442541509+0j) [Z1 Z3] +
(-0.002045316086697597+0j) [Z1 X4 X5] +
(-0.002045316086697597+0j) [Z1 Y4 Y5] +
(0.10416313162196875+0j) [Z1 Z4] +
(0.10702518092938991+0j) [Z1 Z5] +
(0.0036633326618679546+0j) [Z1 X6 X7] +
(0.0036633326618679546+0j) [Z1 Y6 Y7] +
(0.10352319703975532+0j) [Z1 Z6] +
(0.10589625078359582+0j) [Z1 Z7] +
(-0.004483252597706383+0j) [X2 X3] +
(-0.024395190370696845+0j) [X2 X3 X4 X5] +
(-0.024395190370696845+0j) [X2 X3 Y4 Y5] +
(-0.008821906268083685+0j) [X2 X3 Z4] +
(0.0036633326618679546+0j) [X2 X3 Z5] +
(0.025689949571830042+0j) [X2 X3 X6 X7] +
(0.025689949571830042+0j) [X2 X3 Y6 Y7] +
(0.007649625311503733+0j) [X2 X3 Z6] +
(-0.012996931212451403+0j) [X2 X3 Z7] +
(-0.004483252597706383+0j) [Y2 Y3] +
(-0.024395190370696845+0j) [Y2 Y3 X4 X5] +
(-0.024395190370696845+0j) [Y2 Y3 Y4 Y5] +
(-0.008821906268083685+0j) [Y2 Y3 Z4] +
(0.0036633326618679546+0j) [Y2 Y3 Z5] +
(0.025689949571830042+0j) [Y2 Y3 X6 X7] +
(0.025689949571830042+0j) [Y2 Y3 Y6 Y7] +
(0.007649625311503733+0j) [Y2 Y3 Z6] +
(-0.012996931212451403+0j) [Y2 Y3 Z7] +
(0.07666866090982398+0j) [Z2] +
(0.07784794028451397+0j) [Z2 Z3] +
(-0.007801932778402895+0j) [Z2 X4 X5] +
(-0.007801932778402895+0j) [Z2 Y4 Y5] +
(0.10226724417373223+0j) [Z2 Z4] +
(0.10352319703975532+0j) [Z2 Z5] +
(0.007649625311503733+0j) [Z2 X6 X7] +
(0.007649625311503733+0j) [Z2 Y6 Y7] +
(0.1091589968106852+0j) [Z2 Z6] +
(0.10353788985634402+0j) [Z2 Z7] +
(-0.12227609382406271+0j) [Z3] +
(0.013474635539233077+0j) [Z3 X4 X5] +
(0.013474635539233077+0j) [Z3 Y4 Y5] +
(0.1110093491339249+0j) [Z3 Z4] +
(0.10589625078359582+0j) [Z3 Z5] +
(-0.012996931212451403+0j) [Z3 X6 X7] +
(-0.012996931212451403+0j) [Z3 Y6 Y7] +
(0.10353788985634402+0j) [Z3 Z6] +
(0.11970161375543707+0j) [Z3 Z7] +
(-0.0020776113200212066+0j) [X4 X5] +
(-0.011761015389060145+0j) [X4 X5 X6 X7] +
(-0.0003365342989052316+0j) [X4 X5 Y6 Y7] +
(0.002844217831601514+0j) [X4 X5 Z6] +
(0.005067140284950715+0j) [X4 X5 Z7] +
(-0.011424481090154913+0j) [X4 Y5 Y6 X7] +
(-0.011424481090154913+0j) [Y4 X5 X6 Y7] +
(-0.0020776113200212066+0j) [Y4 Y5] +
(-0.0003365342989052316+0j) [Y4 Y5 X6 X7] +
(-0.011761015389060145+0j) [Y4 Y5 Y6 Y7] +
(0.002844217831601514+0j) [Y4 Y5 Z6] +
(0.005067140284950715+0j) [Y4 Y5 Z7] +
(0.23477912416223978+0j) [Z4] +
(0.07755867751288839+0j) [Z4 Z5] +
(-0.0025837417313018998+0j) [Z4 X6 X7] +
(-0.0025837417313018998+0j) [Z4 Y6 Y7] +
(0.07733247653566544+0j) [Z4 Z6] +
(0.09333330628587891+0j) [Z4 Z7] +
(0.07873792608304378+0j) [Z5] +
(-0.00523830590529105+0j) [Z5 X6 X7] +
(-0.00523830590529105+0j) [Z5 Y6 Y7] +
(0.08417436673290517+0j) [Z5 Z6] +
(0.07928157442541509+0j) [Z5 Z7] +
(-0.004483252597706375+0j) [X6 X7] +
(-0.004483252597706375+0j) [Y6 Y7] +
(0.07666866090982404+0j) [Z6] +
(0.07784794028451397+0j) [Z6 Z7] +
(-0.12227609382406274+0j) [Z7]
Loading