From 856e33d0e7863d1163646052b2d7934748773498 Mon Sep 17 00:00:00 2001 From: Valentin Senicourt <41597680+ValentinS4t1qbit@users.noreply.github.com> Date: Mon, 8 Aug 2022 14:02:24 -0700 Subject: [PATCH 01/12] Bump develop to 0.3.2 (#188) * New release v0.3.2 into main (#187) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Co-authored-by: James Brown Co-authored-by: JamesB-1qbit <84878946+JamesB-1qbit@users.noreply.github.com> Co-authored-by: MPCoons <84400409+MPCoons@users.noreply.github.com> Co-authored-by: elloyd-1qbit <58313607+elloyd-1qbit@users.noreply.github.com> Co-authored-by: KrzysztofB-1qbit <86750444+KrzysztofB-1qbit@users.noreply.github.com> Co-authored-by: Rudi Plesch Co-authored-by: GitHub Actions --- .github/workflows/create_release_branch.yml | 2 +- CHANGELOG.md | 23 +++++++++++++++++++++ tangelo/_version.py | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create_release_branch.yml b/.github/workflows/create_release_branch.yml index a67e8c4c2..cb5042794 100644 --- a/.github/workflows/create_release_branch.yml +++ b/.github/workflows/create_release_branch.yml @@ -20,7 +20,7 @@ jobs: git config user.email noreply@github.com - name: Change version number and name run: | - sed -i 's/__version__ = .*/__version__ = "${{ github.event.inputs.versionName }}"/' tangelo/_version.py + sed -i 's/__version__ = .*/__version__ = "${{ github.event.inputs.versionName }}"/' tangelo/_version.py git commit tangelo/_version.py --message "Bumping Tangelo version number in _version.py" # - name: Update Changelog # uses: thomaseizinger/keep-a-changelog-new-release@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b59027a0..192b147dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ This file documents the main changes between versions of the code. +## [0.3.2] - 2022-08-06 + +### Added + +- Linear Combination of Unitaries (LCU) +- QEMIST Cloud MI-FNO innregration: interface adjustments +- iQCC ansatz for VQE +- IonQConnection class and notebook, to facilitate experiments through IonQ's API +- FCISolver active space selection / frozen orbitals: restrictions for half-empty orbitals +- HybridOperator for speedup for QubitOperator on certain operations in stabilizer notation +- Support for symmetry in pyscf computations + +### Changed + +- QEMIST Cloud MI-FNO innregration: interface adjustments +- ADAPT-VQE interface: spin only required when needed +- VQE returns warning or error if no variational parameters are in the ansatz circuit +- Bug fix: scBK reference state, HEA ansatz initialization +- Check for valid number of target qubits for common gates +- Documentation, README + +### Deprecated + ## [0.3.1] - 2022-06-15 ### Added diff --git a/tangelo/_version.py b/tangelo/_version.py index 1debacacf..0c0f6aa1e 100644 --- a/tangelo/_version.py +++ b/tangelo/_version.py @@ -14,4 +14,4 @@ """ Define version number here. It is read in setup.py, and bumped automatically when using the new release Github action. """ -__version__ = '0.3.1' +__version__ = "0.3.2" From 887b2c2d8edf668611635ded5dfcebf1f01582bc Mon Sep 17 00:00:00 2001 From: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:41:20 -0400 Subject: [PATCH 02/12] Formula for estimating n_measurements for exp value to given accuracy updated with simpler form. (#192) --- tangelo/toolboxes/measurements/estimate_measurements.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tangelo/toolboxes/measurements/estimate_measurements.py b/tangelo/toolboxes/measurements/estimate_measurements.py index ab020136e..b022383ef 100644 --- a/tangelo/toolboxes/measurements/estimate_measurements.py +++ b/tangelo/toolboxes/measurements/estimate_measurements.py @@ -47,15 +47,13 @@ def get_measurement_estimate(qb_op, digits=3, method="uniform"): if method not in available_methods: raise NotImplementedError(f"Only available methods are {available_methods}") - scaling_factor = 100**(digits+1) - measurements = dict() for term, coef in qb_op.terms.items(): coef = max(abs(coef.real), abs(coef.imag)) if not term or coef < 10**(-digits): measurements[term] = 0 else: - n_samples = math.floor(scaling_factor * 100**(math.log10(coef))) + n_samples = math.floor((coef / 10**(-(digits+1)))**2) # Assign to dictionary, handle edge case measurements[term] = 100 if n_samples == 1 else n_samples From a370c5f048d94d1d599d2ff54198880aeb8c88cc Mon Sep 17 00:00:00 2001 From: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:42:11 -0400 Subject: [PATCH 03/12] Fix operator_expectation bug qith qubit operator / hamiltonian. (#191) --- tangelo/algorithms/variational/vqe_solver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tangelo/algorithms/variational/vqe_solver.py b/tangelo/algorithms/variational/vqe_solver.py index b3e3c6f81..c0243e800 100644 --- a/tangelo/algorithms/variational/vqe_solver.py +++ b/tangelo/algorithms/variational/vqe_solver.py @@ -388,7 +388,7 @@ def operator_expectation(self, operator, var_params=None, n_active_mos=None, n_a raise TypeError("operator must be a of string, FermionOperator or QubitOperator type.") if isinstance(operator, (str, FermionOperator)): - if (n_active_electrons is None or n_active_sos is None or spin is None) and self.qubit_hamiltonian.mapping == "scbk": + if (n_active_electrons is None or n_active_sos is None or spin is None) and self.qubit_mapping == "scbk": if self.molecule: n_active_electrons = self.molecule.n_active_electrons n_active_sos = self.molecule.n_active_sos @@ -397,10 +397,10 @@ def operator_expectation(self, operator, var_params=None, n_active_mos=None, n_a raise KeyError("Must supply n_active_electrons, n_active_sos, and spin with a FermionOperator and scbk mapping.") self.qubit_hamiltonian = fermion_to_qubit_mapping(fermion_operator=exp_op, - mapping=self.qubit_hamiltonian.mapping, + mapping=self.qubit_mapping, n_spinorbitals=n_active_sos, n_electrons=n_active_electrons, - up_then_down=self.qubit_hamiltonian.up_then_down, + up_then_down=self.up_then_down, spin=spin) self.ansatz.update_var_params(var_params) From 201b3befe554af9cab701fe315dc0f4f42d0d0f3 Mon Sep 17 00:00:00 2001 From: Marc Coons <84400409+MPCoons@users.noreply.github.com> Date: Fri, 12 Aug 2022 19:47:14 -0400 Subject: [PATCH 04/12] iqcc ilc solver fork (#179) iQCC-ILC solver and tests --- CHANGELOG.md | 2 - tangelo/algorithms/variational/__init__.py | 1 + .../algorithms/variational/iqcc_ilc_solver.py | 302 ++++++++++++++++++ tangelo/algorithms/variational/iqcc_solver.py | 36 +-- .../variational/tests/test_iqcc_ilc_solver.py | 91 ++++++ .../variational/tests/test_iqcc_solver.py | 2 +- .../toolboxes/ansatz_generator/_qubit_cc.py | 32 +- .../toolboxes/ansatz_generator/_qubit_ilc.py | 201 +++++++++--- tangelo/toolboxes/ansatz_generator/ilc.py | 122 ++++--- tangelo/toolboxes/ansatz_generator/qcc.py | 32 +- .../ansatz_generator/tests/test_ilc.py | 93 ++++-- .../ansatz_generator/tests/test_qcc.py | 6 +- tangelo/toolboxes/operators/operators.py | 17 + 13 files changed, 733 insertions(+), 204 deletions(-) create mode 100644 tangelo/algorithms/variational/iqcc_ilc_solver.py create mode 100644 tangelo/algorithms/variational/tests/test_iqcc_ilc_solver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 192b147dc..2c94fb5e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,6 @@ This file documents the main changes between versions of the code. - iQCC ansatz for VQE - IonQConnection class and notebook, to facilitate experiments through IonQ's API - FCISolver active space selection / frozen orbitals: restrictions for half-empty orbitals -- HybridOperator for speedup for QubitOperator on certain operations in stabilizer notation -- Support for symmetry in pyscf computations ### Changed diff --git a/tangelo/algorithms/variational/__init__.py b/tangelo/algorithms/variational/__init__.py index 9d46fddcc..e14ef27b4 100644 --- a/tangelo/algorithms/variational/__init__.py +++ b/tangelo/algorithms/variational/__init__.py @@ -17,3 +17,4 @@ from .sa_vqe_solver import SA_VQESolver from .sa_oo_vqe_solver import SA_OO_Solver from .iqcc_solver import iQCC_solver +from .iqcc_ilc_solver import iQCC_ILC_solver diff --git a/tangelo/algorithms/variational/iqcc_ilc_solver.py b/tangelo/algorithms/variational/iqcc_ilc_solver.py new file mode 100644 index 000000000..952f7c1b3 --- /dev/null +++ b/tangelo/algorithms/variational/iqcc_ilc_solver.py @@ -0,0 +1,302 @@ +# Copyright 2021 Good Chemistry Company. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module implements the iQCC-ILC VQE procedure of Refs. 1-2. It is +an iterative and variational approach that combines an ansatz defined +as an exponentiated involutory linear combination (ILC) of mutually +anticommuting Pauli word generators with the QCC ansatz. A small number +of iterations are performed with the ILC ansatz prior to a single energy +evaluation with the QCC ansatz. The advantage of this method over the +iQCC VQE procedure is that Hamiltonian dressing after each iteration +with the set of ILC generators results in quadratic growth of the +number of terms, which is an improvement over the exponential growth +that occurs when QCC generators are used. +Refs: + 1. R. A. Lang, I. G. Ryabinkin, and A. F. Izmaylov. + arXiv:2002.05701v1, 2020, 1–10. + 2. R. A. Lang, I. G. Ryabinkin, and A. F. Izmaylov. + J. Chem. Theory Comput. 2021, 17, 1, 66–78. +""" + +from tangelo.linq import Simulator +from tangelo.toolboxes.ansatz_generator.ilc import ILC +from tangelo.toolboxes.ansatz_generator.qcc import QCC +from tangelo.algorithms.variational.vqe_solver import VQESolver +from tangelo.toolboxes.ansatz_generator._qubit_ilc import ilc_op_dress + + +class iQCC_ILC_solver: + """The iQCC-ILC-VQE solver class combines the both the ILC and ILC ansatze + Classes with the VQESolver class to perform an iterative and variational + procedure to compute the total iQCC-ILC energy for a given Hamiltonian. + The algorithm is outlined below: + (1) For a user-specified number of iterations, compute the ILC energy: + (a) prepare/purify the QMF wave function, obtain the ACS of ILC + generators, and initialize the ILC parameter set; + (b) simulate the ILC energy through VQE minimization + (c) dress the qubit Hamiltonian with the set of ILC generators and + optimal parameters; optional: compress the dressed Hamiltonian + via a technique using the Frobenius norm + (2) With the ILC dressed Hamiltonian, obtain the DIS of QCC generators, + and initialize QCC parameters + (3) Perform a single VQE minimization of the QCC energy functional to + obtain the final iQCC-ILC energy. + Attributes: + molecule (SecondQuantizedMolecule): The molecular system. + qubit_mapping (str): One of the supported qubit mapping identifiers. Default, "jw". + up_then_down (bool): Change basis ordering putting all spin up orbitals first, + followed by all spin down. Default, False. + initial_var_params (str or array-like): Initial values of the variational parameters + for the classical optimizer. + backend_options (dict): Parameters to build the tangelo.linq Simulator + class. + penalty_terms (dict): Parameters for penalty terms to append to target + qubit Hamiltonian (see penaly_terms for more details). + ilc_ansatz_options (dict): Parameters for ILC ansatz (see ILC ansatz + file for details). + qcc_ansatz_options (dict): Parameters for QCC ansatz (see QCC ansatz + file for details). + qubit_hamiltonian (QubitOperator-like): Self-explanatory. + max_ilc_iter (int): maximum number of ILC iterations allowed before termination. + Default, 3. + compress_qubit_ham (bool): controls whether the qubit Hamiltonian is compressed + after dressing with the current set of generators at the end of each ILC iteration. + Default, False. + compress_eps (float): parameter required for compressing intermediate ILC Hamiltonians + using the Froebenius norm. Discarding terms in this manner will not alter the + eigenspectrum of intermediate Hamiltonians by more than compress_eps. + Default, 1.59e-3 Hartree. + verbose (bool): Flag for verbosity. Default, False. + """ + + def __init__(self, opt_dict): + + default_backend_options = {"target": None, "n_shots": None, "noise_model": None} + default_options = {"molecule": None, + "qubit_mapping": "jw", + "up_then_down": False, + "initial_var_params": None, + "backend_options": default_backend_options, + "penalty_terms": None, + "ilc_ansatz_options": dict(), + "qcc_ansatz_options": dict(), + "qubit_hamiltonian": None, + "max_ilc_iter": 3, + "compress_qubit_ham": False, + "compress_eps": 1.59e-3, + "verbose": False} + + # Initialize with default values + self.__dict__ = default_options + # Overwrite default values with user-provided ones, if they correspond to a valid keyword + for param, val in opt_dict.items(): + if param in default_options: + setattr(self, param, val) + else: + raise KeyError(f"The keyword {param} is not available in self.__class__.__name__.") + + if not self.molecule and not self.qubit_hamiltonian: + raise ValueError("An instance of SecondQuantizedMolecule or QubitOperator " + "is required for initializing self.__class__.__name__.") + + # initialize variables and lists to store useful data from each ILC-VQE iteration + self.energies = [] + self.iteration = 0 + self.terminate_ilc = False + self.qmf_energy = None + self.ilc_ansatz = None + self.qcc_ansatz = None + self.vqe_solver = None + self.vqe_solver_options = None + self.final_optimal_energy = None + self.final_optimal_qmf_params = None + self.final_optimal_ilc_params = None + self.final_optimal_qcc_params = None + + def build(self): + """Builds the underlying objects required to run the ILC-VQE algorithm.""" + + # instantiate the ILC ansatz but do not build it here because vqe_solver builds it + self.ilc_ansatz = ILC(self.molecule, self.qubit_mapping, self.up_then_down, **self.ilc_ansatz_options) + + # build an instance of VQESolver with options that remain fixed during the ILC-VQE routine + self.vqe_solver_options = {"qubit_hamiltonian": self.ilc_ansatz.qubit_ham, + "qubit_mapping": self.qubit_mapping, + "ansatz": self.ilc_ansatz, + "initial_var_params": self.initial_var_params, + "backend_options": self.backend_options, + "penalty_terms": self.penalty_terms, + "up_then_down": self.up_then_down, + "verbose": self.verbose} + + self.vqe_solver = VQESolver(self.vqe_solver_options) + self.vqe_solver.build() + + def simulate(self): + """Executes the ILC-VQE algorithm. During each iteration, a ILC-VQE minimization + is performed with the current set of generators, amplitudes, and qubit Hamiltonian.""" + + # initialize quantities and compute the QMF energy + sim = Simulator() + self.qmf_energy = sim.get_expectation_value(self.ilc_ansatz.qubit_ham, self.ilc_ansatz.qmf_circuit) + if self.verbose: + print(f"The qubit mean field energy = {self.qmf_energy}") + + # perform self.max_ilc_iter ILC-VQE minimizations; + e_ilc = 0. + while not self.terminate_ilc: + # check that the ACS has at least one ILC generator to use; if not, terminate + if self.ilc_ansatz.acs and self.ilc_ansatz.var_params.any(): + e_ilc = self.vqe_solver.simulate() + else: + self.terminate_ilc = True + if self.verbose: + print("Terminating the ILC-VQE solver: the ACS of ILC generators is empty.") + # update ILC-VQE simulation data + if not self.terminate_ilc: + self._update_ilc_solver(e_ilc) + + # perform a single QCC-VQE minimization to obtain the final iQCC-ILC energy + # need to rebuild VQE Solver for the QCC ansatz first + self._build_qcc() + + # check that the DIS has at least one QCC generator to use + if self.qcc_ansatz.dis and self.qcc_ansatz.var_params.any(): + e_iqcc_ilc = self.vqe_solver.simulate() + self._update_qcc_solver(e_iqcc_ilc) + else: + if self.verbose: + print("Terminating the iQCC-ILC solver without evaluating the " + "the final QCC energy because the DIS of QCC generators " + "is empty for the given Hamiltonian.") + + return self.energies[-1] + + def get_resources(self): + """Returns the quantum resource estimates for the final + ILC-QCC-VQE iteration.""" + + return self.vqe_solver.get_resources() + + def _build_qcc(self): + """Builds the underlying QCC objects required to run the second part of the + iQCC-ILC-VQE algorithm.""" + + # instantiate the QCC ansatz with the final ILC dressed Hamiltonian and optimal QMF params + self.qcc_ansatz_options["qmf_var_params"] = self.final_optimal_qmf_params + self.qcc_ansatz_options["qubit_ham"] = self.ilc_ansatz.qubit_ham + self.qcc_ansatz = QCC(self.molecule, self.qubit_mapping, self.up_then_down, **self.qcc_ansatz_options) + + # build an instance of VQESolver with options that remain fixed during the ILC-VQE routine + self.vqe_solver_options = {"qubit_mapping": self.qubit_mapping, + "ansatz": self.qcc_ansatz, + "initial_var_params": self.initial_var_params, + "backend_options": self.backend_options, + "penalty_terms": self.penalty_terms, + "up_then_down": self.up_then_down, + "qubit_hamiltonian": self.ilc_ansatz.qubit_ham, + "verbose": self.verbose} + + self.vqe_solver = VQESolver(self.vqe_solver_options) + self.vqe_solver.build() + + def _update_ilc_solver(self, e_ilc): + """This function serves several purposes for the ILC-VQE solver + part of the iQCC-ILC algorithm: + + (1) Updates the ILC energy, generators, QMF Bloch angles, + ILC amplitudes, circuits, number of qubit Hamiltonian terms, + and quantum resource estimates; + (2) Dresses and compresses (optional) the qubit Hamiltonian + with the generators and optimal amplitudes for the current + iteration; + (3) Prepares for the next iteration by rebuilding the DIS & ACS, + reinitializing ILC parameters for the new set of generators, + generating the circuit, and updating the classical optimizer. + + Args: + e_ilc (float): the total ILC ansatz energy at the current iteration. + """ + + # get the optimal variational parameters and split them for qmf and ilc + n_qubits = self.ilc_ansatz.n_qubits + optimal_qmf_var_params = self.vqe_solver.optimal_var_params[:2*n_qubits] + optimal_ilc_var_params = self.vqe_solver.optimal_var_params[2*n_qubits:] + + # update energy list and iteration number + self.energies.append(e_ilc) + self.iteration += 1 + + if self.verbose: + print(f"Iteration # {self.iteration}") + print(f"ILC total energy = {e_ilc} Eh") + print(f"ILC correlation energy = {e_ilc-self.qmf_energy} Eh") + print(f"Optimal QMF variational parameters = {optimal_qmf_var_params}") + print(f"Optimal ILC variational parameters = {optimal_ilc_var_params}") + print(f"# of ILC generators = {len(self.ilc_ansatz.acs)}") + print(f"ILC generators = {self.ilc_ansatz.acs}") + print(f"ILC resource estimates = {self.get_resources()}") + if self.iteration == 1: + n_qham_terms = self.ilc_ansatz.qubit_ham.get_max_number_hamiltonian_terms(n_qubits) + print(f"Maximum number of qubit Hamiltonian terms = {n_qham_terms}") + + # dress and (optionally) compress the qubit Hamiltonian for the next iteration + self.ilc_ansatz.qubit_ham = ilc_op_dress(self.ilc_ansatz.qubit_ham, self.ilc_ansatz.acs, + optimal_ilc_var_params) + if self.compress_qubit_ham: + self.ilc_ansatz.qubit_ham.frobenius_norm_compression(self.compress_eps, n_qubits) + + # set dis, acs, and var_params to none to rebuild the dis & acs and initialize new parameters + self.ilc_ansatz.dis = None + self.ilc_ansatz.acs = None + self.ilc_ansatz.var_params = None + self.ilc_ansatz.build_circuit() + + self.vqe_solver.qubit_hamiltonian = self.ilc_ansatz.qubit_ham + self.vqe_solver.initial_var_params = self.ilc_ansatz.var_params + + if self.iteration == self.max_ilc_iter: + self.terminate_ilc = True + self.final_optimal_qmf_params = optimal_qmf_var_params + self.final_optimal_ilc_params = optimal_ilc_var_params + if self.verbose: + print(f"Terminating the ILC-VQE solver after {self.max_ilc_iter} iterations.") + + def _update_qcc_solver(self, e_iqcc_ilc): + """Updates after the final QCC energy evaluation with the final ILC dressed + Hamiltonian. + + Args: + e_iqcc_ilc (float): the final iQCC-ILC ansatz energy. + """ + + # get the optimal variational parameters and split them for qmf and qcc ansatze + n_qubits = self.qcc_ansatz.n_qubits + self.final_optimal_qmf_var_params = self.vqe_solver.optimal_var_params[:2*n_qubits] + self.final_optimal_qcc_var_params = self.vqe_solver.optimal_var_params[2*n_qubits:] + + # update energy list + self.final_optimal_energy = e_iqcc_ilc + self.energies.append(e_iqcc_ilc) + + if self.verbose: + print("Final iQCC-ILC VQE simulation.") + print(f"iQCC-ILC total energy = {e_iqcc_ilc} Eh") + print(f"iQCC-ILC correlation energy = {e_iqcc_ilc-self.qmf_energy} Eh") + print(f"Optimal QMF variational parameters = {self.final_optimal_qmf_var_params}") + print(f"Optimal QCC variational parameters = {self.final_optimal_qcc_var_params}") + print(f"# of QCC generators = {len(self.qcc_ansatz.dis)}") + print(f"QCC generators = {self.qcc_ansatz.dis}") + print(f"QCC resource estimates = {self.get_resources()}") diff --git a/tangelo/algorithms/variational/iqcc_solver.py b/tangelo/algorithms/variational/iqcc_solver.py index cd90459e3..ac30cecd2 100644 --- a/tangelo/algorithms/variational/iqcc_solver.py +++ b/tangelo/algorithms/variational/iqcc_solver.py @@ -21,9 +21,7 @@ for the iQCC approach relative to the native QCC method. A caveat is that after each iteration, the qubit Hamiltonian is dressed with the generators and optimal parameters, the result of which is an -exponential growth of the number of terms. A technique also described -in Ref. 1 can be utilized to address this issue by discarding some -terms based on the Frobenius norm of the Hamiltonian. +exponential growth of the number of terms. Refs: 1. I. G. Ryabinkin, R. A. Lang, S. N. Genin, and A. F. Izmaylov. @@ -88,7 +86,7 @@ class iQCC_solver: using the Froebenius norm. Discarding terms in this manner will not alter the eigenspeectrum of intermediate Hamiltonians by more than compress_eps. Default, 1.59e-3 Hartree. - verbose (bool): Flag for verbosity of iQCCsolver. Default, False. + verbose (bool): Flag for verbosity. Default, False. """ def __init__(self, opt_dict): @@ -116,10 +114,10 @@ def __init__(self, opt_dict): if param in default_options: setattr(self, param, val) else: - raise KeyError(f"Keyword :: {param}, not available in iQCCsolver") + raise KeyError(f"Keyword {param} not available in self.__class__.__name__.") if not self.molecule: - raise ValueError("An instance of SecondQuantizedMolecule is required for initializing iQCCsolver.") + raise ValueError("An instance of SecondQuantizedMolecule is required for initializing self.__class__.__name__.") # initialize variables and lists to store useful data from each iQCC-VQE iteration self.energies = [] @@ -149,6 +147,7 @@ def build(self): "up_then_down": self.up_then_down, "qubit_hamiltonian": self.qubit_hamiltonian, "verbose": self.verbose} + self.vqe_solver = VQESolver(self.vqe_solver_options) self.vqe_solver.build() @@ -233,8 +232,19 @@ def _update_iqcc_solver(self, delta_eqcc): optimal_qmf_var_params = self.vqe_solver.optimal_var_params[:2*n_qubits] optimal_qcc_var_params = self.vqe_solver.optimal_var_params[2*n_qubits:] - # update all lists with data from the current iteration + # update energy list and iteration number self.energies.append(self.vqe_solver.optimal_energy) + self.iteration += 1 + + if self.verbose: + print(f"Iteration # {self.iteration}") + print(f"iQCC total energy = {self.vqe_solver.optimal_energy} Eh") + print(f"iQCC correlation energy = {self.vqe_solver.optimal_energy-self.qmf_energy} Eh") + print(f"Optimal QMF variational parameters = {optimal_qmf_var_params}") + print(f"Optimal QCC variational parameters = {optimal_qcc_var_params}") + print(f"Number of iQCC generators = {len(self.qcc_ansatz.dis)}") + print(f"iQCC generators = {self.qcc_ansatz.dis}") + print(f"iQCC resource estimates = {self.get_resources()}") # dress and (optionally) compress the qubit Hamiltonian self.qcc_ansatz.qubit_ham = qcc_op_dress(self.qcc_ansatz.qubit_ham, self.qcc_ansatz.dis, @@ -248,18 +258,6 @@ def _update_iqcc_solver(self, delta_eqcc): self.qcc_ansatz.build_circuit() self.vqe_solver.initial_var_params = self.qcc_ansatz.var_params - self.iteration += 1 - - if self.verbose: - print(f"Iteration # {self.iteration}") - print(f"iQCC total energy = {self.vqe_solver.optimal_energy} Eh") - print(f"iQCC correlation energy = {self.vqe_solver.optimal_energy-self.qmf_energy} Eh") - print(f"Optimal QMF variational parameters = {optimal_qmf_var_params}") - print(f"Optimal QCC variational parameters = {optimal_qcc_var_params}") - print(f"Number of iQCC generators = {len(self.qcc_ansatz.dis)}") - print(f"iQCC generators = {self.qcc_ansatz.dis}") - print(f"iQCC resource estimates = {self.get_resources()}") - if abs(delta_eqcc) < self.deqcc_thresh or self.iteration == self.max_iqcc_iter: self.converged = True self.final_optimal_energy = self.vqe_solver.optimal_energy diff --git a/tangelo/algorithms/variational/tests/test_iqcc_ilc_solver.py b/tangelo/algorithms/variational/tests/test_iqcc_ilc_solver.py new file mode 100644 index 000000000..6c3fad596 --- /dev/null +++ b/tangelo/algorithms/variational/tests/test_iqcc_ilc_solver.py @@ -0,0 +1,91 @@ +# Copyright 2021 Good Chemistry Company. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for the closed-shell and restricted open-shell iQCC-ILC solver.""" + +import unittest + +from tangelo.algorithms.variational import iQCC_ILC_solver +from tangelo.molecule_library import mol_H2_sto3g, mol_H4_sto3g_symm, mol_H4_cation_sto3g + + +class iQCC_ILC_solver_test(unittest.TestCase): + """Unit tests for the iQCC_ILC_solver class. Examples for both closed-shell + and restricted open-shell iQCC-ILC are provided via H4 and H4+. + """ + + @staticmethod + def test_build_success(): + """Test instantation of the iQCC-ILC solver with user-defined input.""" + + iqcc_ilc_options = {"molecule": mol_H2_sto3g, + "qubit_mapping": "scbk", + "up_then_down": True, + "max_ilc_iter": 25, + "compress_qubit_ham": True, + "compress_eps": 1e-4} + + iqcc_ilc = iQCC_ILC_solver(iqcc_ilc_options) + iqcc_ilc.build() + + def test_build_fail(self): + """Test that instantation of the iQCC-ILC solver fails without input of a molecule.""" + + iqcc_ilc_options = {"max_ilc_iter": 15} + self.assertRaises(ValueError, iQCC_ILC_solver, iqcc_ilc_options) + + def test_iqcc_ilc_h4(self): + """Test the energy after 1 iteration for H4.""" + + ilc_ansatz_options = {"max_ilc_gens": None} + qcc_ansatz_options = {"max_qcc_gens": None} + + iqcc_ilc_options = {"molecule": mol_H4_sto3g_symm, + "qubit_mapping": "scbk", + "up_then_down": True, + "ilc_ansatz_options": ilc_ansatz_options, + "qcc_ansatz_options": qcc_ansatz_options, + "max_ilc_iter": 1} + + iqcc_ilc_solver = iQCC_ILC_solver(iqcc_ilc_options) + iqcc_ilc_solver.build() + iqcc_ilc_energy = iqcc_ilc_solver.simulate() + + self.assertAlmostEqual(iqcc_ilc_energy, -1.976817, places=4) + + def test_iqcc_ilc_h4_cation(self): + """Test the energy after 2 iterations for H4+ using the maximum + number of generators and compressing the qubit Hamiltonian.""" + + ilc_ansatz_options = {"max_ilc_gens": None} + qcc_ansatz_options = {"max_qcc_gens": None} + + iqcc_ilc_options = {"molecule": mol_H4_cation_sto3g, + "qubit_mapping": "scbk", + "up_then_down": True, + "ilc_ansatz_options": ilc_ansatz_options, + "qcc_ansatz_options": qcc_ansatz_options, + "max_ilc_iter": 2, + "compress_qubit_ham": True, + "compress_eps": 1e-4} + + iqcc_ilc_solver = iQCC_ILC_solver(iqcc_ilc_options) + iqcc_ilc_solver.build() + iqcc_ilc_energy = iqcc_ilc_solver.simulate() + + self.assertAlmostEqual(iqcc_ilc_energy, -1.638197, places=4) + + +if __name__ == "__main__": + unittest.main() diff --git a/tangelo/algorithms/variational/tests/test_iqcc_solver.py b/tangelo/algorithms/variational/tests/test_iqcc_solver.py index 2c18693ef..cb1242786 100644 --- a/tangelo/algorithms/variational/tests/test_iqcc_solver.py +++ b/tangelo/algorithms/variational/tests/test_iqcc_solver.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for the closed-shell and restricted open-shell iQCC-VQE Solver. """ +"""Unit tests for the closed-shell and restricted open-shell iQCC VQE Solver. """ import unittest diff --git a/tangelo/toolboxes/ansatz_generator/_qubit_cc.py b/tangelo/toolboxes/ansatz_generator/_qubit_cc.py index ee6f04f27..4a0d5d74f 100644 --- a/tangelo/toolboxes/ansatz_generator/_qubit_cc.py +++ b/tangelo/toolboxes/ansatz_generator/_qubit_cc.py @@ -161,17 +161,16 @@ def get_gens_from_idxs(group_idxs): return dis_group_gens -def build_qcc_qubit_op(dis_gens, amplitudes): - """Returns the QCC operator by selecting n_var_params generators from the DIS. +def build_qcc_qubit_op(dis_gens, taus): + """Returns the QCC operator with generators selected from the DIS. The QCC operator is constructed as a linear combination of generators using the - parameter set {tau} as coefficients: QCC operator = -0.5 * SUM_k P_k * tau_k. - The exponentiated QCC operator, U = PROD_k exp(-0.5j * tau_k * P_k), is used to - build the circuit. + taus parameter set: QCC operator = -0.5 * SUM_k P_k * tau_k. The exponentiated + QCC operator, U = PROD_k exp(-0.5j * tau_k * P_k), is used to build the circuit. Args: dis_gens (list of QubitOperator): The list of QCC Pauli word generators selected from a user-specified number of characteristic DIS groups. - amplitudes (list or numpy array of float): The QCC variational parameters + taus (list or numpy array of float): The QCC variational parameters arranged such that their ordering matches the order of dis_gens. Returns: @@ -180,25 +179,23 @@ def build_qcc_qubit_op(dis_gens, amplitudes): qubit_op = QubitOperator.zero() for i, dis_gen in enumerate(dis_gens): - qubit_op -= 0.5 * amplitudes[i] * dis_gen + qubit_op -= 0.5 * taus[i] * dis_gen qubit_op.compress() return qubit_op -def qcc_op_dress(qubit_op, dis_gens, amplitudes): +def qcc_op_dress(qubit_op, dis_gens, taus): """Performs canonical transformation of a qubit operator with the set of QCC - generators and amplitudes for the current iteration. For an operator with M terms - each transformation results in exponential growth of the number terms. This growth - can be approximated as M * (3 / 2) ^ n_g, where n_g is the number of QCC generators + generators and amplitudes. For an operator with M terms, each transformation + results in exponential growth of the number terms. This growth can be + approximated as M * (3 / 2) ^ n_g, where n_g is the number of QCC generators selected for the ansatz at the current iteration. Args: - qubit_op (QubitOperator): A qubit operator (e.g., a molecular Hamiltonian or the - electronic spin and number operators) that was previously dressed by canonical - transformation with the QCC generators and amplitudes at the current iteration. + qubit_op (QubitOperator): A qubit operator to be dressed. dis_gens (list of QubitOperator): The list of QCC Pauli word generators - selected from a user-specified number of characteristic DIS groups. - amplitudes (list or numpy array of float): The QCC variational parameters + selected from characteristic DIS groups. + taus (list or numpy array of float): The QCC variational parameters arranged such that their ordering matches the ordering of dis_gens. Returns: @@ -206,7 +203,6 @@ def qcc_op_dress(qubit_op, dis_gens, amplitudes): """ for i, gen in enumerate(dis_gens): - comm = commutator(qubit_op, gen) - qubit_op += .5 * ((1. - cos(amplitudes[i])) * gen - 1j * sin(amplitudes[i])) * comm + qubit_op += .5 * ((1. - cos(taus[i])) * gen - 1j * sin(taus[i])) * commutator(qubit_op, gen) qubit_op.compress() return qubit_op diff --git a/tangelo/toolboxes/ansatz_generator/_qubit_ilc.py b/tangelo/toolboxes/ansatz_generator/_qubit_ilc.py index 419c17cc2..f5d5fed92 100644 --- a/tangelo/toolboxes/ansatz_generator/_qubit_ilc.py +++ b/tangelo/toolboxes/ansatz_generator/_qubit_ilc.py @@ -22,35 +22,37 @@ arXiv:2002.05701v1, 2020, 1–10. 2. R. A. Lang, I. G. Ryabinkin, and A. F. Izmaylov. J. Chem. Theory Comput. 2021, 17, 1, 66–78. - 3. Ç. K. Koç and S. N. Arachchige. - J. Parallel Distrib. Comput., 1991, 13, 118–122. """ import warnings +from math import acos, sin, sqrt import scipy import numpy as np +from openfermion import commutator from tangelo.toolboxes.operators.operators import QubitOperator from tangelo.toolboxes.ansatz_generator._qubit_mf import get_op_expval -def construct_acs(dis, max_ilc_gens, n_qubits): +def construct_acs(dis, n_qubits): """Driver function for constructing the anticommuting set of generators from the direct interaction set (DIS) of QCC generators. Args: dis (list of list): DIS of QCC generators. - max_ilc_gens (int): maximum number of ILC generators allowed in the ansatz. n_qubits (int): number of qubits Returns: list of QubitOperator: the anticommuting set (ACS) of ILC generators """ - bad_sln_idxs, good_sln = [], False + bad_sln_idxs = [] + n_dis_groups = len(dis) + + good_sln = False while not good_sln: - gen_idxs, ilc_gens = [idx for idx in range(max_ilc_gens) if idx not in bad_sln_idxs], [] + gen_idxs, ilc_gens = [idx for idx in range(n_dis_groups) if idx not in bad_sln_idxs], [] n_gens = len(gen_idxs) ng2, ngnq = n_gens * (n_gens + 1) // 2, n_gens * n_qubits @@ -115,9 +117,9 @@ def construct_acs(dis, max_ilc_gens, n_qubits): def gauss_elim_over_gf2(a_mat, b_vec=None): """Driver function that performs Gaussian elimination to solve A * z = b - over the binary field where b is the known solution vector. This routine - was adapted based on Ref. 3. All elements of a_mat and b_vec are assumed - to be the integers 0 or 1. + over the binary field where b is the known solution vector. The elements + of a_mat and b_vec need to be 0 or 1. If they are not provided as such, + they will be transformed accordingly. Args: a_mat (numpy array of int): rectangular matrix of dimension n x m that @@ -127,62 +129,87 @@ def gauss_elim_over_gf2(a_mat, b_vec=None): initial solution of A * z. Default, np.zeros((n, 1)). Returns: - numpy array of float: solution for the z vector of dimension (n, ) + numpy array of int: solution for the z vector of dimension (n, ) """ + # check that b_vec was provided properly; otherwise initialize as a vector of zeros n_rows, n_cols = np.shape(a_mat) - z_vals, z_sln, piv_idx = [], [-1] * n_cols, 0 - # check that b_vec was properly supplied; ortherwise initialize as a vector of zeros if not isinstance(b_vec, np.ndarray): b_vec = np.zeros((n_rows, 1)) - a_mat = np.append(a_mat, b_vec, axis=1) + + # append the initial solution vector as the last column of a_mat; update n_cols + a_mat = np.concatenate((a_mat, b_vec), axis=1).astype('int8') n_cols += 1 + + # force all entries of a_mat to be either 0 or 1. + if (abs(a_mat) > 1).any(): + warnings.warn("Reducing input matrix elements modulo 2 to create a binary matrix.", RuntimeWarning) + a_mat = (a_mat % 2).astype('int8') + + # remove duplicate rows if they exist + _, row_idxs = np.unique([tuple(row) for row in a_mat], axis=0, return_index=True) + a_mat_new = a_mat[np.sort(row_idxs)] + if a_mat_new.shape[0] != a_mat.shape[0]: + warnings.warn("Linear dependency detected in input matrix: redundant rows deleted.", RuntimeWarning) + a_mat = a_mat_new + + # remove rows of all 0s if they exist + del_idxs = [] + for i in range(a_mat.shape[0]): + if (a_mat[i][:] == 0).all(): + del_idxs.append(i) + if del_idxs: + warnings.warn("Linear dependency detected in input matrix: rows of zeros deleted.", RuntimeWarning) + a_mat = np.delete(a_mat, obj=del_idxs, axis=0) + n_rows = a_mat.shape[0] + + # begin gaussian elimination algorithm + z_sln, piv_idx = [-1]*(n_cols-1), 0 for i in range(n_cols): - a_mat_max, max_idx = 0., piv_idx - # locate the pivot index by searching each row for a non-zero value. + a_mat_max, max_idx = 0, piv_idx + # locate the pivot index by searching each row for a non-zero value for j in range(piv_idx, n_rows): - # if a pivot index is found, set the value to the col index for the row in which it was found + # if a pivot index is found, mark the value of the column index if a_mat[j, i] > a_mat_max: max_idx = j a_mat_max = a_mat[j, i] - # if a pivot index is not found in a given row, reset a_mat_max to -1 and move to the next row - elif j == n_rows-1 and a_mat_max == 0.: + # if a pivot index is not found, reset and move to the next row + elif j == n_rows-1 and a_mat_max == 0: piv_idx = max_idx - a_mat_max = -1. + a_mat_max = -1 # update the matrix by flipping the row and columns to achieve row echelon form - if a_mat_max > 0.: + if a_mat_max > 0: if max_idx > piv_idx: a_mat[[piv_idx, max_idx]] = a_mat[[max_idx, piv_idx]] for j in range(piv_idx + 1, n_rows): - if a_mat[j, i] == 1.: + if a_mat[j, i] == 1: a_mat[j, i:n_cols] = np.fmod(a_mat[j, i:n_cols] + a_mat[piv_idx, i:n_cols], 2) piv_idx += 1 - # extract the solution from the bottom to the top since it is now in row echelon form - b_vec = a_mat[0:n_rows, n_cols-1].tolist() - for i in range(n_rows - 1, -1, -1): - col_idx, z_free = -1., [] - for j in range(n_cols-1): - if a_mat[i, j] == 1.: - if col_idx == -1: - col_idx = j - else: - z_free.append(j) - if col_idx >= 0.: - z_vals.append([col_idx, z_free, b_vec[i]]) - # check for free solutions -- select 0 for the free solution - # for the ILC generator screening procedure, 0 leads to an I op and 1 leads to a Z Pauli op - for z_val in (z_vals): - b_val = z_val[2] - for z_free in (z_val[1]): - if z_sln[z_free] == -1: - z_sln[z_free] = 0. - b_val = np.fmod(b_val + z_sln[z_free], 2) - z_sln[z_val[0]] = b_val - # check that z_sln does not have any -1 values left -- if so, a solution was not found. - for z_val in z_sln: - if z_val == -1: - warnings.warn("Gaussian elimination over GF(2) failed to find a solution.", RuntimeWarning) - return np.array(z_sln) + + # extract the solution: back solve from the last row to the first + for i in range(n_rows-1, -1, -1): + # find the first non-zero coefficient for a row + j = 0 + while a_mat[i, j] == 0 and j < n_cols-2: + j += 1 + # initialize the soln then back solve + b_val = a_mat[i, n_cols-1] + if i == n_rows-1 and j == n_cols-2: + z_sln[j] = int(b_val) + else: + for k in range(j+1, n_cols-1): + if a_mat[i, k] == 1: + if z_sln[k] == -1: + z_sln[k] = 0 + else: + b_val = (b_val + z_sln[k]) % 2 + z_sln[j] = int(b_val) + + # set any remaining free variables to 0 + for i, sln_val in enumerate(z_sln): + if sln_val == -1: + z_sln[i] = 0 + return np.array(z_sln, dtype=int) def get_ilc_params_by_diag(qubit_ham, ilc_gens, qmf_var_params): @@ -215,7 +242,7 @@ def get_ilc_params_by_diag(qubit_ham, ilc_gens, qmf_var_params): # = = 1 qubit_overlap_mat[i, i] = 1. + 0j - for j in range(i + 1, n_var_params): + for j in range(i+1, n_var_params): # = = H_ji qubit_ham_mat[j, i] = get_op_expval(ilc_gens[j] * h_psi_i, qmf_var_params) @@ -234,12 +261,86 @@ def get_ilc_params_by_diag(qubit_ham, ilc_gens, qmf_var_params): gs_coefs *= -1. denom_sum, ilc_var_params = 0., [] for i in range(2): - denom_sum += pow(gs_coefs[i].real, 2.) + pow(gs_coefs[i].imag, 2.) + denom_sum += abs(gs_coefs[i])**2 beta_1 = np.arcsin(gs_coefs[1] / np.sqrt(denom_sum)) ilc_var_params.append(beta_1.real) for i in range(2, n_var_params): - denom_sum += pow(gs_coefs[i].real, 2.) + pow(gs_coefs[i].imag, 2.) + denom_sum += abs(gs_coefs[i])**2 beta = np.arcsin(gs_coefs[i] / np.sqrt(denom_sum)) ilc_var_params.append(beta.real) del ilc_gens[0] return ilc_var_params + + +def build_ilc_qubit_op_list(acs_gens, ilc_params): + """Returns a list of 2N - 1 ILC generators to facilitate generation of a circuit + based on symmetric Trotter-Suzuki decomposition. The ILC generators are ordered + according to Eq. C1 in Appendix C of Ref. 1. + + Args: + acs_gens (list of QubitOperator): The list of ILC Pauli word generators + selected from characteristic ACS groups. + ilc_params (list or numpy array of float): The ILC variational parameters + arranged such that their ordering matches the order of acs_gens. + + Returns: + list of QubitOperator: list of ILC ansatz operator generators. + """ + + n_amps = len(ilc_params) + ilc_op_list = [-.5 * ilc_params[i] * acs_gens[i] for i in range(n_amps-1, 0, -1)] + ilc_op_list += [ilc_params[0] * acs_gens[0]] + ilc_op_list += [-.5 * ilc_params[i] * acs_gens[i] for i in range(1, n_amps)] + return ilc_op_list + + +def ilc_op_dress(qubit_op, ilc_gens, ilc_params): + """Performs transformation of a qubit operator with the ACS of ILC generators and + parameters. For a set of N generators, each qubit operator transformation results + in quadratic (N * (N-1) / 2) growth of the number of its terms. + + Args: + qubit_op (QubitOperator): A qubit operator to be dressed. + ilc_gens (list of QubitOperator): The list of ILC Pauli word generators + selected from a user-specified number of characteristic ACS groups. + ilc_params (list or numpy array of float): The ILC variational parameters + arranged such that their ordering matches the ordering of ilc_gens. + + Returns: + QubitOperator: Dressed qubit operator. + """ + + # first, recast the beta parameters into the set of coefficients {c_n} + n_amps = len(ilc_params) + coef_norm = 1. + coefs = [0.] * n_amps + + # See Ref. 1, Appendix C, Eqs. C3 and C4: + # sin b_n = c_n; sin_b_n-1 = c_n-1 / sqrt(1-|c_n|**2); + # sin_b_n-2 = c_n-2 / sqrt(1-|c_n|**2-|c_n-1|**2) ... + for i in range(n_amps-1, -1, -1): + coef = sqrt(coef_norm) * sin(ilc_params[i]) + coefs[i] = coef + coef_norm -= coef**2 + + # the remainder of coef_norm is |c_0|^2 + coefs.insert(0, -sqrt(coef_norm)) + + # second, recast {c_n} into tau, {alpha_i}; + # c_0 = cos(tau); c_n = sin(tau) * alpha_n for n > 0 + tau = acos(coefs[0]) + sin_tau = sin(tau) + alphas = [coefs[i]/sin_tau for i in range(1, n_amps+1)] + + # third, dress the qubit operator according to Eqs. 17, 18 in Ref. 2 + sin2_tau = sin_tau**2 + sin_2tau = sin(2.*tau) + qop_dress = coefs[0]**2 * qubit_op + for i in range(n_amps): + qop_dress += sin2_tau * alphas[i]**2 * ilc_gens[i] * qubit_op * ilc_gens[i]\ + - .5j * sin_2tau * alphas[i] * commutator(qubit_op, ilc_gens[i]) + for j in range(i+1, n_amps): + qop_dress += sin2_tau * alphas[i] * alphas[j] * (ilc_gens[i] * qubit_op * ilc_gens[j] + + ilc_gens[j] * qubit_op * ilc_gens[i]) + qop_dress.compress() + return qop_dress diff --git a/tangelo/toolboxes/ansatz_generator/ilc.py b/tangelo/toolboxes/ansatz_generator/ilc.py index ba708a0ef..167310df4 100755 --- a/tangelo/toolboxes/ansatz_generator/ilc.py +++ b/tangelo/toolboxes/ansatz_generator/ilc.py @@ -34,11 +34,13 @@ from tangelo.toolboxes.qubit_mappings.mapping_transform import get_qubit_number,\ fermion_to_qubit_mapping from tangelo.linq import Circuit +from tangelo import SecondQuantizedMolecule from tangelo.toolboxes.ansatz_generator.ansatz import Ansatz from tangelo.toolboxes.ansatz_generator.ansatz_utils import exp_pauliword_to_gates from tangelo.toolboxes.ansatz_generator._qubit_mf import init_qmf_from_hf, get_qmf_circuit, purify_qmf_state from tangelo.toolboxes.ansatz_generator._qubit_cc import construct_dis -from tangelo.toolboxes.ansatz_generator._qubit_ilc import construct_acs, get_ilc_params_by_diag +from tangelo.toolboxes.ansatz_generator._qubit_ilc import construct_acs, get_ilc_params_by_diag,\ + build_ilc_qubit_op_list class ILC(Ansatz): @@ -49,7 +51,9 @@ class ILC(Ansatz): state is obtained using a RHF or ROHF Hamiltonian, respectively. Args: - molecule (SecondQuantizedMolecule): The molecular system. + molecule (SecondQuantizedMolecule or dict): The molecular system, which can + be passed as a SecondQuantizedMolecule or a dictionary with keys that + specify n_spinoribtals, n_electrons, and spin. Default, None. mapping (str): One of the supported mapping identifiers. Default, "jw". up_then_down (bool): Change basis ordering putting all spin-up orbitals first, followed by all spin-down. Default, False. @@ -75,10 +79,19 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, acs=None, qmf_circuit=None, qmf_var_params=None, qubit_ham=None, ilc_tau_guess=1e-2, deilc_dtau_thresh=1e-3, max_ilc_gens=None): - if not molecule: - raise ValueError("An instance of SecondQuantizedMolecule is required for initializing " - "the self.__class__.__name__ ansatz class.") + if not molecule and not (isinstance(molecule, SecondQuantizedMolecule) and isinstance(molecule, dict)): + raise ValueError("An instance of SecondQuantizedMolecule or a dict is required for " + "initializing the self.__class__.__name__ ansatz class.") self.molecule = molecule + if isinstance(self.molecule, SecondQuantizedMolecule): + self.n_spinorbitals = self.molecule.n_active_sos + self.n_electrons = self.molecule.n_electrons + self.spin = self.molecule.spin + elif isinstance(self.molecule, dict): + self.n_spinorbitals = self.molecule["n_spinorbitals"] + self.n_electrons = self.molecule["n_electrons"] + self.spin = self.molecule["spin"] + self.mapping = mapping self.up_then_down = up_then_down if self.mapping.lower() == "jw" and not self.up_then_down: @@ -87,31 +100,24 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, acs=None, "with the self.__class__.__name__ ansatz.", RuntimeWarning) self.up_then_down = True - self.n_spinorbitals = self.molecule.n_active_sos if self.n_spinorbitals % 2 != 0: raise ValueError("The total number of spin-orbitals should be even.") - - self.spin = molecule.spin - self.fermi_ham = self.molecule.fermionic_hamiltonian - self.n_electrons = self.molecule.n_electrons self.n_qubits = get_qubit_number(self.mapping, self.n_spinorbitals) self.qubit_ham = qubit_ham - if qubit_ham is None: + if not qubit_ham: self.fermi_ham = self.molecule.fermionic_hamiltonian self.qubit_ham = fermion_to_qubit_mapping(self.fermi_ham, self.mapping, self.n_spinorbitals, self.n_electrons, self.up_then_down, self.spin) - self.qmf_var_params = qmf_var_params - if self.qmf_var_params is None: + self.qmf_var_params = np.array(qmf_var_params) if isinstance(qmf_var_params, list) else qmf_var_params + if not isinstance(self.qmf_var_params, np.ndarray): self.qmf_var_params = init_qmf_from_hf(self.n_spinorbitals, self.n_electrons, self.mapping, self.up_then_down, self.spin) - elif isinstance(self.qmf_var_params, list): - self.qmf_var_params = np.array(self.qmf_var_params) if self.qmf_var_params.size != 2 * self.n_qubits: raise ValueError("The number of QMF variational parameters must be 2 * n_qubits.") - + self.n_qmf_params = 2 * self.n_qubits self.qmf_circuit = qmf_circuit self.acs = acs @@ -119,18 +125,10 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, acs=None, self.deilc_dtau_thresh = deilc_dtau_thresh self.max_ilc_gens = max_ilc_gens - # Get purified QMF parameters and build the DIS & ACS or use a list of generators. - if self.acs is None: - pure_var_params = purify_qmf_state(self.qmf_var_params, self.n_spinorbitals, - self.n_electrons, self.mapping, self.up_then_down, self.spin) - self.dis = construct_dis(self.qubit_ham, pure_var_params, self.deilc_dtau_thresh) - self.max_ilc_gens = len(self.dis) if self.max_ilc_gens is None\ - else min(len(self.dis), self.max_ilc_gens) - self.acs = construct_acs(self.dis, self.max_ilc_gens, self.n_qubits) - self.n_var_params = len(self.acs) - else: - self.dis = None - self.n_var_params = len(self.acs) + # Build the ACS of ILC generators + self.n_ilc_params = 0 + self._get_ilc_generators() + self.n_var_params = self.n_qmf_params + self.n_ilc_params # Supported reference state initialization self.supported_reference_state = {"HF"} @@ -142,7 +140,6 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, acs=None, self.var_params_default = "diag" self.var_params = None self.rebuild_dis = False - self.rebuild_acs = False self.ilc_circuit = None self.circuit = None @@ -172,30 +169,37 @@ def set_var_params(self, var_params=None): # Initialize ILC parameters by matrix diagonalization (see Appendix B, Refs. 1 & 2). elif var_params == "diag": initial_var_params = get_ilc_params_by_diag(self.qubit_ham, self.acs, self.qmf_var_params) + # Insert the QMF variational parameters at the beginning. + initial_var_params = np.concatenate((self.qmf_var_params, initial_var_params)) else: initial_var_params = np.array(var_params) - if initial_var_params.size != self.n_var_params: - raise ValueError(f"Expected {self.n_var_params} variational parameters but " - f"received {initial_var_params.size}.") self.var_params = initial_var_params + if initial_var_params.size != self.n_var_params: + raise ValueError(f"Expected {self.n_var_params} variational parameters but " + f"received {initial_var_params.size}.") return initial_var_params def prepare_reference_state(self): """Returns circuit preparing the reference state of the ansatz (e.g prepare reference wavefunction with HF, multi-reference state, etc). These preparations must be consistent - with the transform used to obtain the operator. """ + with the transform used to obtain the qubit operator. """ if self.default_reference_state not in self.supported_reference_state: raise ValueError(f"Only supported reference state methods are: " f"{self.supported_reference_state}.") if self.default_reference_state == "HF": - reference_state_circuit = get_qmf_circuit(self.qmf_var_params, False) + reference_state_circuit = get_qmf_circuit(self.qmf_var_params, True) return reference_state_circuit def build_circuit(self, var_params=None): """Build and return the quantum circuit implementing the state preparation ansatz (with currently specified initial_state and var_params). """ + # Build the DIS or specify a list of generators; updates the number of QCC parameters + self._get_ilc_generators() + self.n_var_params = self.n_qmf_params + self.n_ilc_params + + # Get the variational parameters needed for the QCC unitary operator and circuit if var_params is not None: self.set_var_params(var_params) elif self.var_params is None: @@ -205,12 +209,12 @@ def build_circuit(self, var_params=None): if self.qmf_circuit is None: self.qmf_circuit = self.prepare_reference_state() - # Build create the list of ILC qubit operators - self.ilc_op_list = self._get_ilc_op() + # Build the QCC ansatz qubit operator + ilc_op_list = build_ilc_qubit_op_list(self.acs, self.var_params[2*self.n_qubits:]) - # Obtain quantum circuit through trotterization of the list of ILC operators + # Obtain quantum circuit corresponding to the list of ILC generators pauli_word_gates = [] - for ilc_op in self.ilc_op_list: + for ilc_op in ilc_op_list: pauli_word, coef = list(ilc_op.terms.items())[0] pauli_word_gates += exp_pauliword_to_gates(pauli_word, coef, variational=True) self.ilc_circuit = Circuit(pauli_word_gates) @@ -226,39 +230,29 @@ def update_var_params(self, var_params): self.set_var_params(var_params) # Build the ILC ansatz operator - self.ilc_op_list = self._get_ilc_op() + ilc_op_list = build_ilc_qubit_op_list(self.acs, self.var_params[2*self.n_qubits:]) pauli_word_gates = [] - for ilc_op in self.ilc_op_list: + for ilc_op in ilc_op_list: pauli_word, coef = list(ilc_op.terms.items())[0] pauli_word_gates += exp_pauliword_to_gates(pauli_word, coef, variational=True) self.ilc_circuit = Circuit(pauli_word_gates) self.circuit = self.qmf_circuit + self.ilc_circuit if self.qmf_circuit.size != 0\ else self.ilc_circuit - def _get_ilc_op(self): - """Returns the ILC operators ordered according to the argument of - Eq. C1, Appendix C, Ref. 1. - - Returns: - list of QubitOperator: the list of ILC qubit operators - """ + def _get_ilc_generators(self): + """ Prepares the ILC ansatz by purifying the QMF state, constructing the ACS, + and selecting representative generators from the top candidate ACS groups. """ - # Rebuild DIS & ACS in case qubit_ham changed or they and qubit_op_list don't exist - if self.rebuild_dis or self.rebuild_acs or not self.acs: - pure_var_params = purify_qmf_state(self.qmf_var_params, self.n_spinorbitals, - self.n_electrons, self.mapping, self.up_then_down, self.spin) + if not self.acs: + pure_var_params = purify_qmf_state(self.qmf_var_params, self.n_spinorbitals, self.n_electrons, + self.mapping, self.up_then_down, self.spin) self.dis = construct_dis(self.qubit_ham, pure_var_params, self.deilc_dtau_thresh) - self.max_ilc_gens = len(self.dis) if self.max_ilc_gens is None\ - else min(len(self.dis), self.max_ilc_gens) - self.acs = construct_acs(self.dis, self.max_ilc_gens, self.n_qubits) - self.ilc_op_list = None - - # Build the ILC qubit operator list - ilc_op_list = [] - for i in range(self.n_var_params - 1, 0, -1): - ilc_op_list.append(-0.5 * self.var_params[i] * self.acs[i]) - ilc_op_list.append(-self.var_params[0] * self.acs[0]) - for i in range(1, self.n_var_params): - ilc_op_list.append(-0.5 * self.var_params[i] * self.acs[i]) - return ilc_op_list + self.acs = construct_acs(self.dis, self.n_qubits) + if self.max_ilc_gens: + self.n_ilc_params = min(len(self.acs), self.max_ilc_gens) + del self.acs[self.n_ilc_params:] + else: + self.n_ilc_params = len(self.acs) + else: + self.n_ilc_params = len(self.acs) diff --git a/tangelo/toolboxes/ansatz_generator/qcc.py b/tangelo/toolboxes/ansatz_generator/qcc.py index 6ee7b9863..3801061ba 100755 --- a/tangelo/toolboxes/ansatz_generator/qcc.py +++ b/tangelo/toolboxes/ansatz_generator/qcc.py @@ -40,6 +40,7 @@ from tangelo.toolboxes.qubit_mappings.mapping_transform import get_qubit_number,\ fermion_to_qubit_mapping from tangelo.linq import Circuit +from tangelo import SecondQuantizedMolecule from tangelo.toolboxes.ansatz_generator.ansatz import Ansatz from tangelo.toolboxes.ansatz_generator.ansatz_utils import exp_pauliword_to_gates from tangelo.toolboxes.ansatz_generator._qubit_mf import init_qmf_from_hf, get_qmf_circuit, purify_qmf_state @@ -54,7 +55,9 @@ class QCC(Ansatz): state is obtained using a RHF or ROHF Hamiltonian, respectively. Args: - molecule (SecondQuantizedMolecule): The molecular system. + molecule (SecondQuantizedMolecule or dict): The molecular system, which can + be passed as a SecondQuantizedMolecule or a dictionary with keys that + specify n_spinoribtals, n_electrons, and spin. Default, None. mapping (str): One of the supported qubit mapping identifiers. Default, "jw". up_then_down (bool): Change basis ordering putting all spin-up orbitals first, followed by all spin-down. Default, False. @@ -80,10 +83,19 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, dis=None, qmf_circuit=None, qmf_var_params=None, qubit_ham=None, qcc_tau_guess=1e-2, deqcc_dtau_thresh=1e-3, max_qcc_gens=None): - if not molecule: - raise ValueError("An instance of SecondQuantizedMolecule is required for initializing " - "the self.__class__.__name__ ansatz class.") + if not molecule and not (isinstance(molecule, SecondQuantizedMolecule) and isinstance(molecule, dict)): + raise ValueError("An instance of SecondQuantizedMolecule or a dict is required for " + "initializing the self.__class__.__name__ ansatz class.") self.molecule = molecule + if isinstance(self.molecule, SecondQuantizedMolecule): + self.n_spinorbitals = self.molecule.n_active_sos + self.n_electrons = self.molecule.n_electrons + self.spin = self.molecule.spin + elif isinstance(self.molecule, dict): + self.n_spinorbitals = self.molecule["n_spinorbitals"] + self.n_electrons = self.molecule["n_electrons"] + self.spin = self.molecule["spin"] + self.mapping = mapping self.up_then_down = up_then_down if self.mapping.lower() == "jw" and not self.up_then_down: @@ -92,13 +104,8 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, dis=None, "with the self.__class__.__name__ ansatz.", RuntimeWarning) self.up_then_down = True - self.n_spinorbitals = self.molecule.n_active_sos if self.n_spinorbitals % 2 != 0: raise ValueError("The total number of spin-orbitals should be even.") - - self.spin = molecule.spin - self.fermi_ham = self.molecule.fermionic_hamiltonian - self.n_electrons = self.molecule.n_electrons self.n_qubits = get_qubit_number(self.mapping, self.n_spinorbitals) self.qubit_ham = qubit_ham @@ -108,12 +115,10 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, dis=None, self.n_spinorbitals, self.n_electrons, self.up_then_down, self.spin) - self.qmf_var_params = qmf_var_params - if not self.qmf_var_params: + self.qmf_var_params = np.array(qmf_var_params) if isinstance(qmf_var_params, list) else qmf_var_params + if not isinstance(self.qmf_var_params, np.ndarray): self.qmf_var_params = init_qmf_from_hf(self.n_spinorbitals, self.n_electrons, self.mapping, self.up_then_down, self.spin) - elif isinstance(self.qmf_var_params, list): - self.qmf_var_params = np.array(self.qmf_var_params) if self.qmf_var_params.size != 2 * self.n_qubits: raise ValueError("The number of QMF variational parameters must be 2 * n_qubits.") self.n_qmf_params = 2 * self.n_qubits @@ -125,6 +130,7 @@ def __init__(self, molecule, mapping="jw", up_then_down=False, dis=None, self.max_qcc_gens = max_qcc_gens # Build the DIS or specify a list of generators; updates the number of QCC parameters + self.n_qcc_params = 0 self._get_qcc_generators() self.n_var_params = self.n_qmf_params + self.n_qcc_params diff --git a/tangelo/toolboxes/ansatz_generator/tests/test_ilc.py b/tangelo/toolboxes/ansatz_generator/tests/test_ilc.py index 706862ba4..334295067 100644 --- a/tangelo/toolboxes/ansatz_generator/tests/test_ilc.py +++ b/tangelo/toolboxes/ansatz_generator/tests/test_ilc.py @@ -39,21 +39,18 @@ def test_ilc_set_var_params(): ilc_ansatz = ILC(mol_H2_sto3g, up_then_down=True) - one_zero = np.zeros((1,), dtype=float) + nine_zeros = np.zeros((9,), dtype=float) - ilc_ansatz.set_var_params("qmf_state") - np.testing.assert_array_almost_equal(ilc_ansatz.var_params, one_zero, decimal=6) + ilc_ansatz.set_var_params([0.] * 9) + np.testing.assert_array_almost_equal(ilc_ansatz.var_params, nine_zeros, decimal=6) - ilc_ansatz.set_var_params([0.]) - np.testing.assert_array_almost_equal(ilc_ansatz.var_params, one_zero, decimal=6) + nine_tenths = 0.1 * np.ones((9,)) - one_tenth = 0.1 * np.ones((1,)) + ilc_ansatz.set_var_params([0.1] * 9) + np.testing.assert_array_almost_equal(ilc_ansatz.var_params, nine_tenths, decimal=6) - ilc_ansatz.set_var_params([0.1]) - np.testing.assert_array_almost_equal(ilc_ansatz.var_params, one_tenth, decimal=6) - - ilc_ansatz.set_var_params(np.array([0.1])) - np.testing.assert_array_almost_equal(ilc_ansatz.var_params, one_tenth, decimal=6) + ilc_ansatz.set_var_params(np.array([0.1] * 9)) + np.testing.assert_array_almost_equal(ilc_ansatz.var_params, nine_tenths, decimal=6) def test_ilc_incorrect_number_var_params(self): """ Return an error if user provide incorrect number of variational parameters """ @@ -64,7 +61,7 @@ def test_ilc_incorrect_number_var_params(self): @staticmethod def test_gauss_elim_over_gf2_sqrmat(): - """ Verify behavior of the Gaussian elimination over the binary field function. """ + """ Verify behavior of the Gaussian elimination for a square matrix.""" # a_matrix stores the action of A * z over GF(2); dimension is n x m a_matrix = np.array([[1, 0, 1, 1], [1, 1, 0, 1], [1, 1, 1, 0], [0, 0, 1, 0]]) @@ -82,7 +79,7 @@ def test_gauss_elim_over_gf2_sqrmat(): @staticmethod def test_gauss_elim_over_gf2_rectmat(): - """ Verify behavior of the Gaussian elimination over the binary field function. """ + """ Verify behavior of the Gaussian elimination for a rectangular matrix.""" # a_matrix stores the action of A * z over GF(2); dimension is n x m a_matrix = np.array([[0, 0, 1, 0, 1], [1, 1, 0, 0, 0], [0, 0, 0, 1, 1]]) @@ -100,16 +97,36 @@ def test_gauss_elim_over_gf2_rectmat(): @staticmethod def test_gauss_elim_over_gf2_lindep(): - """ Verify behavior of the Gaussian elimination over the binary field function. """ + """ Verify behavior of the Gaussian elimination when linear dependence + in the form of duplicate rows arises in a matrix.""" # a_matrix stores the action of A * z over GF(2); dimension is n x m a_matrix = np.array([[0, 0, 1, 0, 1], [0, 0, 1, 0, 1], [0, 0, 0, 1, 1]]) # b_vec stores the solution vector for the equation A * z = b_vec; dimension is n x 1 - b_vec = np.array([1, 0, 1]).reshape((3, 1)) + b_vec = np.array([0, 0, 1]).reshape((3, 1)) + + # z_ref stores the serves as the reference for the output of gauss_elim_over_gf2 + z_ref = np.array([0, 0, 0, 1, 0]) + + # solve A * z = b and compare to reference solution + z_sln = gauss_elim_over_gf2(a_matrix, b_vec) + + np.testing.assert_array_almost_equal(z_sln, z_ref, decimal=6) + + @staticmethod + def test_gauss_elim_over_gf2_lindep2(): + """ Verify behavior of the Gaussian elimination when linear dependence + in the form of a row of zeros arises in a matrix.""" + + # a_matrix stores the action of A * z over GF(2); dimension is n x m + a_matrix = np.array([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0]]) + + # b_vec stores the solution vector for the equation A * z = b_vec; dimension is n x 1 + b_vec = np.array([1, 1, 0]).reshape((3, 1)) # z_ref stores the serves as the reference for the output of gauss_elim_over_gf2 - z_ref = np.array([-1, -1, 1, 1, 0]) + z_ref = np.array([1, 1, 0, 0, 0]) # solve A * z = b and compare to reference solution z_sln = gauss_elim_over_gf2(a_matrix, b_vec) @@ -117,44 +134,52 @@ def test_gauss_elim_over_gf2_lindep(): np.testing.assert_array_almost_equal(z_sln, z_ref, decimal=6) def test_ilc_h2(self): - """ Verify closed-shell functionality when using the ILC class separately for H2 """ + """ Verify closed-shell functionality when using the ILC class separately for H2.""" - # Specify the mutually anticommuting set (ACS) of ILC generators and parameters. - acs = [QubitOperator("X0 Y1 Y2 Y3")] - # The QMF parameters are automatically set if the argument qmf_var_params is not given. - ilc_var_params = [0.11360304] - ilc_ansatz = ILC(mol_H2_sto3g, "jw", True, acs) + # Specify the qubit operators from the anticommuting set (ACS) of ILC generators. + acs = [QubitOperator("Y0 X1")] + ilc_ansatz = ILC(mol_H2_sto3g, mapping="scbk", up_then_down=True, acs=acs) - # Build the combined QMF (determined automatically if not specified) + ILC circuit. + # Build the ILC circuit, which is prepended by the qubit mean field (QMF) circuit. ilc_ansatz.build_circuit() # Get qubit hamiltonian for energy evaluation qubit_hamiltonian = ilc_ansatz.qubit_ham + # The QMF and ILC parameters can both be specified; determined automatically otherwise. + qmf_var_params = [3.14159265e+00, 3.14159265e+00, -7.59061327e-12, 0.] + ilc_var_params = [1.12894599e-01] + var_params = qmf_var_params + ilc_var_params + ilc_ansatz.update_var_params(var_params) # Assert energy returned is as expected for given parameters - ilc_ansatz.update_var_params(ilc_var_params) energy = sim.get_expectation_value(qubit_hamiltonian, ilc_ansatz.circuit) - self.assertAlmostEqual(energy, -1.1372697, delta=1e-6) + self.assertAlmostEqual(energy, -1.137270126, delta=1e-6) def test_ilc_h4_cation(self): """ Verify restricted open-shell functionality when using the ILC class for H4+ """ - # Specify the mutually anticommuting set (ACS) of ILC generators and parameters. - acs = [QubitOperator("Y0 Z2 X4 Z6"), QubitOperator("Y1 Y2 Z4 X5 Y6"), QubitOperator("X0 Z2 Z4 Y6"), - QubitOperator("X1 Y2 X4 Z6"), QubitOperator("Y1 Y2 X4 Y5 Z6"), QubitOperator("Y1 Y2 Z4 Z5 Y6"), - QubitOperator("Y0 Z1 Z2 Y5 Y6"), QubitOperator("Y0 Z1 Z2 Y4 Y5 Z6")] - # The QMF parameters are automatically set if the argument qmf_var_params is not given. - ilc_var_params = [ 0.14017492, -0.10792805, -0.05835484, 0.12468933, 0.07173118, 0.04683807, 0.02852163, -0.03133538] - ilc_ansatz = ILC(mol_H4_cation_sto3g, "bk", False, acs) + # Specify the qubit operators from the anticommuting set (ACS) of ILC generators. + acs = [QubitOperator("X0 X1 X2 X3 X4 Y5"), QubitOperator("X1 Z2 X3 X4 Y5"), + QubitOperator("Y0 X1 Z2 X3 X4 Z5"), QubitOperator("Z0 X1 X2 X3 X4 Y5"), + QubitOperator("X1 Y2 X3 X4"), QubitOperator("Y1 X3 X4"), + QubitOperator("Y0 X1 Z2 X3 X4 X5"), QubitOperator("Y0 X1 X2 X3 X4")] + ilc_ansatz = ILC(mol_H4_cation_sto3g, mapping="scbk", up_then_down=True, acs=acs) - # Build the combined QMF (determined automatically if not specified) + ILC circuit. + # Build the ILC circuit, which is prepended by the qubit mean field (QMF) circuit. ilc_ansatz.build_circuit() # Get qubit hamiltonian for energy evaluation qubit_hamiltonian = ilc_ansatz.qubit_ham + # The QMF and ILC parameters can both be specified; determined automatically otherwise. + qmf_var_params = [ 3.14159265e+00, -1.02576971e-11, 1.35522331e-11, 3.14159265e+00, + 3.14159265e+00, -5.62116001e-11, -1.41419277e-11, -2.36789365e-11, + -5.53225030e-11, -3.56400157e-11, -2.61030058e-11, -3.55652002e-11] + ilc_var_params = [ 0.14001419, -0.10827113, 0.05840200, -0.12364925, + -0.07275071, -0.04703495, 0.02925292, 0.03145765] + var_params = qmf_var_params + ilc_var_params # Assert energy returned is as expected for given parameters - ilc_ansatz.update_var_params(ilc_var_params) + ilc_ansatz.update_var_params(var_params) energy = sim.get_expectation_value(qubit_hamiltonian, ilc_ansatz.circuit) self.assertAlmostEqual(energy, -1.6379638, delta=1e-6) diff --git a/tangelo/toolboxes/ansatz_generator/tests/test_qcc.py b/tangelo/toolboxes/ansatz_generator/tests/test_qcc.py index 0327f3ff1..d175b643b 100644 --- a/tangelo/toolboxes/ansatz_generator/tests/test_qcc.py +++ b/tangelo/toolboxes/ansatz_generator/tests/test_qcc.py @@ -74,7 +74,7 @@ def test_qcc_h2(self): # Get qubit hamiltonian for energy evaluation qubit_hamiltonian = qcc_ansatz.qubit_ham - # The QMF and QCC parameters can both be specified; determined automatically othersise. + # The QMF and QCC parameters can both be specified; determined automatically otherwise. qmf_var_params = [ 3.14159265e+00, -2.42743256e-08, 3.14159266e+00, -3.27162543e-08, 3.08514545e-09, 3.08514545e-09, 3.08514545e-09, 3.08514545e-09] qcc_var_params = [-2.26136280e-01] @@ -101,7 +101,7 @@ def test_qmf_qcc_h4_cation(self): # Get qubit hamiltonian for energy evaluation qubit_hamiltonian = qcc_ansatz.qubit_ham - # The QMF and QCC parameters can both be specified; determined automatically othersise. + # The QMF and QCC parameters can both be specified; determined automatically otherwise. qmf_var_params = [3.14159302e+00, 6.20193478e-07, 1.51226426e-06, 3.14159350e+00, 3.14159349e+00, 7.88310582e-07, 3.96032530e+00, 2.26734374e+00, 3.22127001e+00, 5.77997401e-01, 5.51422406e+00, 6.26513711e+00] @@ -128,7 +128,7 @@ def test_qmf_qcc_h4_double_cation(self): # Get qubit hamiltonian for energy evaluation qubit_hamiltonian = load_operator("mol_H4_doublecation_minao_qubitham_bk_updown.data", data_directory=pwd_this_test+"/data", plain_text=True) - # The QMF and QCC parameters can both be specified; determined automatically othersise. + # The QMF and QCC parameters can both be specified; determined automatically otherwise. qmf_var_params = [3.14159247e+00, 3.14158884e+00, 1.37660700e-06, 3.14159264e+00, 3.14159219e+00, 3.14158908e+00, 0.00000000e+00, 0.00000000e+00, 6.94108155e-01, 1.03928030e-01, 5.14029803e+00, 2.81850365e+00, diff --git a/tangelo/toolboxes/operators/operators.py b/tangelo/toolboxes/operators/operators.py index a1a8330cf..7b28f21f9 100644 --- a/tangelo/toolboxes/operators/operators.py +++ b/tangelo/toolboxes/operators/operators.py @@ -19,6 +19,8 @@ from math import sqrt from collections import OrderedDict +from scipy.special import comb + # Later on, if needed, we can extract the code for the operators themselves to remove the dependencies and customize import openfermion @@ -65,6 +67,21 @@ def frobenius_norm_compression(self, epsilon, n_qubits): self.terms = compressed_op self.compress() + def get_max_number_hamiltonian_terms(self, n_qubits): + """Compute the possible number of terms for a qubit Hamiltonian. In the + absence of an external magnetic field, each Hamiltonian term must have + an even number of Pauli Y operators to preserve time-reversal symmetry. + See J. Chem. Theory Comput. 2020, 16, 2, 1055–1063 for more details. + + Args: + n_qubits (int): Number of qubits in the register. + + Returns: + int: The maximum number of possible qubit Hamiltonian terms. + """ + + return sum([comb(n_qubits, 2*i, exact=True) * 3**(n_qubits-2*i) for i in range(n_qubits//2)]) + class QubitHamiltonian(QubitOperator): """QubitHamiltonian objects are essentially openfermion.QubitOperator From f738f465f1bb4639961ca14d18250a95ae4dcaea Mon Sep 17 00:00:00 2001 From: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Date: Mon, 15 Aug 2022 18:40:02 -0400 Subject: [PATCH 05/12] Make circuit iterable (#194) * Added __iter__ and__next__ method to Circuit, to make it iterable (one can now traverse the list of gates in a pythonic way) --- tangelo/linq/circuit.py | 10 ++++++++++ tangelo/linq/tests/test_circuits.py | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/tangelo/linq/circuit.py b/tangelo/linq/circuit.py index f75184768..22730fda3 100644 --- a/tangelo/linq/circuit.py +++ b/tangelo/linq/circuit.py @@ -96,6 +96,16 @@ def __ne__(self, other): """ return not (self == other) + def __iter__(self): + """Define the iterator. This is useful when iterating through all the + gates in a Circuit. + """ + return iter(self._gates) + + def __next__(self): + """Define the next function when calling next(Circuit). """ + return next(self._gates) + @property def size(self): """The size is the number of gates in the circuit. It is different from diff --git a/tangelo/linq/tests/test_circuits.py b/tangelo/linq/tests/test_circuits.py index 805de7fef..3a6c746c8 100644 --- a/tangelo/linq/tests/test_circuits.py +++ b/tangelo/linq/tests/test_circuits.py @@ -284,6 +284,13 @@ def test_simple_optimization_minus_a_qubit(self): self.assertEqual(test_circuit.width, 1) + def test_iterate(self): + """ Test if the iteration returns the expected list of gates. """ + + self.assertEqual([g for g in circuit2], circuit2._gates) + self.assertEqual([g for g in circuit3], circuit3._gates) + self.assertEqual([g for g in circuit4], circuit4._gates) + if __name__ == "__main__": unittest.main() From cd1c3ba8943b5e95e90fb0cf06188b9e6c6c4414 Mon Sep 17 00:00:00 2001 From: James Brown <84878946+JamesB-1qbit@users.noreply.github.com> Date: Tue, 16 Aug 2022 15:27:09 -0400 Subject: [PATCH 06/12] copy method for circuits + get_resources adjusted for some variations of VQE + invertible swap gate fix (#193) * copy method on circuit class * get_resources methods adjusted (VQE, SA-VQE) * invertible swap gate fix --- .../algorithms/variational/sa_vqe_solver.py | 20 +++++++++++++++++++ .../variational/tests/test_sa_vqe_solver.py | 4 ++-- tangelo/algorithms/variational/vqe_solver.py | 11 ++++++---- tangelo/linq/circuit.py | 4 ++++ tangelo/linq/gate.py | 2 +- tangelo/linq/tests/test_circuits.py | 14 +++++++++++-- tangelo/linq/tests/test_gates.py | 9 +++++++-- 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/tangelo/algorithms/variational/sa_vqe_solver.py b/tangelo/algorithms/variational/sa_vqe_solver.py index 55213aa86..4380fafe8 100644 --- a/tangelo/algorithms/variational/sa_vqe_solver.py +++ b/tangelo/algorithms/variational/sa_vqe_solver.py @@ -220,3 +220,23 @@ def energy_estimation(self, var_params): print(f"\tEnergy = {energy:.7f} ") return energy + + def get_resources(self): + """Estimate the resources required by SA-VQE, with the current ansatz. This + assumes "build" has been run, as it requires the ansatz circuit and the + qubit Hamiltonian. Return information that pertains to the user, for the + purpose of running an experiment on a classical simulator or a quantum + device. + """ + + resources = dict() + resources["qubit_hamiltonian_terms"] = (len(self.qubit_hamiltonian.terms) + len(self.deflation_circuits))*self.n_states + circuit = (self.reference_circuits[0] + self.ansatz.circuit + self.deflation_circuits[0] if self.deflation_circuits else + self.reference_circuits[0] + self.ansatz.circuit) + resources["circuit_width"] = circuit.width + resources["circuit_gates"] = circuit.size + # For now, only CNOTs supported. + resources["circuit_2qubit_gates"] = circuit.counts.get("CNOT", 0) + resources["circuit_var_gates"] = len(self.ansatz.circuit._variational_gates) + resources["vqe_variational_parameters"] = len(self.initial_var_params) + return resources diff --git a/tangelo/algorithms/variational/tests/test_sa_vqe_solver.py b/tangelo/algorithms/variational/tests/test_sa_vqe_solver.py index 812b0c733..689b647ac 100644 --- a/tangelo/algorithms/variational/tests/test_sa_vqe_solver.py +++ b/tangelo/algorithms/variational/tests/test_sa_vqe_solver.py @@ -57,14 +57,14 @@ def test_get_resources_h2_mappings(self): expected_values = [(15, 4), (15, 4), (5, 2), (15, 4)] vqe_options = {"molecule": mol_H2_sto3g, "ansatz": BuiltInAnsatze.UCCSD, "qubit_mapping": "jw", - "initial_var_params": [0.1, 0.1], "ref_states": [[1, 1, 0, 0]]} + "initial_var_params": [0.1, 0.1], "ref_states": [[1, 1, 0, 0], [1, 0, 0, 1]]} for index, mi in enumerate(mappings): vqe_options["qubit_mapping"] = mi sa_vqe_solver = SA_VQESolver(vqe_options) sa_vqe_solver.build() resources = sa_vqe_solver.get_resources() - self.assertEqual(resources["qubit_hamiltonian_terms"], expected_values[index][0]) + self.assertEqual(resources["qubit_hamiltonian_terms"], expected_values[index][0]*2) self.assertEqual(resources["circuit_width"], expected_values[index][1]) def test_energy_estimation_sa_vqe(self): diff --git a/tangelo/algorithms/variational/vqe_solver.py b/tangelo/algorithms/variational/vqe_solver.py index c0243e800..dc206824f 100644 --- a/tangelo/algorithms/variational/vqe_solver.py +++ b/tangelo/algorithms/variational/vqe_solver.py @@ -292,11 +292,14 @@ def get_resources(self): """ resources = dict() - resources["qubit_hamiltonian_terms"] = len(self.qubit_hamiltonian.terms) - resources["circuit_width"] = self.ansatz.circuit.width - resources["circuit_gates"] = self.ansatz.circuit.size + resources["qubit_hamiltonian_terms"] = len(self.qubit_hamiltonian.terms) + len(self.deflation_circuits) + circuit = self.ansatz.circuit if self.ref_state is None else self.reference_circuit + self.ansatz.circuit + if self.deflation_circuits: + circuit += self.deflation_circuits[0] + resources["circuit_width"] = circuit.width + resources["circuit_gates"] = circuit.size # For now, only CNOTs supported. - resources["circuit_2qubit_gates"] = self.ansatz.circuit.counts.get("CNOT", 0) + resources["circuit_2qubit_gates"] = circuit.counts.get("CNOT", 0) resources["circuit_var_gates"] = len(self.ansatz.circuit._variational_gates) resources["vqe_variational_parameters"] = len(self.initial_var_params) return resources diff --git a/tangelo/linq/circuit.py b/tangelo/linq/circuit.py index 22730fda3..785f1cf3e 100644 --- a/tangelo/linq/circuit.py +++ b/tangelo/linq/circuit.py @@ -138,6 +138,10 @@ def is_mixed_state(self): """ return "MEASURE" in self.counts + def copy(self): + """Return a deepcopy of circuit""" + return Circuit(copy.deepcopy(self._gates), n_qubits=self._qubits_simulated, name=self.name) + def add_gate(self, g): """Add a new gate to a circuit object and update other fields of the circuit object to gradually keep track of its properties (gate count, diff --git a/tangelo/linq/gate.py b/tangelo/linq/gate.py index caa553761..04c2988a7 100644 --- a/tangelo/linq/gate.py +++ b/tangelo/linq/gate.py @@ -31,7 +31,7 @@ PARAMETERIZED_GATES = {"RX", "RY", "RZ", "PHASE", "CRX", "CRY", "CRZ", "CPHASE", "XX"} INVERTIBLE_GATES = {"H", "X", "Y", "Z", "S", "T", "RX", "RY", "RZ", "CH", "PHASE", - "CNOT", "CX", "CY", "CZ", "CRX", "CRY", "CRZ", "CPHASE", "XX", "SWAP" + "CNOT", "CX", "CY", "CZ", "CRX", "CRY", "CRZ", "CPHASE", "XX", "SWAP", "CSWAP"} diff --git a/tangelo/linq/tests/test_circuits.py b/tangelo/linq/tests/test_circuits.py index 3a6c746c8..a399e6f4b 100644 --- a/tangelo/linq/tests/test_circuits.py +++ b/tangelo/linq/tests/test_circuits.py @@ -263,8 +263,8 @@ def test_simple_optimization_functions(self): """ test_circuit = Circuit([Gate("RX", 0, parameter=2.), Gate("CNOT", 1, control=0), - Gate("RZ", 2, parameter=0.01), Gate("CNOT", 1, control=0), - Gate("RX", 0, parameter=-2.)]) + Gate("RZ", 2, parameter=0.01), Gate("CNOT", 1, control=0), + Gate("RX", 0, parameter=-2.)]) test_circuit.remove_small_rotations(param_threshold=0.05) ref_gates = [Gate("RX", 0, parameter=2.), Gate("CNOT", 1, control=0), @@ -284,6 +284,16 @@ def test_simple_optimization_minus_a_qubit(self): self.assertEqual(test_circuit.width, 1) + def test_copy(self): + """ Test if copy function is working properly.""" + test_circuit = Circuit([Gate("X", 0), Gate("H", 1), Gate("H", 1)]) + modified_circuit = Circuit([Gate("X", 0), Gate("H", 1), Gate("H", 1), Gate("H", 3)]) + copied_circuit = test_circuit.copy() + + copied_circuit.add_gate(Gate("H", 3)) + self.assertTrue(copied_circuit == modified_circuit) + self.assertTrue(copied_circuit != test_circuit) + def test_iterate(self): """ Test if the iteration returns the expected list of gates. """ diff --git a/tangelo/linq/tests/test_gates.py b/tangelo/linq/tests/test_gates.py index 7a3b6d30e..a4bda1741 100644 --- a/tangelo/linq/tests/test_gates.py +++ b/tangelo/linq/tests/test_gates.py @@ -50,12 +50,17 @@ def test_some_gates_inverse(self): # Create a Hadamard gate acting on qubit 2 H_gate = Gate("H", 2) H_gate_inverse = Gate("H", 2) - self.assertEqual(H_gate.inverse().__str__(), H_gate_inverse.__str__()) + self.assertEqual(H_gate.inverse(), H_gate_inverse) + + # Create a SWAP gate acting on qubits 1 and 2 + swap_gate = Gate("SWAP", [1, 2]) + swap_gate_inverse = Gate("SWAP", [1, 2]) + self.assertEqual(swap_gate.inverse(), swap_gate_inverse) # Create a parameterized rotation on qubit 1 with angle 2 radians RX_gate = Gate("RX", 1, parameter=2.) RX_gate_inverse = Gate("RX", 1, parameter=-2.) - self.assertEqual(RX_gate.inverse().__str__(), RX_gate_inverse.__str__()) + self.assertEqual(RX_gate.inverse(), RX_gate_inverse) # Create a parameterized rotation on qubit 1 , with an undefined angle, that will be variational RZ_gate = Gate("RZ", 1, parameter="an expression", is_variational=True) From 892595efd2bcc72d7330b2028cd5bac13b7204af Mon Sep 17 00:00:00 2001 From: Valentin Senicourt <41597680+ValentinS4t1qbit@users.noreply.github.com> Date: Tue, 16 Aug 2022 12:28:07 -0700 Subject: [PATCH 07/12] Release guide for project maintainers + version string (#195) * Release guide for project maintainers * Import version at top level of tangelo --- dev_tools/release_action.png | Bin 0 -> 117499 bytes dev_tools/release_github.png | Bin 0 -> 129597 bytes dev_tools/release_guide.rst | 154 +++++++++++++++++++++++++++++++++++ tangelo/__init__.py | 1 + 4 files changed, 155 insertions(+) create mode 100644 dev_tools/release_action.png create mode 100644 dev_tools/release_github.png create mode 100644 dev_tools/release_guide.rst diff --git a/dev_tools/release_action.png b/dev_tools/release_action.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccdc7d051c217bb654c59de92124bfc25660dba GIT binary patch literal 117499 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 z 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 W?@(C;rVfArKa!$yBGumwg8mQHR)S3c literal 0 HcmV?d00001 diff --git a/dev_tools/release_github.png b/dev_tools/release_github.png new file mode 100644 index 0000000000000000000000000000000000000000..46e3c16150ee12a26606402d5391103db333aea0 GIT binary patch literal 129597 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

Ft8aFmrn6 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 literal 0 HcmV?d00001 diff --git a/dev_tools/release_guide.rst b/dev_tools/release_guide.rst new file mode 100644 index 000000000..53e3a52dc --- /dev/null +++ b/dev_tools/release_guide.rst @@ -0,0 +1,154 @@ +Release guide +============= + +This document is here to assist project maintainers in creating and deploying new releases on Github and pypi. +It covers the processes of bumping the main branch to a new version number, ensuring the develop branch catches up, and +then creating and deploying new releases on Github and pypi (pip). All of these steps take place on the public repo. + +In order to complete the steps of this release process, you must have adequate permissions on Github, and pypi. +If you're not sure you have them, reach out to project maintainers and owners BEFORE you start doing anything. + + In the following, we assume that the project is to be bumped to a new version number x.y.z, that reflects the progress that + was made in the project since the previous release, and has been already agreed on by maintainers. + +1. Bumping the main branch to the new version +---------------------------------------------- + +1a. Creating the release/x.y.z branch to main PR +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can do this through an automated Github workflow/action, called `create_release_branch` at the time of writing this document. +This will create a release branch with the desired version number, and a Pull Request from the release branch into main. +To achieve this, go to the `action tab `_ +of the project, and go through the following steps: + +|release_action| + +.. |release_action| image:: ./release_action.png + :width: 600 + :alt: release_action + +- Click the desired workflow on the left +- Click the "run workflow" button in the blue zone +- Use workflow from branch "develop" +- Enter the desired release version number +- Click the green button that reads "run workflow" + + Our workflow is defined in our repo under `.github/workflows`: it is thus versioned by git and we expect the version in develop + to be the latest. But if you make changes to it and want to try it out, you may want to run the version of the workflow + from your branch. It would be preferable to run workflow tests on a private version of the repo, to avoid leaving traces + of the tests and messing up the history of the public one. + +This workflow should only take a few seconds to run: stay on the action tab to make sure it appears in the log, and has +successfully completed. Feel free to explore the different steps. This should have created a `release/x.y.z` branch and a +PR attempting to merge that branch into main. + + +1b. Merging the release to main PR +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A new PR should have been created. The description tells you how it came to be, and what you should be doing. +Here's a `past example `_ so that you can get an idea of what it may look like. + +This PR does not need to be reviewed in details: virtually all its contents are changes have already been reviewed, tested and +merged into develop. What matters is that: + +- the tests passed +- the version string in `tangelo/_version.py` is as expected +- `CHANGELOG.md` has been updated (you may have to do that manually until we figure out a better way) + +To update the CHANGELOG: use the PR conversation tab and trim the history down to the essentials (you can take example +on the previous entries of changelogs). + +Ask someone to kindly look at the version and CHANGELOG files, and approve the PR once tests have passed. +Once the PR has been merged, main has officially been updated! + + +1c. Updating develop to new version number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The main branch is now slightly ahead of the develop branch (version number, CHANGELOG): open a PR from main into develop. +This PR should be very small, once you fixed the conflicts. Likewise, get the tests to pass and ask for a trivial review. +Once approved, we can merge that PR and develop has caught up with main. + + +2. Creating a new release on Github +----------------------------------- + +Notice the release section on the right part of the screen, on the github project page. +Go to the `release page `_ (you can also reach it by clicking "Releases"). + +|release_github| + +.. |release_github| image:: ./release_github.png + :width: 600 + :alt: release_github + +- Click “draft a new release” +- Create a new tag (vx.y.z for the version number is usually good) +- Base this release on the main branch +- Populate the release message (changelog info, contributors, and a human-friendly message that addresses our readers). +- You do not need to attach any files to the release, github will attach a zip and a tar.gz snapshot of the main branch. + +The release message can be as nice as we want it to be: announcements, roadmap, exciting news, special thanks, +pretty figures, links ... It's an opportunity to celebrate and acknowledge the contributions of everyone, and make people +excited for this new version. + + You can populate the "changelog" part manually or try the "Generate release notes" button with the tag of the previous version. + +After you click the green button, the release section should now feature a new entry, with your release message, and a tar.gz and zip +snapshot of the code in main attached. You did it! + +3. Creating a new release on pypi (pip) +--------------------------------------- + +Most of the process follows the information on `this page `_. +Before proceeding, you need: + +- an account on pypi with adequate privileges for this project +- a pypi token for this project (see link above) + +The following steps will take place in a terminal on your personal computer. Make sure you are doing them using the latest +version of the main branch, where the release is based from (you can just work in a folder that unpacked the zip or tar.gz +archives found in the github release you have just completed). + +.. code-block:: + + # Create new virtualenv with version number (release_x.y.z), activate it + python3 -m venv release_x.y.z + source release_x.y.z/bin/activate + + # Upgrade pip and build + python -m pip install --upgrade pip + python -m pip install --upgrade build + + # Ensure no dist folder is present under the root folder of Tangelo + # Create distribution files (wheel and from-source distrib), they should appear under a dist folder. + # It seems that we do not need a pyproject.toml file and that setup.py is used. + python -m build + + # Upload to pypi with Twine + python3 -m pip install --upgrade twine + python3 -m twine upload dist/* + + +You will be prompted for a username and password. +For the username, use __token__ (two underscores before and after). +For the password, use the token value, including the pypi- prefix (ex: pypi-s32fdg3fg2fd3....). + +If successful, the release is now available on pypi! +You should try to create another fresh virtual environment and install the package with pip to make sure it works +(maybe just do a simple import and query for the version number with tangelo.__version__) + +.. code-block:: + + pip install tangelo-gc + +Share the news with others, ask them to try installing the new version through pip in their environments: the more datapoints, the better. +We really do not want users to have issues with pip installs. + + +Finally, you're done! Thank you for creating a new release. If you think this release process can be made easier or improved +in general, feel free to provide feedback. + +© Good Chemistry Company 2022. This software is released under the Apache Software License version 2.0. diff --git a/tangelo/__init__.py b/tangelo/__init__.py index fafdb742e..915677d85 100644 --- a/tangelo/__init__.py +++ b/tangelo/__init__.py @@ -16,6 +16,7 @@ import numpy as np from tangelo.toolboxes.molecular_computation.molecule import Molecule, SecondQuantizedMolecule +from tangelo._version import __version__ sup = np.testing.suppress_warnings() warnings.filterwarnings("ignore", message="Using default_file_mode other than 'r' is deprecated") From 95d7efc9096a2eaa8345c7f56845e54a46ba5dbd Mon Sep 17 00:00:00 2001 From: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:58:09 -0400 Subject: [PATCH 08/12] Notebook: Important aspects of QChem modelling for QComputing (#199) * Added notebook to tutorials, as well as images. --- examples/img/FeIIPorImO2.png | Bin 0 -> 149688 bytes examples/qchem_modelling_basics.ipynb | 636 ++++++++++++++++++++++++++ 2 files changed, 636 insertions(+) create mode 100644 examples/img/FeIIPorImO2.png create mode 100644 examples/qchem_modelling_basics.ipynb diff --git a/examples/img/FeIIPorImO2.png b/examples/img/FeIIPorImO2.png new file mode 100644 index 0000000000000000000000000000000000000000..b3edd8bb71a56bafe0104fbd5f085f08897999bd GIT binary patch literal 149688 zcmX_n1yoes_ckihF_J@fBi-F0B?c0A91_C8@B6{S&;@R49(U{GacBtF5wyzYa6dBuwW2YixJ&9wmhL$sCAaDaiq zefM&`8lgTH20p}dlvH>8Y-8f+qHk{ul!$Og}I6BBS&}Lvev8CtQC^R(iY6u1+~o3`&*ULvQLdi&BZM(+3v>< z*=jO$R7gQ$xgTk$uE|&tyu!E~ z*Onm@F+<4B-G?(F72&}s{P{C7eB{H(x?P~}Q3X@YqxRp23b{0%mMaO8;QyY{6zk>Y zrNbt&g^pUDm1mF5B=Y<~zT3zK3gR=Uul-2l%o5Me>`TkaN-8R-@uT8Lx6J-7il{9L zbv&K!mz2}jeRfI(L;a0d<87W z3N_hjt0Y=D97~i?(*RX-N(Qq zr4R8-E*>>tZHy>o9UVnl!aT+wrxkLhtS*02F&*pvS-OLEG*HYg^Ddr1WXPKY-JL14xA>oeJ#N-FW8N%#N23BZPx6>H0zWR-505%{z#?@1%GA5~yf(B+i$L7TCEeCtC8n680H5 z5y{N?zJN% zR&R($Hc>KJ-_ajD-T5zP@I1cUJDA+#ibIbd4P#tag633`_4__tf|M$&*WRX@Rmz0X zZ6(QL@KuG5E{YrkcPiAMWfmr^2vKYeR9|1Ol9&|tfqLiAk|s-DZxQDc*vteWH{)Ta zQR(DRQ`q)zwDy0VKl2VqQsHFN^S=(%LV_5zaG%5x3ND&VPW$1Pjs~xVB$g(EAL)Ao zf>^{1z9? z@sO)+pZ=;@o%hu;pY}O0#O}zn`Adqu5qN$j20}@dPi1+f{q;cSky4I{FQw9Ra|JBu z?zro=x3|}{m8^MEv!quj!uN2wkYr?!)A?|IeqeqC2c#)SjwKOpl%8(VbCbx8_2$n_ zmQN~Tug+cN6aGta#V9XPDqc`qYwej(T4}9NQ&e!UGvtUC^Um)fhz~#H% zGOI`1)pxofQ+Hr=RDj=cn^mc-Tzv-$6kFi~k`qgKrj?XXK@%jaJ&=SPxC5DeyS6Wvy zYjrM%T917~pNx`K;z~YoDZhV2jxfQ>9dyLWp75 zq<9;C#bNb1cS9JB*9@@b@mdrqF{nUv8)+>}vj^VU=!`-cbcWwzCLI4mI6I^l9AhnUbUC>|Wj4XJaD4V*%T(#@kr9h;(S2RXp$}H z!6k-JW5U^>!TQlH84Kq&>`}7%f?=Vh0uwEyq@?@>R&)iL0~ky$Pm<4zN$S&-|1-LZ z1b~(Xp|A?)zLHKIHhHB2id(O^LRJJ$Y{~MQXus5ds)2n?PftJObi4t-^6;7>7+tvF zQ7KyhPctSSUF9}OAHq-{dDUOFy~6BOeI#4u>qsxzI3-DoMXr~w@ z(j3Tn1vf;P{`?=%l?1;49Vo0nuW*mSwGd@J{H*4Y_!W^AiRB8-^UVk|ISQ|0*i&Nl2&>ScInV#__B_)77>L1^=C54 z(n|m46lW&C;e&D-#lMV1rLu1V>}n(tJ6u6Xm$=MII_Z^MG|Zr#>u%ETdmCEhIWfJ| zS19J^rvxk91zw#^_C%0M^-kSIGl4nWzuB5ikoWa*vz(z)7ayc>)B7c|uW1&z_gjxy{UsoX#NgBiD08Su-BnvI9w zxu=d-VmmOB--LsEIht*k<;mlQ$d2div^%bASFj$sb!1`DL-iqzA6=j7MKGcQ(|En; z6my=SO1y`B7l6K6NC4 zW@%5dB`5&)v?VIz4 z1DYKmqFDW=Ytz3Mb?=_77F}+Iht`E9MGs7I_VMM@9Cy66A?Hok*D+Y+zu@|+2(|Et zIdHV+!0hf=yUWfviu4k#{F_vb2w{<9&=fAplgKsEu)Z8G*f z$ck&&F*(a4quMH?p}`rP_}23~4^xbENL{Biu{PHb{{h-O^#|mgaNICFmXgvR-v`D{ zn7NnKG1}nSoc2_tBEi)@N%O-~Ri?N^OJNilr2jUKOy%GYYu_p5;jjRadB~AKpcvVo zTAX0S-};!CqSRTY66zpUJ#_(@`Cm#GRoEfEAb%=39EWScYtq69TdP3m$#lzMB#B1E z1`p|lSS{;^ z_44}#N;D}aC(iQna$k~N>Vk-rebe4qZAOi{)v9f&|8Vd#DphC8CVVu-ja)22OQ%`Qi?7TTg6l9f~UrGVC)WDDBwcL8Cl`U9%Lc$#?nBPaG!YWNQ4)=)w;y+Dq*+bFcZwSJW)G|BT|?{QjDY`t9`KmS9*^qc3D=2J(K;P7vgt zyGRryMbhsjqHGB-kExXr)A{`Eo5i=~ljfOS4lx8>6x<5CGmgeOR4=g?+MCNGsqBA4 zdpdn(@>J){{2otM)h*MER-{ih-g-gW#z(kW9-lvF(21x3n%u|IV^hz-ff}e7QZZAl zWLh}+z+~pj1e+kO!qU-@IZRQODv%c*mt+TeJ(|>n5j+?`Pd(OwruQc4gKuZodl6eNz>%YSvS(Ee zJu|E~kFmpYia^N4!h&IZeEcanK(ZQI)tY-6JNV;YLXO7hlMaQ-dY??PKX^G%_i%I9`iEb~7K!MB+-&bXwDl@nKnfqzO;w~8eJmcOc z1nPD#_~k>Gh(8p?iX82Gdu@gU{b*BMFG9#`=?krYJlP_VR7fn_(^ycc;x9tF6w{$^ z7CZy{PCOMY<<=?f#$Xf~76Oa?ri_mv8O*D6sXS&`^0d50Vc9%kNhRGH6|yV-+*@=> zb`kC_1aeeN$2UscH%sFDZu@PJtRLn)hO7z+8P+Xf%s#iH>J32&mNZ&A;&tv=w<uQ1*BgO+*YP>peQ(aB$UFxCplH z@0**OcROT>B~^ddcGSh%7gsMRZy@}1kNWdLl2ru`{FwAzQ^=ci5R zeDntL`Z~Fw2x+WXeo^T|)waRnk(71whFXCHUiv%I4FqCW_czQ|)~oy6+K`J=3bcK< ze`GtER@5`l^_HW+1JsOF;L-fFSJ(z6Sy2%1zIm;RAgUoSaiGDTCTL-@`}FkWjgOB% z-|m6#e@7uP609^(4KRM zS8w&xVYRX4pBn6ym7llCM9P-T?gi0H4X zW6{0aHT1kGM{e3)Ul8}U{x1bbQ+)uDkj)ID6d4FlwM?a+_Z|k=cK!dRzr)z#n9y3;b=3=r(7qGa&ap%<1~@M{$|GYvC+{(nnt)8I+rN0 zFUHW<`|3s($BeHQk}gzWs6>g;)Qt6f-j9wEC1p1?KRY=wW8qR;lAEEf@pj5AQMkPZ zH+NslYfVGk-TQx!LO;5Xpy7T?m1<4AwqTaNT0)c4S956CX-Ed@29sk+?@)`&GJPcE zuV~)J@3^Y3WYzC+mDeUPJ3eSGjCOWKb49DzUssEMjJKil$(zsCaOb%l`)(>+wZGJ5 z!4x>aYuf&l_W^Q#b9}rc$(2EJQi+UOx85(Z16Na47xtVjy# zVnG?n(`QN*1me>c@%fy2&VGs)vxJB%a+e*le(WSDaCg=q?)|^J=X@~)P}i*Mt99<(Htbk2qYNiTxi!a3|6Z)-gu}0q%4!I=@_6KO+k@NDRS<>=nkE7bOpD9F zYax%R$j;uW4M9`g zSSb+V@$uu<@aKo=VlTNdzr&n}6j7SDlpjBNh;hRG?>-(EUbaS77=)y38Aj(*11c-o^e||@9eUR^!;6@R974Rn<%!#dB zT1HQco{@S-z|8?8V{9)_>rT<>u`YSGAV3cG^Gx?Ox1H4(H0_?O((g6LGh@@JoT2@9BBJD0#yzEm?YL7gtw=DPGwK zKOGrfhfM~6b3ZHbAd=mTnF{p+_BS^(J1NJ^j;fn+bgDax5EdGLPtvrfx)>xz2FNuF zN?7cZHEE(^cvVC$orgZpDV^sL_as-EK`DV%C!d*5U{E<;nZcrDReImficgH{G+5%D zx@PLJgzAIA!OC|UA7t6m3UYJ(PzkuI4Em9r59US5GRgAP8%l7y_LJg2$~- z;~~P`|Ey0|+)nzm$j&g|mhboHU4H1m=&&YNntZYrwZfIJ6ugc!gJ6D96*r-{JF)2J z;!?&Bj6Y^prX;05ziD>FfK+#3c6826ke$(q%|E<2^KM}ZVWS~|U>?pGC{>h?uQhtn zJBI331vxGIy%FEsdJ%!0L%G=vB5`_=9|DLrCrrZ|r+O+v3D1uZ0k&x)n*U{^#5FYu zrX9K_M2bRak}LB|1t#Dt7duO&jE$+feZvxJk$dLO8Co$wLEDUY`;=w@J01C%YgfdTCIB&6NLVx?IvE$_eo)8iFMfvxhsD&#a1!$1we z`=Y79WI82@?)CVn{)HHFc~YP@;-56kIi#Erx5mS}J3aT?Z+pSani%37TM=MuWosWa z;fM&Z`rCtIYyGiQ*1^m9U{zHtSi4ZqQj$SCmSxhAD2X2X;_ClZD8ZTg~kHwoYWjFo9Qx`A~r-(z(z;L^#);WUP zc_Vpuch^-P+pNxxG$(dc-Ne{A$iV6q?4q%KjlwutC zk{@Ip9M~({&XCZbPRX2qbCV0A=Mu<3=$vwx+;a;PS2gI=+~V<2HfN!VFtXmJH3jjpwDW$%*}LVZN!5Iy$wei87~k;rq$p*0Ck69bpO9|nXjlKnuEv6pt|F_jcFo-V`iZEl z5^V-%1{4_Zx_6QVHOkiC=#06(g zn=7XbXPgYo^He#Q%K}JlM@<`O)}4>eS4T_8&Ty5LZ<#-JpJ(7}v_3X^u9gO63R{o| z=d#=N@LX{=-n}!&2t0}X#9(G1+Z`JTRcG|j$5yITkGW_QT^Q)Nxh(7L5PVIm5-hlU z-cabdDNe$(c`8Sz(dzs@fm(qaga8VYpk-#3Mo`A+ys*v0IRJzW8R0SD+oXP5G^e&WkCt3s9@r<{yTL1e8V!H<%N)Ye=p23 ze+r{a7(LLmezsxC{!ii2%bfL}mtJp1D={JoTedc+1_MnU7QOEluM76?dE5O45M^-n zTPN$V$(3cUG2%2PG6VyVakRQKd23_7NzR`?>|Nw?iPMq?ieUCsrl*sA8vdnBFf&z@ ze~SIJ;VDcW`c+Ic%50Jni(Z;rtZACm3NT5E$}Cxi0{|sW6%o`_MbwDtAVfq1)_}7! z(3a{}9|HqIVh{o<$pDMeS%q6xL9&gJ^vdg}lLxMBo%$#rw_}WfD1lqg0aaC1&wb66 z^_iR}j?2qS*Alcl{Mi{CmNd7cAfD)6WKH~C%lbznBr-Tl%vJ6iP+nETgzo$XGWBPo^c-qm$85AKkH7>H|4Kx(y@P2)ogQJPDWsCd~&F-=di<8+J z2x#2IPMU$n8XO!Pv7=i*e*P?IXh_y$L9iVnQS2=nku7l03*I^0=P%vh|5T9Z$Wf8! zz0|JmwHPMR1KX2yQABm9fTM7T_?3^{@%rmUu{N7qn6Vt8+TDs05`+SFC!JL9?)PR* z>Oj?pfa+d(>S!c3efhvORZ%g~tbNGtx=+rs?-#qbI#uZqujg0GkK1l-8{^R2eHt~A zbP>|7-)g$!d%w#Tn(Qb_j0lJ{b^FFmQys6|09jvfTfsf}s%QEG zVZZJ647q9b;XIY+bl#2N{iwn1*;c_PI;}Y>EF@OX8`~nK97PWN%d&j<-5V!TT*aT{ z6d=zq{LKUsz7-v$ml^RKb#+tA`>`_aM)nwsajtKdjDqt5 z4X{)FKvFD`Mf+f>E+14uc>Wx+4fPAEngeTv)9E70Q)N4JB$B1bYO95Ndd42AsS{x|IYq?esgnLaY|*+DdqPhw)nR?Wb5TD%VK>QvGL4a zYr08bAyFeXyxDTi!E{cGo!#Bs{B|M=FrIqVOJltl(QQ;{b1-|>zbTJVkq3)3!R1sd zMV?wg%@jUYC0?FOj%g+)1wwX+f+?+HdpKRzw9~^)lu{5}Z!tGLGb65~gs!daZS-en zDqpsEW-N<8#Z@5MYSBhL2@MaQJ-8pibQIyO;=^bfq;URXU9is5C)08{zxutjmjinF z5}M#6@or|w2FfqAalO>NI84L=iw{Zn2KHjZGw-QDT_~_}$v6VIa}xG}Nb)jzh4@zGf?&B={5POAvi^thWGR2mD>I zOJ|fz$Kf9e;s^t?y1Ke5puzzXe5lppuV25aTu%*3r6LUvqp4wpT+W5h7nD42U}IDO z)fFvA_-V^d=)SNL-K`a~@_RH{u>N=CHMP=$uIl&k!`^IZ91Tf>!=|i%QAoU3_?sT4 zBVsf^NmP5N0R+0fK1qhM$7AJQ2PmH`<|>RY_kJ^~SAC}pN9}c8`cTcdX^~}yt|!+E zr{lJ+Nr_3s(Xh3!Xfn0DF`02Ov?&noMG<(ykWq`%k@j(%$Gx@H?q{Zr1|3%>49_H@ zCWe-`W2$wk3OWJeG)0zdb$xeHDI?^sIoSkp)>frc#=;y+T6pP)yE}{v%7njnhxfq# zuMB6JZ^W$hwV?&;15GmZ^o)!!33AE=S?iWvYN3l<^wS<>=92>lNVWN>JBs+=2o%}e zJa2UvJD{!E*OcOru_0-L1ShALQx2EiZMq=(*)`TUru>+Vt{rv_4oqM=0y|9LjFDE)fW_ z{4-_yZ>EGM6W}CoA_>_2Te3V}g+ZI=Zwa|pd2uKhUVEO_J`c=qWRm>-^(zqM?zJLti3{(3MKCmcw~F zuP_9n{X>n?`@Ot8%8^fj1K)T!o{CYU29}Ph)%kE;*t#_;IJo`oyPv2viZZYmyNI^u zuD4jd)R|5y{VZK_%$210QOW6cfM>_bP(EC(-M2IKzYm}K)(0ZQ z2>lbupGD?P6{CNf9pntaT^tI@OxhnQ`^@7a1F7q2_xR{kDAjagDjI;kpQ-Ea1&dhGog|`I5SZI=w|n zpO|^2N1Uvhpmsvraglm;Uu&?$hOsO0MIqIpAXD;tyw8X6`|}D+S$%eYKb`WLE<8XX z#0DEz!G>JS;`%`UNj+JTI)N-<_~tMRo-9yr?^lWEIl&4k77A&2!@FJb0?iY|Rs_gt z`^haKNB8&!bPbkqzb_P(mkskUC?8;Hc~eTiYA$6cjbvng__VC-VS z>6)smBdW(=pN+EJ!ykfChqNkwt?T5vzE`|QI;~3oCW1p=CU8QznP3zNX0BN7(`4>E zX^I|n(zb6VOfOpFL1Q-=bNy`?2+DL>c4O3Rhy-#ro6nPH&l*d!RsF%c6vBf=Bj!ott{^gr7| zpnQdJj0>6lYCaeI9nXa^EY?PcqS@y+?+{>9*^H4|U5=><(P}N`m`ujgFG~j%0AXCy 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

A0%CtuSJG-4`-=E+@=M1b|B4o!Sf2sM}bJ;QAI zF1JABk+hY#w68DGk2TVPaM|T++E`Y;oOO$(#|f@PO_KAytsFn;9@&{+CJqeaIAxd4 zj}#$(KuV_jA#Y1O6{ltCu4qNFva~pM+|7;Rinf2Min!reeN5yfGT6IC`O;;{QFh#- zT&hW+LN_z4HTxWWw*G>mZpeIV`7wm6H3=* zT}76U{odaXT*5$t<0@J$FihyIJGHTqJA=b)1|#H7>iKR|j9XavF_LVx00mcO>(n)* zOUDGjNAwgYj+v1>DJ`zy}AHLOZW(6vOGAgopmO zoG8x58Sx<@PdvjWMd~Su+*Wzfk>ZeBB{h6h^*o0`@A9rQ2+%+0Hs5>@JiUu@7Aokz zBdYGWtbgN_7CN#sTSt|p*tfsKyty!Z_!Iy4duEe#=JJ>ono-42a|Jv?g?eu5SQg=y z?=-zMn>d?mLLT@Q>$hEsj{ngiKisqS0=6mt3ZFQ)|An)Vn#hB&+5J97eM#tX-i(0H zOE(#is_-KVQ&mgl>9hzV6Ids4WnwETzLshv`)|K<#+a93dX7CB~al87_8r)F-eA9dXqmJAA_jkTK zWn{)Lp~;LVOSv#R$CJxVe39ykTrgPqtBp~<96pAf?@oncEa17YrC{Uv7t6Xk?`rg^ z$A7a0=r?&&bfNnsbHQC$#}q9nS`LPnXelt5P}jw?Waf$oucdh^lyN^EF3nz=VTese zZTPeC_1K6iT2LOSAjoKZ7O=q%33R7vpAQiKNgoO!MZ{udrpfyxP>C}}8DKC}n@E^^ zKsJ+TF?dUV@QW>Xn4lE`99lc>@Y?C&TbyEsKWEIQz82R0*|xC|ds;(z9OUbbqKmo` z84Qk2NMmEiN=Y5ta&crxMM{aLwXIap(7-A!wV`FfK}ADPQ6AFoa;8ABGkN^f!_%)+ z2H4WJuXXIp4dJJ&ZHqsDjugqn+Pk=j-eNFq;#qyK&;UibBElC#IHaP1pUpWxFXwPut^~R8x;XMI55$ta<~&l+n$h&P{OM&u3HC+5?o3S@oejEFoy36#Jb0tj(xDyN-v08xih|0e2r8Vlo3pyFr;%@ zy>RY?=m{?3w_%za$u~xnj1o4|1ioadT~1BJ2VS_Yt4TRiAwEw>I_N38A-b!gEPZox6!{0-9FzznXF%t0Cx{NLIRg}}f1B#6^L*K}r47a-I8NU9-260fg z(GbisJ^gAJSy*<;a$GDgwuhb8+LK?u|IKg=P4J6-ofLE1C{k@7Ll3g(a;c<(tjgT{ z{6|da$wtDr?{TN6rz3{tq2P?^!IS6en;CoF^b$oNdC?x?r1kM17}a7O&ak`$ExfRQ zS2G+WtXYazzY0VKP>y}6SIQnFoN1tljOYvv)YKQ{OH=goRR(AVX>>LhO;;&dX;;NF z!d;wlkt(4+X{R*91pbYBnT~SpOD^>+qnf;w`L)2l`M3Y`e9g?+uR7}+{)Q8^Z%U0} ztdnU!d3oF(Im@!3-jXct8=;moRrar7+@AOfyl>tWp@*L2{WKbRbjYvFoF}Pkc(?ER z&h0eq{kov*1f0li$VyDDwqfP{#$I+0=#!kth0 za!xc}kJcK^96&qVGrK^wf)Eo~1N(2qHGeaNJP6;U?|fw(&NvXT5rb6l$ZOJtBM8p} zhZ||BCXr*RG=A~Iul&qgiYO4~TF43B-;H*P=-7QUR*=-N#x;=8vBs70@ey8N>g?)V ze!5gbEk(^={yBM;zY!=gv(m`gdok_mzA+md%~Z)wlrhe>F&1F<=_Ksp#r3RvXSd?` z<>hf|>Spzr&3BxRss{=QVk-Fph5RWL4o~7PCQS1&1`e+`3@*9s%NObxb0`*S8Q3Ec zaYQSq zYzB>Q?c3`WojINOh>95(c^Cm6k7`{})aM%N>+eI`ix?lyFjKou;~0_A?;cahSFPIbA&(%Z6sob{f-o=pm<9*iRLzpr&oV{if7-C z$bN5*40>UaSergc;V#lKD&@ElPBHk@v&9_~7oT7{52gUA6?N4#InzlO!}Y8LgHpm) zZKP!A_Uzdf>df6z_lukCjY$ysw}ck;q<=zA{AJsCJx8JvSMtl%8er_5D#G_1`TTx* zCY_6l+L#WAmo#RK;HTCmwD?JKA0FVq>>c6Qe6lQdgObEK%#PgmJ>rIj0_34ctZ#_0 z-4g-REZ;pz5mtQ;&rabBFD4%Z>)BG(LJl`o$YYNMg|EiQu4_J|#njW9`&kB?;|Z@@ zcy2V&C)?BEjJ9dyO*L8n{a|dMOhEKsGJ4ELapMkgirmTFfjp%N$s%i#Djg7B=to5cw^xn%_o|u;b#r6MJA56dv&W*Q{QpL`=oe!Gig>9FO;Zyu>8LV|$GyTJI7> zmIJMJ;E{81hGn=;Lh~4K(Wxg;&L5YMp!o4!sL%?TOH9N!&q2$3|K|)_^fftut3Th< z_`Wg59!{jVa<*%3w_|U$+qX)2U+GUt=J!57_e%<+g;>pI6%w+M;|>OAL-tD*2%*Bo zDa9!XX+h64sAh)`CzJ)%NJ;9ym-lR)zyKk`#(n4PMMX&pPwuqOUG-uIV_l-^Y2&-@ zdk8eN$u0VR^go6CU@3LI4P{|+2JqGD>B-R&TlF{ku*#v2d*9G&y~7*{cF&WhRP-NW zhwiIsIaVJ#AUr%{z(iChN=yaMwkc?YKLY-rIsO~t{BUhAdee|Nzp*jv8{)>MCL$J+ z+WG+?iW_*E*w7}@D1$KwI};kve*7o)@JlSI6>i}|TH#B~NCua30atk0h^+D=ZF+M( z8_rS#(SQ8?1g*pJ?j2|6NssafTlx^*9Cxe#fbluI!O9Q`4knK1mn40vO^`1JS)PgT z%{GZOFBvb)kzxD7R(8Qt#%jo;^Y8bOZBNaXqu@qK)(wRn+!;rKmp+ghwl1d-wnNQI zQfS0`#)ac}R9&)Q&^I=-T4p`0%bGj5sGLuDqe%-L$q*S{h*_xq$&Fu`5f>1P0GeXX zi;Rh`)j9RYThhsrr0_6jO9T9k`y&x$(#4_WjK~Fdc_xF$-^I$VIFRtLFI0r`t7{MX z*${)#W%s`zpk?M2a747opp9Ag>EdKy50|z4jAw^?l)=lHM*fQ#@p@T#%y{N^{i?pGIzqb)|TXV%XztIsm12{}}o z)xlo)?Dx&i*!`<|YYOwm>)MSDfWE-wFn)iZ{>?&!urAdZ%C;qyiT|JT4CEtHH|Hv9 zV&A7nJKpboT^9j6W)#~u2&NM61tkyVk5ZIvI<^RWJ^wECw&%@`{fT0sJ9QK?sP|(! z`)Vpjoel*Xpjt2$l_)yIB2EIIO-!PcsARAoobT#C^xd0|9~%AN3r}D8Rbojt5J|dc3D-tU z_`xOibVIc1XU#90LnNgQG|cB?_1h7Tije9EISF|YWvF4Luy}ucYhb%yWa6%bCCCpZ z^nRN@=usmo&-;DpVpeQjbYT#{^J1`MkhV{!dTw73mfYPUK4Qganwd==W@rqt6!Eu4 z7;ui;@Zcf~kWLPGpK{wptCYy2Vhu@Y(Xsa&cC*D;gx+T}Lonre)o>rMjt=(wW^iVw z56)q3fedA{B&Rt32H5UrU@Ln&*3+T)F&^aPMC*X{$s37#z-pXuCj!;~cX>WwCS39IA0@Q{S1l*I|&{MP4Ox4U3c z-|yWu#Cnv3*F}*7S|XbErV+hfche%b?qknQIxcc(QSf$;^7OV7O}_15jud7-nHBbUQZy9z>9oBuXZ6i0{CeYnD*X$Xrf z5_^se{t32PrT4^(%TF(kK?Bqsrx!F-xH=;kpivV?W5!E=k|~y^Hiay6qLz4#ACQu+ z4ow|!UJ0C74ib%Cq9|`=hI|NJOc45H{B96b3q;2YreyzgkE^Q%JBUA@Tk!7)8w34} z2MNL%HkYa9*7IEno2l3i=f5F zYikcF(BC(3KamP{WMPC{z>XwpJU6~>uq?&k(;sSe_UIs$#Q310zcj+UJ64j4NW~Qw zdYc`%jx&^@lfm6k=={Fz86yMY1ycqL8U`YVvrS zmC1iU_tduPzk+Abc|sO^Ti$oMyvSkxU+qD3HQZwkTF@s%a@^r{wDDutwyR$`A+tX+ zbN}`(Ffi{lG?Fk(#7w@!9SKe*!`@OfCN*}jP(qZkJPF#==zd0w>@+u|w=E3Sio?w8TvT}Hk;5nxC-Tt*2gU6#AA3>N`(sa%F8GBs zwepA5t$hBB^Qb5_==JTON0R*Ikynnke`>R*;n zm3$R#t4p3+B?`bl;LE8^ShEejJm5>|d=fB^py>80py!+ed ziz})VwDj=o0#_Mj`S>`?N{@o%4)J30B9;g^sPe|4)y?#jtb)j5Guc^cHXQePi;^wm zcQhG&s9(Q#X&Q^)j@5@mW7H-DtF2=P9`@Payq%!?DG|{|-8oez6ERn9B>OL@?MaX= zmt@-CNmyK*Dsh-6UhK3w7*Fc@@>ImZYT6@ig?&#Nu-VJ@W;N~1J<_5_JwsX^6Z<0)Uv8t#v-L${ zCRyq++~#Nl?E{w*SG#Jbyxw4|a|!2XK^x?@z%$3dr>M5M)G?|E@%PY2#FQqykK2MO zSH^m%zkJQ+F`=En4MlZ+X;o$Ro*j5?FAaK&#MnUp{B7Dqn<)v!H!B%{aOgkX^KGq1wIXBrHt#paqzR6Rx? zZ{4r&4{o}irGre^3jQru4i#aU2A_HdKQ5YG=1ulaeOJIqqtrd|0asG8dGEZSo7@o) z8-&%|6teB?A5zfVq>jbmjCQhRlq)enF zOBZW2C0@yY)VaP2z_AM-?Bu$gXsin7!zt-v$Bl5|1Oc9k`Z4$bQ?5kIiJFIZk_w;Gs-}f-}voSFS2;oWUn+@6$PPyD;M&UI>N}Bi)vHCbwQ;kvkWaOLMczOpCD4W3#MpZ_jcrv| z-x6OiwxZL0YU4qe%~Rp8NNqDt8t{}Kylmt%A(-a4PS(sQgP4r6?O|bHq1A@FAqO7i zCVK9VuIK0nU6&5Sq7LG$&`lJj1+!mVraO-9UrN(#ZSkXZ;UTeHd2%pBLZ)bTZ+!U4?KwT|@p(hkS_pLDmzvvzCY%?-b;6eAhZpSwLYJ zYT)z>E!OHly{^%ou}Fo=(pT&HQtC{+VbuCMhe#?nz7#K)$S%R! zQbjprgZVo={JjD_{Fv>6egt%_mA|E*6cwuog}F)ilWpA25d%db=Q(|Juj&UuY~H2c z5HGUTpJThcUT7inbKaRr$Cj`#gbj=m1hh}PC`2j0>R2ScF58UlU43;i8$}wO+W9|K zePvXX-xsa{ii$`Hs0`g8-AH!}h%_T0B@C^Uq;xj|0@4CXO2Z&64qZbJ-Q7L+%z>3VB7Fyk6ZL9bO&O_{{x| zk6P{0fr|Ysk@53w`Gth`4%O&5bPJR&JX-x6_5|Hb`wYczF@AD;U>Mo|%o6%HOxs5A z@F-sBVBkxLj*R=^ujQ*Nq^si)WB+3H3wRgTA>OmGYZkFu5TDY4V8G|IuWhxbP;?$y ziLD3>*Mf=idX+^FO(npCRG55J16MGY2KPyL^{M# zb{JkDQTCx%KVS8&HPH)A)QFP(WM_9lBa`>Oz27($%U0%8uiO{Ja|>Jo#4V{sc!9BH z_dm6grla@>8;EWFzMV?S@8D!`OY&u}qb%V@Z28@9-8;4LuN?VmwM!LxNhKRt_j1Jf zMzyC8+7NZyeV(=3r>C)qdiZH+_~!T$x3%HA=HKPN?}svKK8Z!c3|`0trc+Cit!qM_ z@R)t3^^EEsrpu6jtIULRkWZKH{NNr|(9Q#sUZ~4s+{Zn>ix9bwFKLK76jld+v!(0= za+*vHs}YAi;jTRW){;_?*(iOgXQ0(IDAxRvUg!GE!uxzmybRf6{rM!m;PKQA;BSo` z6$(b_7z_Zo=FfGl;O*;hL+{ZlHUqf-l--#aBRNm$(bcq&r{jX7ywk!nOJ~f$?O&o5 zykNa$yU_g>Y3;9Dx5O^y&A50QL$XoCEgvD|Q!Ujm?Hz3myE^y7gZYWuBzu>Glc7f$ z9h`q?``M}98bzC@ybvKskmb!2zizH?TJ(aPmi%iM?ers%iXPQqQ((n5^UI!t^bnn7 z+`U@8??d?^oZlrKU)a8MbF~NI(_(+Kk9F=}*HNyT&fQ&e#+pxKJ3d;r<*31%Ok)26 z!R_w(u>d((5+OnLCooeaUZmubBtWRCSL+KBl*mjg1ss)pr?CW)mW;%A3MS*Teo`3iI=SqXyHb zsa2a+(9LUD1ti!K`Z>@?>?kv`dRrgWCJmH_??%5;<4&Zguv^~vL~+$mMDFwlF5T`B zTc7%Y{d{2+Y(Q7@9H%fxl`x~b;N!p(Ie}OM#hUqyhSd{8Y3qru6fME?$PHd8Ju#MAtK( zqS#TRyHp>cXCBobj1QkSQ}Vd=XU!j5ot(bpGwjOGX^3vLCY%X)Isy0WUnp&cM|tjC z3UF{3w#F?NuWzig!X?)$UkqTI=|6v9V~v-=k}{q>Y)Jbf)YBCC=}!fH^`dAsWPr|! zy`3gQy?R@L%^gsU46Q2i01<95tk-G<~iZ!II~(e7mZ5z+yAR5}AavF+-JDBU5ak$N&| zkB36{nX8Z?-+JsQCmXeRUvBkIPgK?(9qh((5Z9hPTHQ;0)aQk~Hg+C{y{{Bv7e?E{ z_Y&>n6&MD2BW1WdI-r8VkNU51!5S@?_SzK(jE%ffA72H!o|)#_SiRvUvaLwtZpGPfI7z8))r!})vyOS`GcA0n z@Av&>ify`af^AFY&YvU;2}z^~&T`Uc)5SfjZ(*>L2^hc$q+P;sKHjCU?BfZqJ<{sZ z)PbOu&M+W|qCQI{0#w|pqjmIh|5I#d$HXth&jbCtH=-!=qfjov)nU33&SLunedhr> z_#gC1ipN}DbE--V=|bgIKhgv5<#vfDhm;M0p~vX~ciFLv&mb`g_kS2cacxphE4eM) zc37j@e^Vy|vp&wF1sa^^{{HlOH9zCg4eoq}Kk2?V{C1rp<`z}LXZ<9?4!>eC{%lU& z3_q7A_d08-)jY^avs*@&)P-8dGdc};I|rGIZwfakSaSEI^AsOV_ck}i+t}47@~Dfa zaQNI*j*O1%wO%35CKJV%7FR!q`k;^101#KH)Mu$#eSeLp-(hAn*?HjR@-;!Y-6)*2 z>6~QM`+U>TZPrroFhXm9FESjyZ)8`0jA#4}{XF0Na9n)H!f?u}-qS;9g*J2LpN-uT zNAtDNEoGGVeP8Qc!uLfHI+%DIXO2K2)-|>Qz)ttY%Gz#;r@-ecboyB5`x@3}O?cKw__x#t@E^JOuVh8P#VdyT%{$L6h8TkI7u?)qrt<8x;A>|5Wd#c9*Jw@!W9 z=hB&UaJUK9U`7<2E!HX_sR{4h;3ITL65gy%5gGF==Mek93=Xj>zF0T=aB%PoGlF<= zx8@0;`U|2nItK6C8ZL`|T%edn|BcTmI-+e~HX{>e=W=<4!vSk$8yFNV(~~re%C`=X zrp{L(ujxM49z7;MnYXW)3v6C=xd~p;S0At&51mdlzNlvv)i5L&T!)l78u~4I5G;LT z=5k^W!n-Yv|6slSgTZ;X5n_GAm7vu|I=!zBi)Pfo(GC=a!S^ZLzan@&YrRHsK_dTj@_h_IHAE zwYNK)*lst~U_aY%t-WF;1^xZIo2#}2fhdLdX^Y=5Yby1<>a}4=P%5Zf)^T;(ySd!^ zvTOJ@_59V=_v_l_$zs9tp2OPf63;W#qkh&V9qz=H?)y7gB^FcgVu;aZ-D*^tki*XR zTJi1N#q+7_C*V%teCAjuIrS2p|2ej2-9K2pq@auMB?y;Oplkebl5}FAV<3H5uVy>d z$(dj{IjW)KcK;xSM{T|?*?9RlkJUFD|CqL2_L6m-@bL$bgQ_16#;cJfU9)?8J{8JI zl@OE9iaGr`{ckKee@!_GXEtZ>Ws#DPGkG=I*4qb71d0$V$xgM@?t_}yTfKX1CrT8} zUu;G@2n)j) zH#$T79*b!sVP6G^4n__+ZacJcNqg0P1lqkL-Hnz15S2|^+5OHFvYC_zsUTCiVK_bS zE8_cn&=~%A^${+e*3r?)pm@x8cy-WbN&Ppo=vTzPt5EMq7Y4*L%JbKXxTGnSNL+>; zt|%Zm`6+~|B&4HS50`Ypx$`%5v(Dv=zNK1PqecN@0oO(z>A?_18NO#wv1zdP0`FqC z(nJ)LewYIs1*&&@Go{e>RrdOC@b^L4P*`E%R~NG3H;BY!qrW{SKZ~y0+Bk+L`6IPi zb>5{~q_oLATlTKH;b@u5pIT*^`ysvJghWwNC-)AaQ1Y;0T^8Z7n7%WkO{GZnu-Rr@ z<`PzoF&;A_8)g!CT~xR=C{3*|F78;R$|)Thc7y+rBH!YWjeP4%Is_3s*68~oOGwsT-E2#XrTiWAnC+s8Ey z0+OJoRg|4+1)zs8_Nz(Pb>;W>nmbC`%7eGN%%L~0_T4(lw(a+)iq{luey=#u5j`NE zqWG3GizOQwkia|I+}yZqlv1e0z-4au2r=oYP!MM&=R2n8S$>pQ@Q07-V^O^H4i~>^ zTXC7>!-`BzD#z;|F!nU;KNTuN>%@tPiR~}CoR;k=S0khu91mhIvp0o3`@VKw2_*Rq zH2tt&@5TPhJteU2$*7FVP`zu|TZw)##>1cBrY-78>2lBEo|mZ2`Uj{=kt=;&yFOcG z=9{AX(#SGdY;>B8iH$}PC%&-zS(5*+T zQhF~V*%>Mxpbs3}ro5Kr`S|uCmEpA=$cgI5xN_P8;A+lPZ;XG}$CK0h=c;uhykXS{ zT4Mq0VxT<;Ga{l7k@tPDIC*wnrE{d{5DDB;~TzR>BVtt18?a-Q-Qg; z>(lv@h8>fe;?i9Q$wt(-CVZ*AGae3yammZaddVtz?%T&5pVw+>UDv+ycY#`uy9CC2 zdbRD%{%V)!jh*S+lM~d;-9Pf`!tkT%^JL>bP@w-MRXIr&irg%P8$O-dmip02POH+G zZQ2lG!c5=nIVU8Qh0`=MlRM1JhG;*=-j`!0st~N%P1IKw3hTb8A2}mjeIKv*|MAz((#*7Ub;!}? zypXFF(W1itUQ*I$^M;nbHH4rjUHa$wyQ1d|T6)7OFvKjauw3B6mv(|+NP9$K{Mn$o z{R>mlB&CA$*^f0beeY|g;8Sun4o8jBwVUcbi&aR{q804}^N8TB56;ip+7Xc`j>(sVjB&6cWi>%!xef zB6lPMs`F3>w)i(JvTP)@6w%I$+R)WXQm?e1W_|-P`g#du^XZ=R@^*Pl*g@Fd?K*CE zbdh{_Fv|3QaLCB&{Qzsg&%Tx;HmcnbY~?Jyw{WuN$JC{9f66#JNz=BNFLFGc3^ffH z=V*0?<*Si3EvhXsfU;oo;ycxe&yy~L39}W)_O2=uEZYBdT|n06)x`>>m@$m1nEo`(h%l5J~dgat-1%>tsvo}2G_%-QmBXqOoZg_qiUbius=`>JI zX?`)HC_`hC^b)Fwmhiv3+BZM8Swc~v+TPznBK2C!s46xs$aGciuc|&C(N2sxSBu+~uYuDS8=}>*k@s$?l^P9q`r5g7vzwj6bX(&QOn}{piJuO!%CwrCWbk6(0F7%_M=>2+yt1fC7A$hsW z^PYq!y>D-0GyIuI{zux?5Ri@Qfg?b#lMF>(?jr^dm^>-kB!v>gLfwfsZJV*E5izBBM!E@$ernkM+*|wdQIF zuEJ!>H)(Ps=U2`V9NvPtIWeY(z!=kMx9Jqzl&b@$VIUio4|EiOiU^9*Er7M;@@WZy zUmVleXA?H1g<86xj}U1APB0c(RP(RDVoV3fX~=L)$%LhF47*w?U_DY`M^lH#J#B{z~r z1|Sb~6#`;#3wdcPi@c7>RoM&IMvC|FE~q$*&Ky6%J&76}zOsL14@f#R+h0Q3p0kz`X%|0!T;TlO>0F#heznaH!92Ub@Crs`@;-oyx?QJ-`R>a3D2o zjpZCvNU&m)V&c*ksdD-)x~a@iWa!whl^0|7*;pbtNE(uV}Vg7Zn5(U zbSl6vo5onOkp}2w(Gor&;=F@H?LeM(hj5C}*!|nlm4BX%XD_dzWk{ur`-g~NiHCP< zOh@p81?DGXw$0J&ITOzH$cqtPRr0P0Q_taTS>P6ynh(?^03zUJWMm|;9|*GLS2ka+ zcAW;--(jc!xa7(IWm{5GteY@Z)Be-3VO+?EUi-EGxi!Sq!cO&zP1ij)rKJb=HFBWG z*t1WH^z~nJN83l#MkvQI==(Z_1IlElFi8G3SL&FCs=@OxQzCMYwJZ>gfe9rrzy-@Y zY4SY?VzWF22VDj}f3^x?@0RhSLSyh!@7!5+BY4O?7MxtxbR3#OS87N&Vs`;fO)-wst&-82AYy-_`5MK zq>pabx?yWaEl${`oUVI;47^wwV!Hm4aFl9H#n-|wSX zZ=1G$fOTgJxKrh7GFMEnK_C#&;y;Ih)v&ar6}g?-d8NLawZSzz3hQNpl0a&@tnZR+ zgbc<6dEA(xm1BEOO^8Rp>4HUwEH8gK?3&2*F2$X#cn%;ch?Tq8-5-0l)~<;g5_gic zvil}tv);7`oBYw4UNa-{htmyE&DOTI+CLfrE35AJPBML~{@9NI@&?!zfEi|zYQelw z0su4*I~=mG_WJ@*O32YRK@TjQ=Zc?F=-B^lzgN=u_NGAQ1aarW@4g0yz%uz!K0#yhhRcC0%= z_g3u7Z&hCE2V}x6zBOd^x7HWNNi3+lvr>|zgY^l?bK0rdz29&urFkf zCN`K$_0Fxm^){-gtn(%Eh7xF%eDl~S{AtvX1lTP=&=**e(udbTLakHT^nZsqE_M!% zje$D(5dgGdSdjJgPvkCj0NC>NmN3|ID(5e;X(2AuT)g(#43nzkG@OLB!<4NnXxQMV{@9W4uK>}=Y8b~sQ7IO*2T8+Md`48N2q`6aa zfr2f#8UKTz&eb8KK{RC4!%-NSQi7&X-< z0p$qw6N~G<&AmHBuC8e*EOS#3ZL`c7oOxm0>th z^mueUI7g>@VxOE1cv5-F$#IC~7)?Nw2;Z#NO_F6IX3_icw6OHoN)98rqI{RIv0m+0 z5Co|+X_FCgy}617TJJR#hYE>7^8m;oE2fS6I$OAl!X=eS?pmOBZ26O|nZfhA{a}5T&oh(KI8V^uK=nxzB$_}xAQ{0d z`4g3ccxecLnLWuN%*FRtZT{U*>*Y;0`w zYV06JMn+(V#JsW~d46T3bAx`yFTKhjc}lMY;57i4Q*RHPjKQFSv`7{VSrP^@9z=PJ zG-otD>9HpBr=D5P-Id;~$5Ue#wq3mNA16|pwQ)cU(O<0}#xR`kAe&VZ|3N4|6%`c; zUhTE5Z*S){HKhYSAIP9T8Ua$DK*LOI@J>IaeO;JWL1a#IX&OAk4&3QsKuNjr-oh$) zQ!H+Mgi)?d_d6U?s*LseYJ=J=)zF;c%{LzaoU~f-25`xvz!PWP76HcwH^>A(x(j>` zq_dJYWV8P2yx+&-;%FW4<}gAbRQT@zF>GXHB;qS&1*S2dyxs)3G18FZ?JuxC(nC!( z@Bgmab=?eouLMgqpE&#?HA$*i(wp3WEhta!F@Pr;H4_R}7J!+6=x>!8jDU^bx^*9> zC?oks4x^Wd$HU1f0fTK@3_oEp<+?$|-XDIW(-B_EMwNz0wsRpDr`f9SNSaRj(6NoT zpKb>$TC6XIw>&HOR;y9pxdOC+0Q}e3bDIx9U4eWe4e`TR6$VEm*YQWw6dr5Two{m< z0C#UK5Tn_XF%Gib@d9ewn7|)sTKk${Aw41oZ^p;rB298%D~!Z`uab;jrv7h*p(Zs1 zepDCjyb&Btxh_4qEVK|p%c&ZFyons1no?#@rp3o81Nv32Gipd)F^`48tL0?zg}pi+ z2Z0Ej%R%&G=Qi2(pe}0S0l~u&qO(JYKqXqt)BbSWvhQ0rAgQ|p&l}8ilEMMOPPf@x z6xfvR?nl`60JUVjMmH`nee%l7%SX690CiXi_dft#0{|ncb;br$NDK`8JCM3>#Q3jc zHzuj+Mt$BsXWpS@!qTCWnK5dsWsAWowNpbLBCD?cWM*atECNF$kgminH<=>ONqv6S zJqlf2DTYf)znb%WFy(Et(y|~#Z4`jY>KmZz>J{-7zgh5re;NcC!mKAxIBoPR!Y)S) z38L`LL)Br7+X{GSTb!7Q9?6qed$)kow&~H@Ah3`GKyI+*(t&CKFBo+y2D(@(%T3_T zzjie+)Y&yP(Rm0Re|%fsdG@^{$Iz_dHNJfu@vAX~CC=3N4?}3N3uU=H!)Bx914_JZs;-ZMx?FOzULs_Y+8)HmWv6 zOWcLLith#KE{rubA7j01?0s$yG7nJ10)sj_!Ytq(1k~rU2iM*fnA-lukYt#MO##uE zmzNhmROavMA;vhwdN{vncOTQ|QswjkZ1gECpGao)>QWEUr%Dg2!)5NGKAJ8*(u;Vm z%u6kFDzTCR)BO#g_K9pgs|v_EWX7Bw(a zJv#)1RAzyjE9BL77TSLxb{XEjOl{g+JaZJfD0r$>z~$PPLCbF(*cHwJ|BK*gRsjZ_ zAP@c@{RfodX5e`^)Maepm<0gTX=!4=*VU!u1KweAv2vg-NDXAeNw_>uwjimRWuLb7 zDL(H>GN`7uXLx#KGO7-9;(n3Jk^oe~v|hsh2o)fPCLQ=8fCNP2)d2#SkL0VSfy_m@ zd(rK9V-$y)3=nScMA-k!U1mY<5^t(cf_B~)&@0a;3RrnGPZQ@bFy|}e>Gbb`JeOr@ z3N61{$7@66@=n8UX9XL0DQhb$s^^h$|M|ECw3*mWL$tD6c1#4_tY2ns()5w%(a1^dV2f2)=_j zDULqx2Z~$SgI0w^-%Q9rAJW7sD8A88k_DXxwgeD&@r2i?vIkFho^yS}xCel&Bv6J% zQd|2eP#Dd_914VY0P|4;+aeH?^?>k6rDgwH_clyaz_5RQzK*~L-97D!@~SN{_}~v} zZxGG_>uaQ!nW=Aq-JCX#rkoFx^9DX59U2`4FmDXZmM$us28uk^989-P#rzVi zYLHFj(ERs!G6DeSWRk;2RA6|Edi5^Mg>Q-y7|C(4K!#v;u+**cO|U${tbqrFaABZ4 zAPbb}*Ik~g4g=3QDw1%5NIB)M|B@qalU6LCc~@;ETJT@3a3b}<6hQQR69^F%f8TS1 zm`5EjPLGwH5C;k-{-#_^4V*VHtj|_6K{$rtmZ%k|Cz}x)yn1>y9k%aC4 k_nBcc&%r4EzYjoDCi-}Xy!K4+zXiS&Wz}R#q~7`eAGzG9aR2}S literal 0 HcmV?d00001 diff --git a/examples/qchem_modelling_basics.ipynb b/examples/qchem_modelling_basics.ipynb new file mode 100644 index 000000000..245207581 --- /dev/null +++ b/examples/qchem_modelling_basics.ipynb @@ -0,0 +1,636 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "VKpLon6Agujb" + }, + "source": [ + "# Quantum Chemistry: Modelling Basics\n", + "\n", + "The aim of this notebook is to provide the basic quantum chemistry knowledge to help solve a chemistry problem with quantum computers. Many parameters can be tweaked, and some have higher impact on the accuracy and the quantum resources (number of qubits, quantum circuit depth and number of measurements) than others. This set of parameters includes the choice of initial state, choice of basis set, and the freezing of molecular orbitals. Some references are provided when needed.\n", + "\n", + "The [Tangelo](https://goodchemistry.com/tangelo/) python package is necessary to run the code cells in this notebook, and it can be installed in your environment by executing the code cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " import tangelo\n", + "except ImportError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Et892XDtMfV6" + }, + "source": [ + "## Table of Contents\n", + "\n", + "* [Introduction](#1)\n", + "* [Computation of the Mean-Field](#2)\n", + " * [Molecular Information](#21)\n", + " * [Restricted vs Unrestricted Hartree-Fock (RHF/ROHF vs UHF)](#22)\n", + " * [Choice of the Basis Set](#23)\n", + "* [Consideration of Correlation Energy - Potential of Quantum Computing](#3)\n", + "* [Resource Reduction](#4)\n", + " * [Active Space Selection](#41)\n", + " * [Considering Symmetries](#42)\n", + "* [Advanced Usage of PySCF](#5)\n", + " * [Extracting Mean-Field Quantities](#51)\n", + " * [Outputting Cube Files](#52)\n", + "* [Closing Words](#6)\n", + "* [References](#7)\n", + "\n", + "## Introduction\n", + "\n", + "Quantum chemistry aims to solve the Schrödinger equation for many-electron molecules. As stated in the postulates of quantum mechanics, the wavefunction $\\Psi$ encodes all the information of the system. One who knows the electronic wavefunction of a molecular system can therefore predict measurement outcomes of an experiment. This is a highly valuable asset for academia and industrial purposes, to help develop new drugs or functional materials.\n", + "\n", + "The analysis of natural products is an efficient way of quickly getting inspiration for the design of new materials, while taking into account the million years of evolution that nature had to optimize a biochemical process. For instance, one difficult thing to do in the laboratory is to change the spin state of a compound during a chemical reaction. Nature circumvents this problem by leveraging transition metals to achieve this challenging task: the oxygen fixation process is achieved by the heme biomolecule, where a Fe(II) atom is involved in the spin state change mechanism (see figure below) [[10.1074/jbc.M314007200](https://doi.org/10.1074/jbc.M314007200)].\n", + "\n", + "![FeIIPorImO2 system](https://drive.google.com/uc?id=17J4NNTvISeAqrNczZDWvGAKlCu0HpA6O)\n", + "\n", + "Fully understanding the mechanism of oxygen fixation, that is to say knowing the rate constants for all elementary reactions, would lead to valuable insights for the design of chemical catalysts. Achieving this goal would take us one step closer to [*making the world cleaner, healthier, and more sustainable*](https://goodchemistry.com/). This is one of the main applications of quantum chemistry. However, the Schrödinger equation shown below cannot be solved exactly for systems beyond one electron, i.e. all relevant chemical systems for industrial applications.\n", + "\n", + "$$\n", + "\\hat{H} \\Psi = E \\Psi\n", + "$$\n", + "\n", + "Here, the electronic Hamiltonian $\\hat{H}$ for $N$ electrons is expressed in the first quantization form,\n", + "\n", + "$$\n", + "\\hat{H} = -\\frac{\\hbar^2}{2 m_e} \\sum_i \\nabla_i^2 -\\frac{e^2}{4 \\pi \\epsilon_0} \\sum_i \\sum_A \\frac{Z_A}{r_{iA}} + \\frac{e^2}{4 \\pi \\epsilon_0} \\sum_i \\sum_{j>i} \\frac{1}{r_{ij}}\n", + "$$\n", + "\n", + "Where $m_e$, $\\nabla^2$, $e$, the relative nucleus charge, $Z_A$, $r_{iA}$ and $r_{ij}$ are respectively the electron mass, the Laplacian, the elementary charge, the distance between the nucleus and the electron $i$ and the distance between electron $i$ and $j$. In the second quantization form, the electronic Hamiltonian is expressed as\n", + "\n", + "$$\n", + "H = \\sum_{pq}h_{pq} a_p^{\\dagger}a_q + \\frac{1}{2}\\sum_{pqrs}h_{pqrs}a_p^{\\dagger}a_r^{\\dagger}a_s a_q\n", + "$$\n", + "\n", + "Where $h_{pq}$ and $h_{pqrs}$ refer respectively to the one-body and two-body integrals. For more information about the state-of-the-art theories and methods in quantum chemistry, the reader is invited to read the references at the end of this notebook. The scope of this notebook is to provide clues on how to choose input parameters for modelling molecules on quantum computers with [Tangelo](https://github.com/goodchemistryco/Tangelo). As quantum resources are still scarce, the definition of the problem is a crucial step in an end-to-end quantum chemistry experiment on quantum hardware. To keep a reasonable runtime for this notebook, we work with a simple example, the dioxygen molecule." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "o2_xyz = [(\"O\", (0., 0., 0.)), (\"O\", (0., 0., 1.21))]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dfApY4WZMfV8" + }, + "source": [ + "## Computation of the Mean-Field\n", + "\n", + "The computation of the mean-field is usually the first step of all post Hartree-Fock approaches, which we describe in a [section below](#3). The mean-field approaches solve the Schrödinger equation by averaging the electron-electron repulsion term in a self-consistent way. In other words, each electron does not explicitely interact with other electrons. Depending on the molecular information, discussed shortly, different flavours of mean-field solutions can be computed.\n", + "\n", + "### Molecular Information\n", + "\n", + "The chemical information is encapsulated in the `SecondQuantizedMolecule` object. As the name suggests, the formalism used in Tangelo is second quantization; however, the package is not restricted to it and data structures could be implemented in other formalisms (like first quantization).\n", + "\n", + "When defining a molecule, one must specify molecular properties. One of them is the total charge of the system, i.e. the difference between the number of electrons and the total nuclear charge (default value is 0). This is an important property when dealing with oxydo-reduction reactions where cations (deficit in electrons) and anions (surplus in electrons) are involved. Another important quantity to specify is the spin, defined by the difference between the number of alpha and beta electrons (default value is 0). This allows radical systems to be modelled: a spin of 0 characterizes a restricted-shell molecule while a spin different from 0 defines an open-shell system.\n", + "\n", + "In the next cell, the dioxygen molecule data structure is constructed. The ground state of the dioxygen molecule is neutral and is a triplet state (q=0 and spin=2)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8 active molecular orbitals\n", + "12 active electrons\n" + ] + } + ], + "source": [ + "from tangelo import SecondQuantizedMolecule\n", + "o2_sto3g = SecondQuantizedMolecule(o2_xyz, q=0, spin=2)\n", + "print(f\"{o2_sto3g.n_active_mos} active molecular orbitals\")\n", + "print(f\"{o2_sto3g.n_active_electrons} active electrons\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "X4IzRNI8MfV-" + }, + "source": [ + "In the above output, there are missing orbitals and electrons. The default implementation of Tangelo freezes the core orbitals; for the O$_2$ molecule, two orbitals, corresponding to the 1p atomic orbitals, are frozen. The next sections elaborate on the impact of the basis sets and frozen orbitals.\n", + "\n", + "### Restricted vs Unrestricted Hartree-Fock (RHF/ROHF vs UHF)\n", + "\n", + "The mean-field solution is automatically computed when the `SecondQuantizedMolecule` object is created. With the provided spin, it computes the relevant mean-field, that is to say the Restricted or Restricted Open-Shell Hatree-Fock solution (RHF or ROHF). Using those methods, the spin-orbitals are treated as pairs, so each molecular orbital can accept up to two electrons. The unrestricted Hartree-Fock (UHF) mean-field calculation, where the spin-orbitals are considered individually, usually results in more accurate energies for open-shell systems. At the time of writing, the UHF approach has not yet been implemented in Tangelo. Further details about the RHF, ROHF and UHF methods can be found in [Szabo & Ostlund](https://books.google.ca/books/about/Modern_Quantum_Chemistry.html?id=6mV9gYzEkgIC&redir_esc=y).\n", + "\n", + "### Choice of the Basis Set\n", + "\n", + "The many-electron Schrödinger equation is typically solved in a basis of molecular orbitals which are expressed as a linear combination of atomic orbitals (LCAO). LCAO coefficients, used to construct molecular orbitals, are obtained through the minimization of the total energy, according to the variational principle. For convenience, the basis is usually represented by atom-centered functions for molecular systems, or plane-wave functions in solid-state physics.\n", + "\n", + "In early quantum chemistry, basis sets were constructed with decreasing exponential functions ($e^{-\\alpha r}$). This strategy was referred to as *Slater Type Orbitals* (STOs). With the increase of computational resources, the use of Gaussian functions ($e^{-\\alpha r^2}$) was popularized. Computing the numerous overlap integrals, needed in quantum chemistry, is much more efficient to do using Gaussian functions than with STOs. This is the main point of using a *Gaussian Type Orbitals* (GTOs) wavefunction. \n", + "\n", + "State-of-the-art basis sets are constructed from many Gaussian primitives. The Pople notation is one of the most explicit notations for basis sets:\n", + "- The hyphen symbol (-) separates the reference to core and valence orbitals;\n", + "- The digits represent the number of Gaussian primitives in a function;\n", + "- There are as many digits as there are functions for each atomic orbital (zeta $\\zeta$);\n", + "- The letter G refers to the use of Gaussian functions. \n", + "\n", + "As an example, the `3-21G` double zeta basis set uses three Gaussian primitives for each core orbital and a set of two plus one Gaussian primitives for the valence orbitals. More information, examples and discussions about the GTOs can be found in this [link](https://chem.libretexts.org/Courses/Pacific_Union_College/Quantum_Chemistry/11%3A_Computational_Quantum_Chemistry/11.02%3A_Gaussian_Basis_Sets).\n", + "\n", + "Below are popular basis set examples used in quantum chemistry." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "basis_sets = [\n", + " \"STO-3G\", # Simple zeta, minimal basis.\n", + " \"3-21G\", # Double zeta.\n", + " \"6-31G\", # Double zeta with more Gaussian primitives.\n", + " \"6-31G(d,p)\", # Polarization functions (+ 5 d-orbitals for all atoms except H, +3 p-orbitals for H atoms) added.\n", + " \"6-311G(d,p)\", # Triple zeta with polarization functions.\n", + " \"6-311+G(d,p)\", # Triple zeta with polarization functions and diffuse functions.\n", + " \"cc-pvqz\", # Quadruple zeta.\n", + " \"cc-pv5z\" # Quintuple zeta.\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nKtrojstMfWA" + }, + "source": [ + "The wavefunction for a molecule is an approximation when using a finite basis set,\n", + "\n", + "$$\n", + "\\Phi_{\\text{approx}} = \\sum_{i=0}^N c_i |i \\rangle\n", + "$$\n", + "\n", + "According to the variational principle, considering $\\Phi_{\\text{approx}}$ is normalized, the approximated energy is greater or equals to the true ground-state energy.\n", + "\n", + "$$\n", + "\\langle \\Phi_{\\text{approx}} | \\hat{H} | \\Phi_{\\text{approx}} \\rangle = \\epsilon_{\\text{approx}} \\geq \\epsilon_{\\text{true}}\n", + "$$\n", + "\n", + "With an infinite basis set, the approximation should be close to the real wavefunction.\n", + "\n", + "$$\n", + "\\Phi_{\\text{approx}} = \\sum_{i=0}^{\\infty} c_i |i \\rangle \\approx \\Psi_{\\text{true}}\n", + "$$\n", + "\n", + "However, increasing the basis set size has the effect of increasing the number of parameters to optimize, therefore extending the required computational resources in space (amount of memory) and in time (number of operations). As we shall see shortly, it is often a good idea to balance the basis set size to optimize the time to solution versus the target accuracy ($|\\epsilon_{\\text{approx}} - \\epsilon_{\\text{true}}|$), as the increase in the basis set complexity yields diminishing returns in accuracy gain.\n", + "\n", + "A full list of available basis sets supported in [PySCF](https://pyscf.org/) (therefore also in Tangelo) is available at this [link](https://pyscf.org/_modules/pyscf/gto/basis.html). Also, the [Basis Set Exchange](https://www.basissetexchange.org/) initiative hosts a collection of bases for every atom in the periodic table. With this constantly increasing number of bases available to the community, choosing a basis set can be a challenging task. The theory states that an infinite basis is the way of getting the true wavefunction. However, it is not possible most of the time and one may prefer a tailored approach to their use case. Here are some tips and tricks for the basis set choice depending on the modelled system: \n", + "- As a rule of thumb, a double zeta (e.g. `6-31G` or `cc-pvdz`) is the minimum basis size required to get semi-quantitative energies. \n", + "- For molecules with a high electronegativity difference between atoms, adding polarization functions (e.g. `6-31G**` or `6-31G(d,p)`) is recommended. \n", + "- Diffuse functions (e.g. `6-31G+(d,p)`) should be included when dealing with anions. Diffuse functions are functions with small coefficients (small $\\alpha$ in $e^{-\\alpha r^2}$) that can fit the electronic density far from the nucleus.\n", + "- Effective Core Potential (ECP) basis sets are needed when dealing with heavier atoms with relativistic and non-trivial effects (for example, the iodine atom is often modelled in the `LANDL2DZ` basis).\n", + "\n", + "In the next cell, we demonstrate the effect of the basis on the total energy calculations and time to solution." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import time\n", + "import matplotlib.pyplot as plt\n", + "\n", + "mf_energies = list()\n", + "mf_times = list()\n", + "\n", + "# Perform a Mean-Field calculation for each basis set.\n", + "for bs in basis_sets:\n", + " \n", + " # Measure execution time.\n", + " start = time.time()\n", + " scan_basis_mol = SecondQuantizedMolecule(o2_xyz, q=0, spin=2, basis=bs)\n", + " end = time.time()\n", + " \n", + " mf_energies.append(scan_basis_mol.mf_energy)\n", + " mf_times.append(end-start)\n", + "\n", + "# Create the matplotlib figure.\n", + "fig, ax = plt.subplots(figsize=(8,5))\n", + "\n", + "# Plot the energies.\n", + "ax.set_xticks(range(len(basis_sets)), basis_sets, rotation=45)\n", + "ax.set_xlabel(\"Basis set\")\n", + "ax.set_ylabel(\"Energy / Hartree\", color=\"b\")\n", + "ax.scatter(range(len(basis_sets)), mf_energies, marker=\"o\", s=50, color=\"b\")\n", + "\n", + "# Plot the time to solution.\n", + "ax_time = ax.twinx()\n", + "ax_time.scatter(range(len(basis_sets)), mf_times, marker=\"s\", s=50, color=\"r\")\n", + "ax_time.set_ylabel(\"Time to solution / s\", color=\"r\", rotation=270, va=\"bottom\")\n", + "\n", + "# Show the graph.\n", + "plt.tick_params(axis=\"both\", direction=\"in\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sd8GEceHMfWB" + }, + "source": [ + "We see in the previous graph that increasing the basis complexity brings the energy eigenvalue closer to the true Hartree-Fock energy. This trend can be generalized to other methods as well, like [CCSD](https://en.wikipedia.org/wiki/Coupled_cluster), [MP2](https://en.wikipedia.org/wiki/M%C3%B8ller%E2%80%93Plesset_perturbation_theory), [FCI](https://en.wikipedia.org/wiki/Full_configuration_interaction), (...) although the time to solution would be greater for those post Hatree-Fock approaches. The takeaway is that even if an infite basis is required to converge to the true energy, there are diminishing returns at some point, especially when considering the time required for the calculation. In our case, `6-311G(d,p)` appears as a good choice in term of accuracy and compute time.\n", + "\n", + "## Consideration of Correlation Energy - Potential of Quantum Computing\n", + "\n", + "\n", + "Post Hatree-Fock methods are meant to consider the electronic correlation energy. The correlation energy is defined as\n", + "\n", + "$$\n", + "\\epsilon_{\\text{corr}} = \\epsilon - \\epsilon_{\\text{HF}}\n", + "$$\n", + "\n", + "Where $\\epsilon$ and $\\epsilon_{\\text{HF}}$ are the computed energy and the Hartree-Fock energy, respectively. This correlation energy can be split into two categories: static and dynamical correlation. To consider the former, one should use multi-configuration approaches. The latter can be tackled with post Hartree-Fock methods with a single reference state, like Configuration Interaction (CI), Coupled-Cluster (CC) or perturbative methods (MP2, MP3, ...). Going beyond this explanation is out of scope for this notebook, therefore we encourage the user to read on the subject in [Szabo & Ostlund](https://books.google.ca/books/about/Modern_Quantum_Chemistry.html?id=6mV9gYzEkgIC&redir_esc=y).\n", + "\n", + "We saw in the previous section that the `6-311G(d,p)` is a good compromise to compute the O$_2$ ground state. In this basis, the dioxygen molecule is described by 72 bases (spin orbitals) and 16 electrons. To get the highest fidelity versus the true wavefunction with the current best method (Full Configuration Interaction), one would need ${72 \\choose 16} \\approx 3 \\times 10^{13}$ configurations. Even if we somehow managed to represent each configuration as a single byte of data, 4.11 petabytes would still be needed to store the full wavefunction of the dioxygen molecule. This effect is amplified when dealing with relevant industrial molecules like organometallic complexes or proteins. Going through the classical formalism of quantum chemistry is therefore not a viable solution.\n", + "\n", + "With the occupation transformation (Jordan-Wigner [[Zeitschrift für Physik, 47, p. 631–651 (1928)](https://doi.org/10.1007/BF01331938)]), this problem vanishes. By leveraging the quantum superposition principle in a straightforward way, it is possible to map this O$_2$ triplet ground state to 72 qubits (empty and filled spin orbitals are mapped to the $|0\\rangle$ and $|1\\rangle$ states, respectively). This fact is behind the emerging enthusiasm of the quantum computing community for chemistry applications. We should note that even if the space limitation is mitigated, no consensus is established for the time complexity, correlated to the number of gates and measurement required to approximate the molecular wavefunction [[arXiv:2009.12472](https://doi.org/10.48550/arXiv.2009.12472)].\n", + "\n", + "## Resource Reduction\n", + "\n", + "Resource reduction refers to lowering the computational requirements to run an algorithm. This applies to both classical and quantum computing. In conventional computing, this translates to less bits required to store information and less operations to do on these bits. For quantum computing, this translates to reducing the number of qubits and the number of gates in quantum circuits.\n", + "\n", + "Our starting point is the O$_2$ molecule in the `6-311G(d,p)` basis. We focus on reducing resource requirements before choosing an algorithm to compute the ground state. For approaches relying on choosing a different ansatz or fragmenting a molecule into smaller subproblems (problem decomposition), the user can refer to the relevant notebooks in the [Tangelo/examples](https://github.com/goodchemistryco/Tangelo/tree/develop/examples) folder." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "36 active molecular orbitals\n", + "16 active electrons\n" + ] + } + ], + "source": [ + "o2_6311gdp = SecondQuantizedMolecule(o2_xyz, q=0, spin=2, \n", + " basis=\"6-311G(d,p)\", frozen_orbitals=None)\n", + "print(f\"{o2_6311gdp.n_active_mos} active molecular orbitals\")\n", + "print(f\"{o2_6311gdp.n_active_electrons} active electrons\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WENmx_HFMfWC" + }, + "source": [ + "The O$_2$ molecule in the 6-311G(d,p) basis would require 72 qubits and inherently a quantum circuit that is considered too deep for current architectures (NISQ devices) at the time of writing. Decreasing the number of qubits required to encode the problem provides the first indirect way to reduce those requirements. The two methods discussed below are the reduction of the active space and the consideration of molecular symmetries.\n", + "\n", + "### Active Space Selection\n", + "\n", + "Active space selection is a trivial way to reduce the number of qubits by ignoring some molecular orbitals in the post-Hartree-Fock calculation. Applying this method is trivial, but choosing which molecular orbitals to freeze is not. While there is no general algorithm to perform that operation, one can evaluate which orbitals to freeze by first printing the molecular orbital occupancies." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "NPArrayWithTag([2., 2., 2., 2., 2., 2., 2., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0.])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o2_6311gdp.mo_occ" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JWSVc370MfWD" + }, + "source": [ + "One way of picturing this is to only consider frontier orbitals and their neighbors. The correlation lost on the total energy when only considering a subset of the full active space might be small. For example, freezing low-lying occupied molecular orbitals is known as the *frozen-core approximation*, and can be applied because core orbitals do not mix with valence orbitals. Also, there are algorithms to freeze virtual orbitals, like the Frozen Natural Orbitals (FNO) truncation method [[Collect. Czech. Chem. Commun. 2005, 70, 837-850](https://doi.org/10.1135/cccc20050837) and [J. Chem. Phys. 2008, 128, 164101](https://doi.org/10.1063/1.2902285)]. Despite the fact that choosing a suitable active space can be tailored a problem, it can help reducing quantum resources *a priori*.\n", + "\n", + "The code cell below results in the consideration of molecular orbitals near the HOMO-LUMO level. The `get_orbitals_excluding_homo_lumo` function helps users to get the labels of these orbitals. In our case, the active space is defined from the HOMO-3 to LUMO+3." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8 active molecular orbitals\n", + "6 active electrons\n" + ] + } + ], + "source": [ + "from tangelo.toolboxes.molecular_computation.frozen_orbitals import get_orbitals_excluding_homo_lumo\n", + "\n", + "# Selecting HOMO-3 to LUMO+3 orbitals.\n", + "frozen = get_orbitals_excluding_homo_lumo(o2_6311gdp, homo_minus_n=3, lumo_plus_n=3)\n", + "\n", + "o2_6311gdp_frozen = SecondQuantizedMolecule(o2_xyz, q=0, spin=2, basis=\"6-311G(d,p)\", \n", + " frozen_orbitals=frozen)\n", + "print(f\"{o2_6311gdp_frozen.n_active_mos} active molecular orbitals\")\n", + "print(f\"{o2_6311gdp_frozen.n_active_electrons} active electrons\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cnbZ7LW-MfWE" + }, + "source": [ + "We decrease the number of considered orbitals from 36 to 8! With conventional fermion-to-qubit mappings, the number of qubits can be reduced from 72 to 16. This is an impressive reduction, but it comes at a significant cost. Configurations involving orbitals below HOMO-4 and above LUMO+4 are not considered here. This results in an energy further away from the true energy as there is nothing telling us that those configurations are irrelevant *a priori*. In the next code cell, we consider the CCSD calculation of O$_2$ with and without those orbitals." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Energy difference: 226.51013348418326 kcal/mol.\n" + ] + } + ], + "source": [ + "from tangelo.algorithms.classical import CCSDSolver\n", + "\n", + "# CCSD energy with all the orbitals.\n", + "e_o2_6311gdp = CCSDSolver(o2_6311gdp).simulate()\n", + "\n", + "# CCSD energy with HOMO-3 to LUMO+3 orbitals.\n", + "e_o2_6311gdp_frozen = CCSDSolver(o2_6311gdp_frozen).simulate()\n", + "\n", + "print(f\"Energy difference: {abs(e_o2_6311gdp-e_o2_6311gdp_frozen)*627.5} kcal/mol.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FruSKYNbMfWE" + }, + "source": [ + "Considering the [chemical accuracy](https://en.wikipedia.org/wiki/Computational_chemistry) (1 kcal/mol), the difference is indeed significant: 226 kcal/mol. Therefore, the lower bound with the reduced active space is higher than the CCSD ground state. The takeaway is to be careful when choosing an active space for a molecule.\n", + "\n", + "### Considering Symmetries\n", + "\n", + "Molecular symmetries are reflected in the Hamiltonian structure. The number of electrons in the molecule should be consistent before and after the ansatz has been applied onto the initial state. Electronic configurations not respecting this symmetry can therefore be neglected without loss of accuracy. For our purpose in quantum chemistry, it leads to a smaller number of qubits.\n", + "\n", + "The code cell below shows an example of Z2-symmetries qubit tapering with Tangelo." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of qubits: 16\n", + "Number of qubits after tapering: 12\n", + "4 Z2 symmetries detected\n" + ] + } + ], + "source": [ + "from tangelo.toolboxes.qubit_mappings.mapping_transform import fermion_to_qubit_mapping\n", + "from tangelo.toolboxes.operators import count_qubits\n", + "from tangelo.toolboxes.operators.taper_qubits import QubitTapering\n", + "\n", + "hamiltonian = fermion_to_qubit_mapping(o2_6311gdp_frozen.fermionic_hamiltonian, \"JW\")\n", + "n_qubits = count_qubits(hamiltonian)\n", + "taper = QubitTapering(hamiltonian, n_qubits, \n", + " n_electrons=o2_6311gdp_frozen.n_active_electrons)\n", + "hamiltonian_taper = taper.z2_tapered_op\n", + "n_qubits_tapered = count_qubits(hamiltonian_taper)\n", + "\n", + "print(f\"Number of qubits: {n_qubits}\")\n", + "print(f\"Number of qubits after tapering: {n_qubits_tapered}\")\n", + "print(f\"{n_qubits - n_qubits_tapered} Z2 symmetries detected\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vYkFnG6CMfWE" + }, + "source": [ + "## Advanced Usage of PySCF\n", + "\n", + "Tangelo currently relies on [PySCF](https://pyscf.org/). Advanced usage of this open-source quantum chemistry package enables the use of many analysis tools. We show a couple of examples where advanced users can extract more information from a PySCF calculation.\n", + "\n", + "A `SecondQuantizedMolecule` object can be exported as a `pyscf.gto.Mole` object. From that point, anything implemented in `PySCF` can be applied to this data structure. The next line shows how to do this operation.\n", + "\n", + "```python\n", + "pyscf_mol = sec_mol.to_pyscf(sec_mol.basis)\n", + "```\n", + "\n", + "### Extracting Mean-Field Quantities\n", + "\n", + "The first trick is the extraction of the molecular orbital eigenvalues and coefficients. This can be done with the `analyze` method, and it can be called from the mean-field object to print relevant molecular properties. The output features many sections, described in the table below.\n", + "\n", + "| Section | Decription |\n", + "| :- | :- |\n", + "| `SCF Summaries` | Self-consistent field energy contributions |\n", + "| `MO energy` | Molecular orbital eigenvalues |\n", + "| `MO coefficients` | Linear Combination of Atomic Orbitals (LCAO) coefficients |\n", + "| `Mulliken pop` | Mulliken electron population |\n", + "| `Mulliken atomic charges` | Partial charges on each atom and dipole moment |" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "**** SCF Summaries ****\n", + "Total Energy = -147.632274661317865\n", + "Nuclear Repulsion Energy = 27.989538428826449\n", + "One-electron Energy = -260.148728081504885\n", + "Two-electron Energy = 84.526914991360584\n", + "**** MO energy ****\n", + " Roothaan | alpha | beta\n", + "MO #1 energy= -20.4249798600401 | -20.4400185052847 | -20.4099412147954 occ= 2\n", + "MO #2 energy= -20.424364897337 | -20.4389300606557 | -20.4097997340182 occ= 2\n", + "MO #3 energy= -1.55251062929102 | -1.61345571756454 | -1.49156554101749 occ= 2\n", + "MO #4 energy= -0.993242469558959 | -1.09010934627351 | -0.896375592844403 occ= 2\n", + "MO #5 energy= -0.581544505580074 | -0.616775236948374 | -0.546313774211774 occ= 2\n", + "MO #6 energy= -0.579365900007762 | -0.714071611414284 | -0.444660188601237 occ= 2\n", + "MO #7 energy= -0.579365900007761 | -0.714071611414284 | -0.444660188601237 occ= 2\n", + "MO #8 energy= -0.0715888741311829 | -0.412074886861292 | 0.268897138598928 occ= 1\n", + "MO #9 energy= -0.0715888741311817 | -0.412074886861291 | 0.268897138598927 occ= 1\n", + "MO #10 energy= 0.73033550676964 | 0.689507257614018 | 0.77116375592526 occ= 0\n", + " ** MO coefficients (expansion on meta-Lowdin AOs) **\n", + " #1 #2 #3 #4 #5 \n", + " 0 O 1s -0.70708 0.70711 -0.00060 -0.00323 -0.00005\n", + " 0 O 2s -0.00483 0.00057 0.65237 0.65105 0.27278\n", + " 0 O 2px 0.00000 0.00000 0.00000 -0.00000 -0.00000\n", + " 0 O 2py 0.00000 0.00000 0.00000 -0.00000 -0.00000\n", + " 0 O 2pz -0.00311 0.00019 0.27278 -0.27591 -0.65237\n", + " 1 O 1s 0.70708 0.70711 -0.00060 0.00323 -0.00005\n", + " 1 O 2s 0.00483 0.00057 0.65237 -0.65105 0.27278\n", + " 1 O 2px 0.00000 0.00000 0.00000 -0.00000 -0.00000\n", + " 1 O 2py 0.00000 0.00000 0.00000 -0.00000 -0.00000\n", + " 1 O 2pz -0.00311 -0.00019 -0.27278 -0.27591 0.65237\n", + " #6 #7 #8 #9 #10 \n", + " 0 O 1s -0.00000 -0.00000 -0.00000 -0.00000 -0.00475\n", + " 0 O 2s 0.00000 0.00000 0.00000 0.00000 0.27589\n", + " 0 O 2px -0.10974 0.69854 -0.11637 0.69747 -0.00000\n", + " 0 O 2py 0.69854 0.10974 0.69747 0.11637 -0.00000\n", + " 0 O 2pz -0.00000 -0.00000 0.00000 -0.00000 0.65105\n", + " 1 O 1s 0.00000 -0.00000 -0.00000 -0.00000 0.00475\n", + " 1 O 2s 0.00000 0.00000 -0.00000 -0.00000 -0.27589\n", + " 1 O 2px -0.10974 0.69854 0.11637 -0.69747 0.00000\n", + " 1 O 2py 0.69854 0.10974 -0.69747 -0.11637 0.00000\n", + " 1 O 2pz 0.00000 0.00000 -0.00000 0.00000 0.65105\n", + " ** Mulliken pop on meta-lowdin orthogonal AOs **\n", + " ** Mulliken pop **\n", + "pop of 0 O 1s 1.99995\n", + "pop of 0 O 2s 1.84777\n", + "pop of 0 O 2px 1.50000\n", + "pop of 0 O 2py 1.50000\n", + "pop of 0 O 2pz 1.15227\n", + "pop of 1 O 1s 1.99995\n", + "pop of 1 O 2s 1.84777\n", + "pop of 1 O 2px 1.50000\n", + "pop of 1 O 2py 1.50000\n", + "pop of 1 O 2pz 1.15227\n", + " ** Mulliken atomic charges **\n", + "charge of 0O = 0.00000\n", + "charge of 1O = -0.00000\n", + "Dipole moment(X, Y, Z, Debye): -0.00000, 0.00000, -0.00000\n" + ] + } + ], + "source": [ + "o2_sto3g.mean_field.analyze(verbose=5);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RLP_CotHMfWF" + }, + "source": [ + "### Outputting Cube Files\n", + "\n", + "Visualization of molecular orbitals is useful for analysis purposes or making figures. Those few lines create a `cube` file, compatible with many chemical visualization softwares ([GaussView](https://gaussian.com/gaussview6/), [avogadro](https://avogadro.cc/), [VMD](https://www.ks.uiuc.edu/Research/vmd/), ...), for the `MO #10`.\n", + "\n", + "```python\n", + "from pyscf import tools\n", + "tools.cubegen.orbital(pyscf_mol, f\"MO10.cube\", sec_mol.mean_field.mo_coeff[:,9]) # Python indices start with 0.\n", + "```\n", + "\n", + "## Closing Words\n", + "\n", + "This notebook glanced over the first steps of modelling a chemical system for quantum computing exploration. One of the challenges of quantum chemistry is the ever-present trade-off between computational resources requirements and accuracy of calculations. We emphasized how the choice of a basis set and frozen orbitals can greatly affect this trade-off. \n", + "\n", + "Quantum computing is a nascent technology, and the capabilities of current devices are limited. Efficient modelling of the system can be therefore crucial to sucessfully design experiments on quantum computers, and even simulators.\n", + "\n", + "In our [VQE notebook](https://github.com/goodchemistryco/Tangelo/blob/develop/examples/vqe.ipynb), we show how the modelling choices can greatly impact the quantum computational resources required by this quantum algorithm, and how the algorithm options themselves can further affect both resource requirements and accuracy.\n", + "\n", + "\n", + "## References\n", + "\n", + "- McQuarrie, D. A. [Quantum Chemistry](https://books.google.ca/books/about/Quantum_Chemistry.html?id=zzxLTIljQB4C&redir_esc=y), University Science Books 2nd ed. (2007)\n", + "- Engel, T. [Quantum chemistry & spectroscopy](https://books.google.ca/books/about/Quantum_Chemistry_and_Spectroscopy.html?id=JhUqngEACAAJ&redir_esc=y). Pearson 3rd ed. (2012)\n", + "- Szabo, A. & Ostlund, N. S. [Modern quantum chemistry: Introduction to advanced electronic structure theory](https://books.google.ca/books/about/Modern_Quantum_Chemistry.html?id=6mV9gYzEkgIC&redir_esc=y). Mineola, Dover Publications 1st ed. (1996).\n", + "- [Computational_Quantum_Chemistry](https://chem.libretexts.org/Courses/Pacific_Union_College/Quantum_Chemistry/11%3A_Computational_Quantum_Chemistry), Chemistry LibreTexts, visited on Aug 17, 2022." + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Review_quantum_chemistry.ipynb", + "provenance": [ + { + "file_id": "https://github.com/AlexandreF-1qbit/Tangelo/blob/notebook_chem/examples/quantum_chemistry.ipynb", + "timestamp": 1657994939201 + } + ] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "qsdk", + "language": "python", + "name": "qsdk" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.9" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 5e58dcd3f037547e637ea6464d51f4b7d6635c97 Mon Sep 17 00:00:00 2001 From: AlexandreF-1qbit <76115575+AlexandreF-1qbit@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:50:04 -0400 Subject: [PATCH 09/12] Notebooks enabled for Google colab ("No local install" needed) (#198) * Mod for Tangelo notebooks, to facilitate use in GColab. * Explanations in TUTORIALS.rst and README.rst Co-authored-by: Valentin Senicourt <41597680+ValentinS4t1qbit@users.noreply.github.com> Co-authored-by: Valentin Senicourt --- README.rst | 27 +- TUTORIALS.rst | 64 ++ examples/adapt.ipynb | 314 ++++++++-- examples/classical_shadows.ipynb | 55 +- examples/dmet.ipynb | 123 ++-- examples/linq/1.the_basics.ipynb | 29 +- examples/linq/2.qpu_connection.ipynb | 21 +- examples/linq/3.noisy_simulation.ipynb | 22 +- examples/mifno.ipynb | 130 ++-- examples/oniom.ipynb | 53 +- examples/overview_endtoend.ipynb | 64 +- examples/vqe.ipynb | 586 +++++++++---------- examples/vqe_custom_ansatz_hamiltonian.ipynb | 246 ++++---- 13 files changed, 1032 insertions(+), 702 deletions(-) create mode 100644 TUTORIALS.rst diff --git a/README.rst b/README.rst index 9a79ec621..eb043228b 100644 --- a/README.rst +++ b/README.rst @@ -61,20 +61,23 @@ This package requires a Python 3 environment. We recommend: * installing the "dev" version of Python3 if you encounter missing header errors, such as ``python.h file not found``. * having good C/C++ compilers and BLAS libraries to ensure good overall performance of computation-intensive code. + + Using pip ^^^^^^^^^ -The easiest way to install Tangelo in your environment. We recommend upgrading pip first: +The easiest way to install Tangelo in your local environment. We recommend upgrading pip first: .. code-block:: python -m pip install -–upgrade pip. pip install tangelo-gc + From source, using setuptools ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This package can be installed locally by copying the contents of this repository to any machine. +This package can be installed locally by copying the contents of this repository to any machine. This can be useful if you need a bit more control on your install (such as installing from a particular branch, or tweaking the ``setup.py`` install to circumvent any issue on your system). Type the following command in the root directory: .. code-block:: @@ -85,11 +88,18 @@ If the installation of a dependency fails and the reason is not obvious, we sugg separately with ``pip``\ , before trying again. +"No install" notebook method +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A good alternative for users that simply want to quickly get a working environment ready, especially for quick tests, demos, tutorials. +Check out the tutorial section below to see how services such as Google Colab may help you circumvent local installation challenges or go beyond the limitations of your personal computer if you feel short of compute power or memory. + + Optional dependencies ^^^^^^^^^^^^^^^^^^^^^ Tangelo enables users to target various backends. In particular, it integrates quantum circuit simulators such as -``qulacs``\ , ``qiskit``\ , ``cirq`` or ``qdk``. We leave it to you to install the packages of your choice. +``qulacs``\ , ``qiskit``\ , ``cirq`` or ``qdk``. We leave it to you to install the packages of your choice, and refer to their own documentation. Most packages can be installed through pip in a straightforward way: .. code-block:: @@ -136,9 +146,10 @@ Tutorials --------- The ``examples`` folder of this repository contains various Jupyter notebook tutorials, and other examples. -We wrote a number of them, but nothing prevents users from contributing more notebook content ! -You can visualize a number of pre-run notebooks directly on Github or in our Sphinx documentation. If you'd like to be able to run -them locally, we suggest you use `Jupyter notebooks inside a virtual environment `_. +We wrote a number of them, but nothing prevents users from contributing more notebook content, to show what they have been doing with Tangelo! +You can visualize notebooks directly on Github, most of them have been pre-run. + +If you'd like to be able to run them locally, we suggest you use `Jupyter notebooks inside a virtual environment `_. - Install Jupyter and ipykernel in your environment: .. code-block:: @@ -150,6 +161,10 @@ them locally, we suggest you use `Jupyter notebooks inside a virtual environment python -m ipykernel install --user --name=myenv +Jupyter notebooks can also be displayed and executed in the cloud, with services such as Google Colab. This removes the constraint of building a local development envrionement, and enables users to run interactive notebooks on machines that may provide a better configuration than their own (more RAM, compute power, access to GPUs...). This may come in handy for users who want to get started quickly, especially for quick tests, demos and tutorials. + +Check out our `tutorials <./TUTORIALS.rst>`_ file for more details. + Tests ----- diff --git a/TUTORIALS.rst b/TUTORIALS.rst new file mode 100644 index 000000000..9dc7ba229 --- /dev/null +++ b/TUTORIALS.rst @@ -0,0 +1,64 @@ +Tutorials +========= + +Jupyter notebook python tutorials +--------------------------------- + +Chemistry, quantum computing and software development is tough stuff. We believe that tutorials in the form of jupyter notebooks are +a great tool to both disseminate knowledge, but also to showcase all the cool stuff the community has done with Tangelo. +Working on notebooks is a great way to contribute to this project, and to show everyone something neat you've worked on: +perhaps something that led to a hardware experiment, or implemented an interesting approach. + +If you are new to Jupyter notebooks, check out `this page `_. +I hope you enjoy it. + +Quickly deploy a notebook in the cloud +-------------------------------------- + +Sometimes, you don't want to spend time setting up a local python environment. Maybe it's too cumbersome, or maybe it's +just that your computer's performance is not quite as good as what you'd like. Maybe you simply want to run an existing +notebook and try a few things, right now. Or maybe you intend to run a workshop and you want to avoid any delays +incurred by installation issues experienced by your attendees (the worst). Some cloud providers offer services that can +help with that. + + +Google Colab +^^^^^^^^^^^^ + +.. |gcolab| image:: https://colab.research.google.com/assets/colab-badge.svg + +`Google Colab `_ is a rather straightforward way to achieve the above, as explained on this `webpage `_. +If you see a |gcolab| badge like this one in a notebook, you can just deploy the notebook on Google Colab by just clicking on it. + +Users can read, execute and collaborate through their internet browser. The notebook is hosted and executed on a machine +in the cloud. There are several subscription tiers: the first one is free and may provide you with what you need. The +others can provide you with access to more performant hardware, including GPUs and TPUs, or extra features. + +Most of our notebooks are ready to be deployed through Google Colab as-is. A few notebooks require dependencies +that are not publicly available (at the time of writing, QEMIST Cloud is not), or are a bit trickier to install: you may +have to contact us to get access to non-public material. + +If you also have access to Google Drive, you can upload your notebooks there and just open then in Google Colab by +double-clicking or right-clicking "open with". To enable this, connect Google Drive to Google Colab by +going to the settings (wheel on top-right of screen), clicking "manage apps" and then searching and installing Colab. + +It is possible that Google Colab is not available in your region of the world. Maybe other cloud providers offer similar +services in your area. + +Setting up your environment through an already-deployed notebook +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you have access to an already-deployed notebook in a remote environment you have little control on, you can actually make python run shell commands to modify +the environment in which it runs. We use that trick to check right at the start if Tangelo or the other dependencies +for our notebooks are already installed, and install them for you if not. This is what the cell looks like: + +.. code-block:: + + try: + import tangelo + except ModuleNotFoundError: + !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet + +You can use pip to install python packages, but you can run any other shell command: use other package managers for other +software and libraries, download data from somewhere else... +`These examples `_ are not specific to Google Colab. diff --git a/examples/adapt.ipynb b/examples/adapt.ipynb index 6fd927f79..1f4738f5c 100755 --- a/examples/adapt.ipynb +++ b/examples/adapt.ipynb @@ -6,12 +6,30 @@ "source": [ "# ADAPT-VQE\n", "\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/adapt.ipynb)\n", + "\n", "ADAPT-VQE was introduced by [Grimsley et al](https://www.nature.com/articles/s41467-019-10988-2) as a solution to the often impracticably deep, and not necessarily accurate, static VQE circuits. In ansatze like UCCSD, one easily reaches the order of thousands of gates, even for modestly sized molecules. In UCCSD and its generalized UCCGSD, the number of fermionic excitations in the ansatz scales like $\\mathcal{O}(N^2M^2)$, and $\\mathcal{O}(N^4)$ respectively. Here $N$ refers to the number of spin-orbitals in the problem basis, and $M$ the number of electrons.\n", ".\n", "\n", "In ADAPT-VQE, an ansatz which approximates not UCCSD/UCCGSD, but in fact FCI, is built iteratively. Over a series of cycles, the ansatz circuit is grown to achieve an approximation to FCI with a minimal number of circuit elements. In this way, ADAPT-VQE can be thought as a meta-VQE: at each cycle, a new ansatz is defined, and its parameters optimized according to conventional VQE. As the cycles proceed, the ansatz grows in both complexity and expressibility. This algorithm comes at the expense of a significant increase in measurement overhead. In order to identify the best operator to append to the present ansatz circuit, a large number of measurements are performed to rank the available operators in order of their ability to further reduce the ansatz state energy.\n", "\n", - "In this notebook, we explore the implementation of this algorithm, available in Tangelo. The original algorithm is examined first, and has shown some success in reducing the number of variational parameters required to express the quantum state. Then, we examine another version of ADAPT-VQE which is successful at reducing the circuit size by using a pool of operators defined from the Qubit Hamiltonian." + "In this notebook, we explore the implementation of this algorithm, available in Tangelo. The original algorithm is examined first, and has shown some success in reducing the number of variational parameters required to express the quantum state. Then, we examine another version of ADAPT-VQE which is successful at reducing the circuit size by using a pool of operators defined from the Qubit Hamiltonian.\n", + "\n", + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { @@ -41,19 +59,36 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/alex/Codes/Tangelo/tangelo/algorithms/variational/vqe_solver.py:260: RuntimeWarning: No variational gate found in the circuit.\n", + " warnings.warn(\"No variational gate found in the circuit.\", RuntimeWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "-2.028211284185079" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from tangelo import SecondQuantizedMolecule\n", "from tangelo.algorithms import ADAPTSolver\n", "\n", "H4 = [(\"H\", (0, 0, 0)), (\"H\", (0, 1.4, 0)), (\"H\", (0, 2.8, 0)), (\"H\", (0, 4.2, 0))]\n", - "mol = SecondQuantizedMolecule(H4, q=0, spin=0, basis=\"sto-3g\", frozen_orbitals=[])\n", + "mol = SecondQuantizedMolecule(H4, q=0, spin=0, basis=\"sto-3g\", frozen_orbitals=None)\n", "\n", - "opt_dict = {\"molecule\": mol, \"frozen_orbitals\": None, \"tol\": 0.01, \"max_cycles\": 7, \"verbose\": False, \"qubit_mapping\": \"jw\"}\n", + "opt_dict = {\"molecule\": mol, \"tol\": 0.01, \"max_cycles\": 7, \"verbose\": False, \"qubit_mapping\": \"jw\"}\n", "\n", "adapt_solver = ADAPTSolver(opt_dict)\n", "adapt_solver.build()\n", @@ -70,9 +105,29 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Final Error: 8.5921E-04\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -99,9 +154,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-2.0281387578379206" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from tangelo.algorithms import VQESolver, BuiltInAnsatze\n", "\n", @@ -112,9 +178,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ADAPT-VQE ERROR: 8.5921E-04 Ha\n", + "UCCSD-VQE ERROR: 9.3174E-04 Ha\n" + ] + } + ], "source": [ "print(f'ADAPT-VQE ERROR: {adapt_solver.energies[-1] - exact :0.4E} Ha')\n", "print(f'UCCSD-VQE ERROR: {vqe_solver.optimal_energy - exact :0.4E} Ha')" @@ -129,9 +204,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ADAPT RESOURCES:\n", + " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 2308, 'circuit_2qubit_gates': 1152, 'circuit_var_gates': 128, 'vqe_variational_parameters': 7}\n", + "\n", + "UCCSD RESOURCES:\n", + " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 2692, 'circuit_2qubit_gates': 1312, 'circuit_var_gates': 160, 'vqe_variational_parameters': 14}\n" + ] + } + ], "source": [ "print(f'ADAPT RESOURCES:\\n {adapt_solver.get_resources()}\\n')\n", "print(f'UCCSD RESOURCES:\\n {vqe_solver.get_resources()}')" @@ -165,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -229,9 +316,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OPERATOR POOL: [1j [Y0 X1 Y2 Y3]]\n" + ] + } + ], "source": [ "from tangelo.toolboxes.operators import QubitOperator\n", "qubit_operator = QubitOperator(((0, 'X'), (1, 'X'), (2, 'Y'), (3, 'Y')), -1.0) \\\n", @@ -259,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -280,14 +375,32 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/alex/Codes/Tangelo/tangelo/algorithms/variational/vqe_solver.py:260: RuntimeWarning: No variational gate found in the circuit.\n", + " warnings.warn(\"No variational gate found in the circuit.\", RuntimeWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "-2.0276601175702997" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from tangelo.algorithms import ADAPTSolver\n", "\n", "opt_dict = {\"molecule\": mol,\n", - " \"frozen_orbitals\": 0,\n", " \"pool\": get_pool,\n", " \"pool_args\": {\"qubit_hamiltonian\": qubit_operator, \"n_qubits\": n_qubits},\n", " \"tol\": 0.01,\n", @@ -308,9 +421,29 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Final Error: 1.4104E-03\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "errors = np.array(adapt_solver.energies) - exact\n", "fig,ax = plt.subplots(1,1)\n", @@ -331,9 +464,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ADAPT-VQE ERROR: 1.4104E-03 Ha\n", + "UCCSD-VQE ERROR: 9.3174E-04 Ha\n" + ] + } + ], "source": [ "print(f'ADAPT-VQE ERROR: {adapt_solver.energies[-1] - exact :0.4E} Ha')\n", "print(f'UCCSD-VQE ERROR: {vqe_solver.optimal_energy - exact :0.4E} Ha')" @@ -348,9 +490,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ADAPT RESOURCES:\n", + " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 184, 'circuit_2qubit_gates': 72, 'circuit_var_gates': 12, 'vqe_variational_parameters': 12}\n", + "\n", + "UCCSD RESOURCES:\n", + " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 2692, 'circuit_2qubit_gates': 1312, 'circuit_var_gates': 160, 'vqe_variational_parameters': 14}\n" + ] + } + ], "source": [ "print(f'ADAPT RESOURCES:\\n {adapt_solver.get_resources()}\\n')\n", "print(f'UCCSD RESOURCES:\\n {vqe_solver.get_resources()}')" @@ -372,9 +526,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adapt quantum numbers errors: N = 0.0001, Sz = 0.0004, S^2 = 0.0015\n", + "UCCSD quantum numbers errors: N = -0.0000, Sz = 0.0000, S^2 = 0.0000\n" + ] + } + ], "source": [ "exact_s2 = 0\n", "exact_sz = 0\n", @@ -399,9 +562,28 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/alex/Codes/Tangelo/tangelo/algorithms/variational/vqe_solver.py:260: RuntimeWarning: No variational gate found in the circuit.\n", + " warnings.warn(\"No variational gate found in the circuit.\", RuntimeWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "-2.02259938141137" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from tangelo.toolboxes.ansatz_generator.penalty_terms import combined_penalty\n", "from tangelo.toolboxes.operators.operators import qubitop_to_qubitham\n", @@ -412,19 +594,18 @@ " 'Sz': [penalty_weight, exact_sz],\n", " 'S^2': [penalty_weight, exact_s2]}\n", "\n", - "qubit_hamiltonian = qubitop_to_qubitham(qubit_operator, mapping='jw', up_then_down=False)\n", "pen_fermion_operator = combined_penalty(mol.n_active_mos, opt_penalty_terms=dict_penalty_terms)\n", "pen_qubit_operator = fermion_to_qubit_mapping(fermion_operator=pen_fermion_operator,\n", " mapping='jw',\n", " n_spinorbitals=mol.n_active_sos,\n", " n_electrons=mol.n_electrons)\n", - "pen_qubit_hamiltonian = qubitop_to_qubitham(pen_qubit_operator, mapping='jw', up_then_down=False)\n", - "qubit_hamiltonian_with_pen = qubit_hamiltonian + pen_qubit_hamiltonian\n", - "opt_dict = {\"qubit_hamiltonian\": qubit_hamiltonian_with_pen,\n", + "qubit_operator_with_pen = qubit_operator + pen_qubit_operator\n", + "opt_dict = {\"qubit_hamiltonian\": qubit_operator_with_pen,\n", " \"n_electrons\": mol.n_electrons,\n", - " \"n_spinorbitals\": mol.n_active_sos, \n", + " \"n_spinorbitals\": mol.n_active_sos,\n", + " \"spin\": mol.spin,\n", " \"pool\": get_pool,\n", - " \"pool_args\": {\"qubit_hamiltonian\": qubit_hamiltonian_with_pen, \"n_qubits\": n_qubits},\n", + " \"pool_args\": {\"qubit_hamiltonian\": qubit_operator_with_pen, \"n_qubits\": n_qubits},\n", " \"tol\": 0.01,\n", " \"max_cycles\": 12,\n", " \"verbose\": False}\n", @@ -443,9 +624,26 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ADAPT-VQE ERROR: 6.4480E-03 Ha\n", + "UCCSD-VQE ERROR: 9.3174E-04 Ha\n", + "\n", + "ADAPT RESOURCES:\n", + " {'qubit_hamiltonian_terms': 695, 'circuit_width': 8, 'circuit_gates': 184, 'circuit_2qubit_gates': 72, 'circuit_var_gates': 12, 'vqe_variational_parameters': 12}\n", + "UCCSD RESOURCES:\n", + " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 2692, 'circuit_2qubit_gates': 1312, 'circuit_var_gates': 160, 'vqe_variational_parameters': 14}\n", + "\n", + "Adapt quantum numbers: N = -0.0000, Sz = -0.0000, S^2 = 0.0000\n", + "UCCSD quantum numbers: N = -0.0000, Sz = 0.0000, S^2 = 0.0000\n" + ] + } + ], "source": [ "# Since we initialized VQESolver with a QubitHamiltonian, we need to provide the corresponding number of molecular\n", "# orbitals to use the built-in operators S^2, Sz and N.\n", @@ -483,8 +681,9 @@ "hash": "fd77f6ebaf3d18999f00320d0aca64091b39e7847b653c69719c9ddc4e72c63f" }, "kernelspec": { - "display_name": "Python 3.8.10 64-bit ('agnostic': venv)", - "name": "python3" + "display_name": "qsdk", + "language": "python", + "name": "qsdk" }, "language_info": { "codemirror_mode": { @@ -496,9 +695,8 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" - }, - "orig_nbformat": 2 + "version": "3.9.9" + } }, "nbformat": 4, "nbformat_minor": 2 diff --git a/examples/classical_shadows.ipynb b/examples/classical_shadows.ipynb index e80a2a762..168730525 100644 --- a/examples/classical_shadows.ipynb +++ b/examples/classical_shadows.ipynb @@ -6,6 +6,8 @@ "source": [ "# Classical Shadows\n", "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/classical_shadows.ipynb)\n", + "\n", "The output of a quantum computer is a histogram of measurements, corresponding to the different outcomes observed, usually expressed as bitstrings. The cost and duration of a quantum experiment is roughly linear with the number of shots used to build such histograms, which also correlates with the accuracy of the results. This measurement overhead can be prohibitive for state tomography and computation of observables for quantum chemistry applications.\n", "\n", "The emergent method *classical shadows* ([Nat. Phys. 2020, 16, 1050–1057](https://arxiv.org/abs/2002.08953)) has been developed to mitigate the measurement overhead by offloading quantum tasks to the pre- and post-processing steps. This prediction protocol exhibits logarithmic scaling with the number of terms to measure, in order to compute the expectation value of a term within a given accuracy.\n", @@ -14,7 +16,22 @@ "\n", "![Classical Shadows overview](img/classical_shadow_overview.png \"Classical Shadow\")\n", "\n", - "The randomized, derandomized and adaptive shadow protocols using the single-qubit Pauli basis as a set of unitaries are currently available in Tangelo. This introduction will shed light on how to leverage their use in your own investigation, and highlight the main differences between these approaches. At the end of this notebook, a comparison is made between energies predicted with those techniques and the one computed by using a Hamiltonian partitioning approach relying on qubitwise commutativity." + "The randomized, derandomized and adaptive shadow protocols using the single-qubit Pauli basis as a set of unitaries are currently available in Tangelo. This introduction will shed light on how to leverage their use in your own investigation, and highlight the main differences between these approaches. At the end of this notebook, a comparison is made between energies predicted with those techniques and the one computed by using a Hamiltonian partitioning approach relying on qubitwise commutativity.\n", + "\n", + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { @@ -27,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -66,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -95,14 +112,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Energy from statevector simulation: -1.1475 hartree\n" + "Energy from statevector simulation: -1.1473 hartree\n" ] } ], @@ -132,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -153,15 +170,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Energy from randomized single-Pauli classical shadow: -0.8362 hartree\n", - "Error vs statevector simulation: 0.311 hartree\n" + "Energy from randomized single-Pauli classical shadow: -1.0593 hartree\n", + "Error vs statevector simulation: 0.088 hartree\n" ] } ], @@ -187,15 +204,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Energy from derandomized single-Pauli classical shadow: -1.1598 hartree\n", - "Error vs statevector simulation: 0.012 hartree\n" + "Energy from derandomized single-Pauli classical shadow: -1.1765 hartree\n", + "Error vs statevector simulation: 0.029 hartree\n" ] } ], @@ -221,15 +238,15 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Energy from adaptive single-Pauli classical shadow: -1.2052 hartree\n", - "Error vs statevector simulation: 0.058 hartree\n" + "Energy from adaptive single-Pauli classical shadow: -1.3384 hartree\n", + "Error vs statevector simulation: 0.191 hartree\n" ] } ], @@ -258,15 +275,15 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Energy with qubitwise commutativity and equally distributed shots: -1.2053 hartree\n", - "Error vs statevector simulation: 0.058 hartree\n" + "Energy with qubitwise commutativity and equally distributed shots: -1.3012 hartree\n", + "Error vs statevector simulation: 0.154 hartree\n" ] } ], @@ -308,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { diff --git a/examples/dmet.ipynb b/examples/dmet.ipynb index bb10c0541..a4570fc75 100755 --- a/examples/dmet.ipynb +++ b/examples/dmet.ipynb @@ -11,11 +11,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/dmet.ipynb)\n", + "\n", "This notebook introduces a problem-decomposition technique called DMET (Density-Matrix Embedding Technique), which enables us to break down a molecular systems into a collection of subproblems with lower computational resource requirements.\n", "\n", "Such approaches enable us to study how combining classical and quantum algorithms may play a role in the resolution of problems beyond toy models, and even maybe provide a configurable and scalable path forward in the future, towards much more ambitious molecular systems.\n", "\n", - "In order to run this notebook, you need to install the `tangelo` python package, or add it to your PYTHONPATH." + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { @@ -73,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -102,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -166,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -193,7 +208,7 @@ "\n", "\t\tFragment Number : # 4\n", "\t\t------------------------\n", - "\t\tFragment Energy = -72.0631745662\n", + "\t\tFragment Energy = -72.0631745663\n", "\t\tNumber of Electrons in Fragment = 16.0000000000\n", "\n", " \tIteration = 2\n", @@ -247,28 +262,28 @@ " \n", "\t\tFragment Number : # 1\n", "\t\t------------------------\n", - "\t\tFragment Energy = -72.0523069156\n", + "\t\tFragment Energy = -72.0523069157\n", "\t\tNumber of Electrons in Fragment = 16.0000000000\n", "\n", "\t\tFragment Number : # 2\n", "\t\t------------------------\n", - "\t\tFragment Energy = -72.4061095250\n", + "\t\tFragment Energy = -72.4061095251\n", "\t\tNumber of Electrons in Fragment = 14.0000000000\n", "\n", "\t\tFragment Number : # 3\n", "\t\t------------------------\n", - "\t\tFragment Energy = -72.4138670638\n", + "\t\tFragment Energy = -72.4138670639\n", "\t\tNumber of Electrons in Fragment = 14.0000000000\n", "\n", "\t\tFragment Number : # 4\n", "\t\t------------------------\n", - "\t\tFragment Energy = -72.0614242777\n", + "\t\tFragment Energy = -72.0614242778\n", "\t\tNumber of Electrons in Fragment = 16.0000000000\n", "\n", " \t*** DMET Cycle Done *** \n", - " \tDMET Energy ( a.u. ) = -157.1137415264\n", + " \tDMET Energy ( a.u. ) = -157.1137415267\n", " \tChemical Potential = -0.0004124578\n", - "DMET energy (hartree): \t -157.11374152644245\n" + "DMET energy (hartree): \t -157.11374152666136\n" ] } ], @@ -286,15 +301,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Correlation energy (hartree): \t 0.26456372346564194\n", - "Correlation energy (kcal/mol): \t 166.01373647469032\n" + "Correlation energy (hartree): \t 0.26456372368426173\n", + "Correlation energy (kcal/mol): \t 166.01373661187424\n" ] } ], @@ -326,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -355,7 +370,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -373,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -381,11 +396,11 @@ "output_type": "stream", "text": [ "{\n", - " \"qubit_hamiltonian_terms\": 4479,\n", + " \"qubit_hamiltonian_terms\": 4867,\n", " \"circuit_width\": 20,\n", - " \"circuit_gates\": 66086,\n", - " \"circuit_2qubit_gates\": 42752,\n", - " \"circuit_var_gates\": 2636,\n", + " \"circuit_gates\": 61862,\n", + " \"circuit_2qubit_gates\": 40256,\n", + " \"circuit_var_gates\": 2444,\n", " \"vqe_variational_parameters\": 350\n", "}\n" ] @@ -407,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -434,7 +449,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -468,14 +483,14 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "DMET energy (hartree): \t -5.367523592518705\n" + "DMET energy (hartree): \t -5.367523562973442\n" ] } ], @@ -495,14 +510,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "FCI energy (hartree): \t -5.380926000730881\n" + "FCI energy (hartree): \t -5.380926000730874\n" ] } ], @@ -522,17 +537,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Difference FCI vs HF energies (hartree): \t\t 0.11680533556175732\n", - "Difference FCI vs DMET-VQE energies (hartree): \t\t 0.013402408212176198\n", - "Difference FCI vs HF energies (kcal/mol): \t\t 73.29534806500271\n", - "Difference FCI vs DMET-VQE energies (kcal/mol): \t 8.410011153140564\n" + "Difference FCI vs HF energies (hartree): \t\t 0.11680533556174666\n", + "Difference FCI vs DMET-VQE energies (hartree): \t\t 0.01340243775743133\n", + "Difference FCI vs HF energies (kcal/mol): \t\t 73.29534806499603\n", + "Difference FCI vs DMET-VQE energies (kcal/mol): \t 8.410029692788159\n" ] } ], @@ -558,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -586,21 +601,21 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'molecule': ,\n", + "{'molecule': ,\n", " 'electron_localization': ,\n", " 'fragment_atoms': [1, 1, 1, 1],\n", " 'fragment_solvers': ['ccsd', 'ccsd', 'ccsd', 'ccsd'],\n", - " 'optimizer': >,\n", + " 'optimizer': >,\n", " 'initial_chemical_potential': 0.0,\n", " 'solvers_options': [{}, {}, {}, {}],\n", " 'verbose': False,\n", - " 'mean_field': ,\n", + " 'mean_field': ,\n", " 'chemical_potential': None,\n", " 'dmet_energy': None,\n", " 'orbitals': None,\n", @@ -609,7 +624,7 @@ " 'onerdm_low': None}" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -635,17 +650,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'molecule': ,\n", + "{'molecule': ,\n", " 'electron_localization': ,\n", " 'fragment_atoms': [1, 1, 1, 1],\n", " 'fragment_solvers': ['vqe', 'ccsd', 'fci', 'vqe'],\n", - " 'optimizer': >,\n", + " 'optimizer': >,\n", " 'initial_chemical_potential': 0.0,\n", " 'solvers_options': [{'qubit_mapping': 'jw',\n", " 'initial_var_params': 'ones',\n", @@ -654,7 +669,7 @@ " {},\n", " {'qubit_mapping': 'jw', 'initial_var_params': 'ones', 'verbose': False}],\n", " 'verbose': False,\n", - " 'mean_field': ,\n", + " 'mean_field': ,\n", " 'chemical_potential': None,\n", " 'dmet_energy': None,\n", " 'orbitals': None,\n", @@ -663,7 +678,7 @@ " 'onerdm_low': None}" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -689,21 +704,21 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'molecule': ,\n", + "{'molecule': ,\n", " 'electron_localization': ,\n", " 'fragment_atoms': [1, 1, 1, 1],\n", " 'fragment_solvers': ['ccsd', 'ccsd', 'ccsd', 'ccsd'],\n", - " 'optimizer': >,\n", + " 'optimizer': >,\n", " 'initial_chemical_potential': 0.1,\n", " 'solvers_options': [{}, {}, {}, {}],\n", " 'verbose': False,\n", - " 'mean_field': ,\n", + " 'mean_field': ,\n", " 'chemical_potential': None,\n", " 'dmet_energy': None,\n", " 'orbitals': None,\n", @@ -712,7 +727,7 @@ " 'onerdm_low': None}" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -738,24 +753,24 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'molecule': ,\n", + "{'molecule': ,\n", " 'electron_localization': ,\n", " 'fragment_atoms': [1, 1, 1, 1],\n", " 'fragment_solvers': ['vqe', 'vqe', 'vqe', 'vqe'],\n", - " 'optimizer': >,\n", + " 'optimizer': >,\n", " 'initial_chemical_potential': 0.0,\n", " 'solvers_options': [{'qubit_mapping': 'bk'},\n", " {'qubit_mapping': 'bk'},\n", " {'qubit_mapping': 'bk'},\n", " {'qubit_mapping': 'bk'}],\n", " 'verbose': False,\n", - " 'mean_field': ,\n", + " 'mean_field': ,\n", " 'chemical_potential': None,\n", " 'dmet_energy': None,\n", " 'orbitals': None,\n", @@ -764,7 +779,7 @@ " 'onerdm_low': None}" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } diff --git a/examples/linq/1.the_basics.ipynb b/examples/linq/1.the_basics.ipynb index ba98f63e8..f8c10d381 100755 --- a/examples/linq/1.the_basics.ipynb +++ b/examples/linq/1.the_basics.ipynb @@ -7,6 +7,13 @@ "# Linq: the basics" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/linq/1.the_basics.ipynb)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -36,9 +43,21 @@ "\n", "In order to run the contents of this notebook, you need to have the `tangelo` package installed in your python environment. Some cells may require that a specific backend (such as `qiskit`, `qulacs`...) is installed to run.\n", "\n", - "Please have a look at the installation instructions, if you need.\n", - "\n", - "---" + "Please have a look at the installation instructions, if you need. Executing the cell below provides a quick way of installing the requirements of this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet\n", + " !pip install qiskit qulacs amazon-braket-sdk --quiet" ] }, { @@ -859,9 +878,9 @@ ], "metadata": { "kernelspec": { - "display_name": "tangelo_docs_aesthetics", + "display_name": "main_release0.3.1", "language": "python", - "name": "tangelo_docs_aesthetics" + "name": "main_release0.3.1" }, "language_info": { "codemirror_mode": { diff --git a/examples/linq/2.qpu_connection.ipynb b/examples/linq/2.qpu_connection.ipynb index 3001918f9..cf0b9bc2a 100755 --- a/examples/linq/2.qpu_connection.ipynb +++ b/examples/linq/2.qpu_connection.ipynb @@ -11,6 +11,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/linq/2.qpu_connection.ipynb)\n", + "\n", "This notebook elaborates on how the `tangelo.linq` module can facilitate hardware experiments by integrating the API provided by some hardware providers (IonQ, Honeywell...) or broader quantum cloud services providers such as Azure Quantum or Braket. We essentially provide convenience wrappers to these APIs: the API of your favorite cloud provider is still called underneath, using your own credentials.\n", "\n", "This notebook should be relevant to Tangelo users that prefer to install all the dependencies on their machine, use their own credentials, and be billed directly by the target quantum cloud service(s).\n", @@ -36,10 +38,21 @@ "source": [ "## Requirements\n", "\n", - "- Tangelo needs to be installed in your environment.\n", - "- Ensure you have valid ID tokens and logins for the services of your choice (IonQ, Braket...), and that your environment is ready to use them (e.g install their SDK and dependencies according to the instructions they provide)\n", - "\n", - "---" + "- Tangelo needs to be installed in your environment. The cell below does this installation for you if it is not found.\n", + "- Ensure you have valid ID tokens and logins for the services of your choice (IonQ, Braket...), and that your environment is ready to use them (e.g install their SDK and dependencies according to the instructions they provide)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { diff --git a/examples/linq/3.noisy_simulation.ipynb b/examples/linq/3.noisy_simulation.ipynb index 65afac82c..2f7f35e97 100755 --- a/examples/linq/3.noisy_simulation.ipynb +++ b/examples/linq/3.noisy_simulation.ipynb @@ -11,6 +11,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/linq/3.noisy_simulation.ipynb)\n", + "\n", "This notebook assumes that you are familiar with the basics of this package (Gate, Circuit, Translator, Simulator), and focuses on how users can perform noisy simulation on simulators such as cirq, qiskit or qulacs, using a common interface. Users are free to pick between different compute backends, favoring the one with the best performance of most adequate features, and switch between them with minimal changes to their code.\n", "\n", "In particular, we also take the time here to briefly introduce the various quantum error channels supported for the sake of clarity, occasionally sprinkling some (gentle) mathematical equations on top.\n", @@ -34,9 +36,21 @@ "source": [ "## Requirements\n", "\n", - "In order to run the contents of this notebook, I simply recommend that you install `tangelo` as per the installation instructions, as well as one or several backends supporting noisy simulation (cirq, qiskit, qulacs...). You can install them with `pip`.\n", - "\n", - "---" + "In order to run the contents of this notebook, I simply recommend that you install `tangelo` as per the installation instructions, as well as one or several backends supporting noisy simulation (cirq, qiskit, qulacs...). You can install them with `pip`. Executing the cell below provides a quick way of installing Tangelo, as well as the minimal set of backends to execute code cells in this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet\n", + " !pip install qiskit qulacs amazon-braket-sdk --quiet" ] }, { @@ -536,7 +550,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/mifno.ipynb b/examples/mifno.ipynb index 6bacf8ed4..e76cc9b8b 100644 --- a/examples/mifno.ipynb +++ b/examples/mifno.ipynb @@ -6,12 +6,40 @@ "source": [ "# Exploring the Method of Increments with QEMIST Cloud and Tangelo\n", "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/mifno.ipynb)\n", + "\n", "In this notebook, we illustrate how users can leverage QEMIST Cloud and Tangelo to explore the impact of quantum computing on problems tackled with the MI-FNO problem decomposition technique.\n", "\n", "You do not need to have the `qemist-client` python package installed to run this notebook: only `tangelo` is required. For more information about [QEMIST Cloud](https://goodchemistry.com/qemist-cloud/) (installation, features, issues, `qemist_client` API...), please refer to the [QEMIST Cloud documentation](https://alpha-api.qemist.cloud/#/docs) or contact their development team.\n", "\n", "The first section provides a high-level description of the MI-FNO approach. The second one briefly shows how QEMIST Cloud can apply this approach to a usecase, and provide reference results computed with high-accuracy classical solvers. We then focus on the API provided in Tangelo allowing users to combine the MI-FNO performed by QEMIST Cloud and any quantum workflow written with Tangelo.\n", "\n", + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet\n", + "\n", + "# Download the data folder at https://github.com/goodchemistryco/Tangelo/tree/develop/examples/data\n", + "import os\n", + "if not os.path.isdir(\"data\"):\n", + " !sudo apt install subversion\n", + " !svn checkout https://github.com/goodchemistryco/Tangelo/branches/develop/examples/data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Use case\n", "\n", "Our use case here is the hydrogen fluoride (HF) system defined below, using the `sto-3g` basis, chosen for simplicity. However, the MI-FNO method can be used to tackle much larger systems." @@ -19,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -168,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -184,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -195,20 +223,20 @@ "Total MI-FNO energy = -98.59655271223816\n", "Correlation energy = -0.025795120623911316\n", "Mean-field energy = -98.57075759161424\n", - " problem_handle epsilon correction energy_total \\\n", - "(1,) 65652562505002413 -0.001326 0.0 -98.572083 \n", - "(2,) 10837505518890413 -0.019846 0.0 -98.590604 \n", - "(3,) 31462118862908845 -0.000862 0.0 -98.571619 \n", - "(4,) 49501973643554221 -0.000756 0.0 -98.571513 \n", - "(1, 2) 65302015864237516 -0.003024 0.0 -98.594953 \n", - "(1, 3) 53405772498103756 0.000085 0.0 -98.572860 \n", - "(1, 4) 13411621153304012 0.000142 0.0 -98.572697 \n", - "(2, 3) 22700772126125516 -0.000845 0.0 -98.592310 \n", - "(2, 4) 27549614109650380 0.000124 0.0 -98.591235 \n", - "(3, 4) 23150438022147532 0.000078 0.0 -98.572297 \n", - "(1, 2, 3) 30910159730798073 0.000466 0.0 -98.596109 \n", - "(1, 2, 4) 13137250052500985 -0.000016 0.0 -98.595458 \n", - "(2, 3, 4) 17864205159132665 -0.000017 0.0 -98.592881 \n", + " epsilon problem_handle energy_total correction \\\n", + "(1,) -0.001326 65652562505002413 -98.572083 0.0 \n", + "(2,) -0.019846 10837505518890413 -98.590604 0.0 \n", + "(3,) -0.000862 31462118862908845 -98.571619 0.0 \n", + "(4,) -0.000756 49501973643554221 -98.571513 0.0 \n", + "(1, 2) -0.003024 65302015864237516 -98.594953 0.0 \n", + "(1, 3) 0.000085 53405772498103756 -98.572860 0.0 \n", + "(1, 4) 0.000142 13411621153304012 -98.572697 0.0 \n", + "(2, 3) -0.000845 22700772126125516 -98.592310 0.0 \n", + "(2, 4) 0.000124 27549614109650380 -98.591235 0.0 \n", + "(3, 4) 0.000078 23150438022147532 -98.572297 0.0 \n", + "(1, 2, 3) 0.000466 30910159730798073 -98.596109 0.0 \n", + "(1, 2, 4) -0.000016 13137250052500985 -98.595458 0.0 \n", + "(2, 3, 4) -0.000017 17864205159132665 -98.592881 0.0 \n", "\n", " energy_correlation \n", "(1,) -0.001326 \n", @@ -256,7 +284,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -276,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -323,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -332,43 +360,43 @@ "text": [ "Iteration 1 of QITE with starting energy -98.57075759161438\n", "Iteration 2 of QITE with starting energy -98.57113742411626\n", - "Iteration 3 of QITE with starting energy -98.57140787803596\n", - "Iteration 4 of QITE with starting energy -98.57160051304942\n", - "Iteration 5 of QITE with starting energy -98.57173778008372\n", - "Iteration 6 of QITE with starting energy -98.57183564786015\n", - "Iteration 7 of QITE with starting energy -98.57190547375154\n", - "Iteration 8 of QITE with starting energy -98.57195533547332\n", - "Iteration 9 of QITE with starting energy -98.57199097854448\n", - "Iteration 10 of QITE with starting energy -98.57201649016257\n", - "Iteration 11 of QITE with starting energy -98.57203477838605\n", - "Iteration 12 of QITE with starting energy -98.57204791282895\n", - "Iteration 13 of QITE with starting energy -98.57205736687135\n", - "Iteration 14 of QITE with starting energy -98.57206418984897\n", - "Iteration 15 of QITE with starting energy -98.57206912946631\n", - "Iteration 16 of QITE with starting energy -98.57207271882451\n", - "Iteration 17 of QITE with starting energy -98.57207533829896\n", - "Iteration 18 of QITE with starting energy -98.5720772595381\n", - "Iteration 19 of QITE with starting energy -98.57207867675483\n", - "Iteration 20 of QITE with starting energy -98.57207972898374\n", - "Iteration 21 of QITE with starting energy -98.57208051591682\n", - "Iteration 22 of QITE with starting energy -98.57208110917304\n", - "Iteration 23 of QITE with starting energy -98.5720815603213\n", - "Iteration 24 of QITE with starting energy -98.5720819065949\n", - "Iteration 25 of QITE with starting energy -98.57208217496307\n", - "Iteration 26 of QITE with starting energy -98.57208238503476\n", - "Iteration 27 of QITE with starting energy -98.57208255113032\n", - "Iteration 28 of QITE with starting energy -98.5720826837612\n", - "Iteration 29 of QITE with starting energy -98.57208279068848\n", - "Final energy of QITE is -98.57208287768049\n" + "Iteration 3 of QITE with starting energy -98.571407878036\n", + "Iteration 4 of QITE with starting energy -98.57160051305051\n", + "Iteration 5 of QITE with starting energy -98.57173778008789\n", + "Iteration 6 of QITE with starting energy -98.57183564786958\n", + "Iteration 7 of QITE with starting energy -98.57190547376783\n", + "Iteration 8 of QITE with starting energy -98.57195533549731\n", + "Iteration 9 of QITE with starting energy -98.57199097857621\n", + "Iteration 10 of QITE with starting energy -98.57201649020138\n", + "Iteration 11 of QITE with starting energy -98.57203477843082\n", + "Iteration 12 of QITE with starting energy -98.5720479128784\n", + "Iteration 13 of QITE with starting energy -98.57205736692381\n", + "Iteration 14 of QITE with starting energy -98.57206418990326\n", + "Iteration 15 of QITE with starting energy -98.57206912952093\n", + "Iteration 16 of QITE with starting energy -98.5720727188785\n", + "Iteration 17 of QITE with starting energy -98.5720753383512\n", + "Iteration 18 of QITE with starting energy -98.57207725958806\n", + "Iteration 19 of QITE with starting energy -98.57207867680201\n", + "Iteration 20 of QITE with starting energy -98.57207972902779\n", + "Iteration 21 of QITE with starting energy -98.57208051595758\n", + "Iteration 22 of QITE with starting energy -98.57208110921034\n", + "Iteration 23 of QITE with starting energy -98.57208156035534\n", + "Iteration 24 of QITE with starting energy -98.57208190662573\n", + "Iteration 25 of QITE with starting energy -98.57208217499077\n", + "Iteration 26 of QITE with starting energy -98.57208238505962\n", + "Iteration 27 of QITE with starting energy -98.57208255115249\n", + "Iteration 28 of QITE with starting energy -98.57208268378093\n", + "Iteration 29 of QITE with starting energy -98.572082790706\n", + "Final energy of QITE is -98.57208287769595\n" ] }, { "data": { "text/plain": [ - "-98.57208287768049" + "-98.57208287769595" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -401,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { diff --git a/examples/oniom.ipynb b/examples/oniom.ipynb index 461882bc9..30a97e837 100755 --- a/examples/oniom.ipynb +++ b/examples/oniom.ipynb @@ -6,6 +6,8 @@ "source": [ "# ONIOM Problem Decomposition - A use case for an acetic acid molecule in water\n", "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/oniom.ipynb)\n", + "\n", "## Table of contents:\n", "* [1. Introduction](#1)\n", "* [2. Use case - an acetic acid molecule in water](#2)\n", @@ -31,7 +33,22 @@ "\n", "Where $E_{\\text{All}}$, $E_{\\text{Fragment}_i}$ are respectively the energy of the whole system and the energy of a fragment labelled $i$. The general procedure for ONIOM is as follows. The user identifies a system of interest and a low-cost method is used to compute its total energy ($E_{\\text{All}}^{\\text{Low}}$). Subsequently, a subset of the molecule is defined as a model fragment and it is isolated by using an atom (or a functional group) to keep the valence shell fully populated. $E_{\\text{Fragment}_i}^{\\text{Low}}$ is computed for the fragment using the same low-cost method as used initially for the whole system, and a high-cost method ($E_{\\text{Fragment}_i}^{\\text{High}}$). The difference in energy between the high-cost and low-cost methods ($E_{\\text{Fragment}_i}^{\\text{High}} - E_{\\text{Fragment}_i}^{\\text{Low}}$) is then added to our total energy. This way, we can interpret the ONIOM method as an iterative procedure where the error associated with our low-cost solver is removed.\n", "\n", - "The equation above is formulated to allow us to expand ONIOM beyond a single fragment. In principle, many such fragments can be defined to progressively improve the accuracy or efficiency of the calculations. This may apply to when we have more than one active site on our large molecule, or where an incremental strategy can be utilized to further mitigate errors associated with using our low-cost method in the vicinity of our active region." + "The equation above is formulated to allow us to expand ONIOM beyond a single fragment. In principle, many such fragments can be defined to progressively improve the accuracy or efficiency of the calculations. This may apply to when we have more than one active site on our large molecule, or where an incremental strategy can be utilized to further mitigate errors associated with using our low-cost method in the vicinity of our active region.\n", + "\n", + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { @@ -67,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -85,10 +102,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "scrolled": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "# Coordinates file\n", @@ -116,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -144,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -171,17 +186,15 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "ONIOM Energy: -1278.214343118188\n", - "Hartree-Fock Energy: -1274.4936842154366\n" + "ONIOM Energy: -1278.2143431181937\n", + "Hartree-Fock Energy: -1274.4936842154425\n" ] } ], @@ -216,24 +229,22 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhMAAAEyCAYAAABAu1IqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAux0lEQVR4nO3de5wcVZ338c/XBMmAwAABJQkxqBBBkERHlAd3RW5BViSEW7KPQlZWVAREMRqURbwS5GG94KKLqEFkkYghomEJcnuBEcFJJpAE5CZymaAkShAkIJDf80edJpWme6ane3q6e/r7fr3qNVXn1OVUTc30r885dUoRgZmZmVm1XtHoApiZmVlrczBhZmZmNXEwYWZmZjVxMGFmZmY1cTBhZmZmNXEwYWZmZjVxMGFWA0n/V9K1Fa57lqQf17tM7URSh6RfSHpS0k8bXZ48SftKerTZ9lVPkmZK+vUQHWuupC8PxbGsfw4mrCVI+qOkdZKelvTn9I/kVRVud8AglWGCpJA0spAWEZdGxEGDsX+rypHAq4FtI+KoRhfGrF05mLBWcmhEvAp4C9AFnNHg8rScfCA0TLwWuDciXhjohsPlWgyX87DW5mDCWk5E9AL/C+wOIOl9klZKWivpJkm7pvRLgPHAL1KNxqdT+jsk/Satf4ekfQv7Ttt/SdJiSU9JulbS6JR9c/q5Nu1v7+JqXUnflPSIpL9JWiLpnyo9L0nvlbQsles3kt6cy/ujpE9JujNV6V8uadQAtv2MpDuBv0saKelYSQ9J+ouk/yjU4Eh6jaRnJG2b2/4tklZL2qREmfeS1J3O98+S/jOX987cdX5E0syU/i+SetI2j0g6K7dNofbnOEkPS1oj6XNlrtcXgDOBY9Lv43hJr5B0Rjq3xyX9SNJWRfs+XtLDwA0l9rm1pF+m830izY/L5fd1f5T7vZ6WyvKYpH9LaW9L12tEbr1pku5I8x3Kat+ekHQX8LaifZb6nZb8O8j9DntSmX+a7p8v5/KrvvdKn7K+ndb9vaT9cxljJF0l6a+S7pf0oVzeWZLmpd/ZU+lcunL5kyUtTXmXA32VwYZaRHjy1PQT8EfggDS/I7AS+BKwC/B34EBgE+DTwP3AK4u3S8tjgb8Ah5AF0wem5e1S/k3AA2m/HWl5TsqbAAQwMre/mcCvc8vvB7YFRgKnAX8CRqW8s4Aflzm/ycDjwNuBEcBxqeyb5s7jdmAMsA1wN/CRAWy7LF23DmA34GngncArgf8HPJ+7vlcDH82V7evA+WXKfSvwgTT/KuAdaf61wFPAjPR72RaYlPL2BfZI1//NwJ+BqUXX+HuprHsCzwG7ljn+RtcU+GD6/b8ulWc+cEnRvn8EbA50lNjftsARwGbAFsBPgQW5/Jsoc3+U2Ne+wAvAF9M1OAR4Btg65d8FvCe3/pXAaWl+DnBL+l3vCKwAHi36e8j/Tsv+HaTpIeDjKW8a8A/gy7XeeyXOeWY650+kYx0DPAlsk/JvBi4gCwQmAauB/XK/y2fTdRoBnA38NuUVzqGw3yPJ7tkvN/p/k6f0u290ATx5qmRK/9CeBtamfyoXpH+i/wHMy633CqAX2De3XT6Y+AzpwyWXtgg4Ls3fBJyRyzsRuCbNT6CfYKJEuZ8A9kzzZ1E+mPgO8KWitHuAd+XO4/25vK8B3x3Ath/M5Z0JXJZb3ix9uBSCiWOAxWl+BFlAtFeZct8MfAEYXZR+OnBlhb/bbwBfL7rG43L5twPTy2y70TUFrgdOzC1PTB86I3P7ft0A7rtJwBO55bL3R4lt9wXWFd0vj7Mh4PoMcGma34Ys0NghLf8BODi33Qm8PJjI/07L/h0A/5zmlcv/NRuCiarvvRLnPBNYVXSs24EPkAU+LwJb5PLOBubmfpfX5fJ2A9al+X8usd/f4GCiaSY3c1grmRoRnRHx2og4MSLWkX1beqiwQkSsBx4hq4Eo5bXAUak6d62ktWTf0HfIrfOn3PwzZN9wK5Kqg+9OVbxrga2APqvBc+U6rahcO5KdX3/lqmTbR3LzY/LLEfEMWe1Mwc+B3STtRPZN98mIuL1MuY8n+1b8e0m/k/TelL4j2Tf4l5H0dkk3pqaEJ4GP8PJrVO3vYKP7Ic2PJOukWfAIZUjaTNJ/p2aSv5EFS5355ogBlu0vsXF/jvz6PwYOlbQ5cDRwS0Q8ljuPfDnz51TqPPr6OxgD9Eb6BC6xbS33XinFx3oo7WsM8NeIeKooL/+3WnycUcr6hJQ6h1LXxBrEwYS1ulVk/wyBrLGW7B9hb0oqfi3uI2Q1E525afOImFPBsfp8xa6y/hGfJvtg2DoiOsmqeFXBvh8BvlJUrs0i4rJB2jZf9seAfD+ADrLq/WzFiGeBeWRNNh8ALil34Ii4LyJmANsD5wBXpA/HR4DXl9nsf4CrgB0jYivgu1R2jSqx0f1A1mfmBbKmlJeK3cf2p5HVZrw9IrYk+0bMIJZvQyGyvj+3kjU7FF/nx8ju44LxpXaRm+/r7+AxYGxKK8jvu5Z7r5TiY41P5VsFbCNpi6K8XvpX6hxKXRNrEAcT1urmAf8iaX9lHQRPI2tj/03K/zNZ+3lB4dvgFEkjJI1S9gz/OPq3GlhftL+8Lcg+uFYDIyWdCWxZ4Xl8D/hI+tYuSZsr66i4Rb9bDnzbK8iuwf+R9Eqy6uXiD8sfkVVZv48+gglJ75e0XfomvDYlrwcuBQ6QdHTqHLitpEkpfwuyb6jPStoL+NcKzrFSlwGfkLSTskeHvwpcHpU/7bEFWdPEWknbAJ8fxLKV8iOyAHQPsv4dBfOA05V1CB0HnNzPfvr6O7iVrHnhpPS7OAzYK7dtLfdeKdsDp0jaRNJRwK7A1RHxSCrP2env7s1kNVuVjL1yK9nfVmG/04rOwRrMwYS1tIi4h+wb9PnAGuBQskdI/5FWORs4I1Xffir9QzsM+CzZh/4jwCwq+FtIzQFfARan/b2jaJVFwDXAvWRVsM/SR5V60b67gQ8B3ybrZ3E/2Yf5oG8bESvJPpx+QvaN72mytvzncussJgsKlkZEX9XJBwMrJT0NfJOsb8O6iHiYrCPdacBfyToL7pm2ORH4oqSnyPpvzKvkPCv0A7Lg52bgQbLfQX8fxHnfIOuLswb4Ldnvs56uJKtRuDLdXwVfILuHHgSupY+ADvr+O0h/C9PIPrjXpvV+Sfp913LvlXEbsHMqx1eAIyOi0Iw2g6zvyiqyc/98RFzX3w5z5zCT7H46ho2DL2swbdwEZWbtJn2DXwvsHBEP5tJvAP4nIi5qVNnagaQHgA9X8qE6iMe8jawT5Q+H6pg2vLlmwqwNSTo0dTbcnOzR0OVkvfYL+W8jGxzs8saUsD1IOoKs78PLxrwY5OO8S9kYIiMlHUf2SG69a12sjXjkNLP2dBhZ1bmAbrLmiQCQdDEwFfh4Uc97G0SSbiJ7/PEDqc9JPU0ka07anOyx0yNzT46Y1czNHGZmZlYTN3OYmZlZTRxMmJmZWU3cZ6JKo0ePjgkTJjS6GGZmZkNiyZIlayJiu1J5DiaqNGHCBLq7uxtdDDMzsyEhqeyYM27mMDMzs5o4mDAzM7OaOJgwMzOzmjiYMDMzs5o0JJiQdJSklZLWS+rKpR8oaYmk5ennfil9C0nLctMaSd9IeV/Ppd8raW2ZYx4j6c503HNy6TMlrc7t49/re/ZmZmbDS6Oe5lhB9ga4/y5KX0P2prtVknYnewvj2DSk76TCSpKWkN4YFxGfyKWfDEwuPpikbYFzgbdGxGpJF0vaPyKuT6tcHhEnDdrZmZmZtZGGBBMRcTeApOL0ntziSqBD0qYR8dKrkSXtAmwP3FJi1zOAz5dIfx1wX0SsTsvXAUcA15dYd0gt6Onl3EX3sGrtOsZ0djBrykSmTh7b6GKZmZlVrJn7TBwBLM0HEsl0spqEjV4qIum1wE6Ufvve/cBESRMkjSR7idGO+WOlJpArJO1YYvu6WNDTy+nzl9O7dh0B9K5dx+nzl7Ogp3eoimBmZlazugUTkq6TtKLEdFgF274JOAf4cIns6cBlZdKviIgXizMi4gngo2SvU76F7FXLhfV+AUyIiDcDvwIu7qNcJ0jqltS9evXqcqtV7NxF97Du+Y2Lu+75Fzl30T0179vMzGyo1K2ZIyIOqGY7SeOAK4FjI+KBorw9gZERsaTEptOBj/VRnl+QBQ5IOoEUTETEX3KrXQR8rY99XAhcCNDV1VXz61ZXrV03oHQzM7Nm1FTNHJI6gYXA7IhYXGKVGZSolZD0RmBr4NY+9r19+rk1cCJZ4ICkHXKrvQ+4u8riD9iYzo4BpZuZmTWjRj0aerikR4G9gYWSFqWsk4A3AGfmHtXcPrfp0ZRv4vhJiX4Uy3KL35R0F7AYmBMR96b0U9LjoncApwAzazy9is2aMpGOTUZslNaxyQhmTZk4VEUwMzOrmYo+f61CXV1dMRgv+vLTHGZm1gokLYmIrlJ5fmtog02dPNbBg5mZtbSm6jNhZmZmrcfBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdXEwYSZmZnVxMGEmZmZ1cTBhJmZmdWkYcGEpKMkrZS0XlJXLv1ASUskLU8/90vpW0halpvWSPpGyhsv6UZJPZLulHRImWMeLOkeSfdLmp1L30nSbSn9ckmvrPPpm5mZDRuNrJlYAUwDbi5KXwMcGhF7AMcBlwBExFMRMakwAQ8B89M2ZwDzImIyMB24oPhgkkYA/wW8B9gNmCFpt5R9DvD1iHgD8ARw/KCdpZmZ2TDXsGAiIu6OiHtKpPdExKq0uBLokLRpfh1JuwDbA7cUNgO2TPNbAat4ub2A+yPiDxHxD+AnwGGSBOwHXJHWuxiYWvWJmZmZtZmRjS5AP44AlkbEc0Xp04HLIyLS8lnAtZJOBjYHDiixr7HAI7nlR4G3A9sCayPihVz62MEpvpmZ2fBX15oJSddJWlFiOqyCbd9E1vzw4RLZ04HLcsszgLkRMQ44BLhE0qCfm6QTJHVL6l69evVg797MzKwl1bVmIiJK1RD0S9I44Erg2Ih4oChvT2BkRCzJJR8PHJyOeaukUcBo4PHcOr3AjrnlcSntL0CnpJGpdqKQXup8LgQuBOjq6opS65iZmbWbpns0VFInsBCYHRGLS6wyg41rJQAeBvZP2+8KjAKKqw5+B+ycntx4JVntxlWpqeRG4Mi03nHAzwfhVMzMzNpCIx8NPVzSo8DewEJJi1LWScAbgDNzj4Fun9v0aF4eTJwGfEjSHSlvZkSEpDGSrgZItQ4nAYuAu8me/liZtv8M8ElJ95P1ofj+oJ+wmZnZMKUNfRhtILq6uqK7u7vRxTAzMxsSkpZERFepvKZr5jAzM7PW4mDCzMzMauJgwszMzGriYMLMzMxq4mDCzMzMauJgwszMzGriYMLMzMxq4mDCzMzMauJgwszMzGriYMLMzMxq4mDCzMzMauJgwszMzGriYMLMzMxq4mDCzMzMauJgwszMzGriYMLMzMxq4mDCzMzMauJgwszMzGriYMLMzMxqMrLRBbDqLOjp5dxF97Bq7TrGdHYwa8pEpk4e2+himZlZG3Iw0YIW9PRy+vzlrHv+RQB6167j9PnLARxQmJnZkHMzRws6d9E9LwUSBeuef5FzF93ToBKZmVk7czDRglatXTegdDMzs3pyMNGCxnR2DCjdzMysnhxMtKBZUybSscmIjdI6NhnBrCkTG1QiMzNrZ+6A2YIKnSz9NIeZmTWDfoMJSa8GvgqMiYj3SNoN2Dsivl/30llZUyePdfBgZmZNoZJmjrnAImBMWr4XOLVO5TEzM7MWU0kwMToi5gHrASLiBeDFvjcxMzOzdlFJMPF3SdsCASDpHcCTdS2VmZmZtYxKOmB+ErgKeL2kxcB2wJF1LZWZmZm1jH6DiYhYKuldwERAwD0R8XzdS2ZmZmYtod9mDkmbAbOBUyNiBTBB0nvrXjIzMzNrCZX0mfgh8A9g77TcC3y51gNLOkrSSknrJXXl0g+UtETS8vRzv5S+haRluWmNpG+kvPGSbpTUI+lOSYeUOebBku6RdL+k2bn0uZIezO17Uq3nZ2Zm1i4q6TPx+og4RtIMgIh4RpIG4dgrgGnAfxelrwEOjYhVknYneyx1bEQ8BUwqrCRpCTA/LZ4BzIuI76RxMK4GJuR3KmkE8F/AgcCjwO8kXRURd6VVZkXEFYNwXmZmZm2lkmDiH5I62PA0x+uB52o9cETcnfZXnN6TW1wJdEjaNCJeOqakXYDtgVsKmwFbpvmtgFUlDrkXcH9E/CHt4yfAYcBdJdY1MzOzClUSTHweuAbYUdKlwD7AzHoWKucIYGk+kEimA5dHRKTls4BrJZ0MbA4cUGJfY4FHcsuPAm/PLX9F0pnA9cDsEsc0MzNregt6eof8dQt99pmQ9Apga7LmiJnAZUBXRNxUyc4lXSdpRYnpsAq2fRNwDvDhEtnTU1kKZgBzI2IccAhwSSp7pU4H3gi8DdgG+EyZMp0gqVtS9+rVqwewezMzs/pb0NPL6fOX07t2HQH0rl3H6fOXs6Cnt67H7bNmIiLWS/p0GgFz4UB3HhGlagj6JWkccCVwbEQ8UJS3JzAyIpbkko8HDk7HvFXSKGA08HhunV5gx9zyuJRGRDyW0p6T9EPgU2XO50LgQoCurq4otY6ZmVmjnLvoHtY9v/Eg1euef5FzF91T19qJSr69XyfpU5J2lLRNYapXgSR1kgUusyNicYlVZrBxrQTAw8D+aftdgVFAcdXB74CdJe0k6ZVktRtXpW12SD8FTCXrHGpmZtZSVq1dN6D0wVJJn4lj0s+P5dICeF0tB5Z0OHA+2YiaCyUti4gpwEnAG4AzUx8GgIMiolDLcDRZU0beacD3JH0ilW1mRISkMcBFEXFIRLwg6SSyp0NGAD+IiJVp+0slbUc2KNcy4CO1nJuZmdlgGGj/hzGdHfSWCBzGdHbUs5hoQx/GMitIoyLi2f7S2k1XV1d0d3c3uhhmZjZMFfo/5JstOjYZwdnT9igbUFSzTaUkLYmIrlJ5lTRz/KbCNDMzMxskffV/KGfq5LGcPW0PxnZ2IGBsZ8egBBL9KdvMIek1ZI9TdkiaTNYEANl4DpvVtVRmZmZtrtr+D1Mnj6178FCsrz4TU8geBx0HnMeGYOJvwGfrWywzM7P21qj+D9UoG0xExMWSLgFmRMSlQ1gmMzOztjdrysSS/R9mTZnYwFKVVsk4E58AHEyYmZlVqZpRKQv5Qz2aZTUqeTT0OkmfAi4H/l5IjIi/1q1UZmZmw0TxExaFUSmBigKKZgweijVsnAkzM7N20KhRKYdSv8FEROw0FAUxMzMbjho1KuVQqqRmAkm7A7uRDVMNQET8qF6FMjMzGy5a6amMavU7aJWkz5MNe30+8G7ga8D76lwuMzOzYWHWlIl0bDJio7RmfSqjWpWMgHkk2Uu0/hQR/wbsCWxV11KZmZkNE40alXIoVdLMsS49IvqCpC3JXuu9Y38bmZmZWaZVnsqoViXBRHd6Lfj3gCXA08Ct9SyUmZlZM6pmvIh2UMnTHCem2e9KugbYMiLurG+xzMzMmkst40UMd3296OstfeVFxNL6FMnMzKz5tMN4EdXqq2bivNz8W8maOAoC2K8uJTIzM2tC7TBeRLX6etHXuwvzknryy2ZmZu2mHcaLqFYlj4ZCVhNhZmbWttphvIhqVTQCppmZWbtrpbd4DrW+OmCez4YaiXGSvpXPj4hT6lkwMzOzZjPcx4uoVl81E925+SVl1zIzM2tBHjNi8PTVAfPioSyImZnZUPGYEYOr0g6YZmZmw0ZfY0bYwLkDZhtxlZ6ZWcZjRgyusjUTkmZI2nYoC2P1U6jS6127jmBDld6Cnt5GF83MbMiVGxvCY0ZUp69mjvHATyXdIuksSW+XpKEqmA0uV+mZmW3gMSMGV9lgIiLOiYj9gEOAO4APAksl/Y+kYyW9eqgKabVzlZ6Z2QZTJ4/l7Gl7MLazAwFjOzs4e9oebvqtUiVvDX0KuDJNSNoNeA/wI2BKXUtng8bDwJqZbcxjRgyeAT/NERF3RcR5EeFAooW4Ss/MzOrFT3O0CQ8Da2Zm9eJgoo24Ss/MhiM/9t54/TZzSDpP0puGojBmZmYD4cfem0MlfSbuBi6UdJukj0jaqt6FMjMzq4Qfe28O/QYTEXFRROwDHAtMAO5Mj4e+u96FMzMz64sfe28OFT3NIWkE8MY0rSEbd+KTkn5S7YElHSVppaT1krpy6QdKWiJpefq5X0rfQtKy3LRG0jdS3nhJN0rqkXSnpEPKHPMHkh6XtKIofRtJv5J0X/q5dbXnZWZmQ8cjWTaHSvpMfB24h2zwqq9GxFvTgFaHApNrOPYKYBpwc1H6GuDQiNgDOA64BLLxLiJiUmECHgLmp23OAOZFxGRgOnBBmWPOBQ4ukT4buD4idgauT8tmZtbk/Nh7c6jkaY47gTMi4u8l8vaq9sARcTdA8QjdEdGTW1wJdEjaNCKeKyRK2gXYHrilsBmwZZrfClhV5pg3S5pQIuswYN80fzFwE/CZik/GzMwawo+9N4dKgok7gIlFH/pPAg9FxJN1KdUGRwBL84FEMh24PCIiLZ8FXCvpZGBz4IABHufVEfFYmv8T4KHCzcxahB97b7xKgokLgLeQ1VAI2J2sxmArSR+NiGvLbSjpOuA1JbI+FxE/7+ug6XHUc4CDSmRPBz6QW54BzI2I8yTtDVwiafeIWN/XMUqJiJAUpfIknQCcADB+/PiB7trMzGxYqiSYWAUcHxEr4aV3c3wR+DRZn4WywUREDLSGgHSMcWTvAjk2Ih4oytsTGBkRS3LJx5P6QkTErZJGAaOBxys85J8l7RARj0naodx2EXEhcCFAV1dXyYDDzMys3VTyNMcuhUACsndzAG+MiD/Uo0CSOoGFwOyIWFxilRnAZUVpDwP7p+13BUYBqwdw2KvIOnuSfvZZa2JmZvWxoKeXfebcwE6zF7LPnBs8+FSLqCSYuEvSdyS9K00XpLRNgeerPbCkwyU9CuwNLJS0KGWdBLwBODP3GOj2uU2P5uXBxGnAhyTdkfJmpuaKMZKuzh3zMuBWsj4gj0o6PmXNAQ6UdB9Zf4s51Z6XmZlVx6NZti5t6MNYZgWpAzgReGdKWkzWj+JZYLOIeLquJWxSXV1d0d3d3ehimJkNG/vMuYHeEoNNje3sYPHs/RpQIsuTtCQiukrl9dlnIg1WdXVEvBs4r8QqbRlImJnZ4PNolq2rz2aOiHgRWO/3cZiZWb15NMvWVUmfiaeB5ZK+L+lbhaneBTMzs/bi0SxbVyWPhs5nw7DVZmZmdeHRLFtXv8FERFycOmGOjwi/09XMzOrGo1m2pkpe9HUosAy4Ji1PknRVnctlZmZmLaKSPhNnkb3Qay1ARCwDXle3EpmZmVlLqSSYeL7EC70G/M4LMzMzG54q6YC5UtK/AiMk7QycAvymvsUyM7NWtqCn1x0p20glNRMnA28CniMbqvpvwKl1LJOZmbUwD4vdfvoNJiLimYj4XES8LSK60vyzQ1E4MzNrPecuuod1z7+4Udq651/k3EV+IHC46reZQ9IuwKeACfn1I8IDpZuZ2ct4WOz2U0mfiZ8C3wUuAl7sZ10zM2tzYzo7Sr6wy8NiD1+VBBMvRMR36l4Sa0ruRGVmAzVrykROn798o6YOD4s9vFUSTPxC0onAlWSdMAGIiL/WrVTWFAqdqAr/EAqdqAAHFGZWlofFbj+KiL5XkB4skRwR0dYDV3V1dUV3d3eji1FX+8y5oWRV5djODhbPdpcZM7N2ImlJRHSVyqvk3Rw7DX6RrBW4E5WZmVWi7KOhkj6dmz+qKO+r9SyUNYdynaXcicrMzPL6Gmdiem7+9KK8g+tQFmsys6ZMpGOTERuluROVWXtZ0NPLPnNuYKfZC9lnzg0eeMpK6quZQ2XmSy3bMOROVGbtzZ2wrVJ9BRNRZr7Usg1TUyeP9T8NszbV10iW/r9geX0FE3tK+htZLURHmictj6p7yczMrKHcCdsqVTaYiIgR5fLMzGz480iWVqlK3hpqZmZtyJ2wrVKVjIBpZmZtyJ2wrVIOJszMrCx3wrZKuJnDzMzMauJgwszMzGriYMLMzMxq4j4TZmZtYkFPrztTWl04mDAzawMeGtvqyc0cZmZtoK+hsc1q5WDCzKwNeGhsq6eGBBOSjpK0UtJ6SV259AMlLZG0PP3cL6VvIWlZbloj6Rspb7ykGyX1SLpT0iFljvkDSY9LWlGUfpak3ty+S25vZtbKyg2B7aGxbTA0qmZiBTANuLkofQ1waETsARwHXAIQEU9FxKTCBDwEzE/bnAHMi4jJwHTggjLHnAscXCbv67n9X13lOZmZNS0PjW311JAOmBFxN4Ck4vSe3OJKsreVbhoRzxUSJe0CbA/cUtgM2DLNbwWsKnPMmyVNGIzym5m1Gg+NbfXUzE9zHAEszQcSyXTg8oiItHwWcK2kk4HNgQOqONZJko4FuoHTIuKJKstsZta0PDS21UvdmjkkXSdpRYnpsAq2fRNwDvDhEtnTgctyyzOAuRExDjgEuETSQM7rO8DrgUnAY8B5fZTrBEndkrpXr149gEO0nwU9vewz5wZ2mr2QfebcwIKe3kYXyczM6qRuNRMRUU0NAZLGAVcCx0bEA0V5ewIjI2JJLvl4Ul+IiLhV0ihgNPB4heX8c27/3wN+2ce6FwIXAnR1dUW59dqdn2c3M2svTfVoqKROYCEwOyIWl1hlBhvXSgA8DOyftt8VGAVUXG0gaYfc4uFknUOtBn6e3ay+XPNnzaZRj4YeLulRYG9goaRFKesk4A3AmblHNbfPbXo0Lw8mTgM+JOmOlDczIkLSGEkvPZkh6TLgVmCipEclHZ+yvpYeRb0TeDfwicE+33bj59nN6qdQ89e7dh3Bhpo/BxTWSNrQj9EGoqurK7q7uxtdjKa0z5wb6C0ROIzt7GDx7P0aUCKz4cN/X9YokpZERFepvKZq5rDhwc+zm9WPa/6sGTmYsEE3dfJYzp62B2M7OxDZN6azp+3hzpdmg8AjWVozauZxJqyF+Xl2s/qYNWXiRk9LgWv+rPEcTJiZtRCPZGnNyMGEmVmLcc2fNRv3mTAzM7OaOJgwMzOzmriZw8ysgRb09Lr/g7U8BxNmZg3i99jYcOFmDjOzBvF7bGy4cDBhZtYgHs3ShgsHE2ZmDeLRLG24cDBhTcOvVbZ24/fY2HDhDpjWFNwRzdqRR7O04cLBhDWFvjqi+R+rDWcezdKGAwcT1hTcEc1anceLsHbmPhPWFNwRzVpZoZmud+06gg3NdO73Y+3CwYQ1BXdEs1bm8SKs3bmZw5qCO6JZK3MznbU7BxPWNNwRzVrVmM4OeksEDm6ms3bhZg4zsxq5mc7anWsmzMxq5GY6a3cOJszMBoGb6aydOZgwMyviMSPMBsbBhJlZjod2Nxs4BxPW8vwt0gaTh3Y3GzgHE9bS/C3SBpvHjDAbOD8aai3NIw/aYPPQ7mYD52DCWpq/Rdpg85gRZgPnYMJamr9F2mCbOnksZ0/bg7GdHQgY29nB2dP2cLOZWR/cZ8Ja2qwpEzfqMwH+FmkbVNs512NGmA2MgwlraR550Mpx51yzoeNgwlqev0VaKX7E02zoNKzPhKSjJK2UtF5SVy79QElLJC1PP/dL6VtIWpab1kj6RsobL+lGST2S7pR0SInj7ZjWuSsd9+O5vG0k/UrSfenn1kNwCcysjtw512zoNLID5gpgGnBzUfoa4NCI2AM4DrgEICKeiohJhQl4CJiftjkDmBcRk4HpwAUljvcCcFpE7Aa8A/iYpN1S3mzg+ojYGbg+LdswtqCnl33m3MBOsxeyz5wbWNDT2+gi2SBz51yzodOwYCIi7o6Ilw0GEBE9EbEqLa4EOiRtml9H0i7A9sAthc2ALdP8VsAqikTEYxGxNM0/BdwNFOo6DwMuTvMXA1OrPC1rAYW29N616wg2tKU7oBhe/Iin2dBp9j4TRwBLI+K5ovTpwOUREWn5LOBaSScDmwMH9LVTSROAycBtKenVEfFYmv8T8Orai27Nym3praeapzLcOdds6NQ1mJB0HfCaElmfi4if97Ptm4BzgINKZE8HPpBbngHMjYjzJO0NXCJp94hYX2K/rwJ+BpwaEX8rzo+IkBTF6WnbE4ATAMaPH99X8a2JuS29tdTyVIY755oNjbo2c0TEARGxe4mpv0BiHHAlcGxEPFCUtycwMiKW5JKPB+alY94KjAJGl9jvJmSBxKURMT+X9WdJO6R1dgAeL3M+F0ZEV0R0bbfddv2cvTUrt6W3Fg+Zbtb8mm4ETEmdwEJgdkQsLrHKDOCyorSHgf3T9ruSBROri/Yr4PvA3RHxn0XbX0XW2ZP0s89gx1qb29Jbi2uSzJpfw/pMSDocOB/YDlgoaVlETAFOAt4AnCnpzLT6QRFRqC04Gih+9PM04HuSPkHWGXNmaq4YA1wUEYcA+5A1jSyXtCxt99mIuBqYA8yTdDzZUyJH1+GUrUnU0pbu153XbqDXcExnB70lAgfXJJk1D23ow2gD0dXVFd3d3Y0uhg2h4rZ7yGo0/N6GylVzDX3dzZqDpCUR0VUqr+maOcyaldvua1fNNfSLt8yaX7M/GmrWNNx2X7tqr6GfyjBrbg4mzCpUbdv9cO1nUc15uf+D2fDkZg6zClXzFMhwHW2z2vPykzRmw5NrJswqVM1TILWMtjmUNRoDPVa15+VRKc2GJwcTZgMw0Lb7avsIVDvqYzUBSDXHqqX/iPs/mA0/buYwq6NqR9us5qmHapseqjmWRxE1szwHE2Z1VG0fgWq++Vf76Go1x3LfBzPLczBhVkfVjpFQzTf/apseqjmWx34wszz3mTCrs2r6CMyaMrHkqI99ffOv9rHLao4F7vtgZhu4ZsKsCVXzzb/apgfXMphZrfxujir53RzWjIbrAFlm1nh9vZvDzRxmw4ibHsysEdzMYWZmZjVxMGFmZmY1cTBhZmZmNXEwYWZmZjVxMGFmZmY1cTBhZmZmNfE4E1WStBp4qNHl6MdoYE2jC9FCfL0q52s1ML5elfO1GpihvF6vjYjtSmU4mBjGJHWXG2DEXs7Xq3K+VgPj61U5X6uBaZbr5WYOMzMzq4mDCTMzM6uJg4nh7cJGF6DF+HpVztdqYHy9KudrNTBNcb3cZ8LMzMxq4poJMzMzq4mDiWFA0g8kPS5pRZl8SfqWpPsl3SnpLUNdxmZRwbXaV9KTkpal6cyhLmOzkLSjpBsl3SVppaSPl1jH9xYVXyvfW4mkUZJul3RHul5fKLHOppIuT/fWbZImNKCoDVfhtZopaXXu3vr3oS6nX0E+PMwFvg38qEz+e4Cd0/R24DvpZzuaS9/XCuCWiHjv0BSnqb0AnBYRSyVtASyR9KuIuCu3ju+tTCXXCnxvFTwH7BcRT0vaBPi1pP+NiN/m1jkeeCIi3iBpOnAOcEwjCttglVwrgMsj4qQGlA9wzcSwEBE3A3/tY5XDgB9F5rdAp6QdhqZ0zaWCa2VJRDwWEUvT/FPA3cDYotV8b1HxtbIk3S9Pp8VN0lTcge8w4OI0fwWwvyQNURGbRoXXquEcTLSHscAjueVH8T+6vuydqhT/V9KbGl2YZpCqmCcDtxVl+d4q0se1At9bL5E0QtIy4HHgVxFR9t6KiBeAJ4Fth7SQTaKCawVwRGpqvELSjkNbQgcTZsWWkg0ZuydwPrCgscVpPEmvAn4GnBoRf2t0eZpZP9fK91ZORLwYEZOAccBeknZvcJGaVgXX6hfAhIh4M/ArNtToDBkHE+2hF8hHquNSmhWJiL8VqhQj4mpgE0mjG1yshklttD8DLo2I+SVW8b2V9HetfG+VFhFrgRuBg4uyXrq3JI0EtgL+MqSFazLlrlVE/CUinkuLFwFvHeKiOZhoE1cBx6ae9+8AnoyIxxpdqGYk6TWFdllJe5H9jbTlP7B0Hb4P3B0R/1lmNd9bVHatfG9tIGk7SZ1pvgM4EPh90WpXAcel+SOBG6INB0aq5FoV9VN6H1mfnSHlpzmGAUmXAfsCoyU9CnyerJMOEfFd4GrgEOB+4Bng3xpT0sar4FodCXxU0gvAOmB6O/4DS/YBPgAsT+21AJ8FxoPvrSKVXCvfWxvsAFwsaQRZUDUvIn4p6YtAd0RcRRacXSLpfrJO09MbV9yGquRanSLpfWRPFf0VmDnUhfQImGZmZlYTN3OYmZlZTRxMmJmZWU0cTJiZmVlNHEyYmZlZTRxMmJmZWU0cTJi1OEnjJP1c0n2SHpD0TUmvLLPuTEnfLkq7SVJXP8fYV9Iv0/z7JM3uY91Jkg6p5lwGSxquelyJ9JHp7Ypz6nTcUyVtVo99mzUzBxNmLSwNgjQfWBAROwO7AK8CvlKvY0bEVRHR14fxJLKxJxoiDeyzbUQ8WiL7QOBe4Kg6vTTqVKBkMJHGCTAblhxMmLW2/YBnI+KHkI3hD3wC+GCt35AlHSzp95KWAtNy6S/Vbkg6StKK9PKqm1ONyBeBYyQtk3SMpL0k3SqpR9JvJE3M7We+pGtSrcrXio69NO33+pS2uaQfSLo97euwMkXfF7ipTN4M4JvAw8DeueP9UdIX0jGXS3pjSt9O0q8krZR0kaSHJI1OZVmYyrcinecpwBjgRkk3pu2flnSepDvIXvL1ybT+CkmnpnUmpOs8V9K9ki6VdICkxem67DWgX5xZI0SEJ0+eWnQCTgG+XiK9B3hzifSZwGpgWW56GugqWm8U2RsbdwYEzAN+mdvHt9P8cmBsmu8szk/LWwIj0/wBwM9y6/2B7J0Lo4CHyN7FsF069k5pvW3Sz68C7y8ci6yGYfMS5/gtYL8S6aOAVUAHcAJwfi7vj8DJaf5E4KI0/23g9DR/MNmrn0cDRwDfy22/VW4/o3PpARyd5t+artfmZLVHK8neLjqBbOTCPci+4C0BfpCu+2FktU4Nv9c8eeprcs2EWfu5PCImFSagu8Q6bwQejIj7IiKAH5fZ12JgrqQPAeWq8bcCfippBfB1IP/q7esj4smIeBa4C3gt8A7g5oh4ECAi/prWPQiYnYarvoksOBhf4nj7AL8ukf5e4MaIWEf2Qq6pRU0PhZdzLSH7gAd4J/CTVI5rgCdS+nLgQEnnSPqniHiyzLm/mI5V2NeVEfH3yF74NR/4p5T3YEQsj4j1ZEHG9em6L8+VxaxpOZgwa213UfSGQElbkn3I3i/pY6m5YZmkMYN98Ij4CHAGWY3CEknblljtS2Qf4rsDh5IFAQXP5eZfpO/3BQk4IhcIjY+IjV5oJOl1wCMR8Y8S288ADpD0R7KAYVuyZqLisvRXDiLiXuAtZB/2X5Z0ZplVn42s6ak/+euwPre8vr+ymDUDBxNmre16YDNJx8JLnfzOA+ZGxDMR8V+5D99VA9jv74EJkl6flmeUWknS6yPitog4k6z5ZEfgKWCL3GpbseG15DMrOPZvgX+WtFM6xjYpfRFwcqHjpKTJJbZ9D3BNiXJuSVYLMD4iJkTEBOBj5c4rZzFwdNrHQcDWaX4M8ExE/Bg4lyywgJefe94tZLUhm0naHDg8pZm1PAcTZi0sVYUfTvZ0wn1k/QieJXtjZS37fZasX8HC1AHz8TKrnps6LK4AfgPcAdwI7FbogAl8DThbUg8VfMuOiNXp2PNTx8XLU9aXyN7weqeklWm52MGUCCbIrtENEZGvAfg5cKikTfsozheAg9L5HQX8iSxg2AO4PTW5fB74clr/QuCaQgfMovNaCswFbgduI+uX0dPHsc1aht8aambDQgoKFkdEn2NmVLHPFyPiBUl7A99J/UzMLMdtcWY2LKRah0ELJJLxwDxJrwD+AXxokPdvNiy4ZsLMzMxq4j4TZmZmVhMHE2ZmZlYTBxNmZmZWEwcTZmZmVhMHE2ZmZlYTBxNmZmZWk/8Pn0G5kbao9nwAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
" ] diff --git a/examples/overview_endtoend.ipynb b/examples/overview_endtoend.ipynb index faeecfccd..8fc85b24b 100644 --- a/examples/overview_endtoend.ipynb +++ b/examples/overview_endtoend.ipynb @@ -11,6 +11,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/overview_endtoend.ipynb)\n", + "\n", "Quantum computing is a nascent field, and we have barely started to explore its applications. In order to revolutionize fields such as quantum chemistry, the community has to face challenges in both algorithms design and quantum hardware development. A major undertaking is designing approaches ensuring satisfying accuracy, while keeping computing resource requirements within the capabilities of Noisy Intermediate Scale Quantum (NISQ) devices to solve exciting problems.\n", "\n", "This quantum SDK was designed to support our exploration with this goal in mind, and enables us to build our own end-to-end workflows by providing building-blocks from various toolboxes, and algorithms.\n", @@ -46,43 +48,27 @@ "source": [ "## Setting up your environment \n", "\n", - "In order to run this notebook, `tangelo` needs to be installed in your Python environment, or be found in your PYTHONPATH. Please refer to the installation instructions for any additional information, and how to install optional dependencies such as performant quantum circuit simulators." + "In order to run this notebook, `tangelo` needs to be installed in your Python environment, or be found in your PYTHONPATH. Please refer to the installation instructions for any additional information, and how to install optional dependencies such as performant quantum circuit simulators. If Tangelo is not already installed, executing the cell below installs the minimal requirements for this notebook." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "['__cached__',\n", - " '__doc__',\n", - " '__file__',\n", - " '__loader__',\n", - " '__name__',\n", - " '__package__',\n", - " '__path__',\n", - " '__spec__',\n", - " 'logging']" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Pretty printer for more readable outputs\n", "import pprint\n", "pp = pprint.PrettyPrinter(width=160, compact=False, indent=1)\n", "from pprint import pprint\n", "\n", - "import google\n", - "dir(google)" + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" ] }, { @@ -706,25 +692,9 @@ "\n", "The simplest way to submit an experiment to any device available in the supported quantum cloud services is through QEMIST Cloud's client library, allowing users to run quantum hardware experiments using their QEMIST Cloud account credentials and credits. This is possible if you have access to QEMIST Cloud, and have installed `qemist-client` Python package. For more details about this feature, please don't hesitate to refer to our [dedicated notebook](qemist_cloud_hardware_experiments_braket.ipynb), and reach out to us about QEMIST Cloud.\n", "\n", - "Below, a simple code snippet illustrating how to run 10,000 shots of the `YY` circuit on IonQ's hardware, through Amazon's Braket quantum cloud services:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'braket_ionq': 100.3, 'braket_rigetti': 3.8}\n" - ] - } - ], - "source": [ + "Below, a simple code snippet illustrating how to run 10,000 shots of the `YY` circuit on IonQ's hardware, through Amazon's Braket quantum cloud services:\n", + "\n", + "```python\n", "# Retrieve both these values from your QEMIST Cloud dashboard\n", "import os\n", "os.environ['QEMIST_PROJECT_ID'] = \"your_project_id_string\"\n", @@ -743,7 +713,13 @@ "# This two commands would respecfully submit the job to the quantum device and make a blocking call\n", "# to retrieve the results, through a job ID returned by QEMIST Cloud\n", "# job_id = job_submit(circuit_YY, n_shots=n_shots, backend=backend)\n", - "# freqs, raw_data = job_result(job_id)" + "# freqs, raw_data = job_result(job_id)\n", + "```\n", + "\n", + "Output:\n", + "```output\n", + "{'braket_ionq': 100.3, 'braket_rigetti': 3.8}\n", + "```" ] }, { diff --git a/examples/vqe.ipynb b/examples/vqe.ipynb index 2a9a4b832..f80b49a97 100755 --- a/examples/vqe.ipynb +++ b/examples/vqe.ipynb @@ -6,9 +6,30 @@ "source": [ "# VQE with Tangelo\n", "\n", - "The Tangelo Python package provides various toolboxes, which can be leveraged to build quantum chemistry workflows relying on quantum computing. One example of such a workflow is the Variational Quantum Eigensolver (VQE). We provide an implementation of VQE that supports several options, and may provide valuable help in your research and applications.\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/vqe.ipynb)\n", "\n", - "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. " + "Tangelo provides various toolboxes, which can be leveraged to build quantum chemistry workflows relying on quantum computing. One example of such a workflow is the Variational Quantum Eigensolver (VQE). We provide an implementation of VQE that supports several options, and may provide valuable help in your research and applications.\n", + "\n", + "This notebook assumes that you already have installed Tangelo in your Python environment, or have updated your Python path so that the imports can be resolved. If not, executing the cell below installs the minimal requirements for this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet\n", + "\n", + "# Installation of qulacs if not already installed.\n", + "try:\n", + " import qulacs\n", + "except ModuleNotFoundError:\n", + " !pip install qulacs --quiet" ] }, { @@ -81,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -114,33 +135,45 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'molecule': SecondQuantizedMolecule(xyz=[('H', (0, 0, 0)), ('H', (0, 0, 0.74137727))], q=0, spin=0, n_atoms=2, n_electrons=2, n_min_orbitals=2, basis='sto-3g', mf_energy=-1.1166856303994788, mo_energies=array([-0.5779842, 0.6697221]), mo_occ=array([2., 0.]), mean_field=, n_mos=2, n_sos=4, active_occupied=[0], frozen_occupied=[], active_virtual=[1], frozen_virtual=[]),\n", + "{'molecule': SecondQuantizedMolecule(xyz=[('H', (0.0, 0.0, 0.0)), ('H', (0.0, 0.0, 0.74137727))], q=0, spin=0, n_atoms=2, n_electrons=2, n_min_orbitals=8, basis='sto-3g', ecp={}, symmetry=False, mf_energy=-1.1166856303994788, mo_energies=array([-0.5779842, 0.6697221]), mo_occ=array([2., 0.]), mean_field=, n_mos=2, n_sos=4, active_occupied=[0], frozen_occupied=[], active_virtual=[1], frozen_virtual=[]),\n", " 'qubit_mapping': 'jw',\n", " 'ansatz': ,\n", - " 'optimizer': >,\n", + " 'optimizer': >,\n", " 'initial_var_params': None,\n", " 'backend_options': {'target': None, 'n_shots': None, 'noise_model': None},\n", " 'penalty_terms': None,\n", + " 'deflation_circuits': [],\n", + " 'deflation_coeff': 1,\n", " 'ansatz_options': {},\n", " 'up_then_down': False,\n", " 'qubit_hamiltonian': None,\n", " 'verbose': False,\n", + " 'ref_state': None,\n", + " 'reference_circuit': ,\n", + " 'default_backend_options': {'target': None,\n", + " 'n_shots': None,\n", + " 'noise_model': None},\n", " 'optimal_energy': None,\n", " 'optimal_var_params': None,\n", " 'builtin_ansatze': {,\n", + " ,\n", + " ,\n", + " ,\n", " ,\n", " ,\n", + " ,\n", " ,\n", - " }}" + " ,\n", + " }}" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -170,55 +203,60 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "converged SCF energy = -1.11668563039948\n" - ] - }, { "data": { "text/plain": [ - "{'molecule': SecondQuantizedMolecule(xyz=[('H', (0, 0, 0)), ('H', (0, 0, 0.74137727))], q=0, spin=0, n_atoms=2, n_electrons=2, n_min_orbitals=2, basis='sto-3g', mf_energy=-1.1166856303994788, mo_energies=array([-0.5779842, 0.6697221]), mo_occ=array([2., 0.]), mean_field=, n_mos=2, n_sos=4, active_occupied=[0], frozen_occupied=[], active_virtual=[1], frozen_virtual=[]),\n", + "{'molecule': SecondQuantizedMolecule(xyz=[('H', (0.0, 0.0, 0.0)), ('H', (0.0, 0.0, 0.74137727))], q=0, spin=0, n_atoms=2, n_electrons=2, n_min_orbitals=8, basis='sto-3g', ecp={}, symmetry=False, mf_energy=-1.1166856303994788, mo_energies=array([-0.5779842, 0.6697221]), mo_occ=array([2., 0.]), mean_field=, n_mos=2, n_sos=4, active_occupied=[0], frozen_occupied=[], active_virtual=[1], frozen_virtual=[]),\n", " 'qubit_mapping': 'jw',\n", - " 'ansatz': ,\n", - " 'optimizer': >,\n", - " 'initial_var_params': [2e-05, 0.036324160602554285],\n", + " 'ansatz': ,\n", + " 'optimizer': >,\n", + " 'initial_var_params': [2e-05, 0.03632416060255425],\n", " 'backend_options': {'target': None, 'n_shots': None, 'noise_model': None},\n", " 'penalty_terms': None,\n", + " 'deflation_circuits': [],\n", + " 'deflation_coeff': 1,\n", " 'ansatz_options': {},\n", " 'up_then_down': False,\n", - " 'qubit_hamiltonian': (-0.09883484730799698+0j) [] +\n", - " (-0.045321883918106314+0j) [X0 X1 Y2 Y3] +\n", - " (0.045321883918106314+0j) [X0 Y1 Y2 X3] +\n", - " (0.045321883918106314+0j) [Y0 X1 X2 Y3] +\n", - " (-0.045321883918106314+0j) [Y0 Y1 X2 X3] +\n", - " (0.1712012380659591+0j) [Z0] +\n", - " (0.16862327595071594+0j) [Z0 Z1] +\n", - " (0.12054612740556855+0j) [Z0 Z2] +\n", - " (0.16586801132367487+0j) [Z0 Z3] +\n", - " (0.17120123806595905+0j) [Z1] +\n", - " (0.16586801132367487+0j) [Z1 Z2] +\n", - " (0.12054612740556855+0j) [Z1 Z3] +\n", - " (-0.22279639651093158+0j) [Z2] +\n", - " (0.1743494875700707+0j) [Z2 Z3] +\n", - " (-0.22279639651093153+0j) [Z3],\n", + " 'qubit_hamiltonian': (-0.09883484730799569+0j) [] +\n", + " (-0.045321883918106265+0j) [X0 X1 Y2 Y3] +\n", + " (0.045321883918106265+0j) [X0 Y1 Y2 X3] +\n", + " (0.045321883918106265+0j) [Y0 X1 X2 Y3] +\n", + " (-0.045321883918106265+0j) [Y0 Y1 X2 X3] +\n", + " (0.17120123806595938+0j) [Z0] +\n", + " (0.16862327595071586+0j) [Z0 Z1] +\n", + " (0.12054612740556847+0j) [Z0 Z2] +\n", + " (0.16586801132367474+0j) [Z0 Z3] +\n", + " (0.1712012380659594+0j) [Z1] +\n", + " (0.16586801132367474+0j) [Z1 Z2] +\n", + " (0.12054612740556847+0j) [Z1 Z3] +\n", + " (-0.22279639651093203+0j) [Z2] +\n", + " (0.17434948757007068+0j) [Z2 Z3] +\n", + " (-0.22279639651093203+0j) [Z3],\n", " 'verbose': False,\n", + " 'ref_state': None,\n", + " 'reference_circuit': ,\n", + " 'default_backend_options': {'target': None,\n", + " 'n_shots': None,\n", + " 'noise_model': None},\n", " 'optimal_energy': None,\n", " 'optimal_var_params': None,\n", " 'builtin_ansatze': {,\n", + " ,\n", + " ,\n", + " ,\n", " ,\n", " ,\n", + " ,\n", " ,\n", - " },\n", - " 'backend': }" + " ,\n", + " },\n", + " 'backend': }" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -241,175 +279,175 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Variational parameters: [2e-05, 0.036324160602554285]\n", + "Variational parameters: [2e-05, 0.03632416060255425]\n", "\n", "Circuit object. Size 158 \n", "\n", - "X target : 0 \n", - "X target : 1 \n", - "RX target : 0 parameter : 1.5707963267948966\n", - "H target : 2 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 2 parameter : 2e-05\t (variational)\n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "H target : 2 \n", - "RX target : 0 parameter : 10.995574287564276\n", - "H target : 0 \n", - "RX target : 2 parameter : 1.5707963267948966\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 2 parameter : 12.566350614359173\t (variational)\n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 2 parameter : 10.995574287564276\n", - "H target : 0 \n", - "RX target : 1 parameter : 1.5707963267948966\n", - "H target : 3 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 2e-05\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "H target : 3 \n", - "RX target : 1 parameter : 10.995574287564276\n", - "H target : 1 \n", - "RX target : 3 parameter : 1.5707963267948966\n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 12.566350614359173\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "RX target : 3 parameter : 10.995574287564276\n", - "H target : 1 \n", - "RX target : 0 parameter : 1.5707963267948966\n", - "RX target : 1 parameter : 1.5707963267948966\n", - "RX target : 2 parameter : 1.5707963267948966\n", - "H target : 3 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 0.018162080301277143\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "H target : 3 \n", - "RX target : 2 parameter : 10.995574287564276\n", - "RX target : 1 parameter : 10.995574287564276\n", - "RX target : 0 parameter : 10.995574287564276\n", - "RX target : 0 parameter : 1.5707963267948966\n", - "H target : 1 \n", - "RX target : 2 parameter : 1.5707963267948966\n", - "RX target : 3 parameter : 1.5707963267948966\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 12.548208534057895\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 3 parameter : 10.995574287564276\n", - "RX target : 2 parameter : 10.995574287564276\n", - "H target : 1 \n", - "RX target : 0 parameter : 10.995574287564276\n", - "H target : 0 \n", - "H target : 1 \n", - "RX target : 2 parameter : 1.5707963267948966\n", - "H target : 3 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 12.548208534057895\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "H target : 3 \n", - "RX target : 2 parameter : 10.995574287564276\n", - "H target : 1 \n", - "H target : 0 \n", - "H target : 0 \n", - "RX target : 1 parameter : 1.5707963267948966\n", - "RX target : 2 parameter : 1.5707963267948966\n", - "RX target : 3 parameter : 1.5707963267948966\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 12.548208534057895\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 3 parameter : 10.995574287564276\n", - "RX target : 2 parameter : 10.995574287564276\n", - "RX target : 1 parameter : 10.995574287564276\n", - "H target : 0 \n", - "RX target : 0 parameter : 1.5707963267948966\n", - "H target : 1 \n", - "H target : 2 \n", - "H target : 3 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 0.018162080301277143\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "H target : 3 \n", - "H target : 2 \n", - "H target : 1 \n", - "RX target : 0 parameter : 10.995574287564276\n", - "RX target : 0 parameter : 1.5707963267948966\n", - "RX target : 1 parameter : 1.5707963267948966\n", - "H target : 2 \n", - "RX target : 3 parameter : 1.5707963267948966\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 0.018162080301277143\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 3 parameter : 10.995574287564276\n", - "H target : 2 \n", - "RX target : 1 parameter : 10.995574287564276\n", - "RX target : 0 parameter : 10.995574287564276\n", - "H target : 0 \n", - "RX target : 1 parameter : 1.5707963267948966\n", - "H target : 2 \n", - "H target : 3 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 0.018162080301277143\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "H target : 3 \n", - "H target : 2 \n", - "RX target : 1 parameter : 10.995574287564276\n", - "H target : 0 \n", - "H target : 0 \n", - "H target : 1 \n", - "H target : 2 \n", - "RX target : 3 parameter : 1.5707963267948966\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 3 control : 2 \n", - "RZ target : 3 parameter : 12.548208534057895\t (variational)\n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 3 parameter : 10.995574287564276\n", - "H target : 2 \n", - "H target : 1 \n", - "H target : 0 \n", + "X target : [0] \n", + "X target : [1] \n", + "RX target : [0] parameter : 1.5707963267948966\n", + "H target : [2] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [2] parameter : 2e-05\t (variational)\n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "H target : [2] \n", + "RX target : [0] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "RX target : [2] parameter : 1.5707963267948966\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [2] parameter : 12.566350614359173\t (variational)\n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [2] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "RX target : [1] parameter : 1.5707963267948966\n", + "H target : [3] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 2e-05\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "H target : [3] \n", + "RX target : [1] parameter : -1.5707963267948966\n", + "H target : [1] \n", + "RX target : [3] parameter : 1.5707963267948966\n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 12.566350614359173\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "RX target : [3] parameter : -1.5707963267948966\n", + "H target : [1] \n", + "RX target : [0] parameter : 1.5707963267948966\n", + "RX target : [1] parameter : 1.5707963267948966\n", + "RX target : [2] parameter : 1.5707963267948966\n", + "H target : [3] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 0.018162080301277125\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "H target : [3] \n", + "RX target : [2] parameter : -1.5707963267948966\n", + "RX target : [1] parameter : -1.5707963267948966\n", + "RX target : [0] parameter : -1.5707963267948966\n", + "RX target : [0] parameter : 1.5707963267948966\n", + "H target : [1] \n", + "RX target : [2] parameter : 1.5707963267948966\n", + "RX target : [3] parameter : 1.5707963267948966\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 12.548208534057895\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [3] parameter : -1.5707963267948966\n", + "RX target : [2] parameter : -1.5707963267948966\n", + "H target : [1] \n", + "RX target : [0] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "H target : [1] \n", + "RX target : [2] parameter : 1.5707963267948966\n", + "H target : [3] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 12.548208534057895\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "H target : [3] \n", + "RX target : [2] parameter : -1.5707963267948966\n", + "H target : [1] \n", + "H target : [0] \n", + "H target : [0] \n", + "RX target : [1] parameter : 1.5707963267948966\n", + "RX target : [2] parameter : 1.5707963267948966\n", + "RX target : [3] parameter : 1.5707963267948966\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 12.548208534057895\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [3] parameter : -1.5707963267948966\n", + "RX target : [2] parameter : -1.5707963267948966\n", + "RX target : [1] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "RX target : [0] parameter : 1.5707963267948966\n", + "H target : [1] \n", + "H target : [2] \n", + "H target : [3] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 0.018162080301277125\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "H target : [3] \n", + "H target : [2] \n", + "H target : [1] \n", + "RX target : [0] parameter : -1.5707963267948966\n", + "RX target : [0] parameter : 1.5707963267948966\n", + "RX target : [1] parameter : 1.5707963267948966\n", + "H target : [2] \n", + "RX target : [3] parameter : 1.5707963267948966\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 0.018162080301277125\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [3] parameter : -1.5707963267948966\n", + "H target : [2] \n", + "RX target : [1] parameter : -1.5707963267948966\n", + "RX target : [0] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "RX target : [1] parameter : 1.5707963267948966\n", + "H target : [2] \n", + "H target : [3] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 0.018162080301277125\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "H target : [3] \n", + "H target : [2] \n", + "RX target : [1] parameter : -1.5707963267948966\n", + "H target : [0] \n", + "H target : [0] \n", + "H target : [1] \n", + "H target : [2] \n", + "RX target : [3] parameter : 1.5707963267948966\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [3] control : [2] \n", + "RZ target : [3] parameter : 12.548208534057895\t (variational)\n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [3] parameter : -1.5707963267948966\n", + "H target : [2] \n", + "H target : [1] \n", + "H target : [0] \n", "\n" ] } @@ -441,21 +479,16 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1372704157729\n", - " Iterations: 3\n", - " Function evaluations: 13\n", - " Gradient evaluations: 3\n", "\n", - "Optimal energy: \t -1.1372704157729\n", - "Optimal parameters: \t [-5.44125522e-05 5.65221900e-02]\n" + "Optimal energy: \t -1.1372704157729143\n", + "Optimal parameters: \t [-5.4412497e-05 5.6522190e-02]\n" ] } ], @@ -476,16 +509,16 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "FCI energy: \t -1.1372704220924401\n", - "CCSD energy: \t -1.1372704220946788\n", - "VQE energy: \t -1.1372704157729\n" + "FCI energy: \t -1.1372704220924397\n", + "CCSD energy: \t -1.1372704220914702\n", + "VQE energy: \t -1.1372704157729143\n" ] } ], @@ -520,7 +553,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -528,9 +561,8 @@ "output_type": "stream", "text": [ "-0.3369215 (params = [1. 1.])\n", - "converged SCF energy = -1.11668563039948\n", - "-1.1346304 (params = [2e-05, 0.036324160602554285])\n", - "-1.1372704 (params = [-5.44125522e-05 5.65221900e-02])\n" + "-1.1346304 (params = [2e-05, 0.03632416060255425])\n", + "-1.1372704 (params = [-5.4412497e-05 5.6522190e-02])\n" ] } ], @@ -566,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -595,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -627,7 +659,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -639,21 +671,15 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "converged SCF energy = -1.78948325185599\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.8943598012230212\n", - " Iterations: 4\n", - " Function evaluations: 16\n", - " Gradient evaluations: 4\n", - "VQE energy: \t -1.8943598012230212\n", - "CCSD energy: \t -1.8943602376644733\n", + "VQE energy: \t -1.8943598012228877\n", + "CCSD energy: \t -1.894360237665742\n", "\n", " {'qubit_hamiltonian_terms': 15, 'circuit_width': 4, 'circuit_gates': 158, 'circuit_2qubit_gates': 64, 'circuit_var_gates': 12, 'vqe_variational_parameters': 2}\n" ] @@ -683,20 +709,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "converged SCF energy = -1.78948325185599\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.9778373031817014\n", - " Iterations: 9\n", - " Function evaluations: 154\n", - " Gradient evaluations: 9\n", - "VQE energy: \t -1.9778373031817014\n", + "VQE energy: \t -1.9778372805046642\n", "\n", " {'qubit_hamiltonian_terms': 185, 'circuit_width': 8, 'circuit_gates': 2692, 'circuit_2qubit_gates': 1312, 'circuit_var_gates': 160, 'vqe_variational_parameters': 14}\n" ] @@ -731,39 +751,21 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "converged SCF energy = -1.11668563039948\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1372704157729\n", - " Iterations: 3\n", - " Function evaluations: 13\n", - " Gradient evaluations: 3\n", "\n", " {'qubit_hamiltonian_terms': 15, 'circuit_width': 4, 'circuit_gates': 158, 'circuit_2qubit_gates': 64, 'circuit_var_gates': 12, 'vqe_variational_parameters': 2} \n", "\n", - "converged SCF energy = -1.11668563039948\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1372704143406926\n", - " Iterations: 3\n", - " Function evaluations: 13\n", - " Gradient evaluations: 3\n", "\n", " {'qubit_hamiltonian_terms': 15, 'circuit_width': 4, 'circuit_gates': 107, 'circuit_2qubit_gates': 46, 'circuit_var_gates': 12, 'vqe_variational_parameters': 2} \n", "\n", - "converged SCF energy = -1.11668563039948\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1372702304939277\n", - " Iterations: 5\n", - " Function evaluations: 23\n", - " Gradient evaluations: 5\n", "\n", - " {'qubit_hamiltonian_terms': 5, 'circuit_width': 2, 'circuit_gates': 20, 'circuit_2qubit_gates': 4, 'circuit_var_gates': 4, 'vqe_variational_parameters': 2} \n", + " {'qubit_hamiltonian_terms': 5, 'circuit_width': 2, 'circuit_gates': 22, 'circuit_2qubit_gates': 4, 'circuit_var_gates': 4, 'vqe_variational_parameters': 2} \n", "\n" ] }, @@ -771,7 +773,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/media/sf_QEMIST_Tangelo/tangelo/tangelo/toolboxes/qubit_mappings/statevector_mapping.py:53: RuntimeWarning: Symmetry-conserving Bravyi-Kitaev enforces all spin-up followed by all spin-down ordering.\n", + "/home/alex/Codes/Tangelo/tangelo/toolboxes/qubit_mappings/statevector_mapping.py:149: RuntimeWarning: Symmetry-conserving Bravyi-Kitaev enforces all spin-up followed by all spin-down ordering.\n", " warnings.warn(\"Symmetry-conserving Bravyi-Kitaev enforces all spin-up followed by all spin-down ordering.\", RuntimeWarning)\n" ] } @@ -799,26 +801,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.137270337835849\n", - " Iterations: 3\n", - " Function evaluations: 9\n", - " Gradient evaluations: 3\n", "\n", " {'qubit_hamiltonian_terms': 15, 'circuit_width': 4, 'circuit_gates': 17, 'circuit_2qubit_gates': 6, 'circuit_var_gates': 1, 'vqe_variational_parameters': 1} \n", "\n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.13727033783102\n", - " Iterations: 3\n", - " Function evaluations: 15\n", - " Gradient evaluations: 3\n", "\n", " {'qubit_hamiltonian_terms': 15, 'circuit_width': 4, 'circuit_gates': 23, 'circuit_2qubit_gates': 8, 'circuit_var_gates': 3, 'vqe_variational_parameters': 3} \n", "\n" @@ -851,16 +843,21 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\tOptimal UCCSD energy: -1.1372703637657735\n", - "\tOptimal UCCSD variational parameters: [1.57091875 2.4126589 ]\n", - "\tNumber of Function Evaluations : 39\n" + "\tOptimal UCCSD energy: -1.1372704174429256\n", + " Normal return from subroutine COBYLA\n", + "\n", + " NFVALS = 36 F =-1.137270E+00 MAXCV = 0.000000E+00\n", + " X = 1.570763E+00 2.412707E+00\n", + "\n", + "\tOptimal UCCSD variational parameters: [1.57076299 2.41270658]\n", + "\tNumber of Function Evaluations : 36\n" ] } ], @@ -898,37 +895,19 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "converged SCF energy = -1.11668563039948\n", - "\tEnergy = -1.1346304 \n", - "\tEnergy = -1.1346304 \n", - "\tEnergy = -1.1346304 \n", - "\tEnergy = -1.1346330 \n", - "\tEnergy = -0.7901071 \n", - "\tEnergy = -1.1370452 \n", - "\tEnergy = -1.1370452 \n", - "\tEnergy = -1.1370452 \n", - "\tEnergy = -1.1370444 \n", - "\tEnergy = -1.1372704 \n", - "\tEnergy = -1.1372704 \n", - "\tEnergy = -1.1372704 \n", - "\tEnergy = -1.1372704 \n", - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1372704157729283\n", - " Iterations: 3\n", - " Function evaluations: 13\n", - " Gradient evaluations: 3\n", - "\t\tOptimal VQE energy: None\n", - "\t\tOptimal VQE variational parameters: None\n", - "\t\tNumber of Function Evaluations : 13\n" + "VQESolver optimization results:\n", + "\tOptimal VQE energy: -1.1372704157729134\n", + "\tOptimal VQE variational parameters: [-5.44125627e-05 5.65221900e-02]\n", + "\tNumber of Iterations : 3\n", + "\tNumber of Function Evaluations : 10\n", + "\tNumber of Gradient Evaluations : 3\n" ] } ], @@ -960,17 +939,16 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "converged SCF energy = -1.11668563039948\n", - "Energy estimation with 1.0E+02 shots = -1.1562184233964925 \t(Error: 1.89E-02)\n", - "Energy estimation with 1.0E+04 shots = -1.1363766310347638 \t(Error: 8.94E-04)\n", - "Energy estimation with 1.0E+06 shots = -1.1374247256596115 \t(Error: 1.54E-04)\n" + "Energy estimation with 1.0E+02 shots = -1.1335574814374392 \t(Error: 3.71E-03)\n", + "Energy estimation with 1.0E+04 shots = -1.1358696314459025 \t(Error: 1.40E-03)\n", + "Energy estimation with 1.0E+06 shots = -1.1372051734252862 \t(Error: 6.52E-05)\n" ] } ], @@ -1003,9 +981,9 @@ ], "metadata": { "kernelspec": { - "display_name": "tangelo_docs_aesthetics", + "display_name": "qsdk", "language": "python", - "name": "tangelo_docs_aesthetics" + "name": "qsdk" }, "language_info": { "codemirror_mode": { @@ -1017,7 +995,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.9.9" } }, "nbformat": 4, diff --git a/examples/vqe_custom_ansatz_hamiltonian.ipynb b/examples/vqe_custom_ansatz_hamiltonian.ipynb index b9679ab8b..0b61352c1 100755 --- a/examples/vqe_custom_ansatz_hamiltonian.ipynb +++ b/examples/vqe_custom_ansatz_hamiltonian.ipynb @@ -6,7 +6,9 @@ "source": [ "# Tangelo VQE: Custom Ansatz and qubit Hamiltonian Tutorial\n", "\n", - "The `Tangelo` comes packaged with an implementation of several standard ansatz circuits for the user to take advantage of. In this tutorial, we'll explore how you can incorporate the built in `VQESolver` into your own workflow, by introducing a user-defined custom ansatz circuit and/or a qubit Hamiltonian. We'll base our work here on the `VQESolver` class, and take advantage of tools readily available through the `Tangelo`." + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/vqe_custom_ansatz_hamiltonian.ipynb)\n", + "\n", + "Tangelo comes packaged with an implementation of several standard ansatz circuits for the user to take advantage of. In this tutorial, we'll explore how you can incorporate the built in `VQESolver` into your own workflow, by introducing a user-defined custom ansatz circuit and/or a qubit Hamiltonian. We'll base our work here on the `VQESolver` class, and take advantage of tools readily available through Tangelo." ] }, { @@ -14,6 +16,19 @@ "execution_count": 1, "metadata": {}, "outputs": [], + "source": [ + "# Installation of tangelo if not already installed.\n", + "try:\n", + " import tangelo\n", + "except ModuleNotFoundError:\n", + " !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import numpy as np\n", "\n", @@ -286,29 +301,18 @@ "execution_count": 10, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.137233584498153\n", - " Iterations: 45\n", - " Function evaluations: 2791\n", - " Gradient evaluations: 45\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - ":25: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/tmp/ipykernel_46116/549362070.py:25: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " elif var_params == \"ones\":\n" ] }, { "data": { "text/plain": [ - "-1.137233584498153" + "-1.1372335845006827" ] }, "execution_count": 10, @@ -359,21 +363,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "(-0.09883484730799698+0j) [] +\n", - "(-0.045321883918106314+0j) [X0 X1 Y2 Y3] +\n", - "(0.045321883918106314+0j) [X0 Y1 Y2 X3] +\n", - "(0.045321883918106314+0j) [Y0 X1 X2 Y3] +\n", - "(-0.045321883918106314+0j) [Y0 Y1 X2 X3] +\n", - "(0.1712012380659591+0j) [Z0] +\n", - "(0.16862327595071594+0j) [Z0 Z1] +\n", - "(0.12054612740556855+0j) [Z0 Z2] +\n", - "(0.16586801132367487+0j) [Z0 Z3] +\n", - "(0.17120123806595905+0j) [Z1] +\n", - "(0.16586801132367487+0j) [Z1 Z2] +\n", - "(0.12054612740556855+0j) [Z1 Z3] +\n", - "(-0.22279639651093158+0j) [Z2] +\n", - "(0.1743494875700707+0j) [Z2 Z3] +\n", - "(-0.22279639651093153+0j) [Z3]\n" + "(-0.09883484730799569+0j) [] +\n", + "(-0.045321883918106265+0j) [X0 X1 Y2 Y3] +\n", + "(0.045321883918106265+0j) [X0 Y1 Y2 X3] +\n", + "(0.045321883918106265+0j) [Y0 X1 X2 Y3] +\n", + "(-0.045321883918106265+0j) [Y0 Y1 X2 X3] +\n", + "(0.17120123806595938+0j) [Z0] +\n", + "(0.16862327595071586+0j) [Z0 Z1] +\n", + "(0.12054612740556847+0j) [Z0 Z2] +\n", + "(0.16586801132367474+0j) [Z0 Z3] +\n", + "(0.1712012380659594+0j) [Z1] +\n", + "(0.16586801132367474+0j) [Z1 Z2] +\n", + "(0.12054612740556847+0j) [Z1 Z3] +\n", + "(-0.22279639651093203+0j) [Z2] +\n", + "(0.17434948757007068+0j) [Z2 Z3] +\n", + "(-0.22279639651093203+0j) [Z3]\n" ] } ], @@ -397,29 +401,18 @@ "execution_count": 12, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.137233584498153\n", - " Iterations: 45\n", - " Function evaluations: 2791\n", - " Gradient evaluations: 45\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - ":25: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/tmp/ipykernel_46116/549362070.py:25: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " elif var_params == \"ones\":\n" ] }, { "data": { "text/plain": [ - "-1.137233584498153" + "-1.1372335845006827" ] }, "execution_count": 12, @@ -489,80 +482,80 @@ "text": [ "Circuit object. Size 74 \n", "\n", - "X target : 0 \n", - "X target : 1 \n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RX target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RX target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RX target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "RX target : 3 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RX target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RX target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RX target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "RX target : 3 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RX target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RX target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RX target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "RX target : 3 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RX target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RX target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RX target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "RX target : 3 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 3 control : 2 \n", - "CNOT target : 2 control : 1 \n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RX target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 0 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RX target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 1 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RX target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 2 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", - "RX target : 3 parameter : 0.0\t (variational)\n", - "RZ target : 3 parameter : 0.0\t (variational)\n", + "X target : [0] \n", + "X target : [1] \n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RX target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RX target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RX target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "RX target : [3] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RX target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RX target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RX target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "RX target : [3] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RX target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RX target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RX target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "RX target : [3] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RX target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RX target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RX target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "RX target : [3] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [3] control : [2] \n", + "CNOT target : [2] control : [1] \n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RX target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [0] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RX target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [1] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RX target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [2] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", + "RX target : [3] parameter : 0.0\t (variational)\n", + "RZ target : [3] parameter : 0.0\t (variational)\n", "\n" ] } @@ -584,21 +577,10 @@ "execution_count": 15, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization terminated successfully. (Exit mode 0)\n", - " Current function value: -1.1371714690876744\n", - " Iterations: 49\n", - " Function evaluations: 3039\n", - " Gradient evaluations: 49\n" - ] - }, { "data": { "text/plain": [ - "-1.1371714690876744" + "-1.1370682042984708" ] }, "execution_count": 15, @@ -630,7 +612,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "HEA-VQE ENERGY (from a circuit): -1.1371715 Ha\n" + "HEA-VQE ENERGY (from a circuit): -1.1370682 Ha\n" ] } ], @@ -651,9 +633,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Tangelo", + "display_name": "qsdk", "language": "python", - "name": "tangelo" + "name": "qsdk" }, "language_info": { "codemirror_mode": { @@ -665,7 +647,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.9.9" } }, "nbformat": 4, From 4de7b97cde37c437ce6c4019d7a6c2b97cb68ef0 Mon Sep 17 00:00:00 2001 From: Valentin Senicourt <41597680+ValentinS4t1qbit@users.noreply.github.com> Date: Mon, 22 Aug 2022 10:33:33 -0700 Subject: [PATCH 10/12] Docker fix (#200) * Dockerfile and docs updated. A few fixes to linq notebook, which was a bit too old/familiar. --- Dockerfile | 38 +++--- README.rst | 5 + examples/linq/1.the_basics.ipynb | 211 +++++++++++++++---------------- 3 files changed, 124 insertions(+), 130 deletions(-) diff --git a/Dockerfile b/Dockerfile index f615cadaf..c984d77f9 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,17 @@ FROM fedora:30 +# Fundamentals +# ============ RUN dnf -y update RUN dnf -y install wget libgomp openblas-devel pandoc RUN dnf clean all # Python, C/C++ compilers, git +# ============================ RUN dnf -y install gcc redhat-rpm-config gcc-c++ python3-devel make cmake git # Set up a virtual environment, set all calls to pip3 and python3 to use it +# ========================================================================= RUN pip3 install virtualenv ENV VIRTUAL_ENV=/root/env RUN virtualenv -p python3 $VIRTUAL_ENV @@ -17,26 +21,22 @@ RUN more /root/.bashrc RUN echo "export PATH=$PATH" >> /root/.bashrc # Python packages for documentation, Jupyter notebook support and visualization +# ============================================================================= RUN pip3 install --upgrade pip -RUN pip3 install h5py==2.9.0 ipython jupyter setuptools wheel sphinx py3Dmol sphinx_rtd_theme nbsphinx scikit-build - -# Copy and set root directory, -ENV PYTHONPATH=/root/tangelo:$PYTHONPATH -WORKDIR /root/ -COPY . /root +RUN pip3 install ipython jupyter setuptools wheel sphinx py3Dmol sphinx_rtd_theme nbsphinx scikit-build # Install Tangelo and its immediate dependencies (pyscf, openfermion, ...) -RUN python3 /root/setup.py install +# ======================================================================== -# Install Microsoft QDK qsharp package -WORKDIR /tmp/ -RUN dnf clean all -RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc -RUN wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/30/prod.repo -RUN dnf install -y dotnet-sdk-3.1 -RUN dotnet tool install -g Microsoft.Quantum.IQSharp -RUN /root/.dotnet/tools/dotnet-iqsharp install --user -RUN pip3 install qsharp - -# Install other simulators -RUN pip install amazon-braket-sdk qiskit qulacs projectq +# > Option 1: install from pypi +RUN pip3 install tangelo-gc + +# > Option 2: install from locally mounted Tangelo, in the docker container +# ENV PYTHONPATH=/root/tangelo:$PYTHONPATH +# WORKDIR /root/ +# COPY . /root +# RUN python3 -m pip install . + +# OPTIONAL: common dependencies (quantum circuit simulator and quantum cloud services) +# ==================================================================================== + RUN pip3 install cirq amazon-braket-sdk qiskit qulacs projectq diff --git a/README.rst b/README.rst index eb043228b..729fd968e 100644 --- a/README.rst +++ b/README.rst @@ -87,6 +87,11 @@ Type the following command in the root directory: If the installation of a dependency fails and the reason is not obvious, we suggest installing that dependency separately with ``pip``\ , before trying again. +With Docker +^^^^^^^^^^^ + +Use our Docker file to deploy Tangelo in a Linux environment, either retrieved from pip or mounted locally. +Comment / uncomment the relevant sections of the Dockerfile to control installation and dependencies. "No install" notebook method ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/linq/1.the_basics.ipynb b/examples/linq/1.the_basics.ipynb index f8c10d381..b6c0457e6 100755 --- a/examples/linq/1.the_basics.ipynb +++ b/examples/linq/1.the_basics.ipynb @@ -18,9 +18,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`linq` is a submodule of `tangelo` that helps you connect to and leverage the features of various backends, may they be simulators or QPUs. This notebook talks about the abstract format used in this python package to represent a quantum circuit, and how we can then translate it to other formats or objects used in popular packages such as Qiskit, ProjectQ, Qulacs (...) and leverage the different features and performance they offer.\n", + "`linq` is a submodule of `tangelo` that helps you connect to and leverage the features of various backends, may they be simulators or QPUs. This notebook talks about the abstract format used in Tangelo to represent a quantum circuit, and how we can then convert it to other formats or objects used in popular packages such as Braket, Qulacs, Qiskit, Cirq (...) and leverage the different features and performance these platforms offer.\n", "\n", - "This functionality is pretty useful because it means that you can derive a given quantum circuit for any supported compute backend available with minimal effort, whether it is a simulator or an actual QPU. You therefore do not need to rewrite your program to run on a different platform, or to share your code in a specific format that your collaborators or clients expect, for publication or running an actual hardware experiment. It also means that whatever new method or code you develop can now suddenly run on all the compute backends available, enabling researchers and product users to benefit from your contributions regardless of the compute platform they intend to use.\n", + "Write code once, run it on various platforms with minimal effort: no need to rewrite everything in order to port your project to a different hardware, or generate what you need for a publication. It also means that whatever new method or code you develop can just run on all the compute backends available.\n", "\n", "## Table of contents\n", "* [1. Abstract gate class](#1)\n", @@ -41,14 +41,12 @@ "source": [ "## Requirements\n", "\n", - "In order to run the contents of this notebook, you need to have the `tangelo` package installed in your python environment. Some cells may require that a specific backend (such as `qiskit`, `qulacs`...) is installed to run.\n", - "\n", - "Please have a look at the installation instructions, if you need. Executing the cell below provides a quick way of installing the requirements of this notebook." + "In order to run the contents of this notebook, you need to have `tangelo` installed in your python environment. Some cells may require that a specific backend (such as `qiskit`, `qulacs`...) is installed to run. Please have a look at their installation instructions, if needed. Executing the cell below provides a quick way of installing the requirements of this notebook." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -66,11 +64,7 @@ "source": [ "## 1. Abstract gate class \n", "\n", - "The `linq` submodule is not here to provide yet another language to express a quantum circuit or to sell you an elaborate syntax to be used as a standard. Instead, it aims at providing users a straightforward and transparent way to represent a quantum gate operation, and by extension a quantum circuit.\n", - "\n", - "The idea is to decouple quantum circuit definition, optimization, as well as post-processing, from the actual compute backend and state preparation: users are no longer necessarily tied to a given platform for their research or experiments and can easily jump from one to another depending on their needs. Do you need a faster simulator, or to use specific noise models only supported by specific backends? No need to rewrite your whole code.\n", - "\n", - "The humble cornerstone of this package is the ability to represent a quantum gate operation acting on qubits as a simple python object. An abstract gate has:\n", + "The `linq` submodule aims at providing users a straightforward and transparent way to represent a quantum gate operation, and by extension a quantum circuit. It represents a quantum gate operation acting on qubits as a simple python object. An abstract gate has:\n", "\n", "- A name\n", "- target qubit(s) (only one qubit supported at the moment)\n", @@ -88,18 +82,18 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "H target : 2 \n", - "CNOT target : 1 control : 0 \n", - "RX target : 1 parameter : 2.0\n", - "RZ target : 1 parameter : an expression\t (variational)\n", - "POTATO target : 3 \n" + "H target : [2] \n", + "CNOT target : [1] control : [0] \n", + "RX target : [1] parameter : 2.0\n", + "RZ target : [1] parameter : an expression\t (variational)\n", + "POTATO target : [3] \n" ] } ], @@ -125,9 +119,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "What's that, you don't even know about the POTATO gate?! Oof. Your imposter syndrom must be in full swing right now. It's ok. No one has noticed yet. Smile. Take another sip of that coffee. Keep reading.\n", + "What's that, you don't know about the POTATO gate?! Oof. Your imposter syndrom must be in full swing right now. It's ok. No one has noticed yet. Smile. Take another sip of that coffee. Keep reading.\n", "\n", - "This abstract gate data-structure simply stores information, and does not need to fully specify a valid gate operation that corresponds to, let's say, a very well-defined matrix representation of the operator. As you can see, the parameter for our `Rz` gate can be anything, and the actual existence of the POTATO gate is questionable. The gate set supported, the conventions on phases and parameters, are all backend-dependent. Therefore, the fields of your abstract gate only really need to make sense later on, once you have picked a target backend (Qiskit, qulacs...).\n", + "This abstract gate data structure simply stores information, and does not need to fully specify a valid gate operation that corresponds to, let's say, a very well-defined matrix representation of the operator. As you can see, the parameter for our `Rz` gate can be anything, and the actual existence of the POTATO gate is questionable. The gate set supported, the conventions on phases and parameters, are all backend-dependent. Therefore, the fields of your abstract gate only really need to make sense later on, once you have picked a target backend (qiskit, qulacs...).\n", "\n", "**Note**: The controlled gates, such as CNOT, expect that you first pass the target qubits and then the control ones, which may be counter-intuitive and trip you up." ] @@ -138,9 +132,9 @@ "source": [ "## 2. Abstract circuit class \n", "\n", - "An abstract circuit can be simply seen as a list of abstract gates. This class has a few methods to help users know at a glance how many gates or qubits are in a quantum circuit, or if it contains gates tagged as variational for example. In the future, other methods to compute the depth of the circuit, unentangled registers or qubits that do not actually need to be simulated could be added, for example.\n", + "An abstract circuit can be simply seen as a list of abstract gates. This class has a few methods to help users know at a glance how many gates or qubits are in a quantum circuit, or if it contains gates tagged as variational for example. Other convenience methods to compute the depth of the circuit, identify unentangled registers or qubits that can be simulated separately, etc, are available.\n", "\n", - "Users can instantiate abstract circuits by directly passing a list of gates, or using the `add_gate` method on an existing abstract circuit object. It is also possible to concatenate abstract circuits using the $+$ operator: useful to build more complex circuits using simpler ones as building-blocks.\n", + "Users can instantiate abstract circuits by directly passing a list of gates, or using the `add_gate` method on an existing abstract circuit object. It is also possible to concatenate abstract circuits in a pythonic way using the $+$ or $*$ operators: useful to build more complex circuits using simpler ones as building blocks. Circuits are iterable objects, which means that you can traverse them in order to traverse the underlying list of gates they're made of.\n", "\n", "**Note**: It is more efficient to build circuits by using list comprehension and other python syntaxes to efficiently build a list of `Gate` objects, and then passing it to the `Circuit` class; rather than use `add_gate` or concatenate a lot of small `Circuit` objects with `+`.\n", "\n", @@ -151,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -160,12 +154,12 @@ "text": [ "Circuit object. Size 6 \n", "\n", - "H target : 2 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "Y target : 0 \n", - "RX target : 1 parameter : 2.0\n", - "RZ target : 4 parameter : some angle\t (variational)\n", + "H target : [2] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "Y target : [0] \n", + "RX target : [1] parameter : 2.0\n", + "RZ target : [4] parameter : some angle\t (variational)\n", "\n", "The number of gates contained in circuit3 is 6\n", "The number of qubits in circuit3 is 5\n", @@ -174,12 +168,12 @@ "\n", "Circuit object. Size 6 \n", "\n", - "H target : 2 \n", - "CNOT target : 1 control : 0 \n", - "CNOT target : 2 control : 1 \n", - "Y target : 0 \n", - "RX target : 1 parameter : 2.0\n", - "RZ target : 4 parameter : 777.0\t (variational)\n", + "H target : [2] \n", + "CNOT target : [1] control : [0] \n", + "CNOT target : [2] control : [1] \n", + "Y target : [0] \n", + "RX target : [1] parameter : 2.0\n", + "RZ target : [4] parameter : 777.0\t (variational)\n", "\n" ] } @@ -240,18 +234,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This package provides helper functions allowing users to put together more general circuits easily, without the need to reinvent the wheel when it comes to common patterns. In the future, users could contribute functions generating useful for benchmarking reasons, building-blocks to form larger circuits, or well-known quantum circuits such as the QFT, for instance. These could be contributed as helper functions, or available in a separate folder aiming to gather a collection a circuits for different purposes. If you need to do something that seems fairly common, take a quick look around: you may have all the pieces already (or have the opportunity to design and contribute the pieces you need !).\n", + "This package provides helper functions allowing users to put together more general circuits easily, without the need to reinvent the wheel when it comes to common patterns. In the future, users could contribute functions generating useful for benchmarking reasons, building blocks to form larger circuits, or well-known quantum circuits such as the QFT, for instance. These could be contributed as helper functions, or available in a separate folder aiming to gather a collection a circuits for different purposes. If you need to do something that seems fairly common, take a quick look around: you may have all the pieces already (or have the opportunity to design and contribute the pieces you need!).\n", "\n", "**Note:** Most functions do not yield a `Circuit` object, but a list of gates (see the convention used at the end of the function name). For performance reasons, it is better to concatenate a list of gates and then turn it into a Circuit, than to turn smaller lists of gates into `Circuit` objects and then use the `+` operator to concatenate them. This will not be an issue unless you are for example running an algorithm that requires a circuit to be rebuilt frequently and requiring many `Circuit` objects to be concatenated.\n", "\n", - "Below, an example of how we can design a function to easily produce `Circuit` objects implementing a parameter sweep, working for any pauli measurement basis, which has been one of our most common hardware experiment so far in order to understand the capability of a quantum device. No need to write many different circuits explicitly when you can generate many variations of the same base circuit with a function and some simple loops over the range of interesting parameters !\n", + "Below, an example of how we can design a function to easily produce `Circuit` objects implementing a parameter sweep, working for any pauli measurement basis, which is not uncommon in hardware experiments: just a combination of loops and helper functions.\n", "\n", "The measurement basis is assumed to be passed as a list of 2-tuples of the form `(i, K)` where `i` is an integer denoting the qubit index and `K` a letter (string) that can take the value 'I', 'X', 'Y', or 'Z'; which also happens to be the format encountered while traversing a `QubitOperator` object in `Openfermion`." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -260,25 +254,25 @@ "text": [ "Circuit object. Size 3 \n", "\n", - "CNOT target : 0 control : 1 \n", - "RX target : 1 parameter : 0.1\n", - "CNOT target : 0 control : 1 \n", + "CNOT target : [0] control : [1] \n", + "RX target : [1] parameter : 0.1\n", + "CNOT target : [0] control : [1] \n", "\n", "\n", "Circuit object. Size 3 \n", "\n", - "CNOT target : 0 control : 1 \n", - "RX target : 1 parameter : 0.2\n", - "CNOT target : 0 control : 1 \n", + "CNOT target : [0] control : [1] \n", + "RX target : [1] parameter : 0.2\n", + "CNOT target : [0] control : [1] \n", "\n", "\n", "Circuit object. Size 5 \n", "\n", - "CNOT target : 0 control : 1 \n", - "RX target : 1 parameter : 0.3\n", - "CNOT target : 0 control : 1 \n", - "RY target : 0 parameter : -1.5707963267948966\n", - "RX target : 1 parameter : 1.5707963267948966\n", + "CNOT target : [0] control : [1] \n", + "RX target : [1] parameter : 0.3\n", + "CNOT target : [0] control : [1] \n", + "RY target : [0] parameter : -1.5707963267948966\n", + "RX target : [1] parameter : 1.5707963267948966\n", "\n", "\n" ] @@ -307,30 +301,30 @@ "source": [ "## 3. Translator module \n", "\n", - "In order to make use of the various compute backends available, the `translator` module provides users with functions that can translate from, and sometimes to, the abstract circuit format. This is the corner stone of this approach: once the circuit has been translated, the user is free to use any of the methods and functionalities of the corresponding backend to analyze or simulate their circuit.\n", + "In order to make use of the various compute backends available, the `translator` module provides users with functions that can translate from, and sometimes to, the abstract circuit format. Users can therefore import or export their quantum circuits to work with their favorite framework.\n", "\n", - "The `translator` module defines how the content of your abstract gates should be parsed, what gates are supported, the convention used, and is subject to error-checking: the contents must make sense for the target backend, otherwise you will get errors ! At that point, your gates must be supported and their parameters correct.\n", + "The `translator` module defines how the content of your abstract gates should be parsed, what gates are supported, the convention used, and is subject to error-checking: the contents must make sense for the target backend, otherwise you will get errors. At that point, your gates must be supported and their parameters correct.\n", "\n", - "You can find in the translator module the dictionaries telling you what backends are supported, and what gates they currently support. As you can see, the exceptional `POTATO` gate is not yet supported by any available backend. You'd most certainly get an error if you tried to translate an abstract circuit containing such a gate into a given backend's format, unless a major breakthrough in toaster oven technology happens and we integrate this disruptive compute platform." + "You can find in the translator module the dictionaries telling you what backends are supported, and what gates they currently support. As you can see, the exceptional `POTATO` gate is not yet supported by any available backend. You'd most certainly get an error if you tried to translate an abstract circuit containing such a gate into a given backend's format, unless a major breakthrough in toaster-oven technology happens and we integrate this disruptive compute platform." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "projectq : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "ionq : ['CNOT', 'H', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "qdk : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "openqasm : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "qiskit : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "qulacs : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "braket : ['CNOT', 'H', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", - "cirq : ['CNOT', 'H', 'MEASURE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n" + "projectq : ['CNOT', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", + "ionq : ['CNOT', 'H', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'T', 'X', 'Y', 'Z']\n", + "qdk : ['CH', 'CNOT', 'CPHASE', 'CRX', 'CRY', 'CRZ', 'CS', 'CSWAP', 'CT', 'CX', 'CY', 'CZ', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'Y', 'Z']\n", + "openqasm : ['CNOT', 'CPHASE', 'CRZ', 'CSWAP', 'CY', 'CZ', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'Y', 'Z']\n", + "cirq : ['CH', 'CNOT', 'CPHASE', 'CRX', 'CRY', 'CRZ', 'CSWAP', 'CX', 'CY', 'CZ', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'XX', 'Y', 'Z']\n", + "qulacs : ['CH', 'CNOT', 'CPHASE', 'CRX', 'CRY', 'CRZ', 'CSWAP', 'CX', 'CY', 'CZ', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'XX', 'Y', 'Z']\n", + "qiskit : ['CH', 'CNOT', 'CPHASE', 'CRX', 'CRY', 'CRZ', 'CSWAP', 'CX', 'CY', 'CZ', 'H', 'MEASURE', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'XX', 'Y', 'Z']\n", + "braket : ['CNOT', 'CPHASE', 'CRZ', 'CSWAP', 'CX', 'CY', 'CZ', 'H', 'PHASE', 'RX', 'RY', 'RZ', 'S', 'SWAP', 'T', 'X', 'XX', 'Y', 'Z']\n" ] } ], @@ -349,16 +343,16 @@ "\n", "**Note**: Do not use the `MEASURE` Gate in your noiseless/shotless simulations, unless your circuit requires a mid-circuit measurement. This gate is intended for the simulation of **mixed states**. \n", "\n", - "**Note**: If you actually had a closer look at some simulation backends, such as Qiskit, Qulacs or ProjectQ, you'd find out that none of them have the same definition for the $R_z(\\theta)$ operation: they all differ up to a phase or sign convention for $\\theta$! Since the outcome of your simulation should not depend on the target backend, the translation step enforce a given convention, detailed in the documentation. In particular, this implies that the native circuit written for a given backend may not be equivalent to the same one written in abstract format, and then translated to this backend. Be mindful of that as you try to take some code written for a given backend, to port it to `tangelo`.\n", + "**Note**: Backends often have different conventions, operations may differ up to a phase or sign convention for parametrized gates for instance. Since the outcome of your simulation should not depend on the target backend, the translation step enforces a given convention, detailed in the documentation. In particular, this implies that the native circuit written for a given backend may not be equivalent to the same one written in abstract format, and then translated to this backend. Be mindful of that as you try to take some code written for a given backend, to port it to `tangelo`.\n", "\n", - "Below, we show how the translation function returns backend-specific objects, all with their usual built-in functionalities! See how the print function behaves differently for each of them for instance, and remember that you can use their built-in methods to accomplish many things (ex: after translating your circuit into a `Qiskit.QuantumCircuit` object, you can use the `draw` method to export it in a nice format: https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.draw.html). \n", + "Below, we show how the translation function returns backend-specific objects, all with their usual built-in functionalities. See how the print function behaves differently for each of them for instance, and remember that you can use their built-in methods to accomplish many things (ex: after translating your circuit into a `Qiskit.QuantumCircuit` object, you can use the `draw` method to export it in a nice format: https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.draw.html). \n", "\n", "Here are a few examples. Some cells may fail depending on what packages you have installed." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -460,7 +454,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -506,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -534,24 +528,24 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "T : | 0 |1| 2 |\n", - " \n", - "q0 : -C-------Y-------\n", - " | \n", - "q1 : -X-------C-Rx(2)-\n", - " | \n", - "q2 : -H-------X-------\n", - " \n", - "q4 : -Rz(777)---------\n", - "\n", - "T : | 0 |1| 2 |\n" + "T : | 0 |1| 2 |\n", + " \n", + "q0 : -C----------Y----------\n", + " | \n", + "q1 : -X----------C-Rx(2.00)-\n", + " | \n", + "q2 : -H----------X----------\n", + " \n", + "q4 : -Rz(777.00)------------\n", + "\n", + "T : | 0 |1| 2 |\n" ] } ], @@ -562,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -588,24 +582,24 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "T : | 0 |1| 2 |\n", - " \n", - "q0 : -C-------Y-------\n", - " | \n", - "q1 : -X-------C-Rx(2)-\n", - " | \n", - "q2 : -H-------X-------\n", - " \n", - "q4 : -Rz(777)---------\n", - "\n", - "T : | 0 |1| 2 |\n" + "T : | 0 |1| 2 |\n", + " \n", + "q0 : -C----------Y----------\n", + " | \n", + "q1 : -X----------C-Rx(2.00)-\n", + " | \n", + "q2 : -H----------X----------\n", + " \n", + "q4 : -Rz(777.00)------------\n", + "\n", + "T : | 0 |1| 2 |\n" ] } ], @@ -622,13 +616,11 @@ "\n", "### Saving, loading and sharing quantum circuits\n", "\n", - "The abstract circuit class used by the linq package can be translated into various formats and objects, so that users can easily save, load and share them with collaborators without providing an explicit code to do so. This is particularly relevant if you are working with external collaborators that need a circuit in a specific or general format, or if the circuit you want to share comes at the expense of complex calculations (using an application library, or maybe as a result of a variational or iterative procedure).\n", - "\n", - "A first option is to use the function translating abstract format to OpenQASM, which allows you to export your circuit in a straightforward OpenQASM 2.0 text format (it relies on the QASM export from the IBM Qiskit package, as they drive the standard), which is both human readable and can be imported by other quantum circuit simulation packages in general. A \"reverse\" translation from OpenQASM back to abstract format is available as well, but only supports a subset of OPENQASM 2.0. Users can thus save as QASM and load this back into an abstract circuit as well. No need to rewrite anything.\n", + "You may need to save, load or share quantum circuits or operators with collaborators, which may be used to working on other platforms.\n", "\n", - "A second option is to first translate your quantum circuit into the target format (string, object) and write it to file. For non-string objects, users may consider using a Python package such as `pickle` to serialize and save/load from a `.pkl` file a quantum circuit object. Your collaborators should then be able to load the circuit into their code by reading the string from file, or reading the pickled objects using the Python `pickle` package. I recommend to give them a sample code to load the objects properly.\n", + "A first suggestion is to use the OpenQASM format, as it is a rather common human-readable format, supported by most framework. Tangelo proposes convertion to OPENQASM 2.0, and limited reverse convertion from a subset of OpenQASM to Tangelo format. \n", "\n", - "**Note**: The second method may fail when loading pickle objects saved with a version of the target backend python package and loaded with a different one later on. Using the OpenQASM format may be the most human-friendly and reliable method if the syntax is kept simple." + "Otherwise, python packages such as `pickle` or `json` may come in handy to export compatible non-string objects, but can be a bit tricky if version numbers of dependencies do not match." ] }, { @@ -644,7 +636,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -683,7 +675,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -739,7 +731,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -747,9 +739,9 @@ "output_type": "stream", "text": [ "{'00': 0.2248275934887112, '01': 0.06709898823771769, '10': 0.5453235594453588, '11': 0.16274985882821247}\n", - "{'11': 0.13, '10': 0.63, '01': 0.07, '00': 0.17}\n", - "{'10': 0.5446, '00': 0.2246, '01': 0.0655, '11': 0.1653}\n", - "{'10': 0.545782, '01': 0.067003, '11': 0.162823, '00': 0.224392}\n" + "{'01': 0.06, '00': 0.27, '10': 0.55, '11': 0.12}\n", + "{'10': 0.5494, '01': 0.0656, '00': 0.2255, '11': 0.1595}\n", + "{'10': 0.545534, '01': 0.067011, '00': 0.224759, '11': 0.162696}\n" ] } ], @@ -786,14 +778,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'10': 0.49995, '01': 0.50005}\n" + "{'10': 0.49972, '01': 0.50028}\n" ] } ], @@ -820,14 +812,14 @@ "source": [ "### Expectation values\n", "\n", - "The `get_expectation_value`method can be used to compute the expectation value of an Opeefermion-style operator with regards to a state-preparation circuit, and `get_expectation_value_from_frequencies_oneterm` can directly take a sparse histogram of frequencies obtained by executing or simulating a quantum circuit on a backend (which could be resulting from a QPU experiment).\n", + "The `get_expectation_value`method can be used to compute the expectation value of a qubit / Pauli operator with regards to a state-preparation circuit, and `get_expectation_value_from_frequencies_oneterm` can directly take a sparse histogram of frequencies obtained by executing or simulating a quantum circuit on a backend (which could be resulting from a QPU experiment).\n", "\n", - "**Note**: `get_expectation_value_from_frequencies_oneterm` is a static method that does not require a `Simulator` object to be instantiated: it can be called directly. For now, users are to manually loop over terms and corresponding histograms if they intend to compute the expectation value of a linear combination of operators. " + "**Note**: For now, users are to manually loop over terms and corresponding histograms if they intend to compute the expectation value of a linear combination of operators." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -867,12 +859,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This notebook provided a general introduction to the `linq` submodule. I hope you liked it.\n", - "To dive into other topics, such as **noisy simulation** or how to use this package for **variational algorithms** for example, please refer to the other examples and tutorials available !\n", - "\n", - "---\n", + "This notebook provided a general introduction to the `linq` submodule, which hopefully helped you getting started with quantum circuits in Tangelo. There are many other notebooks available that illustrate quantum algorithms using these data structures, or more advanced features of `linq`.\n", "\n", - "*Valentin Senicourt*" + "What will you do with Tangelo ?" ] } ], From 60c40ecbcd68871c12ca74085c49938c8a998b83 Mon Sep 17 00:00:00 2001 From: James Brown <84878946+JamesB-1qbit@users.noreply.github.com> Date: Thu, 25 Aug 2022 12:35:45 -0400 Subject: [PATCH 11/12] Excited states (#197) * Excited states algorithm notebook, figures and data. Co-authored-by: Valentin Senicourt <41597680+ValentinS4t1qbit@users.noreply.github.com> --- examples/data/bodipy.xyz | 23 +++++++++++++++++++++++ examples/excited_states.ipynb | 1 + examples/img/bodipy_absorption.png | Bin 0 -> 29611 bytes examples/img/li2_4.png | Bin 0 -> 57417 bytes examples/img/li2_4_opt.png | Bin 0 -> 71465 bytes examples/img/rodeo_1000.png | Bin 0 -> 23298 bytes examples/test_notebooks.py | 3 +++ 7 files changed, 27 insertions(+) create mode 100644 examples/data/bodipy.xyz create mode 100644 examples/excited_states.ipynb create mode 100644 examples/img/bodipy_absorption.png create mode 100644 examples/img/li2_4.png create mode 100644 examples/img/li2_4_opt.png create mode 100644 examples/img/rodeo_1000.png diff --git a/examples/data/bodipy.xyz b/examples/data/bodipy.xyz new file mode 100644 index 000000000..2e4968396 --- /dev/null +++ b/examples/data/bodipy.xyz @@ -0,0 +1,23 @@ +21 +g_unsubstituted_1 +N -0.0555304 1.3373440 0.0095323 +B -1.3662048 2.2108790 0.0141997 +F -1.4064831 2.9876188 1.1536997 +F -1.4162739 2.9830453 -1.1282614 +N -2.5606210 1.1813023 0.0216546 +C -3.8667919 1.4769415 0.0347311 +C -4.6416310 0.2918896 0.0329794 +C -3.7437939 -0.7698467 0.0179344 +C -2.4367931 -0.2060427 0.0109525 +C -1.1777796 -0.8066945 -0.0014339 +C -0.0035441 -0.0537897 -0.0017986 +C 1.3643276 -0.4475740 -0.0094267 +C 2.1206206 0.7190914 -0.0020201 +C 1.2021487 1.7966059 0.0096879 +H -4.2032836 2.5134814 0.0448062 +H -5.7287942 0.2429060 0.0420732 +H -3.9698468 -1.8353072 0.0128376 +H -1.1093767 -1.8969062 -0.0097628 +H 1.7232737 -1.4757218 -0.0187190 +H 3.2051409 0.8090718 -0.0042795 +H 1.4034289 2.8677042 0.0179882 diff --git a/examples/excited_states.ipynb b/examples/excited_states.ipynb new file mode 100644 index 000000000..30ded7e8a --- /dev/null +++ b/examples/excited_states.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"mOclGIFNL8wf"},"source":["# Excited States in Tangelo"]},{"cell_type":"markdown","metadata":{"id":"X0feZqprmm5b"},"source":["[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/goodchemistryco/Tangelo/blob/develop/examples/excited_states.ipynb)"]},{"cell_type":"markdown","metadata":{"id":"8BtSmADsL8wj"},"source":["## Introduction\n","\n","One impactful application of quantum chemistry, in both academia and industry, is the study of the interaction of light with matter. Absorption (resp. emission) of a photon by a molecule can promote (resp. demote) an electron from a lower (resp. higher) electronic state to a higher (resp. lower) energy electronic state. The photon wavelength (i.e. energy) required for these transitions to occur is determined by the difference between the two respective electronic states. Therefore, it is imperative to be able to calculate accurate energies for both ground and excited states to study light/matter interations. These energy differences play a central role in many technologies such as solar panels, light-emitting diodes (LED), displays, and colorants. "]},{"cell_type":"markdown","metadata":{"id":"ZjlMQmjsL8wk"},"source":["To be more concrete, a colorant must emit light in a narrow region in the visible spectrum to be appropriate for the purpose, that is to say it must exhibit a specific wavelength. Another example is solar panels, where the absorption spectrum of a molecule is tuned via chemical functionalization to fit the solar emission spectrum to optimize the energy output efficiency. Here we show an example of a spectrum for the BODIPY molecule, a molecule widely used for fluorescent dyes. BODIPY absorbs light at a lower wavelength (higher energy) and emits light at a higher wavelength (lower energy). To compute this spectrum, one needs to calculate the ground and excited state energies and calculate their intensities. The absorption spectrum for the simplest BODIPY is shown below. Different absorption and emission wavelengths can be targeted by substituting the hydrogen atoms with different functional groups [J. Chem. Phys. 155, 244102 (2021)](https://aip.scitation.org/doi/10.1063/5.0076787).\n","\n","![BODIPY](https://drive.google.com/uc?id=1OTfF2-9tKZ6DvClbftDP1qWB9nNvRm6d)\n","\n","As there are a very large number of compounds to be considered, predicting absorption/emission UV-visible spectra would be a valuable asset to the scientific community.\n","\n","To achieve complete understanding of light interaction with a molecule, the quantum chemistry community has worked on several algorithms. In general, one must compute the relevant molecular electronic structures for the prediction of UV light absorption/emission. This notebook shows how Tangelo enables excited states calculations by implementing a few existing quantum algorithms. These are broadly grouped into variational optimization algorithms and algorithms that rely on Hamiltonian simulation. Along the way, we keep track of the quantum computational resources required by each of these approaches, and summarize this information at the end of the notebook. The use case here is Li $_2$ for expediency but many of these quantum algorithms can, in principle, be extended to much larger systems such as the BODIPY molecule above.\n","\n","It is worth noting that even with all the computed excited states, non-trivial effects can happen (solvation effect, geometry change, etc.) in which all modify the shape of a spectrum. In this notebook, we do not discuss how these effects are accounted for, but the calculations presented here are the necessary first steps towards computing excited states."]},{"cell_type":"markdown","metadata":{"id":"iujthgTEPHjH"},"source":["## Installation & Background\n","In order to successfully run this notebook, you need to install Tangelo. It is also important to be somewhat familiar with the variational quantum eigensolver (VQE). Information about VQE can be found in our [VQE with Tangelo](https://github.com/goodchemistryco/Tangelo/blob/main/examples/vqe.ipynb) notebook. Information about each algorithm can be found by following the references linked when each method is introduced. The cell below installs Tangelo in your environment, if it has not been done already."]},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58111,"status":"ok","timestamp":1661272038424,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"G_-oZvLrMI1S","outputId":"ab991feb-ee17-44ec-84a4-e1e57f9b23a5"},"outputs":[],"source":["try:\n"," import tangelo\n","except ModuleNotFoundError:\n"," !pip install git+https://github.com/goodchemistryco/Tangelo.git@develop --quiet\n","\n","# Download the data folder at https://github.com/goodchemistryco/Tangelo/tree/develop/examples/data\n","import os\n","if not os.path.isdir(\"data\"):\n"," !sudo apt install subversion\n"," !svn checkout https://github.com/goodchemistryco/Tangelo/branches/develop/examples/data"]},{"cell_type":"markdown","metadata":{"id":"xPrfVi8IL8wl"},"source":["## Table of Contents\n","* [1. Obtaining excited state energies classically](#1)\n","* [2. Variational optimization algorithms](#2)\n"," * [2.1 VQE for lowest singlet and triplet state ](#21)\n"," * [2.2 VQE Deflation](#22)\n"," * [2.3 Quantum Subspace Expansion](#23)\n"," * [2.4 State-Averaged VQE](#24)\n"," * [2.5 Multi-state contracted VQE (MC-VQE)](#25)\n"," * [2.6 State-Averaged VQE with deflation](#26)\n"," * [2.7 State-Averaged Orbital-Optimized VQE](#27)\n","* [3. Hamiltonian Simulation algorithms](#3)\n"," * [3.1 Multi-Reference Selected Quantum Krylov](#31)\n"," * [3.2 Rodeo Algorithm](#32)\n","* [4. Closing words](#4)"]},{"cell_type":"markdown","metadata":{"id":"knX1VqLsL8wl"},"source":["The molecular system we use to illustrate a number of excited state algorithms in this notebook is Li $_2$ near its equilibrium geometry. The full calculation of the Li $_2$ energies would be non-trivial and very computationally expensive; we therefore restrict ourselves to an active space of 2 electrons in 2 orbitals which involve 4 qubits when mapped to a qubit Hamiltonian using the Jordan-Wigner mapping. However, there are still non-trivial effects that occur with this small problem, made particularly evident in section [2.7](#27). We define two molecule objects:\n","\n","- `mol_li2` defined as the ground state configuration with 2 electrons in the HOMO.\n","- `mol_li2_t` defined as the triplet configuration with an alpha electron in each of the HOMO and LUMO."]},{"cell_type":"code","execution_count":2,"metadata":{"executionInfo":{"elapsed":897,"status":"ok","timestamp":1661272536335,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"pAxm9AzoL8wl"},"outputs":[],"source":["from tangelo import SecondQuantizedMolecule as SQMol\n","li2= \"\"\"Li 0. 0. 0.\n"," Li 3.0 0. 0. \"\"\"\n","\n","# 2 electrons in 2 orbitals\n","fo = [0,1]+[i for i in range(4,28)]\n","\n","# Runs RHF calculation\n","mol_Li2 = SQMol(li2, q=0, spin=0, basis='6-31g(d,p)', frozen_orbitals=fo, symmetry=True)\n","\n","# Runs ROHF calculation\n","mol_Li2_t = SQMol(li2, q=0, spin=2, basis=\"6-31g(d,p)\", frozen_orbitals=fo, symmetry=True)"]},{"cell_type":"markdown","metadata":{"id":"D-72nuJ3L8wn"},"source":["Since we set `symmetry=True` in the initialization, the symmetry labels of all the \n","orbitals have been populated in `mol_li2.mo_symm_labels`."]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1661272537393,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"AYeFshnnL8wn","outputId":"0cd1f4fb-b8bd-4801-8ab0-b2333d6da38a"},"outputs":[{"name":"stdout","output_type":"stream","text":[" # Energy Symm Occ\n"," 1 -2.4478 A1g 2\n"," 2 -2.4478 A1u 2\n"," 3 -0.1716 A1g 2\n"," 4 0.0129 A1u 0\n","Number of active electrons: 2\n","Number of active orbtials: 2\n"]}],"source":["# Symmetry labels and occupations for frozen core and active orbitals\n","print(\" # Energy Symm Occ\")\n","for i in range(4):\n"," print(f\"{i+1:3d}{mol_Li2.mo_energies[i]: 9.4f} {mol_Li2.mo_symm_labels[i]} {int(mol_Li2.mo_occ[i])}\")\n","\n","# Active electrons, Active orbitals\n","print(f\"Number of active electrons: {mol_Li2.n_active_electrons}\")\n","print(f\"Number of active orbtials: {mol_Li2.n_active_mos}\")"]},{"cell_type":"markdown","metadata":{"id":"INDk1VI0L8wo"},"source":["We can examine the molecular orbitals by exporting them as cube files. These can then be read in by your favourite orbital viewer.\n","\n","```python\n","from pyscf.tools import cubegen\n","# Output cube files for active orbitals\n","for i in [2, 3]:\n"," cubegen.orbital(mol_Li2.to_pyscf(basis = mol_Li2.basis), f'li2_{i+1}.cube', mol_Li2.mean_field.mo_coeff[:, i])\n","```"]},{"cell_type":"markdown","metadata":{"id":"wwUS06EwL8wp"},"source":["## 1. Obtaining excited state energies classically \n","\n","In order to compare the various quantum algorithms, it is useful to have the classically calculated values. Below we will calculate the two A1g and A2g states using PySCF CASCI implementation (https://pyscf.org/user/mcscf.html)."]},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":382,"status":"ok","timestamp":1661272539183,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"5ek4Iga7L8wp","outputId":"9dc46589-cbe3-4b02-fe58-fedebbdff5b8"},"outputs":[{"name":"stdout","output_type":"stream","text":["Calculation for A1g symmetry\n","\n","WARN: Mulitple states found in CASCI solver. First state is used to compute the natural orbitals in active space.\n","\n","CASCI state 0 E = -14.8696203037798 E(CI) = -0.575225247721381 S^2 = 0.0000000\n","CASCI state 1 E = -14.6801959955889 E(CI) = -0.385800939530506 S^2 = 0.0000000\n","\n"," Calculation for A1u symmetry\n","\n","WARN: Mulitple states found in CASCI solver. First state is used to compute the natural orbitals in active space.\n","\n","CASCI state 0 E = -14.8387663453704 E(CI) = -0.544371289311979 S^2 = 2.0000000\n","CASCI state 1 E = -14.784038331423 E(CI) = -0.489643275364569 S^2 = 0.0000000\n"]}],"source":["from pyscf import mcscf\n","\n","myhf = mol_Li2.mean_field\n","ncore = {\"A1g\": 1, \"A1u\": 1}\n","ncas = {\"A1g\": 1, \"A1u\": 1}\n","\n","print(\"Calculation for A1g symmetry\")\n","mc = mcscf.CASCI(myhf, 2, (1, 1))\n","mo = mc.sort_mo_by_irrep(cas_irrep_nocc=ncas, cas_irrep_ncore=ncore)\n","mc.fcisolver.wfnsym = \"A1g\"\n","mc.fcisolver.nroots = 2\n","emc_A1g = mc.casci(mo)[0]\n","\n","print(\"\\n Calculation for A1u symmetry\")\n","mc = mcscf.CASCI(myhf, 2, (1, 1))\n","mc.fcisolver.wfnsym = \"A1u\"\n","mc.fcisolver.nroots = 2\n","emc_A1u = mc.casci(mo)[0] "]},{"cell_type":"markdown","metadata":{"id":"mE9Dp_XZL8wq"},"source":["## 2. Variational algorithms\n","\n","We start by showing how different approaches based on VQE can be used to obtain excited states. For more information about VQE and the `VQESolver` class, feel free to have a look at our dedicated tutorials. "]},{"cell_type":"markdown","metadata":{"id":"Y6t3SWGdL8wq"},"source":["### 2.1 VQE for lowest singlet and triplet states \n","\n","Both the lowest singlet (ground state) and lowest triplet (first excited state) can be computed using `VQESolver`. The `FCISolver` class can be used to produce a classically-computed reference value, to get a sense of the accuracy of VQE in this situation. Along the way, we capture the quantum computational resources required for each algorithm in the dictionary `algorithm_resources`."]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2881,"status":"ok","timestamp":1661272543251,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"bChMajJ8L8wq","outputId":"b9645cda-b73b-4871-d335-f90cb902f631"},"outputs":[{"name":"stdout","output_type":"stream","text":["\n"," Ground Singlet state\n","VQE energy = -14.86962030275721\n","CASCI energy = -14.869620303779781\n","\n"," Lowest Triplet state\n","VQE energy = -14.853462489026873\n","CASCI energy = -14.853462489027105\n"]}],"source":["from tangelo.algorithms.variational import VQESolver, BuiltInAnsatze\n","from tangelo.algorithms.classical import FCISolver\n","\n","# Dictionary of resources for each algorithm\n","algorithm_resources = dict()\n","\n","# Ground state energy calculation with VQE, reference values with FCI\n","vqe_options = {\"molecule\": mol_Li2, \"ansatz\": BuiltInAnsatze.UCCSD}\n","vqe_solver = VQESolver(vqe_options)\n","vqe_solver.build()\n","vqe_energy = vqe_solver.simulate()\n","print(\"\\n Ground Singlet state\")\n","print(f\"VQE energy = {vqe_energy}\")\n","print(f\"CASCI energy = {FCISolver(mol_Li2).simulate()}\")\n","algorithm_resources[\"vqe_ground_state\"] = vqe_solver.get_resources()\n","\n","# First excited state energy calculation with VQE, reference values with FCI\n","vqe_options = {\"molecule\": mol_Li2_t, \"ansatz\": BuiltInAnsatze.UpCCGSD}\n","vqe_solver_t = VQESolver(vqe_options)\n","vqe_solver_t.build()\n","vqe_energy_t = vqe_solver_t.simulate()\n","print(\"\\n Lowest Triplet state\")\n","print(f\"VQE energy = {vqe_energy_t}\")\n","print(f\"CASCI energy = {FCISolver(mol_Li2_t).simulate()}\")\n","algorithm_resources[\"vqe_triplet_state\"] = vqe_solver_t.get_resources()"]},{"cell_type":"markdown","metadata":{"id":"iXSSQBsvL8wr"},"source":["### 2.2 VQE Deflation \n","\n","Deflation can be used to gradually obtain higher and higher excited states, by applying an orthogonality penalty against all previous VQE calculations. This idea was introduced in [arXiv:2205.09203](https://arxiv.org/abs/2205.09203).\n","\n","This approach can be implented by using the deflation options built in the `VQESolver` class:\n","\n","- The keyword `\"deflation_circuits\"` allows the user to provide a list of circuits to use in the deflation process.\n","- Additionally, the keyword `\"deflation_coeff\"` allows a user to specify the weight in front of the penalty term. This coefficient must be larger than the difference in energy between the ground and the target excited state."]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":28371,"status":"ok","timestamp":1661272571615,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"V-BzLB_cL8wr","outputId":"5b3c99c1-4275-4c3d-be19-191be0e8b4c3"},"outputs":[{"name":"stdout","output_type":"stream","text":["Excited state #1 \t VQE energy = -14.784037073788548\n","Excited state #2 \t VQE energy = -14.680196061800041\n"]}],"source":["# Add initial VQE optimal circuit to the deflation circuits list\n","deflation_circuits = [vqe_solver.optimal_circuit.copy()]\n","\n","# Calculate first and second excited states by adding optimal circuits to deflation_circuits\n","for i in range(2):\n"," vqe_options = {\"molecule\": mol_Li2, \"ansatz\": BuiltInAnsatze.UpCCGSD, \n"," \"deflation_circuits\": deflation_circuits, \"deflation_coeff\": 0.4}\n"," vqe_solver = VQESolver(vqe_options)\n"," vqe_solver.build()\n"," vqe_energy = vqe_solver.simulate()\n"," print(f\"Excited state #{i+1} \\t VQE energy = {vqe_energy}\")\n"," algorithm_resources[f\"vqe_deflation_state_{i+1}\"] = vqe_solver.get_resources()\n","\n"," deflation_circuits.append(vqe_solver.optimal_circuit.copy())"]},{"cell_type":"markdown","metadata":{"id":"gZVPYZHGL8wr"},"source":["The deflation above generated the singlet states. Sometimes it is useful to use a different reference state. In the next example of deflation, we use a reference state with 2 alpha electrons and 0 beta electrons to calculate the triplet state. The reference state is defined by alternating up then down ordering, which yields `{\"ref_state\": [1, 0, 1, 0]}` for 2 alpha electrons in 2 orbitals for this situation."]},{"cell_type":"code","execution_count":7,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4700,"status":"ok","timestamp":1661272576294,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"5CDOUDORL8wr","outputId":"123a886d-8f59-4bae-daac-15fa813cc4a1"},"outputs":[{"name":"stdout","output_type":"stream","text":["VQE energy = -14.838766345424597\n"]}],"source":["vqe_options = {\"molecule\": mol_Li2, \"ansatz\": BuiltInAnsatze.UpCCGSD, \n"," \"deflation_circuits\": deflation_circuits,\n"," \"deflation_coeff\": 0.4, \"ref_state\": [1, 0, 1, 0]}\n","vqe_solver_triplet = VQESolver(vqe_options)\n","vqe_solver_triplet.build()\n","vqe_energy = vqe_solver_triplet.simulate()\n","print(f\"VQE energy = {vqe_energy}\")\n","algorithm_resources[f\"vqe_deflation_state_{3}\"] = vqe_solver_triplet.get_resources()"]},{"cell_type":"markdown","metadata":{"id":"_odsQd-dL8ws"},"source":["This value is a great match for the triplet CASCI reference values we obtained earlier. We calculated all the excited states calculated using CASCI using deflation by running `VQESolver` 4 times.\n","\n","The `deflation_circuits` option is also available for the SA-VQE solver shown in another section of this notebook (`SA_VQESolver`), as well as ADAPT (`ADAPTSolver`)."]},{"cell_type":"markdown","metadata":{"id":"uTRtGu2XL8ws"},"source":["### 2.3 Quantum Subspace Expansion \n","\n","Another way to obtain excited states is to define a pool of operators providing a good approximation to the excitations needed to represent the excited states from the ground state calculations produced by `VQESolver`. This idea was presented in [arXiv:1603.05681](https://arxiv.org/abs/1603.05681).\n","\n","For this example, we choose a pool of operators of the form $O_p=a_i^{\\dagger}a_j$.\n","\n","We then have to solve $FU = SUE$, where $F_{pq}=\\left<\\psi\\right|O_p^* H O_q\\left|\\psi\\right>$ and $S_{pq}=\\left<\\psi\\right|O_p^* O_q\\left|\\psi\\right>$.\n","\n","For simplicity here, we keep all wavefunction symmetry excitations. However, the matrix we need to diagonalize can be made smaller by only keeping excitations that respect the desired wavefunction symmetry of the excited state."]},{"cell_type":"code","execution_count":8,"metadata":{"executionInfo":{"elapsed":9330,"status":"ok","timestamp":1661272585618,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"WCTsrPADL8ws"},"outputs":[],"source":["import numpy as np\n","from scipy.linalg import eigh\n","from openfermion.utils import hermitian_conjugated as hc\n","\n","from tangelo.toolboxes.operators import FermionOperator\n","from tangelo.toolboxes.qubit_mappings.mapping_transform import fermion_to_qubit_mapping as f2q_mapping\n","\n","# Generate all single excitations as qubit operators\n","op_list = list()\n","for i in range(2):\n"," for j in range(i+1, 2):\n"," op_list += [f2q_mapping(FermionOperator(((2*i, 1), (2*j, 0))), \"jw\")] #spin-up transition\n"," op_list += [f2q_mapping(FermionOperator(((2*i+1, 1), (2*j+1, 0))), \"jw\")] #spin-down transition\n"," op_list += [f2q_mapping(FermionOperator(((2*i+1, 1), (2*j, 0))), \"jw\")] #spin-up to spin-down\n"," op_list += [f2q_mapping(FermionOperator(((2*i, 1), (2*j+1, 0))), \"jw\")] #spin-down to spin-up\n","\n","# Compute F and S matrices.\n","size_mat = len(op_list)\n","h = np.zeros((size_mat, size_mat))\n","s = np.zeros((size_mat, size_mat))\n","state_circuit = vqe_solver.optimal_circuit\n","for i, op1 in enumerate(op_list):\n"," for j, op2 in enumerate(op_list):\n"," h[i, j] = np.real(vqe_solver.backend.get_expectation_value(hc(op1)*vqe_solver.qubit_hamiltonian*op2, state_circuit))\n"," s[i, j] = np.real(vqe_solver.backend.get_expectation_value(hc(op1)*op2, state_circuit))\n","\n","label = \"quantum_subspace_expansion\"\n","algorithm_resources[label] = vqe_solver.get_resources()\n","algorithm_resources[label][\"n_post_terms\"] = len(op_list)**2*algorithm_resources[label][\"qubit_hamiltonian_terms\"]"]},{"cell_type":"markdown","metadata":{"id":"MrS38WBO2DBF"},"source":["After generating the matrices on the quantum computer. We need to perform the classical post-processing to obtain the energies by solving the $FU = SUE$ eigenvalue problem."]},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9,"status":"ok","timestamp":1661272585618,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"Qg5IhLHm2CEd","outputId":"5f451bfc-c388-4649-834b-3d807f339d9c"},"outputs":[{"name":"stdout","output_type":"stream","text":["Quantum Subspace Expansion energies: \n"," [-14.83876635 -14.83876635 -14.83876635 -14.7840384 ]\n"]}],"source":["# Solve FU = SUE\n","e, v = eigh(h,s)\n","print(f\"Quantum Subspace Expansion energies: \\n {e}\")"]},{"cell_type":"markdown","metadata":{"id":"YCqaM-2SL8ws"},"source":["We can see that we have obtained the correct energies for CASCI state A1g state 1, and A2 state 0 and 1. A1g state 1 was not recovered. We would therefore need to measure more excitations in $F$."]},{"cell_type":"markdown","metadata":{"id":"SLJrouJXL8wt"},"source":["### 2.4 State-Averaged VQE \n","\n","Another method to obtain excited states is to use the State-Averaged VQE Solver (SA-VQE). SA-VQE minimizes the average energy of multiple orthogonal reference states using the same ansatz circuit. As the reference states are orthogonal, using the same circuit transformation (a unitary), results in final states that are also orthogonal. This idea can be found in [arXiv:2009.11417](https://arxiv.org/pdf/2009.11417.pdf).\n","\n","Here, we target singlet states only. This can be accomplished by adding a penalty term with `\"penalty_terms\": {\"S^2\": [2, 0]}`. This means that the target Hamiltonian to be minimized is $H = H_0 + 2 (\\hat{S}^2 - 0)^2$, where $H_0$ is the original molecular Hamiltonian."]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":28509,"status":"ok","timestamp":1661272614122,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"mZxPQhFqL8wt","outputId":"e5afb39a-f001-4581-8900-c373f41731ba"},"outputs":[{"name":"stdout","output_type":"stream","text":["Singlet State 0 has energy -14.742180681856254\n","Singlet State 1 has energy -14.812125666900934\n","Singlet State 2 has energy -14.779540065574887\n"]}],"source":["from tangelo.algorithms.variational import SA_VQESolver\n","\n","vqe_options = {\"molecule\": mol_Li2, \"ref_states\": [[1,1,0,0], [1,0,0,1], [0,0,1,1]],\n"," \"weights\": [1, 1, 1], \"penalty_terms\": {\"S^2\": [2, 0]},\n"," \"qubit_mapping\": \"jw\", \"ansatz\": BuiltInAnsatze.UpCCGSD, \"ansatz_options\": {\"k\": 2}\n"," }\n","vqe_solver = SA_VQESolver(vqe_options)\n","vqe_solver.build()\n","enernew = vqe_solver.simulate()\n","for i, energy in enumerate(vqe_solver.state_energies):\n"," print(f\"Singlet State {i} has energy {energy}\")\n","\n","algorithm_resources[\"sa_vqe\"] = vqe_solver.get_resources()"]},{"cell_type":"markdown","metadata":{"id":"kpLLy2N2L8wt"},"source":["The energies above are inaccurate, as the calculated states are restricted to linear combinations of the three lowest singlet states. We can use MC-VQE to generate the exact eigenvectors, as shown in the next section.\n","\n","However, the cell below shows the $\\hat{S}^2$ expectation value is nearly zero for all states, so they are all singlet as expected when using the penalty term."]},{"cell_type":"code","execution_count":11,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":527,"status":"ok","timestamp":1661272614626,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"R2Q-tL04L8wt","outputId":"d555dc92-6ae1-4825-9b15-b39a66498782"},"outputs":[{"name":"stdout","output_type":"stream","text":["State 0 has S^2 = 3.529245484745758e-08\n","State 1 has S^2 = 2.022386547784194e-06\n","State 2 has S^2 = 7.83819953387166e-09\n"]}],"source":["from tangelo.toolboxes.ansatz_generator.fermionic_operators import spin2_operator\n","\n","s2op = f2q_mapping(spin2_operator(2), \"jw\")\n","for i in range(3):\n"," print(f\"State {i} has S^2 = {vqe_solver.backend.get_expectation_value(s2op, vqe_solver.reference_circuits[i]+vqe_solver.optimal_circuit)}\")\n"]},{"cell_type":"markdown","metadata":{"id":"G6afws2QL8wt"},"source":["### 2.5 Multistate, contracted VQE (MC-VQE) \n","\n","To obtain the energies of the individual states, we can use multistate contracted VQE (MC-VQE), as introduced in [arXiv:1901.01234](https://arxiv.org/abs/1901.01234). This process defines a small matrix by measuring the Hamiltonian expectation values of $(\\left|\\theta_i\\right>+\\left|\\theta_j\\right>)/\\sqrt{2}$ and $(\\left|\\theta_i\\right>-\\left|\\theta_j\\right>)/\\sqrt{2}$ for all combinations of our final states ($\\left|\\theta_i\\right>$) resulting from the SA-VQE procedure. \n","\n","In general, the reference states are simple occupations so generating $(\\left|\\theta_i\\right>+\\left|\\theta_j\\right>)/\\sqrt{2}$ and $(\\left|\\theta_i\\right>-\\left|\\theta_j\\right>)/\\sqrt{2}$ by hand should be \"fairly straightforward\". In this notebook, we use Tangelo to obtain these statevectors and then generate the expectation values."]},{"cell_type":"code","execution_count":12,"metadata":{"executionInfo":{"elapsed":1856,"status":"ok","timestamp":1661272616479,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"HKLOknHSL8wu"},"outputs":[],"source":["# Generate individual statevectors\n","ref_svs = list()\n","for circuit in vqe_solver.reference_circuits:\n"," _, sv = vqe_solver.backend.simulate(circuit, return_statevector=True)\n"," ref_svs.append(sv)\n","\n","# Generate Equation (2) using equation (4) and (5) of arXiv:1901.01234\n","h_theta_theta = np.zeros((3,3))\n","for i, sv1 in enumerate(ref_svs):\n"," for j, sv2 in enumerate(ref_svs):\n"," if i != j:\n"," sv_plus = (sv1 + sv2)/np.sqrt(2)\n"," sv_minus = (sv1 - sv2)/np.sqrt(2)\n"," exp_plus = vqe_solver.backend.get_expectation_value(vqe_solver.qubit_hamiltonian, vqe_solver.optimal_circuit, initial_statevector=sv_plus)\n"," exp_minus = vqe_solver.backend.get_expectation_value(vqe_solver.qubit_hamiltonian, vqe_solver.optimal_circuit, initial_statevector=sv_minus)\n"," h_theta_theta[i, j] = (exp_plus-exp_minus)/2\n"," else:\n"," h_theta_theta[i, j] = vqe_solver.state_energies[i]\n"]},{"cell_type":"markdown","metadata":{"id":"10myRMdfHJoJ"},"source":["Accurate energies can be recovered by solving the resulting eigenproblem classically:"]},{"cell_type":"code","execution_count":13,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":10,"status":"ok","timestamp":1661272616480,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"Oay_MF79HJSr","outputId":"1c789fc6-6567-4bcc-a0ad-02a0dc59fb5c"},"outputs":[{"name":"stdout","output_type":"stream","text":["Singlet State 0 \t MC-VQE energy = -14.869616815256446\n","Singlet State 1 \t MC-VQE energy = -14.784034669938098\n","Singlet State 2 \t MC-VQE energy = -14.680194929137528\n"]}],"source":["e, _ = np.linalg.eigh(h_theta_theta)\n","for i, energy in enumerate(e):\n"," print(f\"Singlet State {i} \\t MC-VQE energy = {energy}\")"]},{"cell_type":"markdown","metadata":{"id":"JtJADlmZL8wu"},"source":["We can see that these singlet energies are all close to the exact answer. "]},{"cell_type":"markdown","metadata":{"id":"IrcmQn8cL8wu"},"source":["#### Using StateVector for MC-VQE\n","The code below can be used obtain the same MC-VQE result by using `StateVector` to automatically generate circuits for $(\\left|\\theta_i\\right>+\\left|\\theta_j\\right>)/\\sqrt{2}$ and $(\\left|\\theta_i\\right>-\\left|\\theta_j\\right>)/\\sqrt{2}$. However, the circuits created by StateVector are generally inefficient and one should try to create the circuits that generate these states by hand if running on a real quantum device."]},{"cell_type":"code","execution_count":14,"metadata":{"executionInfo":{"elapsed":2135,"status":"ok","timestamp":1661272623722,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"mHk_50TxL8wu"},"outputs":[],"source":["from tangelo.linq.helpers import StateVector\n","\n","# Generate individual statevectors\n","ref_svs = list()\n","for state in vqe_solver.ref_states:\n"," sv = np.zeros(2**4)\n"," # Generate bitstring representation of each ref_state and populate that position in the statevector\n"," bitstring = \"\".join([str(i) for i in reversed(state)])\n"," sv[int(bitstring, base=2)] = 1\n"," ref_svs.append(sv)\n","\n","# Generate Equation (2) using equation (4) and (5) of arXiv:1901.01234\n","h_theta_theta = np.zeros((len(ref_svs), len(ref_svs)))\n","for i, sv1 in enumerate(ref_svs):\n"," for j, sv2 in enumerate(ref_svs):\n"," if i != j:\n"," sv_plus = (sv1 + sv2)/np.sqrt(2)\n"," sv_plus = StateVector(sv_plus)\n"," ref_circ_plus = sv_plus.initializing_circuit()\n"," exp_plus = vqe_solver.backend.get_expectation_value(vqe_solver.qubit_hamiltonian, ref_circ_plus + vqe_solver.optimal_circuit)\n","\n"," sv_minus = (sv1 - sv2)/np.sqrt(2)\n"," sv_minus = StateVector(sv_minus)\n"," ref_circ_minus = sv_minus.initializing_circuit()\n"," exp_minus = vqe_solver.backend.get_expectation_value(vqe_solver.qubit_hamiltonian, ref_circ_minus + vqe_solver.optimal_circuit)\n","\n"," h_theta_theta[i, j] = (exp_plus-exp_minus)/2\n"," else:\n"," h_theta_theta[i, j] = vqe_solver.state_energies[i]\n","\n","algorithm_resources[\"mc_vqe\"] = vqe_solver.get_resources()\n","algorithm_resources[\"mc_vqe\"][\"n_post_terms\"] = len(ref_svs)**2*algorithm_resources[\"mc_vqe\"][\"qubit_hamiltonian_terms\"]"]},{"cell_type":"code","execution_count":15,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":139,"status":"ok","timestamp":1661272626993,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"ejuElP5XHZyZ","outputId":"2481e0fd-4fea-4ee6-c30b-81ec38846e36"},"outputs":[{"name":"stdout","output_type":"stream","text":["Singlet State 0 \t MC-VQE energy = -14.869616815256434\n","Singlet State 1 \t MC-VQE energy = -14.784034669938118\n","Singlet State 2 \t MC-VQE energy = -14.68019492913752\n"]}],"source":["\n","e, _ = np.linalg.eigh(h_theta_theta)\n","for i, energy in enumerate(e):\n"," print(f\"Singlet State {i} \\t MC-VQE energy = {energy}\")"]},{"cell_type":"markdown","metadata":{"id":"p6odrzVoL8wv"},"source":["### 2.6 State-Averaged VQE with deflation \n","We can obtain the final excited state by using deflation for the three singlet states above and removing the penalty term. We define a reference state with `\"ref_states\": [[1, 0, 1, 0]]` that better targets the remaining triplet state. We can revert back to the UCCSD ansatz for this state as we do not need as expressive an ansatz anymore."]},{"cell_type":"code","execution_count":16,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1953,"status":"ok","timestamp":1660764178172,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"emTkX2rkL8wv","outputId":"bc28786d-4441-499c-ec47-64810c0e2b38"},"outputs":[{"name":"stdout","output_type":"stream","text":["Triplet State 0 has energy -14.838766345424714\n"]}],"source":["vqe_options = {\"molecule\": mol_Li2, \"ref_states\": [[1, 0, 1, 0]],\n"," \"weights\": [1], \"deflation_circuits\": [vqe_solver.reference_circuits[i]+vqe_solver.optimal_circuit for i in range(3)],\n"," \"qubit_mapping\": \"jw\", \"ansatz\": BuiltInAnsatze.UCCSD, \"ansatz_options\": {\"k\": 2}\n"," }\n","vqe_solver_deflate = SA_VQESolver(vqe_options)\n","vqe_solver_deflate.build()\n","enernew = vqe_solver_deflate.simulate()\n","\n","for i, energy in enumerate(vqe_solver_deflate.state_energies):\n"," print(f\"Triplet State {i} has energy {energy}\")\n","\n","algorithm_resources[f\"sa_vqe_deflation\"] = vqe_solver_deflate.get_resources()"]},{"cell_type":"markdown","metadata":{"id":"JrU59nB3L8wv"},"source":["This is the correct triplet state energy."]},{"cell_type":"markdown","metadata":{"id":"FNeQXqbIL8wv"},"source":["### 2.7 State-Averaged Orbital-Optimized VQE \n","\n","This performs the equivalent of a CASSCF calculation using a quantum computer. This approach runs multiple iterations comprised of the two following steps:\n","\n","- SA-VQE calculation\n","- orbital optimization \n","\n","These iterations are called by using the `iterate()` call. The `simulate()` method from `SA_OO_Solver` only performs a State-Averated VQE simulation. The reference for this method is [arXiv:2009.11417](https://arxiv.org/pdf/2009.11417.pdf)."]},{"cell_type":"code","execution_count":17,"metadata":{"colab":{"background_save":true},"id":"xpuXu4iyL8wv","outputId":"87ab3813-fdf5-4579-eac2-95174fdb424a"},"outputs":[{"name":"stdout","output_type":"stream","text":["State 0 has energy -14.87559934821644\n","State 1 has energy -14.85178914848705\n"]}],"source":["from tangelo.algorithms.variational import SA_OO_Solver\n","\n","mol_Li2_nosym = SQMol(li2, q=0, spin=0, basis='6-31g(d,p)',\n"," frozen_orbitals=fo, symmetry=False)\n","vqe_options = {\"molecule\": mol_Li2_nosym, \"ref_states\": [[1,1,0,0], [1,0,1,0]],\n"," \"weights\": [1, 1],\n"," \"qubit_mapping\": \"jw\", \"ansatz\": BuiltInAnsatze.UpCCGSD, \"ansatz_options\": {\"k\": 2}\n"," }\n","vqe_solver = SA_OO_Solver(vqe_options)\n","vqe_solver.build()\n","enernew = vqe_solver.iterate()\n","for i, energy in enumerate(vqe_solver.state_energies):\n"," print(f\"State {i} has energy {energy}\")\n","\n","algorithm_resources[\"sa_oo_vqe\"] = vqe_solver.get_resources()"]},{"cell_type":"markdown","metadata":{"id":"PD3cQc1GL8ww"},"source":["Comparing the `SA_OO_VQE` solution to CASSCF calculations from a library such as pyscf shows similar results."]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"background_save":true},"id":"xDxQ3wIbL8ww","outputId":"cadde5af-7e7d-4a33-f517-1c541fb7de2c"},"outputs":[{"name":"stdout","output_type":"stream","text":["CASSCF energy = -14.8636942982906\n","CASCI E = -14.8636942982906 E(CI) = -0.569133524449605 S^2 = 1.0000000\n","CASCI state-averaged energy = -14.8636942982906\n","CASCI energy for each state\n"," State 0 weight 0.5 E = -14.8756048775827 S^2 = 0.0000000\n"," State 1 weight 0.5 E = -14.8517837189985 S^2 = 2.0000000\n"]}],"source":["mol_Li2_no_sym_copy = SQMol(li2, q=0, spin=0, basis='6-31g(d,p)',\n"," frozen_orbitals=fo, symmetry=False)\n","mc = mcscf.CASSCF(mol_Li2_no_sym_copy.mean_field, 2, 2).state_average([0.5, 0.5])\n","energy = mc.kernel()"]},{"cell_type":"markdown","metadata":{"id":"N7ZIjE-ML8ww"},"source":["`SA_OO_Solver` has optimized the orbitals in `mol_Li2_nosym` to minimize the average energy of the states above. We can then use the code below to output the optimized molecular orbitals as cube files and compare to the unoptimized orbitals from the top of the notebook.\n","\n","```python\n","from pyscf.tools import cubegen\n","# loop over active orbitals i.e. 2, 3\n","for i in [2, 3]:\n"," cubegen.orbital(mol_Li2_nosym.to_pyscf(basis = mol_Li2_nosym.basis), f'li2_{i+1}_opt.cube', mol_Li2_nosym.mean_field.mo_coeff[:, i])\n","```"]},{"cell_type":"markdown","metadata":{"id":"_uXgf8A7L8ww"},"source":["Using [Avogadro](https://avogadro.cc/) to generate the two figures below with the .cube files outputted above, we see that the original fourth molecular orbital and the optimized fourth molecular orbital look very different:\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
\n"," Original molecular orbital \n"," \n"," Optimized molecular orbital\n","
\n"," \n"," \n"," \n","
\n"]},{"cell_type":"markdown","metadata":{"id":"JzCzgcA1L8ww"},"source":["Li ${_2}$ is a molecule that requires CASSCF type optimization to exihibit the correct qualitative behavior when using a small active space. Below, we run `SA_OO_VQE` for multiple different bond lengths and compare to CASCI. This calculation can take more than one minute, depending on your computer."]},{"cell_type":"code","execution_count":19,"metadata":{"colab":{"background_save":true},"id":"jLiH5xJcL8wx","outputId":"d66e33c7-d600-40b0-cba0-eeb8f2a0ae6a"},"outputs":[{"name":"stdout","output_type":"stream","text":["Computing state-averaged orbital-optimized VQE energy for r=2.0\n","Computing state-averaged orbital-optimized VQE energy for r=2.2\n","Computing state-averaged orbital-optimized VQE energy for r=2.5\n","Computing state-averaged orbital-optimized VQE energy for r=3.0\n","Computing state-averaged orbital-optimized VQE energy for r=3.5\n","Computing state-averaged orbital-optimized VQE energy for r=4.0\n","Computing state-averaged orbital-optimized VQE energy for r=4.5\n","Computing state-averaged orbital-optimized VQE energy for r=5.0\n","Computing state-averaged orbital-optimized VQE energy for r=6.0\n","Computing state-averaged orbital-optimized VQE energy for r=7.0\n","Computing state-averaged orbital-optimized VQE energy for r=9.0\n"]}],"source":["sa_oo_eners = list()\n","casci_eners = list()\n","xvals = np.array([2, 2.2, 2.5, 3., 3.5, 4., 4.5, 5., 6., 7., 9.])\n","\n","for r in xvals:\n"," print(f\"Computing state-averaged orbital-optimized VQE energy for r={r}\")\n"," li2_xyz = [('Li', (0, 0, 0)),('Li', (r, 0, 0))]\n"," \n"," mol_Li2_nosym_copy = SQMol(li2_xyz, q=0, spin=0, basis='6-31g(d,p)',\n"," frozen_orbitals=fo, symmetry=False)\n"," mc = mcscf.CASCI(mol_Li2_nosym_copy.mean_field, 2, 2)\n"," mc.fcisolver.nroots = 2\n"," mc.verbose = 0\n"," e = mc.kernel()\n"," casci_eners.append(e[0])\n","\n"," # Compute SA-OO-VQE energy\n"," mol_Li2_nosym = SQMol(li2_xyz, q=0, spin=0, basis='6-31g(d,p)',\n"," frozen_orbitals=fo, symmetry=False)\n"," vqe_options = {\"molecule\": mol_Li2_nosym, \"ref_states\": [[1, 1, 0, 0], [1, 0, 1, 0]], \"tol\": 1.e-3,\n"," \"ansatz\": BuiltInAnsatze.UCCGD, \"weights\": [1, 1], \"n_oo_per_iter\": 1}\n"," vqe_solver = SA_OO_Solver(vqe_options)\n"," vqe_solver.build()\n"," enernew = vqe_solver.iterate()\n"," sa_oo_eners.append(vqe_solver.state_energies)"]},{"cell_type":"markdown","metadata":{"id":"E_fA-ed2L8wx"},"source":["The plot below shows the resulting potential energy curves, and illustrates the impact of orbital optimization for our use case:"]},{"cell_type":"code","execution_count":20,"metadata":{"colab":{"background_save":true},"id":"1vb0Q1UXL8wx","outputId":"4b0adc24-9066-43a5-9768-494140a6be6e"},"outputs":[{"data":{"text/plain":[""]},"execution_count":20,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["import matplotlib.pyplot as plt\n","\n","sa_oo_eners=np.array(sa_oo_eners)\n","casci_eners= np.array(casci_eners)\n","\n","fig, ax = plt.subplots()\n","ax.plot(xvals, sa_oo_eners[:, 0], label=\"SA_OO State 0\")\n","ax.plot(xvals, sa_oo_eners[:, 1], label=\"SA_OO State 1\")\n","ax.plot(xvals, casci_eners[:, 0], label=\"CASCI State 0\")\n","ax.plot(xvals, casci_eners[:, 1], label=\"CASCI State 1\")\n","ax.set_xlabel('r (Angstrom)')\n","ax.set_ylabel('Energy (Hartree)')\n","ax.legend()"]},{"cell_type":"markdown","metadata":{"id":"rpnEQfLZL8wx"},"source":["## 3. Hamiltonian Simulation algorithms \n","\n","We now illustrate a few other approches based on time-evolution of the Hamiltonian. Although these algorithms are not NISQ-friendly, they do not require non-linear optimization of parameters like the variational methods encountered in the previous sections. They may be a better choice for future fault-tolerant architectures.\n","\n","### 3.1 Multi-Reference Selected Quantum Krylov (MRSQK) \n","\n","The multi-reference selected Quantum Krylov algorithm as outlined in [arXiv:1911.05163](https://arxiv.org/abs/1911.05163) uses multiple reference states and performs multiple time evolutions $U = e^{-iH\\tau}$ for time $\\tau$, to generate a Krylov representation of the system. The method relies on building two matrices ${\\cal{H}}$ and $S$, whose elements are defined by ${\\cal{H}_{ia,jb}} = \\left<\\phi_a\\right|U^i H U^j\\left|\\phi_b\\right>$ and $S_{ia,jb} = \\left<\\phi_a\\right|U^i U^j\\left|\\phi_b\\right>$, where $\\phi_a, \\phi_b$ denote different reference configurations. The matrix elements are measured using the procedure outlined in [arXiv:1911.05163](https://arxiv.org/abs/1911.05163) and the energies obtained through solving ${\\cal{H}}V = SVE$.\n","\n","In [arXiv:2109.06868](https://arxiv.org/abs/2109.06868), it was further noticed that one can use any function of $\\cal{H}$ to obtain the eigenvalues. For example, one could use $f({\\cal{H}})=e^{-iH\\tau}=U$. The same procedure results in the matrix elements $f({\\cal{H}})_{ia,jb} = \\left<\\phi_a\\right|U^i U U^j\\left|\\phi_b\\right>, S_{ia,jb} = \\left<\\phi_a\\right|U^i U^j\\left|\\phi_b\\right>$ for the eigenvalue problem $f({\\cal{H}})V=SVf(E)$. As $E$ is a diagonal matrix, the correct energies can be obtained by calculating the phase of the eigenvalues ($f(E)=e^{-iE\\tau}$) and dividing by $\\tau$. (i.e. $\\arctan \\left[\\Im(f(E))/\\Re(f(E)) \\right]/\\tau$). The resulting circuit is slightly longer but much fewer measurements are required. It is worth mentioning that [qubitization](https://arxiv.org/abs/1610.06546), which natively implements $e^{i \\arccos(H\\tau)}$, can be used without issue. Qubitization is currently one of the most efficient algorithms that implements time-evolution."]},{"cell_type":"code","execution_count":21,"metadata":{"executionInfo":{"elapsed":174,"status":"ok","timestamp":1661272087411,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"vJQiKfKIL8wy"},"outputs":[],"source":["from itertools import product\n","from scipy.linalg import eigh, eigvals\n","\n","from tangelo.linq import Simulator, Circuit, Gate\n","from tangelo.toolboxes.operators import QubitOperator, count_qubits\n","from tangelo.toolboxes.qubit_mappings.statevector_mapping import vector_to_circuit\n","from tangelo.toolboxes.ansatz_generator.ansatz_utils import controlled_pauliwords, trotterize"]},{"cell_type":"code","execution_count":22,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9670,"status":"ok","timestamp":1661272160408,"user":{"displayName":"James Brown","userId":"06283700661119510182"},"user_tz":240},"id":"IMbJSHcWL8wy","outputId":"ef370245-194f-4a03-bbc7-5306af52172e"},"outputs":[{"name":"stdout","output_type":"stream","text":["The HV=SVE energies are [-14.8696203 -14.83876635 -14.78403833 -14.68019599]\n","The f(H)V=SVf(E) energies are [-14.86962029 -14.68019602 -14.78403834 -14.83876635]\n"]}],"source":["# Number of Krylov vectors\n","n_krylov = 4\n","# Simulation time for each unitary\n","tau = 0.04\n","# Qubit Mapping\n","mapping = \"jw\"\n","\n","backend = Simulator()\n","\n","# Qubit operator for Li2\n","qu_op = f2q_mapping(mol_Li2.fermionic_hamiltonian, mapping, mol_Li2.n_active_sos,\n"," mol_Li2.n_active_electrons, up_then_down=False, spin=mol_Li2.spin)\n","\n","# control qubit\n","c_q = count_qubits(qu_op)\n","\n","# Operator that measures off-diagonal matrix elements i.e. 2|0><1|\n","zeroone = (QubitOperator(f\"X{c_q}\", 1) + QubitOperator(f\"Y{c_q}\", 1j))\n","\n","# Controlled unitaries for each term in qu_op\n","c_qu = controlled_pauliwords(qubit_op=qu_op, control=c_q, n_qubits=5)\n","\n","# Controlled time-evolution of qu_op\n","c_trott = trotterize(qu_op, time=tau, n_trotter_steps=1, trotter_order=1, control=4)\n","\n","# Generate multiple controlled-reference states.\n","reference_states = list()\n","reference_vecs = [[1, 1, 0, 0], [1, 0, 0, 1]]\n","for vec in reference_vecs:\n"," circ = vector_to_circuit(vec)\n"," gates = [Gate(\"C\"+gate.name, target=gate.target, control=4) for gate in circ]\n"," reference_states += [Circuit(gates)]\n","\n","# Calculate MRSQK\n","sab = np.zeros((n_krylov, n_krylov), dtype=complex)\n","hab = np.zeros((n_krylov, n_krylov), dtype=complex)\n","fhab = np.zeros((n_krylov, n_krylov), dtype=complex)\n","\n","for a, b in product(range(n_krylov), range(n_krylov)):\n"," # Generate Ua and Ub unitaries\n"," ua = reference_states[a%2] + c_trott * (a//2) if a > 1 else reference_states[a%2]\n"," ub = reference_states[b%2] + c_trott * (b//2) if b > 1 else reference_states[b%2]\n"," \n"," # Build circuit from Figure 2 for off-diagonal overlap\n"," hab_circuit = Circuit([Gate(\"H\", c_q)]) + ua + Circuit([Gate(\"X\", c_q)]) + ub\n"," sab[a, b] = backend.get_expectation_value(zeroone, hab_circuit) / 2\n"," sab[b, a] = sab[a, b].conj()\n","\n"," # Hamiltonian matrix element for f(H) = e^{-i H \\tau}\n"," fhab[a, b] = backend.get_expectation_value(zeroone, hab_circuit+c_trott.inverse())/2\n","\n"," # Return statevector for faster calculation of Hamiltonian matrix elements\n"," _ , initial_state = backend.simulate(hab_circuit, return_statevector=True)\n"," for i, (term, coeff) in enumerate(qu_op.terms.items()):\n","\n"," # From calculated statevector append controlled-pauliword for each term in Hamiltonian and measure zeroone\n"," expect = coeff*backend.get_expectation_value(zeroone, c_qu[i], initial_statevector=initial_state) / 2\n","\n"," # Add term to sum\n"," hab[a, b] += expect\n","\n","e, v = eigh(hab, sab)\n","print(f\"The HV=SVE energies are {e}\")\n","e = eigvals(fhab, sab)\n","print(f\"The f(H)V=SVf(E) energies are {np.arctan2(np.imag(e), np.real(e))/tau}\")\n","\n","algorithm_resources[\"mrsqk\"] = dict()\n","algorithm_resources[\"mrsqk\"][\"qubit_hamiltonian_terms\"] = 0\n","algorithm_resources[\"mrsqk\"][\"circuit_2qubit_gates\"] = hab_circuit.counts.get(\"CNOT\", 0)\n","algorithm_resources[\"mrsqk\"][\"n_post_terms\"] = n_krylov**2"]},{"cell_type":"markdown","metadata":{"id":"QiFCp4e6L8wy"},"source":["The calculated energies are very close to the exact energies calculated at the top of the notebook."]},{"cell_type":"markdown","metadata":{"id":"xwrLpY95L8wy"},"source":["### 3.2 Rodeo Algorithm \n","\n","Another method based on Hamiltonian simulation that can be used to obtain energies is the Rodeo Algorithm. This simulates the Hamiltonian for many random lengths of time with different input energies. The probability of the ancilla qubit being 0 for a given energy $E$ is $P_0(E) = \\frac{1 + e^{-\\sigma^2 (E_i - E)^2/2}}{2}$ where $E_i$ is one of the eigenvalues of the Hamiltonian. The algorithm is outlined in [arXiv:2110.07747](https://arxiv.org/abs/2110.07747). When the energy $E$ is close to an eigenvalue $E_i$, the probability is maximized. Therefore, one would observe peaks in success probability when the input energy $E$ is an eigenvalue. \n","\n","The cell illustrates this process over 10 iterations for each energy, for simplicity. We however show a plot resulting from 1,000 iterations afterwards. To reduce the computational complexity, we also use the [symmetry-conserving Bravyi-Kitaev](https://arXiv.org/abs/1701.08213) mapping to reduce the number of qubits to 2 by remove qubits corresponding to spin and electron number. This means we can only obtain the singlet state energies. A separate calculation would be needed to calculate the triplet energy."]},{"cell_type":"code","execution_count":23,"metadata":{"colab":{"background_save":true},"id":"kZmWnLmnL8wz"},"outputs":[],"source":["# One rodeo cycle as defined in Fig.1 of arXiv.2110.07747\n","def rodeo_cycle(hobj, energy, t, i):\n"," circuit = Circuit([Gate(\"H\", i)])\n"," circuit += trotterize(hobj, time=t, control=i, trotter_order=2, n_trotter_steps=40)\n"," circuit += Circuit([Gate(\"PHASE\", i, parameter=energy*t), Gate(\"H\", i)])\n"," return circuit"]},{"cell_type":"code","execution_count":24,"metadata":{"id":"8ygE_fkbL8wz"},"outputs":[],"source":["from tangelo.toolboxes.qubit_mappings.statevector_mapping import do_scbk_transform\n","\n","h_obj = f2q_mapping(mol_Li2.fermionic_hamiltonian, \"scbk\", mol_Li2.n_active_sos,\n"," mol_Li2.n_active_electrons, up_then_down=True, spin=mol_Li2.spin)\n","\n","n_qubits = count_qubits(h_obj)\n","\n","# Stretch factor of 300 to make eigenvalue gap larger. Therefore, time evolution needs to be shorter.\n","h_obj = 300*(h_obj - QubitOperator((), -14.85))\n","\n","sim = Simulator()\n","\n","sigma = 0.4\n","\n","# We will use multiple reference states as probability depends on overlap with starting state.\n","ref_states = [vector_to_circuit(do_scbk_transform([1, 1, 0, 0], 4)),\n"," vector_to_circuit(do_scbk_transform([1, 0, 1, 0], 4)),\n"," vector_to_circuit(do_scbk_transform([0, 0, 1, 1], 4))]\n","\n","# Equivalent to energies from -14.9 -> 14.75 for 10 iterations.\n","energies = [-0.05*300 +300*0.005*i for i in range(30)]\n","success_prob = list()\n","for energy in energies:\n"," success=0\n"," for sample in range(10):\n"," t = np.random.normal(0, sigma, 1)\n"," circuit = np.random.choice(ref_states)\n"," for i, tk in enumerate(t):\n"," circuit += rodeo_cycle(h_obj, energy, tk, i+n_qubits)\n"," f, _ = sim.simulate(circuit)\n"," for key, v in f.items():\n"," if key[2:] == \"0\":\n"," success += v\n"," success_prob.append(success/10)\n","\n","algorithm_resources[\"rodeo\"] = dict()\n","algorithm_resources[\"rodeo\"][\"qubit_hamiltonian_terms\"] = 0\n","algorithm_resources[\"rodeo\"][\"circuit_2qubit_gates\"] = circuit.counts.get(\"CNOT\", 0)\n","algorithm_resources[\"rodeo\"][\"n_post_terms\"] = 30"]},{"cell_type":"code","execution_count":25,"metadata":{"colab":{"background_save":true},"id":"9yufDRx1L8wz","outputId":"6cd8d620-cd5b-4921-ca50-36b24e3b0a67"},"outputs":[{"data":{"text/plain":["Text(0, 0.5, 'Success Probability')"]},"execution_count":25,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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1atXx6Sczz//PLnlllsIIYRs37496nJ6c/XVV5O///3vhBBCHn74YfK73/2OEEKITqcj6enpxGazxZycer2elJaWkqamJkJI5P9HhBCSEINpSktL/b723nvvYeLEiUhOTvb5end3N6RSKUpKSgAAF198MTZv3oyf//zn2LlzJ376059CIBDg3HPPhcFgQHt7O/Lz83mXE3CPADQajQDcdy8FBQWjPh8uXMn50ksvYcOGDUhPd48wzMnJiUk5AeC+++7DXXfdhUcffTQiGbmUc9GiRZ59zj33XLz22msxKefOnTuxadMmAMA111yD2267DYQQCASCqMjJYDQa8emnn3ru/AUCAUwmEwghMJvNyMjIgFgc/lckV3K+/vrruPrqqzFu3DgAkf8fAQk+ocxsNuPPf/4z9u7d69f8ysrKgsPhQHV1NSorK/H222+jpaUFAKDRaFBUVOTZt7CwEBqNJmxFEImcAPC3v/0NK1asgEKhQGpqKg4ePAgA2LRpE5YtW4Znn30WfX192LdvH6vysSVnbW0tAGDBggVwOp3YtGkTLrnkkpiTs6amBi0tLbjssstYUQRcyenNyy+/jEsvvTQm5fT+PxKLxVCpVOju7kZWVlZU5GR47733sGTJEqSmpgIAbrvtNlRVVaGgoAAmkwlvvPEGhEL2veeRyllbW4uBgQFcdNFFMJlM+M1vfoOf/vSnEckUNzGCpUuXYvr06SO2nTt3+n3Ppk2bcMcddyAlJcXvPgKBADt27MAdd9yBc845B0qlEiKRKObkBIAnn3wSu3btQmtrK372s59h48aNAIDt27fjxhtvRGtrK3bt2oV169bB5XLFnJwOhwN1dXU4cOAAtm/fjptvvhkGgyGm5HS5XNi4cSMef/zxUd8bbTm9ee2111BdXY3/9//+X0zLGQpcysmwfft2XHfddZ7f9+zZg4qKCrS1teHo0aO47bbbPBZOLMnpcDjw7bff4qOPPsKePXvw4IMPem6ywiZi51IMMdwXd8EFF5Dx48eT8ePHE5VKRdLT08mzzz476jH27NlDrr32WkIIIevXryevv/6657WSkhLS1tYWFTl1Oh2ZNGmS5/empiZSWlpKCCGkrKyMNDc3e16bOHEiK35DtuW85ZZbyCuvvOJ5bfHixeTw4cMxJafBYCCZmZme98tkMpKfnx9xnIBtORn27t1Lpk2b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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["fig, ax = plt.subplots()\n","fig.patch.set_facecolor('w')\n","ax.set_facecolor('w')\n","evals = [-14.8696203, -14.83876635, -14.78403833]\n","for e in evals:\n"," ax.axvline(x=e, color='r',ls='--')\n","ax.plot(np.array(energies)/300-14.85, success_prob)\n","ax.set_xlabel('Energy (Hartree)')\n","ax.set_ylabel('Success Probability')"]},{"cell_type":"markdown","metadata":{"id":"ZD4RJ1RML8wz"},"source":["The above plot shows promise that the correct energies indeed align with peaks in the success probability, despite our small number of iterations. To save time, below is the result after running the above code for 1000 iterations. The peaks are centered on the exact energies, represented by the vertical red dashed lines.\n","\n","\n",""]},{"cell_type":"markdown","metadata":{"id":"RUwlEQ-AL8wz"},"source":["## 4. Closing words \n","\n","We have shown a few of the many different algorithms that can be used to calculate excited states using Tangelo. Unlike ground states, the use of variational methods requires either penalizing against previously calculated states or the optimization of a collection of orthogonal states. Outside of variational methods, we have shown a few Hamiltonian simulation based algorithms to calculate excited states. \n","\n","But quantum resource requirements are an important aspect of quantum algorithm design: let's have a look at the resources required for each algorithm we tried on our use case. In particular, the following metrics:\n","\n","- `# measurements basis` is the number of distinct measurements for each function evaluation in the variational optimization process.\n","- `# CNOT gates` is the number of CNOT gates in each circuit.\n","- `# post measurements basis` is the number of measurements needed to successfully post-process the output of the algorithm. \n","\n","We note that `# CNOT gates` for each variational algorithm could be improved greatly if an algorithm such as ADAPT-VQE was used to create an ansatz. Similarly, `# CNOT gates` could be reduced for the time-evolution algorithms with more advanced approaches such as qubitization."]},{"cell_type":"code","execution_count":26,"metadata":{"colab":{"background_save":true},"id":"ES7gCpQXmVex","outputId":"c5daba74-9595-4fe8-cf5b-508ff5433521"},"outputs":[{"name":"stdout","output_type":"stream","text":["Algorithm # measurements # CNOT gates # post measurements \n","vqe_ground_state 15 64 0 \n","vqe_triplet_state 15 128 0 \n","vqe_deflation_state_1 16 192 0 \n","vqe_deflation_state_2 17 192 0 \n","vqe_deflation_state_3 18 192 0 \n","quantum_subspace_expansion 18 192 288 \n","sa_vqe 60 128 0 \n","mc_vqe 60 128 540 \n","sa_vqe_deflation 18 192 0 \n","sa_oo_vqe 30 128 0 \n","mrsqk 0 72 16 \n","rodeo 0 320 30 \n"]}],"source":["format = \"{:<40} {:<20} {:<20} {:<20}\"\n","print(format.format(\"Algorithm\", \"# measurements\", \"# CNOT gates\", \"# post measurements\"))\n","for method, resources in algorithm_resources.items():\n"," print(format.format(method, resources[\"qubit_hamiltonian_terms\"], resources[\"circuit_2qubit_gates\"], resources.get(\"n_post_terms\", 0)))"]},{"cell_type":"markdown","metadata":{"id":"6cT7h0NhmNEt"},"source":["These are the resource requirements that came out from calculations on our small Li$_2$ use case in minimal basis set, featuring two 2 electrons in 2 orbitals.\n","\n","But what of BODIPY ?"]},{"cell_type":"code","execution_count":27,"metadata":{"id":"g86VlhxYL8w0"},"outputs":[{"name":"stdout","output_type":"stream","text":["Active electrons = 63\n","Active orbitals = 70\n"]}],"source":["bodipy = SQMol(\"data/bodipy.xyz\", q=0, spin=0, basis=\"sto-3g\")\n","print(f\"Active electrons = {bodipy.n_active_mos}\")\n","print(f\"Active orbitals = {bodipy.n_active_electrons}\")"]},{"cell_type":"markdown","metadata":{"id":"35WSxIsRL8w0"},"source":["Whereas we did calculations with 2 electrons in 2 orbitals, the full calculation of BODIPY in the minimal STO-3G basis would entail 63 electrons in 70 orbitals, with the core electrons frozen. The number of qubits needed to represent this would be 140 for the Jordan-Wigner mapping, compared to the 4 (+1 ansatz for the Hamiltonian simulation algorithms) qubits used in this notebook. [J. Chem. Theory. Comput. 2015, 11, 6](https://pubs.acs.org/doi/10.1021/ct500775r) showed reasonable results using CASSCF with 12 electrons in 11 orbitals, which would be a 22-qubit problem using the Jordan-Wigner mapping. Another issue is the number of CNOT gates, which would be much larger for the full 22-qubit problem than shown in the table for our use case. \n","\n","This system is orders or magnitude harder, and emphasize how it is crucial that we design and choose approaches that require as little quantum computational resources as possible to make such use cases tractable in the future.\n","\n","There is still much work to be done to efficiently calculate excited states using quantum computers, and allow us to tackle more industrially-relevant use cases.\n","\n","What will you do with Tangelo? "]}],"metadata":{"colab":{"collapsed_sections":[],"name":"excited_states.ipynb","provenance":[]},"interpreter":{"hash":"95050af2697fca56ed7491a4fb0b04c1282c0de0a7e0a7cacd318a8297b0b1d8"},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.10"}},"nbformat":4,"nbformat_minor":0} diff --git a/examples/img/bodipy_absorption.png b/examples/img/bodipy_absorption.png new file mode 100644 index 0000000000000000000000000000000000000000..4da326d80f2158bebc592857d4bdf0b89792f0b1 GIT binary patch literal 29611 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 PH!TBfeJs$i&a%Xl! literal 0 HcmV?d00001 diff --git a/examples/img/li2_4.png b/examples/img/li2_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8a4c7947b15325d4ff8ff516dc8c4a6a7aa319 GIT binary patch literal 57417 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 literal 0 HcmV?d00001 diff --git a/examples/img/li2_4_opt.png b/examples/img/li2_4_opt.png new file mode 100644 index 0000000000000000000000000000000000000000..485c331f81e64ccaa38ef08db5ce936587847f71 GIT binary patch literal 71465 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 literal 0 HcmV?d00001 diff --git a/examples/img/rodeo_1000.png b/examples/img/rodeo_1000.png new file mode 100644 index 0000000000000000000000000000000000000000..16aa6f7baa6b0a732b55129cd59fe509870a393f GIT binary patch literal 23298 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 Date: Thu, 25 Aug 2022 16:03:38 -0400 Subject: [PATCH 12/12] Translation function for qubit operators (#196) * Qiskit (PauliOpSum) <-> Tangelo operator conversion functions. * added test with timers for large operator conversion between qiskit and tangelo Co-authored-by: Valentin Senicourt --- tangelo/linq/tests/data/H2_JW_occfirst.data | 16 +++ tangelo/linq/tests/test_simulator.py | 11 +- tangelo/linq/tests/test_translator_qubitop.py | 112 ++++++++++++++++++ tangelo/linq/translator/__init__.py | 1 + tangelo/linq/translator/translate_qiskit.py | 65 +++++++++- tangelo/linq/translator/translate_qubitop.py | 59 +++++++++ 6 files changed, 259 insertions(+), 5 deletions(-) create mode 100644 tangelo/linq/tests/data/H2_JW_occfirst.data create mode 100644 tangelo/linq/tests/test_translator_qubitop.py create mode 100644 tangelo/linq/translator/translate_qubitop.py diff --git a/tangelo/linq/tests/data/H2_JW_occfirst.data b/tangelo/linq/tests/data/H2_JW_occfirst.data new file mode 100644 index 000000000..0902dc2f8 --- /dev/null +++ b/tangelo/linq/tests/data/H2_JW_occfirst.data @@ -0,0 +1,16 @@ +QubitOperator: +(-0.10973055606700678+0j) [] + +(-0.0454428841443262+0j) [X0 X1 Y2 Y3] + +(0.0454428841443262+0j) [X0 Y1 Y2 X3] + +(0.0454428841443262+0j) [Y0 X1 X2 Y3] + +(-0.0454428841443262+0j) [Y0 Y1 X2 X3] + +(0.16988452027940382+0j) [Z0] + +(0.16821198673715723+0j) [Z0 Z1] + +(0.12005143072546026+0j) [Z0 Z2] + +(0.16549431486978647+0j) [Z0 Z3] + +(0.16988452027940382+0j) [Z1] + +(0.16549431486978647+0j) [Z1 Z2] + +(0.12005143072546026+0j) [Z1 Z3] + +(-0.21886306781219628+0j) [Z2] + +(0.17395378776494128+0j) [Z2 Z3] + +(-0.21886306781219633+0j) [Z3] \ No newline at end of file diff --git a/tangelo/linq/tests/test_simulator.py b/tangelo/linq/tests/test_simulator.py index 6b8297627..efa50f170 100644 --- a/tangelo/linq/tests/test_simulator.py +++ b/tangelo/linq/tests/test_simulator.py @@ -33,26 +33,31 @@ # Simple circuit for superposition, also tells us qubit ordering as well immediately from the statevector # probabilities : |00> = 0.5 |01> = 0.5 circuit1 = Circuit([Gate("H", 0)], n_qubits=2) + # 2-qubit circuit checking all the basic gates that are not defined up to a convention (e.g unambiguous) mygates = [Gate("H", 0), Gate("S", 0), Gate("X", 0), Gate("T", 1), Gate("Y", 1), Gate("Z", 1)] mygates += [Gate("CNOT", 1, control=0)] circuit2 = Circuit(mygates) + # Circuit for the parametrized rotation gates Rx and Ry. Some convention about the sign of theta or a phase may appear circuit3 = Circuit([Gate("RX", 0, parameter=2.), Gate("RY", 1, parameter=-1.)]) + # Circuit for the parametrized rotation gate Rz. Some convention about the sign of theta or a phase may appear circuit4 = Circuit([Gate("RZ", 0, parameter=2.)], n_qubits=2) + # Circuit that tests all gates that are supported on all simulators init_gates = [Gate('H', 0), Gate('X', 1), Gate('H', 2)] one_qubit_gate_names = ["H", "X", "Y", "Z", "S", "T", "RX", "RY", "RZ", "PHASE"] one_qubit_gates = [Gate(name, target=0) if name not in PARAMETERIZED_GATES else Gate(name, target=0, parameter=0.5) - for name in one_qubit_gate_names] + for name in one_qubit_gate_names] one_qubit_gates += [Gate(name, target=1) if name not in PARAMETERIZED_GATES else Gate(name, target=1, parameter=0.2) - for name in one_qubit_gate_names] + for name in one_qubit_gate_names] two_qubit_gate_names = ["CNOT", "CH", "CX", "CY", "CZ", "CRX", "CRY", "CRZ", "CPHASE"] two_qubit_gates = [Gate(name, target=1, control=0) if name not in PARAMETERIZED_GATES - else Gate(name, target=1, control=0, parameter=0.5) for name in two_qubit_gate_names] + else Gate(name, target=1, control=0, parameter=0.5) for name in two_qubit_gate_names] swap_gates = [Gate('SWAP', target=[1, 0]), Gate('CSWAP', target=[1, 2], control=0)] circuit5 = Circuit(init_gates + one_qubit_gates + two_qubit_gates + swap_gates) + # Circuit preparing a mixed-state (e.g containing a MEASURE instruction in the middle of the circuit) circuit_mixed = Circuit([Gate("RX", 0, parameter=2.), Gate("RY", 1, parameter=-1.), Gate("MEASURE", 0), Gate("X", 0)]) diff --git a/tangelo/linq/tests/test_translator_qubitop.py b/tangelo/linq/tests/test_translator_qubitop.py new file mode 100644 index 000000000..61ab9f5c6 --- /dev/null +++ b/tangelo/linq/tests/test_translator_qubitop.py @@ -0,0 +1,112 @@ +# Copyright 2021 Good Chemistry Company. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import unittest +import time +from itertools import product + +import numpy as np +from openfermion.utils import load_operator +from openfermion.linalg import eigenspectrum + +from tangelo.helpers.utils import installed_backends +from tangelo.linq import translate_operator +from tangelo.toolboxes.operators import QubitOperator + +# For openfermion.load_operator function. +pwd_this_test = os.path.dirname(os.path.abspath(__file__)) + +tangelo_op = QubitOperator("X0 Y1 Z2", 1.) + + +class TranslateOperatorTest(unittest.TestCase): + + def test_unsupported_source(self): + """Test error with an unsuported source.""" + + with self.assertRaises(NotImplementedError): + translate_operator(tangelo_op, source="sourcenotsupported", target="tangelo") + + def test_unsupported_target(self): + """Test error with an unsuported target.""" + + with self.assertRaises(NotImplementedError): + translate_operator(tangelo_op, source="tangelo", target="targetnotsupported") + + @unittest.skipIf("qiskit" not in installed_backends, "Test Skipped: Qiskit not available \n") + def test_qiskit_to_tangelo(self): + """Test translation from a qiskit to a tangelo operator.""" + + from qiskit.opflow.primitive_ops import PauliSumOp + qiskit_op = PauliSumOp.from_list([("ZYX", 1.)]) + + test_op = translate_operator(qiskit_op, source="qiskit", target="tangelo") + self.assertEqual(test_op, tangelo_op) + + @unittest.skipIf("qiskit" not in installed_backends, "Test Skipped: Qiskit not available \n") + def test_tangelo_to_qiskit(self): + """Test translation from a tangelo to a qiskit operator.""" + + from qiskit.opflow.primitive_ops import PauliSumOp + qiskit_op = PauliSumOp.from_list([("ZYX", 1.)]) + + test_op = translate_operator(tangelo_op, source="tangelo", target="qiskit") + self.assertEqual(qiskit_op, test_op) + + @unittest.skipIf("qiskit" not in installed_backends, "Test Skipped: Qiskit not available \n") + def test_tangelo_to_qiskit_H2_eigenvalues(self): + """Test eigenvalues resulting from a tangelo to qiskit translation.""" + + from qiskit.algorithms import NumPyEigensolver + + qu_op = load_operator("H2_JW_occfirst.data", data_directory=pwd_this_test+"/data", plain_text=True) + test_op = translate_operator(qu_op, source="tangelo", target="qiskit") + + eigenvalues_tangelo = eigenspectrum(qu_op) + + qiskit_solver = NumPyEigensolver(2**4) + eigenvalues_qiskit = qiskit_solver.compute_eigenvalues(test_op) + + np.testing.assert_array_almost_equal(eigenvalues_tangelo, eigenvalues_qiskit.eigenvalues) + + @unittest.skipIf("qiskit" not in installed_backends, "Test Skipped: Qiskit not available \n") + def test_tangelo_to_qiskit_big(self): + """Test translation from a tangelo to a qiskit operator, for a large input""" + + n_qubits = 10 + n_terms = 3**n_qubits + + # Build large operator made of all possible "full" Pauli words (no 'I') of length n_qubits + terms = {tuple(zip(range(n_qubits), pw)): 1.0 for pw in product(['X', 'Y', 'Z'], repeat=n_qubits)} + q_op = QubitOperator() + q_op.terms = terms + + s, t = "tangelo", "qiskit" + tstart1 = time.time() + tmp_op = translate_operator(q_op, source=s, target=t) + tstop1 = time.time() + print(f"Qubit operator conversion {s} to {t}: {tstop1 - tstart1:.1f} (terms = {n_terms})") + + t, s = s, t + tstart2 = time.time() + q_op2 = translate_operator(tmp_op, source=s, target=t) + tstop2 = time.time() + print(f"Qubit operator conversion {s} to {t}: {tstop2 - tstart2:.1f} (terms = {n_terms})") + + assert(q_op == q_op2) + + +if __name__ == "__main__": + unittest.main() diff --git a/tangelo/linq/translator/__init__.py b/tangelo/linq/translator/__init__.py index 02da3c729..dde9b355a 100644 --- a/tangelo/linq/translator/__init__.py +++ b/tangelo/linq/translator/__init__.py @@ -22,6 +22,7 @@ from .translate_qdk import translate_qsharp, get_qdk_gates from .translate_projectq import translate_projectq, _translate_projectq2abs, get_projectq_gates from .translate_openqasm import translate_openqasm, _translate_openqasm2abs, get_openqasm_gates +from .translate_qubitop import translate_operator # List all supported gates for all backends found diff --git a/tangelo/linq/translator/translate_qiskit.py b/tangelo/linq/translator/translate_qiskit.py index eb972bd53..29eedb9f9 100644 --- a/tangelo/linq/translator/translate_qiskit.py +++ b/tangelo/linq/translator/translate_qiskit.py @@ -12,16 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Functions helping with quantum circuit format conversion between abstract -format and qiskit format. +"""Functions helping with quantum circuit and operator format conversion between +Tangelo format and qiskit format. In order to produce an equivalent circuit for the target backend, it is necessary to account for: - how the gate names differ between the source backend to the target backend. - how the order and conventions for some of the inputs to the gate operations may also differ. + +The module also enables bidirectional conversion between qiskit and Tangelo +qubit operators (linear combination of Pauli operators) """ +from tangelo.toolboxes.operators import QubitOperator +from tangelo.linq.helpers import pauli_of_to_string, pauli_string_to_of + def get_qiskit_gates(): """Map gate name of the abstract format to the equivalent add_gate method of @@ -98,3 +104,58 @@ def translate_qiskit(source_circuit): else: raise ValueError(f"Gate '{gate.name}' not supported on backend qiskit") return target_circuit + + +def translate_op_to_qiskit(qubit_operator, n_qubits): + """Helper function to translate a Tangelo QubitOperator to a qiskit + PauliSumOp. Qiskit must be installed for the function to work. + + Args: + qubit_operator (tangelo.toolboxes.operators.QubitOperator): Self-explanatory. + n_qubits (int): Number of qubits relevant to the operator. + + Returns: + (qiskit.opflow.primitive_ops.PauliSumOp): Qiskit qubit operator. + """ + + # Import qiskit qubit operator. + from qiskit.opflow.primitive_ops import PauliSumOp + + # Convert each term sequencially. + term_list = list() + for term_tuple, coeff in qubit_operator.terms.items(): + term_string = pauli_of_to_string(term_tuple, n_qubits) + + # Reverse the string because of qiskit convention. + term_list += [(term_string[::-1], coeff)] + + return PauliSumOp.from_list(term_list) + + +def translate_op_from_qiskit(qubit_operator): + """Helper function to translate a qiskit PauliSumOp to a Tangelo + QubitOperator. + + Args: + qubit_operator (qiskit.opflow.primitive_ops.PauliSumOp): Self-explanatory. + + Returns: + (tangelo.toolboxes.operators.QubitOperator): Tangelo qubit operator. + """ + + # Create a dictionary to append all terms at once. + terms_dict = dict() + for pauli_word in qubit_operator: + # Inversion of the string because of qiskit ordering. + term_string = pauli_word.to_pauli_op().primitive.to_label()[::-1] + term_tuple = pauli_string_to_of(term_string) + terms_dict[tuple(term_tuple)] = pauli_word.coeff + + # Create and copy the information into a new QubitOperator. + tangelo_op = QubitOperator() + tangelo_op.terms = terms_dict + + # Clean the QubitOperator. + tangelo_op.compress() + + return tangelo_op diff --git a/tangelo/linq/translator/translate_qubitop.py b/tangelo/linq/translator/translate_qubitop.py new file mode 100644 index 000000000..667fd7aea --- /dev/null +++ b/tangelo/linq/translator/translate_qubitop.py @@ -0,0 +1,59 @@ +# Copyright 2021 Good Chemistry Company. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Module to convert qubit operators to different formats.""" + +from tangelo.toolboxes.operators import count_qubits +from tangelo.linq.translator.translate_qiskit import translate_op_from_qiskit, translate_op_to_qiskit + + +FROM_TANGELO = { + "qiskit": translate_op_to_qiskit +} + +TO_TANGELO = { + "qiskit": translate_op_from_qiskit +} + + +def translate_operator(qubit_operator, source, target, n_qubits=None): + """Function to convert a qubit operator defined within the "source" format + to a "target" format. + + Args: + qubit_operator (source format): Self-explanatory. + source (string): Identifier for the source format. + target (string): Identifier for the target format. + n_qubits (int): Number of qubits relevant to the operator. + + Returns: + (operator in target format): Translated qubit operator. + """ + + source = source.lower() + target = target.lower() + + if source == target: + return qubit_operator + if source != "tangelo": + if source not in TO_TANGELO: + raise NotImplementedError(f"Qubit operator conversion from {source} to {target} is not supported.") + qubit_operator = TO_TANGELO[source](qubit_operator) + if target != "tangelo": + if target not in FROM_TANGELO: + raise NotImplementedError(f"Qubit operator conversion from {source} to {target} is not supported.") + n_qubits = count_qubits(qubit_operator) if n_qubits is None else n_qubits + qubit_operator = FROM_TANGELO[target](qubit_operator, n_qubits) + + return qubit_operator