diff --git a/content/lab-4/Kai-Chun Lin_Score_Fall22_Lab4.ipynb b/content/lab-4/Kai-Chun Lin_Score_Fall22_Lab4.ipynb new file mode 100644 index 00000000..f672dbfa --- /dev/null +++ b/content/lab-4/Kai-Chun Lin_Score_Fall22_Lab4.ipynb @@ -0,0 +1,3068 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1e0efada-b53a-4a9b-a52d-7fa35977c687", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "81f8836f-1c26-4299-a74e-2adc06bfe34d", + "metadata": {}, + "source": [ + "# Quantum Chemistry Challenge - Use Quantum Computers to Explore Interstellar Space!" + ] + }, + { + "cell_type": "markdown", + "id": "b8570ffe", + "metadata": {}, + "source": [ + "# Table of Contents\n", + "- **[Story](#Story---Chapter-4)**\n", + "- **[Introduction: Special Chemistry of Interstellar Molecules](#Introduction:-Special-Chemistry-of-Interstellar-Molecules)**\n", + "- **[VQE Syllabi](#VQE-syllabi)**\n", + "- **[Part I: Exploring Interstellar $H_3^+$](#Part-I:-Exploring-Interstellar-$H_3^+$)**\n", + " - **[Exercise 1: Defining Molecule declaration for $H_3^+$](#exercise1)**\n", + " - **[Exercise 2: Building up VQE using Estimator](#exercise2)**\n", + " - **[Exercise 3: Creating helper functions](#exercise3)**\n", + " - **[Exercise 4: Computing reaction energy of $H_3^+$](#exercise4)**\n", + "- **[Part II: Exploring Interstellar Cyclopropenylidene($C_3H_2$)](#Part-II:-Exploring-Interstellar-Cyclopropenylidene($C_3H_2$))**\n", + " - **[Exercise 5: Exploring the first excited state and computing dipole moment of Cyclopropenylidene](#exercise5)**\n", + "- **[Part III: Final Challenge - Exploring the Interstellar Cyclopropenylidene($C_3H_2$) Reaction Chain](#Part-III:-Final-Challenge---Exploring-the-Interstellar-Cyclopropenylidene($C_3H_2$)-Reaction-Chain)**\n", + " - **[Final Challenge: computing the reaction energy of C + C2H2 →C3H2](##Final-Challenge---Compute-Reaction-energy-of-C-+-C2H2-→C3H2)**" + ] + }, + { + "cell_type": "markdown", + "id": "9d0aaf1e-c680-4fd2-9d48-c00773e3176b", + "metadata": {}, + "source": [ + "# Story - Chapter 4\n", + "\n", + "With your path clear, you are prepared for your slingshot around the planet. But you want to increase your chances of success as much as possible, and it occurs to you there’s one last thing you can do before you attempt the maneuver. \n", + "\n", + "You see, one of the magnificent discoveries Earth scientists made while inventing interstellar travel technologies is that certain dense cosmic clouds, especially those containing Hydrogenium ($H_3^+$), Interstellar Cycloproenylidene ($C_3H_2$), or a combination of them, boost starship velocity without expending extra fuel. Like sledding down a steep hill, or sliding a block across an oiled surface. \n", + "\n", + "If you can find such a cloud within the vicinity of your slingshot path, you can increase your chances of escape. It would be as though a hand of cosmic dust pushes your starship, providing more force to your slingshot. \n", + "\n", + "But when your systems were broken, certain memory files were corrupted, and you no longer have the molecular properties your scanners require to identify such clouds. You must re-do the calculations. And the more precise your calculations, the more precise your scanners will be! \n", + "\n", + "Complete these exercises to calculate and analyze the various molecular properties required to calibrate your scanner’s sensors and potentially discover cosmic clouds that will aid in your escape. " + ] + }, + { + "cell_type": "markdown", + "id": "6b53f499-906a-4489-9e8c-582daead659b", + "metadata": {}, + "source": [ + "# Introduction: Special Chemistry of Interstellar Molecules" + ] + }, + { + "cell_type": "markdown", + "id": "6f5294d9-614b-4565-b212-311d83f8b30b", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "13cac829-2b5f-4cbc-b091-29670aedaa0d", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "Interstellar space is the most remarkable chemical laboratory for many unstable species which are rarely found on Earth. Due to its extreme environment, a large number of chemical processes are very different from how they would behave in the Earth's environment. There are three main types of chemical processes that occur in interstellar and circumstellar regions, these are **[[1]](https://www.astronomy.ohio-state.edu/pogge.1/Ast871/Notes/Molecules.pdf)**:\n", + "\n", + "1. Gas phase processes between atoms, ions and molecules, promoted by photoionization, photodissociation, and cosmic ray ionization\n", + "2. Reactions on the surfaces of bare grains, with either prompt or delayed ejection of products into the gas phase\n", + "3. Accumulation of molecular ices on the surfaces of dust inside dark clouds, with activation of these ices by cosmic rays or photons and subsequent reactions between the radicals so generated to form species of greater complexity **[[2]](https://pubs.rsc.org/en/content/chapterhtml/2017/bk9781782627760-00001?isbn=978-1-78262-776-0)**\n", + "\n", + "This fascinating interstellar chemistry began in the 1930's with the observation of molecular absorption spectra in distant stars within the galaxy. The species CH, CH+, and CN all have electronic spectra in an accessible wavelength region where the Earth’s atmosphere is still transparent. So far, spectroscopic development including radioastronomy has contributed greatly to unveiling abundant species of molecules in the universe, and also gives us a lot of information on the chemical reaction process that happens there **[[3]](https://www.pnas.org/doi/full/10.1073/pnas.0605352103)**.\n", + "\n", + "In this lab, we will look into a few well-known interstellar chemical reactions and compute a few properties of specific molecules. We will first start off by exploring the formation of interstellar $H_3^+$ ions using $H_2$ and ionized $H_2^+$. Here we will start off by computing the reaction energy by solving for the ground state energy of the participating molecules by building a **Variational Quantum Eigensolver (VQE)** routine. This will be followed by demonstrating how we can compute molecular properties of interest using the ground state energy information obtained by VQE by other approaches dependent on the same. We will be specifically looking and investigating the excited energy absorption spectra and the dipole moment $C_3H_2$ by using a VQD(Variational Quantum Deflation) approach and the Estimator primitive. $C_3H_2$ is a highly reactive class of organic molecules known as carbenes which are only seen in the laboratory due to their reactivity on Earth but are found in significant concentrations in the interstellar medium (ISM) and on Saturn's moon Titan **[[5]](https://pubs.rsc.org/en/content/articlelanding/2003/CP/b303753n)**. Finally, we shall compute the reaction energy of creation of $C_3H_2$ which is our final competition problem to find the best way to have this calculation run on a noisy simulation **[[6]](https://en.wikipedia.org/wiki/Cyclopropenylidene)**. \n", + "\n", + "For this lab, we will be building up a VQE routine ground up as compared to using the VQE class in the previous problem. Before we begin, we shall briefly go through basics of VQE and basic problem formation using Qiskit Nature for those who are unfamiliar with these concepts." + ] + }, + { + "cell_type": "markdown", + "id": "5b586139-ea69-43e7-940b-5317db10b17c", + "metadata": {}, + "source": [ + "\n", + "# VQE syllabi" + ] + }, + { + "cell_type": "markdown", + "id": "7f043602-a3c7-48fa-9949-06f84836807d", + "metadata": {}, + "source": [ + "
\n", + " \n", + " References for additional details \n", + "\n", + "For the Qiskit Nature tutorials that implement this algorithm see **[here](https://qiskit.org/documentation/nature/tutorials/01_electronic_structure.html)**.\n", + "For additional information, please refer to Qiskit Github **[first page of github repository](https://github.com/Qiskit/qiskit-nature)** >>> the **[test folder](https://github.com/Qiskit/qiskit-nature/tree/main/test)** with the base code for the use of each functionality.\n", + " \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f77c01e2-7111-4a66-8b81-634cb28e8535", + "metadata": {}, + "source": [ + "\n", + "# Part I: Exploring Interstellar $H_3^+$\n", + "\n", + "In the 21st century astrophysics, the study of molecules in interstellar medium is of great interest to uncover information about formation of stars and galaxies in the universe. When Watson, Herbst & Klemperer in 1973 proposed that interstellar molecules may be combining in an ion-molecule type of reaction, it was clear $H_3^+$ ions play an important role in the interstellar environment. **[[7]](https://www.cambridge.org/core/journals/international-journal-of-astrobiology/article/abs/h3-the-initiator-of-interstellar-chemistry/69C0753DDB337E4475416CB6FA3D802D)**\n", + "\n", + "The $H_3^+$ ion, so called \"interstellar acid\" plays a central role in interstellar chemistry acting as proton donors (acid) through the proton-hop reaction. $H_3$ is produced by the reaction $H_2 + H_2^+ → H_3^+ + H$ in which a proton in $H_2^+$ hops to molecular hydrogen. In interstellar space, cosmic rays are capable of ionizing $H_2$ and are always present. $H_3^+$ is also always ubiquitous as long as $H_2$ is present **[[7]](https://www.cambridge.org/core/journals/international-journal-of-astrobiology/article/abs/h3-the-initiator-of-interstellar-chemistry/69C0753DDB337E4475416CB6FA3D802D)**.\n", + "\n", + "As shown explained in the following paper **[[8]](https://arxiv.org/ftp/arxiv/papers/1707/1707.07926.pdf)** , $H_3^+$ is located at an important point in the ion-molecular chemistry tree and plays a pivotal role in the generation of organic molecules." + ] + }, + { + "cell_type": "markdown", + "id": "7eca19ca-2566-463e-aedb-e4e5c7e2d87f", + "metadata": {}, + "source": [ + "We will study the fundamentals of computing the ground state energy of $H_3^+$ ions using Qiskit to get you warmed up with some quantum chemistry tasks. You will be required to determine the reaction energy required to produce $H_3^+$ ions. Cosmic rays that ionize from each of the reacting molecules ground states yield $H_3^+$ ions which we will be looking into for the exercise." + ] + }, + { + "cell_type": "markdown", + "id": "c0e51df1-cd1b-47a2-9337-6af4d13c17e6", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "e9e2fa76-5ab7-4b0e-a05c-654eb3b057df", + "metadata": {}, + "source": [ + "## Importing Libraries \n", + "\n", + "First, let's start by importing some libraries. We shall be using one of Qiskit's application modules: Qiskit Nature here for loading chemistry drivers and the necessary functions to help us formulate our problem and solve for the molecule we have at hand." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "36fd92cc-3c83-4084-93d3-6e425173af3c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Import necessary libraries and packages\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "from qiskit import Aer, IBMQ, QuantumCircuit\n", + "from qiskit.primitives import Estimator\n", + "from qiskit.providers.aer import StatevectorSimulator\n", + "from qiskit.utils import QuantumInstance\n", + "\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "\n", + "# Import Qiskit libraries for VQE\n", + "from qiskit.algorithms import MinimumEigensolverResult, VQE\n", + "from qiskit.algorithms.optimizers import SLSQP, SPSA\n", + "\n", + "# Import Qiskit Nature libraries\n", + "from qiskit_nature.algorithms import GroundStateEigensolver, VQEUCCFactory\n", + "from qiskit_nature.algorithms.ground_state_solvers.minimum_eigensolver_factories import NumPyMinimumEigensolverFactory\n", + "from qiskit_nature.circuit.library import UCC, UCCSD\n", + "from qiskit_nature.drivers import Molecule\n", + "from qiskit_nature.drivers.second_quantization import ElectronicStructureDriverType, ElectronicStructureMoleculeDriver\n", + "from qiskit_nature.converters.second_quantization import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import BravyiKitaevMapper, JordanWignerMapper, ParityMapper\n", + "from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem\n", + "from qiskit_nature.transformers.second_quantization.electronic import ActiveSpaceTransformer\n", + "\n", + "# Prototype-zne\n", + "!pip install prototype-zne --quiet\n", + "\n", + "from qiskit_nature.settings import settings\n", + "\n", + "settings.dict_aux_operators = True" + ] + }, + { + "cell_type": "markdown", + "id": "f7a4c161-408a-4ead-a55f-fa766b37935d", + "metadata": {}, + "source": [ + "## Building up our Model ground up\n", + "\n", + "### 1. Define molecule geometry and get molecular properties\n", + "\n", + "The first step is to define our molecules by specifying their atomic coordinates, total spin (multiplicity) and charge information. For this, we will first declare molecular structure in cartesian coordinates and set a chemical driver according to its charge and multiplicity.\n", + "\n", + "Molecular geometry can be found by searching research papers **[[9]](https://pubchem.ncbi.nlm.nih.gov/) [[10]](https://webbook.nist.gov/chemistry/form-ser/)**. In this exercise, we will use the properties that originate from this source **[[11]](https://aip.scitation.org/doi/abs/10.1063/1.433585)** with an approximation of the equilateral triangle structure like below picture.\n", + "\n", + "The multiplicity of energy levels is defined as $2S + 1$, where $S$ is the total spin of the molecule. $H_3^+$ has two electrons, and by obeying the **[Aufbau principle](https://en.wikipedia.org/wiki/Aufbau_principle)** and **[Pauli principle](https://en.wikipedia.org/wiki/Pauli_exclusion_principle)**, two electron's total spin are cancelled out due to their configuration ($\\uparrow + \\downarrow $), leading to a multiplicity of 1.\n", + "\n", + "With this information, let's finish the below part to include the proper molecular structure." + ] + }, + { + "cell_type": "markdown", + "id": "619ac424-9849-477a-b299-b22fc49cd723", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise 1: \n", + " \n", + "Complete the below Molecule declaration according to the structure of $H_3^+$. According to the reference, the atomic distance between $H$ is **0.91396** $\\text{Ă…}$ and it is equilateral triangle structure. Our target molecule contains **two electrons** with **charge +1**. To grade your answer, do not change the basis.
" + ] + }, + { + "cell_type": "markdown", + "id": "f8e544a3-c977-4ab4-a747-6a21f2bd3f7e", + "metadata": {}, + "source": [ + "
\n", + " Note from Sensei: Spin and Multiplicity of molecules \n", + "\n", + "We need to specify which electronic state to compute. In quantum chemistry calculations, $S$ corresponds to the spin of the unpaired electrons. The spin of electrons is $\\frac{1}{2}$, thus the total spin can be described as follows,
\n", + "$S = \\frac{1}{2} \\times \\mathrm{number\\ of\\ unpaired\\ electrons}$.
\n", + "The spin multiplicity is $2S + 1$, which is \"$\\mathrm{number\\ of\\ unpaired\\ electrons}+1$\".\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "34904f45-99ca-4769-97eb-a3e983c81199", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d53fa961-9911-43e8-b11a-02d6a9d93060", + "metadata": {}, + "outputs": [], + "source": [ + "#### Fill in the values below and complete the function to define the Molecule ####\n", + "\n", + "# Coordinates are given in Angstrom\n", + "hydrogen_t = [[\"H\", [0.45698, 0.0, 0.0]], # ----------- Enter your code here\n", + " [\"H\", [-0.45698, 0.0, 0.0]], # ----------- Enter your code here\n", + " [\"H\", [0.0, 0.791513, 0.0]]]\n", + " \n", + "h3p = Molecule( # Fill up the function below\n", + " geometry= hydrogen_t, # ----------- Enter your code here\n", + " multiplicity= 1, # ----------- Enter your code here\n", + " charge=1, # ----------- Enter your code here\n", + ")\n", + "\n", + "driver = ElectronicStructureMoleculeDriver(h3p, basis=\"ccpvdz\", driver_type=ElectronicStructureDriverType.PYSCF) \n", + "\n", + "properties = driver.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f3f54fbe-b343-4d57-b3b9-8eaef5b871bf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Submitting your answer. Please wait...\n", + "Congratulations 🎉! Your answer is correct and has been submitted.\n" + ] + } + ], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_ex1\n", + "\n", + "grade_lab4_ex1(h3p)" + ] + }, + { + "cell_type": "markdown", + "id": "c7922c09-4039-4959-9fa7-50368e1df400", + "metadata": {}, + "source": [ + "The Qiskit Nature driver gives us some properties of the molecule (see also: **[The Property Framework](https://qiskit.org/documentation/nature/tutorials/08_property_framework.html)**), let's check some out now!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0599238c-5dbc-49aa-a391-eed022e506f7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of alpha electrons: 1\n", + "number of beta electrons: 1\n", + "number of spin orbitals: 30\n", + "nuclear repulsion energy: 1.736981060004552\n" + ] + } + ], + "source": [ + "num_alpha_electrons = properties.get_property('ParticleNumber').num_alpha\n", + "num_beta_electrons = properties.get_property('ParticleNumber').num_beta\n", + "num_spin_orbitals = int(properties.get_property('ParticleNumber').num_spin_orbitals)\n", + "\n", + "nuclear_rep_energy = properties.get_property('ElectronicEnergy').nuclear_repulsion_energy\n", + "print(\"number of alpha electrons: \" , num_alpha_electrons)\n", + "print(\"number of beta electrons: \" , num_beta_electrons)\n", + "print(\"number of spin orbitals: \" , num_spin_orbitals)\n", + "print(\"nuclear repulsion energy: \" , nuclear_rep_energy)" + ] + }, + { + "cell_type": "markdown", + "id": "2bced4a1-ba4b-46f0-bc62-f86491883e1a", + "metadata": {}, + "source": [ + "### 2. Electronic Structure Problem and Active Space Transformer\n", + "\n", + "\n", + "The next step is to select our active space which will describe what molecular orbitals will be simulated with VQE and treat the rest with classical methods. The more orbitals we include in our active space, the more computationally expensive our quantum circuit will be. As such, the goal is to construct the most accurate active space with as fewest orbitals as possible. \n", + "\n", + "In Qiskit Nature, we use `ActiveSpaceTransformer` to specify how many electrons and molecular orbitals we would like to have in our active space, as well as which of those particular orbitals we would like to consider. \n", + "After that, you can then create an `ElectronicStructureProblem` that produces a list of fermionic operators before mapping them to qubits (Pauli strings)." + ] + }, + { + "cell_type": "markdown", + "id": "844b3d29-d160-4872-9a49-f5500188d634", + "metadata": {}, + "source": [ + "
\n", + " Note from Sensei: Active Space \n", + "\n", + " \n", + "As the problem size increases, the computational cost (number of qubits (which corresponds to the number of orbitals is used) and the circuit depth (which corresponds to the number of electronic excitations considered)) increases rapidly. The active space approach is a well known approach to reduce the computational cost. In many chemistry problems, the orbitals occupied with electrons high in energy and the unoccupied orbitals with low energy play an important role. So, rather than treating all orbitals and electrons with the same accuracy, treating those important electrons and orbitals with high accuracy is a good approximation in general. Therefore, we can select the important orbitals and electrons as our active space and solve the problem with low cost while maintaining the accuracy of the calculation.\n", + " \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e52d6961-8a1e-4e52-98f3-a17d8676db9a", + "metadata": {}, + "outputs": [], + "source": [ + "# Check the occupation of the spin orbitals\n", + "PN_property = properties.get_property(\"ParticleNumber\")\n", + "\n", + "# Define the active space around the Fermi level \n", + "# (selected automatically around the HOMO and LUMO, ordered by energy)\n", + "transformer = ActiveSpaceTransformer(\n", + " num_electrons=2, # Number of electrons in our active space\n", + " num_molecular_orbitals=3, # Number of orbitals in our active space\n", + ")\n", + "\n", + "# Now you can get the reduced electronic structure problem\n", + "problem_reduced = ElectronicStructureProblem(driver, transformers=[transformer]) \n", + "\n", + "# The second quantized Hamiltonian of the reduce problem\n", + "second_q_ops_reduced = problem_reduced.second_q_ops()" + ] + }, + { + "cell_type": "markdown", + "id": "268617fc-9b7e-4a6a-aa7a-b23cdda240eb", + "metadata": {}, + "source": [ + "### 3. Fermion-Qubit Mapping \n", + "\n", + "Because electrons are fermions, the electronic systems are described by Hamiltonians consisting of fermionic operators expressed in second quantization. Since quantum computers are made up of qubits, we have to transform such fermionic Hamiltonians into the qubit operators. There are different types of mappers to transform fermionic operators to qubits operators. You can try different mapping options, but we will stick to `ParityMapper`, where we will be exploiting problem symmetries and applying two-qubit reduction to reduce the problem size. Feel free to to try out different mappers and experiment if you wish, but for the purposes of the challenge grading, we will be using `ParityMapper`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5efe1c18-6e04-45be-904a-048ba795905b", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.3705782023199005 * IIIIII\n", + "+ 0.3492296180456834 * IIIIIZ\n", + "- 1.724684211830245e-08 * IIIIZX\n", + "+ 1.724684211830245e-08 * IIIIIX\n", + "+ 0.04107515475324274 * IIIIZZ\n", + "+ 0.041075085753784414 * IIIZZI\n", + "+ 0.3492296180456834 * IIZZII\n", + "- 1.724684211830245e-08 * IZXZII\n", + "+ 1.724684211830245e-08 * IIXIII\n", + "+ 0.04107515475324269 * IZZIII\n", + "+ 0.04107508575378436 * ZZIIII\n", + "+ 0.09263375051327181 * IIIIZI\n", + "+ 0.09263374411183314 * IIIZZZ\n", + "+ 0.1703424914950203 * IIZZIZ\n", + "+ 0.01892506184544881 * IZXZZX\n", + "- 0.01892506184544881 * IIXIZX\n", + "- 0.01892506184544881 * IZXZIX\n", + "+ 0.01892506184544881 * IIXIIX\n", + "+ 0.018925050277467714 * ZXXIXX\n", + "+ 0.018925050277467714 * IYYZXX\n", + "+ 0.018925050277467714 * ZXXZYY\n", + "+ 0.018925050277467714 * IYYIYY\n", + "+ 0.11155881235872062 * IZZIIZ\n", + "+ 0.0063335393221763125 * IZZIZX\n", + "- 0.0063335393221763125 * IZZIIX\n", + "- 0.006333532495285949 * ZXZZXX\n", + "+ 0.006333532495285949 * IXIZXX\n", + "- 0.006333532495285949 * ZXZIYY\n", + "+ 0.006333532495285949 * IXIIYY\n", + "+ 0.11155879438930086 * ZZIIIZ\n", + "- 0.006333537574596253 * ZZIIZX\n", + "+ 0.006333537574596253 * ZZIIIX\n", + "+ 0.07770205519201824 * IIIZIZ\n", + "+ 0.11155881235872062 * IIZZZZ\n", + "+ 0.0063335393221763125 * IZXZZZ\n", + "- 0.0063335393221763125 * IIXIZZ\n", + "- 0.006333532495285949 * ZXXIXZ\n", + "- 0.006333532495285949 * IYYZXZ\n", + "+ 0.006333532495285949 * ZXXZXI\n", + "+ 0.006333532495285949 * IYYIXI\n", + "+ 0.0981371173539964 * IZZIZZ\n", + "+ 0.006811680175428652 * ZXZZXZ\n", + "- 0.006811680175428652 * IXIZXZ\n", + "- 0.006811680175428652 * ZXZIXI\n", + "+ 0.006811680175428652 * IXIIXI\n", + "+ 0.0845137353674469 * ZZIIZZ\n", + "+ 0.11155879438930086 * IIZIZI\n", + "- 0.006333537574596252 * IZXIZI\n", + "+ 0.006333537574596252 * IIXZZI\n", + "+ 0.0845137353674469 * IZZZZI\n", + "+ 0.0981370925002784 * ZZIZZI\n", + "+ 0.09263375051327181 * IZIZII\n", + "+ 0.09263374411183314 * ZZZZII\n", + "+ 0.07770205519201824 * ZIZIII\n" + ] + } + ], + "source": [ + "# Setup the mapper and qubit converter\n", + "mapper_type = 'ParityMapper'\n", + "\n", + "if mapper_type == 'ParityMapper':\n", + " mapper = ParityMapper()\n", + "elif mapper_type == 'JordanWignerMapper':\n", + " mapper = JordanWignerMapper()\n", + "elif mapper_type == 'BravyiKitaevMapper':\n", + " mapper = BravyiKitaevMapper()\n", + "\n", + "\n", + "converter = QubitConverter(mapper)\n", + "\n", + "qubit_op = converter.convert(second_q_ops_reduced[\"ElectronicEnergy\"])\n", + "print(qubit_op)" + ] + }, + { + "cell_type": "markdown", + "id": "ab953b19-60e6-4ecd-a825-28cdc4a6e0aa", + "metadata": {}, + "source": [ + "### Apply reduction\n", + "\n", + "We can reduce system size by applying various methods. Here, we will apply **[two qubit reduction](https://qiskit.org/documentation/stubs/qiskit.opflow.converters.TwoQubitReduction.html)**. The two qubit reduction converter eliminates the central and last qubit in a list of Paulis that have diagonal operators (Z, I) in those positions. This is a nice method that can be used in chemistry problems to reduce computational resources. In this particular example, this method can be used to taper two qubits in parity and binary-tree mapped fermionic Hamiltonians when the spin orbitals are ordered in two spin sectors (block spin order), according to the number of particles in the system." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3ad24077-87bc-4cf2-8d18-bccd464e7223", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.3705782023198996 * IIII\n", + "+ 0.2715275628536651 * IIIZ\n", + "- 1.7246842118302443e-08 * IIZX\n", + "+ 1.7246842118302443e-08 * IIIX\n", + "- 0.051558589358590375 * IIZZ\n", + "+ 0.05155866475948739 * IIZI\n", + "- 0.2715275628536651 * IZII\n", + "+ 1.7246842118302443e-08 * ZXII\n", + "+ 1.7246842118302443e-08 * IXII\n", + "- 0.05155858935859042 * ZZII\n", + "- 0.05155866475948744 * ZIII\n", + "- 0.17034249149502023 * IZIZ\n", + "- 0.018925061845448805 * ZXZX\n", + "- 0.018925061845448805 * IXZX\n", + "+ 0.018925061845448805 * ZXIX\n", + "+ 0.018925061845448805 * IXIX\n", + "+ 0.018925050277467707 * XXXX\n", + "- 0.018925050277467707 * YYXX\n", + "- 0.018925050277467707 * XXYY\n", + "+ 0.018925050277467707 * YYYY\n", + "+ 0.11155881235872057 * ZZIZ\n", + "+ 0.006333539322176311 * ZZZX\n", + "- 0.006333539322176311 * ZZIX\n", + "+ 0.006333532495285946 * XZXX\n", + "- 0.006333532495285946 * XIXX\n", + "- 0.006333532495285946 * XZYY\n", + "+ 0.006333532495285946 * XIYY\n", + "+ 0.11155879438930083 * ZIIZ\n", + "- 0.00633353757459625 * ZIZX\n", + "+ 0.00633353757459625 * ZIIX\n", + "- 0.11155881235872057 * IZZZ\n", + "- 0.006333539322176311 * ZXZZ\n", + "- 0.006333539322176311 * IXZZ\n", + "- 0.006333532495285946 * XXXZ\n", + "+ 0.006333532495285946 * YYXZ\n", + "- 0.006333532495285946 * XXXI\n", + "+ 0.006333532495285946 * YYXI\n", + "+ 0.09813711735399637 * ZZZZ\n", + "- 0.0068116801754286496 * XZXZ\n", + "+ 0.0068116801754286496 * XIXZ\n", + "- 0.0068116801754286496 * XZXI\n", + "+ 0.0068116801754286496 * XIXI\n", + "+ 0.08451373536744687 * ZIZZ\n", + "+ 0.11155879438930083 * IZZI\n", + "- 0.006333537574596249 * ZXZI\n", + "- 0.006333537574596249 * IXZI\n", + "- 0.08451373536744687 * ZZZI\n", + "- 0.09813709250027836 * ZIZI\n" + ] + } + ], + "source": [ + "# Set the mapper to qubits\n", + "parity_mapper = ParityMapper() # This is the example of parity mapping\n", + "\n", + "# Set the qubit converter with two qubit reduction to reduce the computational cost \n", + "parity_converter = QubitConverter(parity_mapper, two_qubit_reduction=True) \n", + "\n", + "# Compute the Hamitonian in qubit form\n", + "qubit_op_parity = parity_converter.convert(second_q_ops_reduced.get('ElectronicEnergy'), num_particles=problem_reduced.num_particles)\n", + "\n", + "print(qubit_op_parity)" + ] + }, + { + "cell_type": "markdown", + "id": "e515cade-3dc7-4826-a7c5-ef5aae7e72ca", + "metadata": {}, + "source": [ + "### 4. Compute the Real Solution for Reference Plotting\n", + "\n", + "Before we start to compute the ground state using Qiskit Runtime, let's compute a reference ground state energy by using `GroundStateEigensolver`. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7068a7f6-9953-40ce-bc9a-495fb92736fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reference energy : (-1.3014603031212078+0j)\n" + ] + } + ], + "source": [ + "vqe_factory = VQEUCCFactory( # This is an example of UCC\"SD\" ansatz\n", + " quantum_instance=Aer.get_backend(\"aer_simulator_statevector\"),\n", + " optimizer=SLSQP(),\n", + " ansatz=UCC(excitations='sd')\n", + ") \n", + "\n", + "from qiskit.algorithms import NumPyMinimumEigensolver\n", + "\n", + "numpy_solver = NumPyMinimumEigensolver()\n", + "\n", + "solver = GroundStateEigensolver(parity_converter, vqe_factory) # Define Numpy\n", + "real_solution_t = solver.solve(problem_reduced).total_energies[0] \n", + "print('Reference energy : ', real_solution_t)" + ] + }, + { + "cell_type": "markdown", + "id": "f0a1e566-660d-4ed7-ba83-3b1547f12549", + "metadata": {}, + "source": [ + "## Build VQE Routine on Estimator" + ] + }, + { + "cell_type": "markdown", + "id": "413cd519-2c38-4d91-8681-5c32edc3fc33", + "metadata": {}, + "source": [ + "To find the ground state one of the most popular approaches around is the **Variational Quantum Eigensolver (VQE) algorithm.** The VQE algorithm works by exchanging information between a classical and a quantum computer as depicted in the following figure.\n", + "\n", + "In the previous labs we leveraged prebuilt functions in Terra to run our VQE instances. Here, we shall try to build one from the ground up using the Estimator primitive. We shall also pass in a `noise_model` to simulate a noisy simulation routine here later in the notebook." + ] + }, + { + "cell_type": "markdown", + "id": "3030a221-acd8-424d-8bc0-bddcaac97d50", + "metadata": {}, + "source": [ + "\n", + "\n", + "Image: [Qiskit Nature Docs: Ground state solver tutorial](https://qiskit.org/documentation/nature/tutorials/03_ground_state_solvers.html)" + ] + }, + { + "cell_type": "markdown", + "id": "d6f20447-5665-4d61-ae3a-8b2bf0f2f0c3", + "metadata": {}, + "source": [ + "We shall build up on a VQE routine using `Estimator` to measure expectation values of the prepared states and use a classical optimizer to readjust our parameters again for the next iteration." + ] + }, + { + "cell_type": "markdown", + "id": "047decd9-301e-4eb7-a1d3-be3b06e029c8", + "metadata": { + "tags": [] + }, + "source": [ + "### Building a Variational Quantum Eigensolver using Estimator \n", + "\n", + "To build up a routine for VQE using estimator, let's look at our previous image and leverage the same intuition. \n", + "\n", + "For our variational model or `ansatz` which will serve as our model circuit for evaluation and optimization of parameters as shown in the Qiskit Nature docs tutorial image above, we shall use a chemistry specific `UCCSD` type of ansatz for our problem here. \n", + "\n", + "As mentioned in the Qiskit nature **[tutorial](https://qiskit.org/documentation/nature/tutorials/03_ground_state_solvers.html)**: the Unitary Coupled Cluster **[`UCC`](https://qiskit.org/documentation/nature/stubs/qiskit_nature.circuit.library.UCC.html)** ansatz (see **[[12]](https://arxiv.org/abs/1805.04340)** as an example) is a chemistry standard widely utilized across. Here we shall be specifying single and double excitation states. However, the excitation type (`'s'`,`'d'`,`'sd'`) as well as other parameters can be selected.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5875fffb-92a8-4fca-9bc2-8bf629fd5621", + "metadata": {}, + "outputs": [], + "source": [ + "# Define our 'ansatz' for the problem\n", + "ansatz = UCC(\n", + " qubit_converter=parity_converter,\n", + " num_particles=problem_reduced.num_particles, \n", + " num_spin_orbitals=problem_reduced.num_spin_orbitals,\n", + " excitations='sd'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3ad8d117-a987-4c24-97af-53782b938e22", + "metadata": {}, + "source": [ + "Next, we will define how we shall set our routine with the `Estimator`. Remember, the `Estimator` will return the estimated expectation values of quantum circuits and observables passed to it. The **circuit** to pass here will be our `ansatz`, the **observables** will be the `qubit_op_parity` hamiltonian we just made and the **parameter_values** will be the values processed by the classical optimizer passed here as `x`. For our example here, we shall be using the Simultaneous perturbation stochastic approximation (`SPSA`) optimizer for our routine.\n", + "\n", + "This will be done iteratively and here we shall define a routine as shown in the image below: " + ] + }, + { + "cell_type": "markdown", + "id": "3c97f762-19aa-4aef-ab75-21fb8f6572ae", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "31ff8071-14a1-4e11-ac97-1e86f08f3175", + "metadata": {}, + "source": [ + "The `optimizer` we define will be used to minimize a scalar function. Here we should define a function such that we return the computed expectation value result to be minimized. We shall define `evaluate_expectation` function to calculate the same using the `Estimator`. This will be the function passed to our optimizer to solve for and generate a new set of parameters to be evaluated again.\n", + "\n", + "For the purpose of visualizing the result and getting a view on the internal states of the optimization run, we shall also define a `callback` function which shall append the convergence value per run and store it in a list to be visualized later." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "640048d9-ad56-43ab-a0c5-dd31b91bbce1", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.primitives import Estimator, BackendEstimator" + ] + }, + { + "cell_type": "markdown", + "id": "9f560bcd-7818-4669-a895-a752c5656097", + "metadata": {}, + "source": [ + "## A short note on the Estimator Primitive" + ] + }, + { + "cell_type": "markdown", + "id": "a9cea49c-8990-471f-9a29-893a4c93f42c", + "metadata": { + "tags": [] + }, + "source": [ + "We have been using the Qiskit Runtime version of `Estimator` until now. For the purposes of this exercise, we shall use a localized version of the `Estimator` which resides in Qiskit Terra.\n", + "\n", + "### Specification\n", + "Formally speaking, the _Estimator_ primitive is a standardized specification for calculating and interpreting expectation values for different combinations of quantum states (i.e. circuits) and operators. This means that there is no single `Estimator` class to solve this task, but rather a family of them; each of which performing the same (internal) calculation on a slightly different way, while exposing a common _application programming interface_ (API) to the users.\n" + ] + }, + { + "cell_type": "markdown", + "id": "011c5198-b183-416d-a8a0-177f4c43a95e", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "b20915d6-63a2-43a4-a2f9-28a53d88d2b2", + "metadata": {}, + "source": [ + "Following now, we shall go forward with Qiskit's native Terra implementation of `Estimator` and `BackendEstimator` with Qiskit's native simulators. You can substitute this with the Qiskit Runtime Estimator by following the same routine as before if you wish. Here is a tutorial that will help you **[get started with the Estimator class residing in Qiskit Terra](https://qiskit.org/documentation/apidoc/primitives.html)**" + ] + }, + { + "cell_type": "markdown", + "id": "ffac1f28-20cb-4cdb-baab-ac230e615fce", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise 2: \n", + " \n", + "Complete the cell below for building up our VQE routine. Define the `Estimator` primitive object and define the `estimator.run` call for the `evaluate_expectation` function. \n", + "Fill the optimizer call using the `SPSA` optimizer with `maxiter=50` and pass the callback function for the intermediate values to be stored for plotting. Finally, store the result by calling the optimizer.minimize call to complete the routine.\n", + " \n", + "For successful grading, use a `UCCSD ansatz` and `maxiter=50` for your optimizer and do not modify any of the seed values.
" + ] + }, + { + "cell_type": "markdown", + "id": "dc93470b-c360-4eca-8354-eee5d38cffaa", + "metadata": {}, + "source": [ + "### Calculate the ground state of $H_3^+$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c7a3cd93-e646-4413-b87b-00402e472efe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "EstimatorResult(values=array([-1.92486651]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.56354345]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.23466395]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.21967291]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.10024123]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.12465858]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.34387208]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.07028725]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.92608409]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.55778757]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.33423474]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.11655049]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.98393486]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.25075652]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.97328118]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.26985446]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.08612174]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.11383314]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.06689625]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.1823246]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.85859771]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.4879219]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.21854082]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.22232435]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.92825125]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.57290437]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.38435508]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.06174643]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.55778757]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.92608409]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.12746355]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.10664841]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.20985701]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.20690095]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.34387208]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.07028725]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.32753796]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.11186503]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.91110349]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.30771401]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.36618501]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.99402805]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.19168199]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.07257772]), metadata=[{}])\n", + "EstimatorResult(values=array([-1.92486651]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.56354345]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.21272995]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.21287052]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.06689625]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.1823246]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.19887834]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.19389049]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.1754654]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.1754654]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.20594198]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.22310624]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.17623483]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.17623483]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.34847509]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.06911337]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.41329679]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.41329679]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.3764047]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.35414845]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.41223883]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.41223883]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.56892185]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.28587189]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.67399786]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.67399786]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.67620552]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.54406374]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.69022712]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.69022712]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.57588406]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.59200546]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.69075876]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.69075876]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.78440759]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.54113601]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.79397873]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.79397873]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.71754441]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.79481427]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.802423]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.802423]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.59743891]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.9206538]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95176217]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95176217]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.81169845]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.82254634]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95177389]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95177389]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.87214887]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.7724758]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95453305]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95453305]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.75851599]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.87813102]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.94866277]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.94866277]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92301878]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.7443779]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95783692]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.95783692]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.76007024]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91913464]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96588236]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96588236]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.93986218]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.946082]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96582372]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96582372]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90428471]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.77725889]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96774343]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96774343]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.9429956]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.75791546]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98350658]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98350658]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.94597207]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98159493]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98587804]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98587804]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.952636]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.97727898]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98713327]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98713327]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92460192]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.78061193]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98836348]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98836348]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.8526127]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03402345]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02541036]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02541036]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89982093]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89270459]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02520521]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02520521]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.97773635]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00184408]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02585914]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02585914]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90378438]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89236894]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02590213]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02590213]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.9858051]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.99583209]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02599117]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02599117]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.96845527]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.02626531]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03066654]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03066654]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.98198014]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.01928244]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03263449]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03263449]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89617137]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92159818]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03288364]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03288364]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00906108]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.99470772]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03310756]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03310756]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.0004556]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00437539]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03305875]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03305875]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90798537]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91477044]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03323778]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03323778]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92433035]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89450243]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03359478]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03359478]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90037281]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92669269]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03339022]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03339022]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.9949598]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00691305]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03352518]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03352518]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.93477363]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.89376201]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03384689]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03384689]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00302166]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00366157]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03384506]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03384506]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92776708]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90885898]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441131]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441131]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.99773225]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00918896]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03438522]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03438522]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91205218]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92459671]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03446569]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03446569]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.9219905]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91326599]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.0345012]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.0345012]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.90971663]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92593574]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441343]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441343]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.99509585]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00914635]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03439352]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03439352]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00077827]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00643289]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441116]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03441116]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91346863]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92537807]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448389]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448389]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.0029783]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.0043772]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448144]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448144]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92184395]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92151896]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448232]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448232]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00514987]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.00793015]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448143]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03448143]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.91714564]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92917404]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03440395]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03440395]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92242966]), metadata=[{}])\n", + "EstimatorResult(values=array([-2.92547985]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03436477]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03436477]), metadata=[{}])\n", + "EstimatorResult(values=array([-3.03436477]), metadata=[{}])\n", + "CPU times: user 30.6 s, sys: 275 ms, total: 30.8 s\n", + "Wall time: 32.5 s\n" + ] + } + ], + "source": [ + "%%time\n", + "from qiskit.utils import algorithm_globals\n", + "algorithm_globals.random_seed = 1024\n", + "\n", + "# Define convergence list\n", + "convergence = []\n", + "\n", + "# Keep track of jobs (Do-not-modify)\n", + "job_list = []\n", + "\n", + "# Initialize estimator object\n", + "estimator = Estimator(ansatz)# Enter your code here\n", + "print(estimator)\n", + "# Define evaluate_expectation function\n", + "def evaluate_expectation(x):\n", + " x = list(x)\n", + " \n", + " # Define estimator run parameters\n", + " #### enter your code below ####\n", + " job = estimator.run(ansatz, qubit_op_parity, x).result() # ----------- Enter your code here\n", + " print(job)\n", + " results = job.values[0]\n", + " job_list.append(job)\n", + " \n", + " # Pass results back to callback function\n", + " return np.real(results)\n", + "\n", + "# Call back function\n", + "def callback(x,fx,ax,tx,nx):\n", + " # Callback function to get a view on internal states and statistics of the optimizer for visualization\n", + " convergence.append(evaluate_expectation(fx))\n", + "\n", + "np.random.seed(10)\n", + "\n", + "# Define initial point. We shall define a random point here based on the number of parameters in our ansatz\n", + "initial_point = np.random.random(ansatz.num_parameters)\n", + "\n", + "#### enter your code below ####\n", + "# Define optimizer and pass callback function\n", + "optimizer = SPSA(maxiter=50, callback=callback)# ----------- Enter your code here\n", + "\n", + "# Define minimize function\n", + "result = optimizer.minimize(evaluate_expectation, initial_point) # ----------- Enter your code here\n" + ] + }, + { + "cell_type": "markdown", + "id": "37055344-55d4-4f91-9339-40ab3860a37e", + "metadata": {}, + "source": [ + "In the cell below, we will interpret our optimizer eigenstateresult in the context of our problem_reduced transformation for the molecule we defined above:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "5ae33012-c125-45f6-81de-5ea462226110", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computed Energy: (-1.2973837145813873+0j)\n" + ] + } + ], + "source": [ + "Energy_H_t = []\n", + "for i in range(len(convergence)):\n", + " sol = MinimumEigensolverResult()\n", + " sol.eigenvalue = convergence[i]\n", + " sol = problem_reduced.interpret(sol).total_energies[0]\n", + " Energy_H_t.append(sol)\n", + "print(\"Computed Energy:\", Energy_H_t[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "8492cbfc-b1ab-443c-894a-8954ab846ca8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuYAAAGPCAYAAAAQihVcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABZuElEQVR4nO3deVhUZf8G8PvMAsMwbMOwyA4u4YIr4ormbpmkZpkrLj9tMXO3Usts0UyzzOo1zSxNTUstlzd7NfddNNRyV1BRQRFQFtlmzu8PYHIaQFDgzAz357rmYuZ5zvKdOVj3HJ7zHEEURRFERERERCQpmdQFEBERERERgzkRERERkUVgMCciIiIisgAM5kREREREFoDBnIiIiIjIAjCYExERERFZAAZzIiIiIiILwGBORCSRqKgoqFQqpKWllbjM66+/DkEQcP78eWObKIpYvnw52rVrBxcXF6jVaoSFheGDDz5AVlaW2TaGDh0KQRBKfGRnZ1fG2yMionJSSF0AEVF1NWjQIGzatAnr1q3DiBEjzPr1ej3WrFmD5s2bo06dOsa2AQMGYO3atYiMjMR7770HBwcH7NmzBzNmzMDatWuxfft2eHp6mmxLqVTi22+/LbYOOzu7in9zRERUbgzmREQSiYqKgrOzM1atWlVsMN+2bRtu3bqFadOmGds+/vhjrF27FpMmTcLcuXON7aNGjcILL7yA3r17Y9iwYdiyZYvJtmQyGQYNGlR5b6YKZWVlQa1WS10GEVGF41AWIiKJqFQqPPfcc9i1axdu3Lhh1r9y5UrI5XK8+OKLAID79+9j7ty5qFOnDmbPnm22fFRUFKKjo/Hf//4XR44cqdBa//e//6F9+/bQaDTQaDTo3r07YmNjTZYZOnQoVCoVrl+/jl69ekGj0cDDwwOTJk2CXq83WVYURSxcuBBhYWFQqVTw9PTEiBEjkJycbLJcUFAQunfvjj/++AMtWrSASqXCxx9/DAC4c+cOBg8eDGdnZ7i6uiI6OhqxsbEQBAHfffcdAGDJkiUQBAHHjx83e0+ff/45BEHAmTNnKu6DIiJ6DAzmREQSGjRoEAwGA3788UeT9qysLPzyyy/o0qWLcVjKvn37kJqaigEDBkChKP4PnkOGDAEAbNq0yawvOTnZ7HH37t2H1rhq1Sp0794dKpUKs2fPxrvvvovLly8jMjISZ8+eNVnWYDCge/fucHd3x7x589C+fXt88sknWLx4sclyr7zyCiZMmIAWLVpgwYIFGDVqFH7++Wd06NDBbMz7xYsX0bdvX7Rv3x6ff/45WrZsCYPBgJ49e2LVqlUYMmQIPvzwQyQmJiI6Otpk3RdeeAEqlQo//PCD2fv64YcfEB4ejrp16z70MyAiqhIiERFJRq/Xi35+fmKzZs1M2letWiUCEH/44Qdj22effSYCEDds2FDi9lJSUkQAYp8+fYxt0dHRIoBiHy1atCi1voyMDNHNzU0cNmyY2X48PDzE/v37m+1n5syZJss2adLE5P3t379fBCB+//33Jsvt3btXBCB+/fXXxrbAwEARgPjrr7+aLLtu3ToRgDhv3jxjm16vFzt27CgCEJctW2Zs79evn+jt7S3m5+cb286dOycCEBcsWFDq+yciqko8Y05EJCGZTIb+/fvj2LFjJjOvrFy5Eo6OjujVq5exLT09HQDg5ORU4vaK+oqWLaJUKrFt2zazx8KFC0utb9u2bcaz9A+eadfr9YiMjMTOnTvN1hk5cqTJ68jISFy+fNn4eu3atcbhMA9uMzQ0FF5eXmbb9PPzQ1RUlEnb1q1bIZfL8dJLLxnbZDIZRo8ebVZPdHQ0EhMTsX37dmPbDz/8AIVCYRwmRERkCXjxJxGRxAYNGoS5c+di5cqVmDlzJpKTk/H777+jX79+cHR0NC5XUuh+UFHfv2dlkclk6Ny5c7lrK/qy0KVLl2L7ZTLT8ztKpRI1atQwaXNzc0NqaqrJNjMyMuDl5VXsNm/dumXyOiQkxGyZK1euwMvLCxqNxqS9Vq1aZst27doV3t7e+OGHH9CtWzcABV98unXrZvY5ERFJicGciEhiDRs2RFhYGFavXo2ZM2di7dq1yM/PN5tFpV69egCAkydPmpxJf9DJkycBFB9mH4XBYAAAfPfdd/D19X3o8v8O6iVt093d3WxcfRE3NzeT1w4ODmWotGRyuRwDBw7EokWLkJmZiRMnTuDy5cuYNWvWY22XiKiiMZgTEVmAQYMG4Y033sDRo0excuVKeHl5mZ2lbtOmDVxdXbFq1SpMmzYNcrncbDvLly8HADz//PMVUlfNmjUBAB4eHo90xr2kbW7btg0tW7Y0O+NdVoGBgfjjjz+QkZFhso2LFy8Wu3x0dDQ++eQTbNiwAQcOHICzszOeffbZR9o3EVFl4RhzIiILMGDAAMhkMnzwwQc4cOAA+vXrZxa81Wo1pkyZgnPnzpnMbV5ky5Yt+O677xAVFYWwsLAKqatbt25wdXXFrFmzkJuba9Z/+/btcm+zX79+MBgMeO+998z69Hq9ybCX0urS6/X4+uuvjW0GgwFffvllscuHhYWhSZMmWLZsGdauXYvnn38eKpWq3LUTEVUmnjEnIrIAfn5+aN++PTZu3AgAJd4MaMqUKYiNjcWcOXNw6NAh9OnTByqVCvv27cPKlSsRFhZmnMP7QQaDodgpAwGgZ8+ecHFxKbbP2dkZixYtwsCBA9GkSRP0798fXl5euHr1KrZu3Yr69esXu7/StGvXDqNHj8bcuXNx8uRJdOvWDfb29rh48SJ+/vlnvPfeexg6dGip2+jVqxciIiIwZcoUxMXFoW7duti4cSNSUlIAAIIgmK0zZMgQjB8/HgAwePDgctVMRFQVGMyJiCzEoEGDsHPnTtSpUwfNmzcvdhm5XI4ff/wRTz/9NJYsWYLp06cbL/js1q0bNm7cCDs7O7P18vLySgyjp06dKjGYAwVnuH18fDBr1ix88sknyM7Oho+PD9q0aWMyK0p5fPHFF2jatCkWLVqEadOmQaFQICAgAC+88AI6duz40PXlcjm2bNmCsWPHYvny5ZDJZOjduzfeeecdtG3bttiz4QMGDMDkyZPh6+uLdu3aPVLdRESVSRBFUZS6CCIienR5eXno2bMnduzYgS1btpQ4g0p18Msvv6B3797Yt28f2rRpY9KXmpoKb29vTJo0CR9++KFEFRIRlYxjzImIrJxSqcS6devQqFEjPPfcc8Xeft4W3b9/3+S1Xq/HwoUL4ezsjKZNm5ot//333yM3N9fs7qBERJaCQ1mIiGyAo6Mjjh49KnUZVWrMmDG4f/8+WrVqhZycHKxfvx4HDhzArFmzTKZY3LFjB86cOYP33nsPzzzzDOrUqSNh1UREJbPYM+Y5OTkYM2YMdDodHB0dERUVhYSEhDKvP3v2bAiCgNdee60SqyQiIql07NgRZ8+exbRp0zB16lSkpaVh4cKFeOutt0yWe++99zB+/HiEhYXhq6++kqhaIqKHs9gx5q+88gp+/fVXfP/993B3d8eECROQlpaGY8eOFTt374MOHTqE/v37w9nZGZGRkfjiiy+qqGoiIiIiokdjkWfM7969i6VLl2Lu3Lno0qULmjZtihUrVuDkyZPYvn37Q9cdOHAgvv32W7O7xxERERERWSqLHGN+7Ngx5OXloWvXrsY2f39/1K1bFwcOHEC3bt1KXHfUqFHo27cvOnTogJkzZ5Z5nzqdDkFBQY9TNhERERHRQ8XHxyM5Odms3SKDeWJiIuRyOXQ6nUm7l5cXEhMTS1xvyZIluHjxYok30fi3xYsXY/HixQAKLpyKiYl59KKJiIiIiMogPDy82PYqHcoyffp0CIJQ6mPXrl2PtO1z585h6tSpWLVqFZRKZZnWGTVqFGJiYhATEwMPD49H2i8RERERUUWo0jPm48aNK/E200UCAgJw6NAh6PV6JCcnmwTmpKQkREZGFrvewYMHkZycjPr16xvb9Ho99uzZg0WLFiEzMxP29vYV80aIiIiIiCpYlQZznU5nNjylOM2aNYNSqcS2bdswYMAAAEBCQgLOnDmD1q1bF7tOr169zP4sMGzYMNSuXRtTp04t9hbVRERERESWwiLHmLu4uGDEiBGYMmUKPD09jdMlNmzYEJ07dzYuFxoaitdeew2vvfYaXF1d4erqarIdR0dHaLVaNGjQoIrfARERERFR+VhkMAeAzz77DAqFAv369cP9+/fRqVMnLF++3GQO83PnzhV7RSsRERERkbWx2BsMVbXw8HDOykJERFYjLy8PCQkJyM7OlroUInqAXC6Hq6srdDodZLLi51kpKXda7BlzIiIiKllCQgKcnJwQFBQEQRCkLoeIAIiiiLy8PCQlJSEhIQEBAQHlWt8i7/xJREREpcvOzoa7uztDOZEFEQQBdnZ28PX1RWZmZrnXZzAnIiKyUgzlRJappCEsD12vgusgIiIiIqJHwGBORERERGQBePGnhLLz9Dh46Q4UcgEKmQx2ioKfSrkMSrkApVwGhVyAnVwGxQNt9goZ/3xJRERUSBAE/PTTT+jbt6/UpRA9Fp4xl9CdzFwM++4oBi89gv5LDuG5/xzEs1/ux9Of70WXT/fgyXm70HbOTkTM+gNN39+GsHf/h9C3t+LlH45JXToREVG5DR06FIIgmD1atmxZ5vWfeeYZs/abN2+iZ8+eFV2umaCgIMybN69Stv3666+jdu3axfalpqbCwcEBixcvNrYdPnwYUVFR0Gq1sLe3R2hoKGbOnGk2fWbRrD3/frz55psl1lLS5xwTEwNBEBAfHw8AuH37Nrp16wYfHx/Y29vD398fo0ePxt27dx/hEyiZIAj4+eefi31PKpUK/v7+6N27NzZt2lTsusU9Fi1aZLZso0aNoFAocP78ebO+kj6TisYz5hLSaezwy+g2yNMbCh8i8h94nqc3IF8vIldvKGwXse10Eg5eugNRFHnWnIiIrE7nzp2xYsUKkzY7O7vH2qa3t/djrV/VcnNzzd7ziBEjsHDhQuzevRvt27c36Vu5ciXkcjn69+8PANi4cSP69u2LgQMHYvv27XB3d8eBAwcwadIk/PHHH9i+fbvJ9t955x288sorJtvUaDSP/T5kMhl69+6NWbNmQafT4eLFixg9ejRGjhyJtWvXFrvOrl27MHToUGO4f1RF7yk3NxfXrl3Dzz//jN69e+Pll1/GF198YbLskiVLzEK1i4uLyesjR47g1q1bGDJkCJYuXYo5c+Y8Vn2PTCRRFEWxWbNmUpdQJkv3XhYD39gs3k7PlroUIiKS0OnTp6Uuodyio6PFHj16lLrMokWLxNq1a4v29vaiu7u72LVrVzEvL0+cMWOGCMDksXPnTlEURRGA+NNPP4miKIpxcXEiAHH16tViu3btRJVKJTZu3Fg8ceKEeOrUKbFVq1aiWq0W27RpI16+fNm434sXL4pRUVGil5eXqFarxSZNmoibNm0y9rdv395s/0XWrVsnNmjQQLSzsxP9/PzEDz74QDQYDMb+wMBAccaMGeKwYcNEFxcXsW/fvsW+9/DwcHHIkCFm7Y0bNxaHDRsmiqIoZmZmijqdTnz22WfNljt27JgoCIL48ccfm+x77ty5pX7m/1bScTp69KgIQIyLiytx3QULFoje3t4l9u/cuVMMDAwsVz0PHl9RLPk9ff311yIAcceOHSWuW5JRo0aJEyZMEPfs2SN6e3uLeXl5Jv1l+d39t9L+jZaUO3nG3MqEeDgCAC7fzoROYy9xNUREZClmbvobp2/cq9J91vNxxoye9StsezExMRg9ejS+//57tG3bFmlpadixYwcAYNKkSThz5gxSUlKMZ9y1Wm2J25oxYwY+/fRThISE4JVXXkH//v3h6emJDz/8EJ6enoiOjsbrr79uHP6QkZGBp556Ch988AEcHBywZs0a9OnTBydPnkRoaCjWr1+PRo0aYfjw4SZnn48dO4bnn38e06dPx8CBA3H06FG89NJLcHZ2xpgxY4zLzZ8/H9OnT0dMTAzEEm66PmLECEycOBELFy6Es7MzAOD48eOIjY01ngX+/fffkZycjClTppit37RpU3Tq1AmrVq3C5MmTy/PRV4gbN25g/fr1Zmf8q8qIESPw5ptvYt26dejQoUOZ18vMzMSPP/6IXbt2oXHjxnBwcMDmzZvRq1evyiu2BBxjbmVqehT86eny7QyJKyEiIiq/rVu3QqPRmDzeeOMNAMDVq1fh6OiIqKgoBAYGolGjRhg/fjwUCgU0Gg0cHBxgb28Pb29veHt7lzoEZsKECXj66acRGhqKiRMn4vTp0xgzZgw6dOiA+vXr47XXXsPOnTuNyzdq1Agvv/wywsLCUKtWLUybNg1NmzY1jm3WarWQy+VwcnIy7h8oCNzt27fHzJkzUadOHQwcOBCTJk0yGwrRvn17TJkyBbVq1SpxLPmAAQMAAD/++KOxbenSpQgNDUWbNm0AwDj+uW7dusVuo169ejh37pxJ27Rp08w+882bN5f42QHFH6d27doVu2z//v2hVqvh6+sLJycnLFu2rNRtVxa5XI46derg8uXLJu2DBw82ey+nTp0y9v/000/w9/dHkyZNIAgCBg0ahG+++aaqywfAMeZWx8fVAXYKGS4nl/9uUkREZLsq8sx1ZWrXrp3JRYwA4OrqCgDo0qULAgMDERwcjG7duqFr167o06cPnJycyr2fhg0bGp97eXkBAMLCwkzaMjMzkZWVBbVajczMTMycORObN2/GzZs3kZeXh+zsbJPtFOfMmTPo0aOHSVvbtm0xc+ZM3Lt3z3jmOzw8/KE1Ozs74/nnn8e3336LUaNGITs7G6tWrcK0adPK/L4B8zH7EyZMwIgRI0zaatSoUeo2ijtOf/31F3r37m227KeffooZM2bg/PnzeOuttzBu3Dh8/fXXAAq+bNWrV8+4rF6vR05OjskY90GDBhV7MeajEIu5Bm/u3Lno3r27SVtAQIDx+TfffIPBgwcbXw8ePBizZs3CjRs34OPjUyF1lRWDuZWRywQEuzvyjDkREVkltVqNWrVqFdvn5OSE48ePY8+ePdi2bRtmz56NqVOn4ujRo+UOSEql0vi8KKgV12YwGAAUDJXZunUr5s2bh9q1a0OtVmPIkCHIzc0t134f9GBAdHR0LNM6I0aMQLt27XD69GnExsYiMzMT0dHRxv46deoAAE6fPm08i/6g06dPG5cp4u7uXuJnXpLijlNaWlqxyxb9BSE0NBRarRaRkZGYPn06/P394ePjg9jYWOOyhw8fxhtvvIFdu3YZ24q+vDwuvV6P8+fPIyIiwqy+kt7/2bNnsX//fhw8eNDkC5Ber8eyZcvK/aXocTGYW6FgnSPO30qXugwiIqIKp1Ao0LFjR3Ts2BEzZ86Ep6cnNm/ejFGjRsHOzg56vb5S9rtv3z4MGTIEzz33HAAgOzsbly5dMgm5xe2/bt262L9/v9m2/Pz8HulMf2RkJJ544gksXboUsbGxiIqKgoeHh7G/W7du0Ol0mDt3rlkwP378OP744w+zWUmqUtEXnZycHAAFx/PBUJyQkGDWVlG++eYbpKWllWs++6VLl6JFixZmQ1fWrVuHb7/9FlOnTq3SWfAYzK1QiIcjtp9JQp7eAKWclwkQEZH1yMnJQWJiokmbXC6Hh4cHNm/ejEuXLqFdu3bQarXYuXMn0tPTjeOpg4KC8Ntvv+HcuXNwd3eHi4uLyVnwx1GnTh1s2LABzz77LJRKZYlzgu/duxeDBg2Cvb09dDodJk6ciObNm+Pdd9/FgAEDcPToUXzyySeYNWvWI9cyfPhwzJ49G3fv3sWWLVtM+tRqNZYuXYq+ffti+PDhGDNmjMl0id27d8dLL71ksk56errZZ+7g4GA2ZWB5bd68GXfu3EGzZs2g0Wjw999/Y/LkyWjZsmWlBO8HFb2nvLw8XLt2DT/99BMWLlyI1157zezi07S0NLP3r9FoYG9vj+XLl2PatGlo0KCBSb+7uzvee+897Ny5Ex07dgQA3Lt3z+TsP1AwDCsoKKji3li55n2xYdYyXaIoiuJPMdfEwDc2i5dupUtdChERScRap0vEv6YcBCD6+vqKoiiKe/fuFZ988klRq9WKKpVKrF+/vvjtt98a179165bYpUsXUaPRPHS6xKNHjxrXK26av99++00EIKanF/y/ND4+XuzUqZOoVqtFX19fce7cuWKPHj3E6Oho4zoHDx4UGzZsKNrb2xc7XaJSqSxxusTyTFmYmJgoKpVK0d/fX9Tr9cUuc/DgQfGZZ54RXV1djZ/j2LFjxfz8fJPlAgMDi/3MBw4cWOL+yzpd4rZt28SWLVuKLi4uokqlEmvXri1OmTJFTElJKXHbFTVdYtH7sLOzE319fcVnn31W/PXXX4tdt7jHtGnTxHXr1omCIIgJCQnF7jcyMlLs37+/KIol/+4+99xzJdb9KNMlCoVFV3vh4eGIiYmRuowyOX41FX2+OoBvhoSjcz0vqcshIiIJnDlzpsSZOah60ev1GDhwIPbu3Yvdu3dX+tlqKpvS/o2WlDs5DsIK1dQVTpmYzAtAiYiIqju5XI6VK1di4sSJ2LNnj9Tl0GPgGHMr5KJWwt3RDpdvc8pEIiIiKgjnEyZMkLoMekw8Y26lQjwcGcyJiIiIbAiDuZUK0Wk4lIWIiIjIhjCYW6lgD0ckZ+Ti7v08qUshIiIiogrAYG6lQnQFdxCLS+ZwFiIiIiJbwGBupUI8Cmdmuc3hLERERES2gMHcSgVo1ZDLBF4ASkRERGQjGMytlJ1ChgCtmheAEhEREdkIBnMrFqLjlIlEREREtoLB3IqFeDgiLjkTBoModSlERESlEgSh1MfQoUMlqy0oKAjz5s2TbP9ERXjnTysWrNMgJ9+AG3fvw89NLXU5REREJbp586bx+ebNmzFy5EiTNgcHh3JtLzc3F3Z2dhVWH5El4BlzKxbiUTBlIoezEBGRpfP29jY+XF1dTdoyMzMxZMgQeHt7w9HREU2bNsXmzZtN1g8KCsK7776L4cOHw9XVFQMHDgQAfPvttwgICIBarUbPnj3x1VdfQRAEk3U3bdqEZs2aQaVSITg4GNOmTUNubi4A4Mknn8SVK1cwefJk49l7IqnwjLkV+yeYZ6BdHQ+JqyEiIqldGTzErM3pqe7QDhgAw/37uDbqJbN+l9694dqnN/JTU3H99bFm/W79X4Tz008j7+ZN3Jjyhklf4IrlFVJ3RkYGnnrqKXzwwQdwcHDAmjVr0KdPH5w8eRKhoaHG5ebPn4/p06cjJiYGoiji4MGD+L//+z/Mnj0bvXv3xu7duzF16lSTbf/+++8YOHAgFixYgHbt2uHq1at4+eWXkZOTg3nz5mH9+vVo1KgRhg8fjldeeaVC3g/Ro2Iwt2IeGns42StwmTcZIiIiK9aoUSM0atTI+HratGnYtGkTfv75Z0yfPt3Y3r59e0yZMsX4+p133kHXrl3xxhsFXxjq1KmDo0ePYsmSJcZlPvzwQ0yePBnDhg0DANSsWRNz5szBoEGDMHfuXGi1Wsjlcjg5OcHb27uy3ypRqRjMrZggCAjx4MwsRERUoLQz2DIHh1L7FW5upfYra9SosDPk/5aZmYmZM2di8+bNuHnzJvLy8pCdnY2GDRuaLBceHm7y+uzZs+jZs6dJW4sWLUyC+bFjx3DkyBHMmTPH2GYwGHD//n0kJiaiRo0alfCOiB4Ng7mVC/HQ4PDlO1KXQURE9MgmTZqErVu3Yt68eahduzbUajWGDBliHAdexNHRsdzbNhgMmDFjBp5//nmzPg8PDgMly8JgbuVCdI7Y8Od1ZOXmQ23Hw0lERNZn3759GDJkCJ577jkAQHZ2Ni5duoQ6deqUul5oaCiOHj1q0nbkyBGT102bNsXZs2dRq1atErdjZ2cHvV7/iNUTVRzOymLlQjw0AIA4jjMnIiIrVadOHWzYsAHHjx/HqVOnMGjQIGRnZz90vddffx3/+9//MHfuXFy4cAFLly7Fhg0bTJZ55513sGrVKrzzzjv466+/cPbsWfz8888mY9WDgoKwd+9eXL9+HcnJyRX+/ojKisHcygXrCv6sx2BORETWav78+fD09ERkZCSeeuoptGzZEpGRkQ9dr1WrVliyZAk+//xzNGzYEL/88gveeOMNqFQq4zLdunXDli1bsHPnTkRERCAiIgIfffQRAgICjMu89957uHbtGmrWrMnhLSQpQRRF3jYSBReUxMTESF1Gud3P1aPuO1sxoUsdvN6pttTlEBFRFTlz5gzq1q0rdRkWZ/z48di+fTtOnToldSlUzZX2b7Sk3MlByVbOwU4OX1cHXL6dIXUpREREVW7u3Lno0qULNBoNtm/fjkWLFmHWrFlSl0X0SBjMbUCIhyPnMiciomopJiYG8+bNw927dxEcHIzZs2dj7FjzGyURWQMGcxsQonPEuuPXIYoibyVMRETVypo1a6QugajC8OJPGxDioUFGTj5up+dIXQoRERERPSIGcxsQ4lEwM8sl3gGUiKha4fwNRJbpUf9tMpjbgKK5zC8n8wJQIqLqQi6XIy8vT+oyiKgY9+/fh1KpLPd6DOY2oIazCiqlDHE8Y05EVG24uroiKSkJBoNB6lKIqJAoisjKysL169fh6elZ7vV58acNkMkEBLlzZhYioupEp9MhISEB586dk7oUInqAUqmEl5cXnJ2dy70ug7mNqOmhwd837kpdBhERVRGZTGZy90oisn4cymIjQjwccS31PnLz+SdNIiIiImvEYG4jQjwcoTeIuJrC4SxERERE1ojB3EaE6ApmZuGUiURERETWicHcRgQXzmV+mcGciIiIyCoxmNsIZ5USOo094jiXOREREZFVYjC3ISEejjxjTkRERGSlGMxtSE0PzmVOREREZK0YzG1IiE6DlMxcpGXlSl0KEREREZUTg7kNCSm8AJQzsxARERFZHwZzGxLiUTBl4uXbvACUiIiIyNowmNsQfzcHKOUCx5kTERERWSGLDeY5OTkYM2YMdDodHB0dERUVhYSEhIeud/PmTURHR8PDwwMqlQr16tXD7t27q6Bi6SnkMgRo1TxjTkRERGSFLDaYjxs3DuvWrcPq1auxd+9e3Lt3D8888wz0en2J66SlpaFNmzYQRRFbtmzBmTNnsHDhQnh6elZh5dIK1mkQxzPmRERERFZHIXUBxbl79y6WLl2KZcuWoUuXLgCAFStWIDAwENu3b0e3bt2KXe/jjz9GjRo1sHz5cmNbcHBwldRsKWp6OGLPhdvQG0TIZYLU5RARERFRGVnkGfNjx44hLy8PXbt2Nbb5+/ujbt26OHDgQInr/fLLL2jRogX69esHT09PNG7cGF988QVEUayKsi1CiIcjcvMNuJ56X+pSiIiIiKgcLDKYJyYmQi6XQ6fTmbR7eXkhMTGxxPUuX76Mr776CiEhIfj9998xduxYvPnmm/jyyy+LXX7x4sUIDw9HeHg4bt++XaHvQSpFM7NcSuY4cyIiIiJrUqXBfPr06RAEodTHrl27Hnn7BoMBTZs2xezZs9GkSRMMGzYMr7/+eonBfNSoUYiJiUFMTAw8PDweeb+WJERXMJf5Zc5lTkRERGRVqnSM+bhx4zBo0KBSlwkICMChQ4eg1+uRnJxsEpiTkpIQGRlZ4ro1atRAvXr1TNrq1q2LBQsWPF7hVkTraAcXByVnZiEiIiKyMlUazHU6ndnwlOI0a9YMSqUS27Ztw4ABAwAACQkJOHPmDFq3bl3iem3atMG5c+dM2s6fP4/AwMDHK9yKCIKAEA9HnjEnIiIisjIWOcbcxcUFI0aMwJQpU7B9+3b8+eefGDx4MBo2bIjOnTsblwsNDcUXX3xhfD1+/HgcOnQIH374IS5evIiffvoJn3/+OUaPHi3F25BMsM6RUyYSERERWRmLDOYA8Nlnn6F3797o168f2rRpA41Gg02bNkEulxuXOXfuHJKTk42vmzdvjl9++QVr165FgwYNMG3aNLz//vt49dVXpXgLkqnpoUHivWxk5uRLXQoRERERlZFFzmMOAPb29li4cCEWLlxY4jLFTYPYo0cP9OjRozJLs3hFF4DGJWeiga+LxNUQERERUVlY7BlzenTGKRN5ASgRERGR1WAwt0GB7moIAqdMJCIiIrImDOY2SKWUw8/NAZd5ASgRERGR1WAwt1EhOg3nMiciIiKyIgzmNirEo2DKxOIukCUiIiIiy8NgbqNCdI7IytUj6V6O1KUQERERURkwmNuooplZOJyFiIiIyDowmNuoEI+Cucwv8QJQIiIiIqvAYG6jvJ1VUNvJecaciIiIyEowmNsoQRAQrHPkXOZEREREVoLB3IaFeGhwOZlnzImIiIisAYO5DQvROSIh9T6y8/RSl0JERERED8FgbsNCPBwhisDVlCypSyEiIiKih2Awt2EhOk6ZSERERGQtGMxtWHDRlIm8AJSIiIjI4jGY2zCNvQJezvacmYWIiIjICjCY27gQHWdmISIiIrIGDOY2LsSjYC5zURSlLoWIiIiISqGQugCqXCEeGty9n4c9F5KhlAvIyTcgN9/wwE89cvIMyNUbCn/qkZtvwFNhNdA0wE3q8omIiIiqDQZzGxfq7QQAiP72SJmWV8gE6EURl25n4tuhzSuzNCIiIiJ6AIO5jWsV4o5V/9cC+QYRdgoZ7BWywp9y2P/rtZ1CBrlMwMsrjuH8rXSpSyciIiKqVhjMbZxMJqB1LV251gl0V2PH2VvQG0TIZUIlVUZERERED+LFn2QmwF2NXL0BifeypS6FiIiIqNpgMCczQe4FNya6cofznxMRERFVFQZzMhOgVQMArt7JkrgSIiIiouqDwZzM+Lg6QCkXEM9gTkRERFRlGMzJjFwmwM9NjaspHMpCREREVFUYzKlYAVo1rvCMOREREVGVYTCnYgW5q3H1ThZEUZS6FCIiIqJqgcGcihXg7oj0nHykZuVJXQoRERFRtcBgTsUKLJyZJZ5TJhIRERFVCQZzKlagO6dMJCIiIqpKDOZULP/CM+a8AJSIiIioajCYU7FUSjlquKhwhVMmEhEREVUJBnMqUYBWzaEsRERERFWEwZxKFOiu5t0/iYiIiKoIgzmVKNDdEckZOcjMyZe6FCIiIiKbx2BOJTLOzJLCs+ZERERElY3BnEoUqHUEwJlZiIiIiKoCgzmVKMB4xpwzsxARERFVNgZzKpGLgxKuaiUvACUiIiKqAgzmVKpATplIREREVCUYzKlUge6OvMkQERERURVgMKdSBbqrcSMtG3l6g9SlEBEREdk0BnMqVYBWDb1BxPXU+1KXQkRERGTTGMypVIHuBVMmxt/hcBYiIiKiysRgTqXiTYaIiIiIqgaDOZXK08keKqWMNxkiIiIiqmQM5lQqQRAQqHVkMCciIiKqZAzm9FAB7mre/ZOIiIiokjGY00MFatW4cicLBoModSlERERENktRUkfDhg3LtSFBEPDf//4Xvr6+j10UWZZAdzVy8g24lZ4DbxeV1OUQERER2aQSg/lff/2FiRMnQqPRPHQjoijio48+Qk5OToUWR5ahaMrEK3cyGcyJiIiIKkmJwRwAJk+eDE9PzzJt6JNPPqmQgsjyFE2ZeCUlCy1C3CWuhoiIiMg2lRjM4+Li4OHhUeYNnT59Gj4+PhVSFFkWH1cHyGUCrnJmFiIiIqJKU2IwDwwMLNeG/P39H7sYskxKuQy+rg68+ycRERFRJSp1KMvVq1fLtJGAgIAKKYYsV6C7mnf/JCIiIqpEpQbzoKAgCIJQYr8oihAEAXq9vsILI8sS6K7GphM3pS6DiIiIyGaVOo/50aNHceTIERw5cgSHDx+GSqXC+vXrjW1F/ZUhJycHY8aMgU6ng6OjI6KiopCQkFDqOnq9Hm+//TaCg4OhUqkQHByM6dOnIz8/v1JqrE4CtY64ez8Pd7PypC6FiIiIyCaVesa8WbNmJq9lMhnCwsIQEhJSqUUBwLhx4/Drr79i9erVcHd3x4QJE/DMM8/g2LFjkMvlxa4zZ84cfPnll/j+++8RFhaGkydPIjo6Gvb29nj77bcrvWZbFmCcmSUTDdWu0hZDREREZINKDeZSuXv3LpYuXYply5ahS5cuAIAVK1YgMDAQ27dvR7du3Ypd78CBA+jZsyd69uwJoGAoTlRUFA4fPlxltduqoikT4+9koaGfq7TFEBEREdmgUoeySOXYsWPIy8tD165djW3+/v6oW7cuDhw4UOJ6bdu2xc6dO3H27FkABVM47tixA08//XSl12zrArQFwfwqZ2YhIiIiqhTlPmNe2sWgFSUxMRFyuRw6nc6k3cvLC4mJiSWu98YbbyA9PR316tWDXC5Hfn4+pk2bhldffbXY5RcvXozFixcDAG7fvl1xb8AGqe0U8HSyxxXOZU5ERERUKUoN5lFRUSavs7OzMXLkSKjVapP2jRs3lmln06dPx4cffljqMjt37izTtoqzZs0aLF++HKtWrUL9+vURGxuLsWPHIjg4GCNGjDBbftSoURg1ahQAIDw8/JH3W10EuqtxhVMmEhEREVWKUoO5u7vp7dcHDRr0WDsbN27cQ7cREBCAQ4cOQa/XIzk52eTuo0lJSYiMjCxx3cmTJ2PSpEl48cUXAQBhYWG4cuUKZs+eXWwwp/IJ0Dpi/8VkqcsgIiIiskmlBvNly5ZV6M50Op3Z8JTiNGvWDEqlEtu2bcOAAQMAAAkJCThz5gxat25d4npZWVlmM7bI5XIYDIbHK5wAFJwxX3c8G9l5eqiUxc+MQ0RERESPxiIv/nRxccGIESMwZcoUbN++HX/++ScGDx6Mhg0bonPnzsblQkND8cUXXxhf9+zZEx999BG2bNmC+Ph4bNiwAfPnz0fv3r2leBs2p2hmFt4BlIiIiKjilRjMX331VWRkZJR5QxMmTMCdO3cqpCgA+Oyzz9C7d2/069cPbdq0gUajwaZNm0zOiJ87dw7Jyf8MrVi4cCH69u2LV199FXXr1sXEiRMxcuTIh45rp7IJdHcEAF4ASkRERFQJBFEUxeI65HI5EhMTTcZ4l8bZ2RmxsbFVcvOhyhAeHo6YmBipy7BoqZm5aPL+NkzvURf/F2mdx5mIiIhIaiXlzhLHmIuiiJCQkDJPj5iZyfmtbZ2rWgknlYJDWYiIiIgqQYnB/FEu/PTy8nqsYsiyCYKAQHc14jmUhYiIiKjClRjMo6Ojq7IOshKBWkf8feOu1GUQERER2RyLnJWFLFeguxoJqfeRr+cUlEREREQVicGcyiXQXY18g4ibd7OlLoWIiIjIpjCYU7kEaDllIhEREVFlYDCncim6yVD8Hc7CQ0RERFSRyhTMf/nlF+j1+squhayAt7MKdgoZp0wkIiIiqmBlCuYDBw6Er68v3njjDZw/f76yayILJpMJCNCqcYVnzImIiIgqVJmCeWJiImbOnIndu3ejbt26aNu2LZYtW8abClVTgVo1x5gTERERVbAyBXMnJye89NJLOHToEE6ePIkWLVrgrbfeQo0aNTBy5EgcOnSosuskCxLgrsbVlCyIoih1KUREREQ2o9wXf9avXx/jx4/HqFGjkJubizVr1iAyMhItWrTAyZMnK6NGsjCBWjWycvW4nZEjdSlERERENqPMwTwvLw9r165F9+7dERwcjB07dmDRokVISkrClStXULduXfTr168yayULEeheMGXiVQ5nISIiIqowirIsNGbMGKxevRqCIGDw4MGYP38+6tWrZ+x3cHDARx99BB8fn0orlCxH0ZSJV+5kITxIK3E1RERERLahTMH89OnT+OKLL9CnTx/Y2dkVu4xOp8POnTsrtDiyTH5uasgE4AqnTCQiIiKqMGUK5n/88cfDN6RQoH379o9dEFk+O4UMNVwccJVTJhIRERFVmDIF8+XLlxfbLggCVCoVatWqhSZNmlRoYWTZAt3ViOcYcyIiIqIKU6ZgPnr0aOTm5iIvLw8yWcH1ogaDAUqlEkDBhaFNmjTB1q1b4eHhUXnVksUIdFfj97+TpC6DiIiIyGaUaVaWtWvXokmTJti/fz+ys7ORnZ2N/fv3o1mzZtiwYQP+/PNPiKKICRMmVHa9ZCEC3R2RkpmL9Ow8qUshIiIisgllCuYTJkzAggUL0KpVKygUCigUCrRq1Qrz58/HxIkT0ahRI3zyySe8+LMaCdT+MzMLERERET2+MgXz+Ph4qNVqs3a1Wo34+HgAQHBwMFJTUyu0OLJcAYVTJl7lzCxEREREFaJMwTwiIgITJkxAYmKisS0xMRGTJk1CixYtAAAXLlyAn59f5VRJFqfoJkPxnJmFiIiIqEKUKZgvWbIEN27cQEBAAIKCghAUFISAgADcuHED33zzDQAgMzMT06dPr9RiyXJo7BVwd7Tj3T+JiIiIKkiZZmXx8/NDbGwsduzYgXPnzgEAQkND0aVLFwiCAADo1atXpRVJlinQXc0x5kREREQV5KHBXK/Xw8XFBSdOnEC3bt3QrVu3qqiLrECguyOOxKVIXQYRERGRTXjoUBa5XI7AwEDk5uZWRT1kRQK0aty4ex85+XqpSyEiIiKyemUaY/7222/jzTffRHJycmXXQ1Yk0F0NUQSupdyXuhQiIiIiq1emMebz5s1DXFwcfH194efnB0dHR5P+kydPVkpxZNkCjVMmZqKWp0biaoiIiIisW5mCed++fSu7DrJCRVMm8gJQIiIiosdXpmA+Y8aMyq6DrJC7ox0c7eQM5kREREQVoExjzAEgOzsbP//8M+bMmYO0tDQAwKVLl5CSwlk5qitBEBDg7ogrvMkQERER0WMr0xnzixcvonPnzsjIyEBaWhqef/55uLq64j//+Q/S0tKMNxmi6idQq8b5W+lSl0FERERk9cp0xnzcuHHo2rUrkpKS4ODgYGyPiorCzp07K604snyB7mokpNyH3iBKXQoRERGRVSvTGfMDBw7g0KFDkMvlJu0BAQG4ceNGpRRG1iHQ3RG5egMS72XD19Xh4SsQERERUbHKPMY8Ly/PrO3q1atwcXGp0ILIuhRNmchx5kRERESPp0zBvGvXrpg/f77xtSAIuHfvHmbMmIEePXpUWnFk+QK0RcGcM7MQERERPY4yDWWZP38+OnTogCeeeALZ2dno168fLl68CC8vL6xdu7ayayQL5uPqAKVcYDAnIiIiekxlCuY+Pj6IjY3F6tWrcfz4cRgMBowaNQoDBw40uRiUqh+5TICfmxpXUziUhYiIiOhxlCmYA4CDgwOGDx+O4cOHV2Y9ZIUC3dU8Y05ERET0mMoczBMSErBnzx7cunULBoPBpG/ChAkVXhhZj0CtGsfiUyGKIgRBkLocIiIiIqtUpmC+cuVKDB8+HAqFAh4eHibhSxAEBvNq7glvZ6TnXEG/rw9hZLsQdAr1hEzGgE5ERERUHmUK5u+88w4mTpyI999/32wuc6IXwv2QlZuPZfvjMXJ5DEJ0jhgRGYznmvpBpeTvCxEREVFZCKIoPvSWjRqNBidPnkRISEhV1CSJ8PBwxMTESF2GVcvXG/DfvxKxZM9lnLp+F1pHOwxuGYjBrQKh09hLXR4RERGRRSgpd5ZpHvOnn34ahw8frvCiyLYo5DJENfLBxtfa4MdRLdHE3xUL/riA1h/twFvrT+LirQypSyQiIiKyWGUaytKlSxe88cYb+PvvvxEWFgalUmnS36dPn0opjqyTIAhoGeKOliHuuHgrA0v3Xca649ex+sg1dAr1xMh2IWgRrOWFokREREQPKNNQFpms5BPrgiBAr9dXaFFS4FCWypWckYMVB69gxaErSMnMRZivCxr4ukAuAxQyGeQyAQqZYPwpM76WGduf8HZCm1o6qd8KERER0WMpKXeW6Yz5v6dHJCovncYe47vUwStP1sS64wn44dBVbD+TBL1BRL7eUPDTIMIgisjTF/9d0U4uw9HpneHioCy2n4iIiMialXkec6KKoFLKMbBFIAa2CCx1OUNhUNcbROhFEScT0jBgyWH8/nciXgj3r6JqiYiIiKpOqRd/tm7dGmlpacbXb731FlJSUoyvk5OTERAQUGnFUfUlkwmwU8jgYCeHxl6BViHuCNCqsenEDalLIyIiIqoUpQbzQ4cOITc31/j6yy+/NAnqer0e169fr7TiiIoIgoCoRj7YfzEZt9NzpC6HiIiIqMKVabrEImW4TpSo0kQ19oFBBP576qbUpRARERFVuHIFcyIp1fFyQqi3E36N5V9piIiIyPaUGswFQTCba5pzT5OUohr74PjVNFxLyZK6FCIiIqIKVeqsLKIoYtCgQbC3L7idenZ2NkaOHAm1Wg0AyMnhWF+qWj0b+uDjreew6eQNvPpkLanLISIiIqowpQbz6Ohok9eDBg0yW2bIkCEVWxFRKfy1ajQNcMXGWAZzIiIisi2lBvNly5ZVVR1EZfZsY1/M2Pg3zielo46Xk9TlEBEREVUIXvxJVufpsBqQCcDGWM5pTkRERLaDwZysjoeTPdrU0mHjiRucwpOIiIhshsUG88WLF6NDhw5wdXWFIAiIj48v03rr1q1DvXr1YG9vj3r16mHDhg2VWyhJomcjH1xNycKJhLtSl0JERERUISw2mGdlZaFr16549913y7zOwYMH0a9fPwwcOBCxsbEYOHAgnn/+eRw+fLjyCiVJdG/gDTuFjHOaExERkc0QRAsfCxATE4PmzZsjLi4OQUFBpS7br18/pKSkYNu2bca2zp07w8PDA6tXry513fDwcMTExFREyVRFXloRg+NX03DorU6Qyzi/PhEREVmHknKnxZ4xfxQHDx5E165dTdq6deuGAwcOSFQRVaaoRr64nZ6Dw5fvSF0KERER0WOzqWCemJgILy8vkzYvLy8kJiYWu/zixYsRHh6O8PBw3L59uypKpArUqa4nHO3k2HiCs7MQERGR9avSYD59+nQIglDqY9euXVVWz6hRoxATE4OYmBh4eHhU2X6pYqiUcnSr743/nrqJnHy91OUQERERPZZSbzBU0caNG1fs3UMfFBAQ8Mjb9/b2RlJSkklbUlISvL29H3mbZNl6NvbB+j+vY8/5ZHSp5/XwFYiIiIgsVJUGc51OB51OV2nbb9WqFbZt24bJkycb27Zt24bWrVtX2j5JWm1r6eCmVmLjiRsM5kRERGTVqjSYl0diYiISExNx/vx5AMDp06eRlpaGgIAAaLVaAECnTp0QERGB2bNnAwDGjh2Ldu3a4aOPPkKvXr2wYcMG7Ny5E/v27ZPsfVDlUspleDqsBtYfv47MnHw42lvsrzQRERFRqSz24s9FixahSZMmGDhwIACgR48eaNKkCTZu3Ghc5tKlS7h586bxdevWrfHjjz/iu+++Q8OGDbF8+XKsWbMGLVq0qPL6qeo829gX9/P02H4m6eELExEREVkoi5/HvKpwHnPrZTCIaDNnB+rVcMbSoc2lLoeIiIioVNViHnOqnmQyAT0b+WDPhdtIy8qVuhwiIiKiR8JgTjYhqpEP8vQifvur+DnriYiIiCwdgznZhPo+zgjxcMSvsdelLoWIiIjokTCYk00QBAFRjXxwOC4FiXezpS6HiIiIqNwYzMlmRDXygSgCm0/ekLoUIiIionJjMCebEeKhQZivCzadYDAnIiIi68NgTjYlqpEPTiTcRXxyptSlEBEREZULgznZlGca1YAgABt51pyIiIisDIM52ZQaLg5oHqTFxhM3wHtnERERkTVhMCeb82xjH1y8lYEzN9OlLoWIiIiozBjMyeY83aAGFDKBw1mIiIjIqjCYk81xc7RDZG0dNp24AYOBw1mIiIjIOjCYk02KauyD62n3MfGnE1h3LAFX72RxzDkRERFZNIXUBRBVhqca1MDuc7ex4+wtbPjzOgDA08kezYO0CA9yQ/MgLUK9naCQ87spERERWQYGc7JJKqUcn73YBAaDiIu3M3A0PgUx8ak4Gp+CLaduAgAc7eRoGuiG8EAtmge5oXGAK9R2/CdBRERE0mAKIZsmkwmo4+WEOl5OGNgiEABw8+59HI1PRUx8Co7Gp+KzP85DFAG5TMCw1kGY/kw9iasmIiKi6ojBnKqdGi4OiGrkgKhGPgCAe9l5OH4lFf/ZdQlrYq7hrafrQi4TJK6SiIiIqhsOsKVqz1mlxJNPeOLFCH+kZ+fjXCLnPyciIqKqx2BOVKh5kBYAcCTujsSVEBERUXXEYE5UyM9NDV9XBxyNT5W6FCIiIqqGGMyJHhARrMXhuBTOeU5ERERVjsGc6AHNg7RIzshBXHKm1KUQERFRNcNgTvSAiOCCceZH41MkroSIiIiqGwZzogfU9HCEu6MdDscxmBMREVHVYjAneoAgCGgepMURBnMiIiKqYgzmRP8SEaxFQup93Ei7L3UpREREVI0wmBP9C8eZExERkRQYzIn+pW4NZzjZKzjOnIiIiKoUgznRv8hlApoFuXGcOREREVUpBnOiYkQEa3HxVgbuZORIXQoRERFVEwzmRMVoYRxnnipxJURERFRdMJgTFSPM1xX2ChmHsxAREVGVYTAnKoadQoYmAa6cmYWIiIiqDIM5UQkigt3x9427SM/Ok7oUIiIiqgYYzIlK0CJYC4MIHLvCceZERERU+RjMiUrQJMAVCpnAceZERERUJRjMiUqgtlOgga8Lx5kTERFRlWAwJypFi2AtTly7i+w8vdSlEBERkY1jMCcqRfMgLXL1BsReS5O6FCIiIrJxDOZEpWgepIUgAEc5zpyIiIgqGYM5USlc1Eo84eWEIxxnTkRERJWMwZzoISKCtTh2JRX5eoPUpRAREZENYzAneoiIYC2ycvX4+8Y9qUshIiIiG8ZgTvQQEUFaAOB85kRERFSpGMyJHsLTWYVgnSMOM5gTERFRJWIwJyqD5kFuOBqfAoNBlLoUIiIislEM5kRlEBHsjrv383DhVobUpRAREZGNYjAnKoMWwUXjzO9IXAkRERHZKgZzojLwc3OAt7OK48yJiIio0jCYE5WBIAiICNbiaHwKRJHjzImIiKjiMZgTlVFEsBZJ93JwNSVL6lKIiIjIBjGYE5VR0ThzDmchIiKiysBgTlRGtTw1cFMrcZTBnIiIiCoBgzlRGQmCgOZBWhyJZzAnIiKiisdgTlQOEcFaXLmThcS72VKXQkRERDaGwZyoHCKK5jPnWXMiIiKqYAzmROVQr4YzHO3kHGdOREREFY7BnKgcFHIZmgVpcYTBnIiIiCqYxQbzxYsXo0OHDnB1dYUgCIiPj3/oOkuWLEFkZCTc3Nzg6uqKDh06YN++fZVfLFUrEUFuOJeUjtTMXKlLISIiIhtiscE8KysLXbt2xbvvvlvmdXbt2oV+/fphx44dOHz4MJ544gl069YNFy5cqLxCqdqJCHYHAMRcSZW4EiIiIrIlCqkLKMm4ceMAADExMWVeZ+XKlSav//Of/+CXX37B1q1bUbt27Yosj6qxhn4usFPIcCTuDrrU85K6HCIiIrIRFnvGvCLk5uYiOzsbbm5uUpdCNkSllKOxvyvHmRMREVGFsulgPn36dGg0GkRFRRXbv3jxYoSHhyM8PBy3b9+u4urImkUEafHXjXvIzMmXuhQiIiKyEVUazKdPnw5BEEp97Nq1q0L2tWDBAnz99ddYv349nJ2di11m1KhRiImJQUxMDDw8PCpkv1Q9RARroTeIOH6V48yJiIioYlTpGPNx48Zh0KBBpS4TEBDw2Pv57LPP8Pbbb+O3335DRETEY2+P6N+aBrpBLhNwJC4FkbX5pY6IiIgeX5UGc51OB51OV6n7mD9/PmbMmIEtW7agbdu2lbovqr409grU93HGYQsaZ34vOw8Xb2UgPjkTAVo1Gvm7Qim36dFqRERENsViZ2VJTExEYmIizp8/DwA4ffo00tLSEBAQAK224LbonTp1QkREBGbPng0AmDt3LqZNm4YffvgBderUQWJiIgDAwcEBLi4u0rwRslkRQVosP3QFm0/egAChzOup7eXQqu3gpraDm6MSGnsFBKHs66dk5uJCUjou3s7AhaQMXLyVgQu30pF0L8d0P3ZyhAdp0SrEHa1ruqO+jzMUDOpEREQWy2KD+aJFizBz5kzj6x49egAAli1bhqFDhwIALl26BH9/f+MyX375JfLy8tCvXz+TbUVHR+O7776r9Jqpeoms44Fv9sXhtVV/PtZ2lHIBrmo7aNV2cFUroXW0K3jtqISb2g4yQcCl2wUB/OKtDNx54MZGajs5anlq0KaWDrU8Najt6YQgdzUu3c7AgUt3cPDSHczZehYA4GSvQESwFq1quqNVTXfU9XaGTFb2LwRERERUuQRRFEWpi7AE4eHh5ZoznUgURVxLuY+cfL15X4nrABk5+UjLykVKZi5Ss3KRmpWH1KLnmXlIycpFWmG73lCwJWeVArW9nFDLQ4PaXpqCEO7lhBrOqoeG61vp2Th0OQUHL93Boct3EJecCQBwVSvRIrjgjHrLmu6o7ekEOYM6ERFRpSspd1rsGXMiSycIAgLc1ZW2fYNBRHpOPvL0Brg72pVruMuDPJ1UiGrkg6hGPgCAm3fv49DlOzhw8Q4OXr6D3/9OAlAwbr6xvyuaBrqhaYArmvi7wUWtrLD3Q0RERKVjMCeyUDKZABeHig/GNVwc0LuJH3o38QMAXEvJwtH4FBy/morjV9LwxY4LKDxRj1qeGjQNcEXTADc0C3RDTQ8Nh78QERFVEgZzomrOX6uGv1aNPk0LgnpGTj5OXksrCOpX0/C/00lYG5MAoGBITeMANzTyc4HaruA/H2LhwJ3iBsU9OFJOKZdBo1JAY//Pw9FeASfVP8/tFbJH/ssAERGRtWMwJyITGnsFWtfSoXWtgqlNRVHE5eRMHL9SENSPX0nFFxduFxvEH5dSLhhDuk5jj+ea+eG5pr7GLwFERES2jBd/FuLFn0Rll5tvgKGY/3Q8eLK7aArJorbcfAMycvILHtn5yMzJR3rR89x8pGcX9GUWtp1LSsffN+7BxUGJ/hEBGNIqED6uDlXx9oiIiCoVL/4kogpjpyj/fOhKuQyO9gp4lXF5URRx7Eoqvt0fh8V7LmHJ3st4qoE3hrcNRtMAt3Lvn4iIyNIxmBORRRIEAeFBWoQHaZGQmoXlB69g9ZGr2HzyJhr7u2J422A81cCbdzclIiKbwaEshTiUhcjyZebkY93xBCzbH4+45Ex4O6swpHUgBkQEwFVtJ3V5REREZVJS7mQwL8RgTmQ9DAYRu87fwrf74rHvYjJUShmea+qHliHucHFQmjycHZS8cRIREVkUjjEnIpshkwnoGOqFjqFeOJt4D8v2xeOnYwlYefhqscs72SvgXBjSXRwUxtDupFJCpZRBpZBDpZRDpZTBXln4XFH4XCEr7CvoL+iTw14p4/SORERUoRjMiciqhXo7Y07fhpj2TF0k3s3G3ft5uJuVV/Cz8HEvu/Bn4eu45EzcvZ+H9Ox8ZOfpjTdUehT2xuBe8NP4ujC8hwdqMaZjLd6YiYiIHorBnIhsgrNKCWfVo90pNU9vQHaeHtl5BT9z8v95bvxZ2PZgX06eHjn5DyyXr0dO4c/sPD3uZOTi0+3ncSczBzOj6vPsOhERlYrBnIiqPaVcBqVcBidVxW5XFEXM/u0sFu+5DDu5DNN61GU4JyKiEjGYExFVEkEQ8NZTocjNN+CbfXGwU8gwudsTDOdERFQsBnMiokokCAJm9KyHnHwDvtp1CfYKOcZ2ri11WUREZIEYzImIKpkgCPiwVwPk6Q34dPt52ClkeOXJmlKXRUREFobBnIioCshkAuY81xC5+QbM2XoWSrmA/4sMkbosIiKyIAzmRERVRC4TMP+FRsjTG/DBljOwV8gwuFWQ1GUREZGFkEldABFRdaKQy7DgxSboXNcTb//6N9YcLf6mSEREVP0wmBMRVTE7hQxfDmyK9nU88Ob6U1h/PEHqkoiIyAIwmBMRScBeIcfXg5uhVYg7Jv10AptO3JC6JCIikhiDORGRRFRKOb6JDkd4oBbj1sRi61+JUpdEREQSYjAnIpKQ2k6Bb4c1R0M/F4xZfRw7ziZJXRIREUmEs7IQEUlMY6/Ad8MiMOibwxi5/BicVQqIAAwGESIAUQREUYRBBEQU/IQIGMSCfplQMOOLUiaDQi5ALpNBKRegkAtQyGRQyAQo5EU/BShkAgQ8cPfR4p9CMGkXjG1F7Q+2/bNOQatKKYOfmxr+bg7w16oRoFXDz00NBzt5xX1wREQ2hsGciMgCuDgosWJEBBbtvoys3HwIKAy5QkEAlhUGYllBA2SFAVgQCoJ7vkFEnt4AvUFEnl5EftFzQ8HzfJOfonG/BdG+8Pk/T41fCIwvIBqXLWovWEb8Z5EH+m6k5WP3+dvIzjOYvE+dxh7+Wgf4uxWE9aLn/lo1XNVKONopIJMJICKqjhjMiYgshKvaDm8+FSp1GRVGFEUkZ+TiWmoWrqUUPe7jWmoWjl9NxZZTN6E3iGbraewVBQ9VwU+nwp9FbU6FP1VKOQSh8EtL4ZcXWeGXmVJ/4p8vPUWvZbJ/zvY/uKzp+3ngeQlfaAAYv0wV/XXB+BwFN5oq+kL14P7ksoJl5DIBMqHo8cBrWeHrwg0V/BXln7+aiKJo1mYobPvna9M/dQgPfLErqg//qquoJpkgQF5YkyDDP89N6i1Yj4geD4M5ERFVCkEQ4OFkDw8nezQNcDPrz9cbcPNuNq6lZCEh9T7u3s9Dek4+MrLzkZGTh4ycfKRn5yMjJx+Jd7ORUdSXm28Whsn6CAKgkBV8KVHIZIU/hX9+yk3bzb4o/Wt7Yim/FEVfGgTj65KHZJl9vfjXfov7+mHcsyia/fXowb80lfZ7+yi/0iV9FXrwi1bBcoJ5378aLO1r1YOfadHr4j7Top9l/X34d/OK/4uAp5PqseutKAzmhXLj4nBl8BCTNqenukM7YAAM9+/j2qiXzNZx6d0brn16Iz81FddfH2vW79b/RTg//TTybt7EjSlvmPVrhw2DU8cOyLkch8QZM8z6da+8DMfWrZF95gySZs026/cYPx7qpk2QdfxP3P70U7N+r6lvQVW3LjIPHEDyfxaZ9XvPnAn7kGCk79iJlGXLzPp9Pp4DZY0auPff/yJ19Y9m/b6fL4DCzQ1p6zfg7oYNZv3+i7+GzMEBKatWIf23rWb9gSuWAwDuLP0WGbt2mfQJKhUCliwGANz+6itkHTxk0i93dYXfws8BALc+mY/7sbEm/Qpvb/jO/RgAkDhrFnLOnDXptwsKQo333wMA3Hz7HeTGx5v029cNhffUqQCA65OnID/RdLYMh8aN4TlxAgAgYczr0KelmfSrW7WEx6uvAgCujhwFMTvbpF/z5JNwHzEcAMx+7wD+7vF3r3r97vkWPoDC370uRb97n5it7zF+PFSNGyP16DGkLvjM5H/Gogioxk+CUKsO8o8cRu5335j2AxAmvAXRPwDi/r3ATyuN6xXJmfwORE9PyHZth2LzBvw7rmRP/wBwcYXif1ug3PbbPx2Fi+W8Pw+ivQryTeuh2POHcb9FhdybvRAGUYRqw2rYHz0IiP+EDIPSHknTPoJeFOH68wo4nDpuXFcEkK9xwuUxb8MgAn4/fQvNJdPfrXytDjdGvwVBALyW/weqKxeBwrPfIoBcb1/cGjUBogh4LZkP5c0H5s8XgfuBNXFz0CsAAL//fARFSrJJ0EwPCUV8n6EwiCJC/zMLiox7Ju/vzhMNcal7PwBAs69mQp6Xa1LfrQbhiO/UGwAQsWBaweCoB4LV1YatcLZlVyA7Gx2/m20axEQRf4VF4u+G7eCQlY6eGz7Hv51o2gkX6rWE5t4ddN9o/t+dmIincLl2U7jduYEuvy37p/ZCB1tHIT6oPjyTrqDTH6vM1t/dri8SfGvD9/oFtN/z8z8fXOHB/6PjANzyCkTQlb/R+sBGk3UFAP/rPgxpuhoIufAnwo/8hn/7refLyHBxR53Th9Do+B9m/Zv6vI5stRPqndyD+if3mvWvf2ES8pX2aHRsG544e8T45ore45qBUyGKIpof/i9qXjphsm6eQom1z08CALQ58CsCr5w26b/voMGGXmMAAO13r4XvjUsm/elObtj0zMsAgM5/rITnLdMbp6W4eWFr94L/7nTf+i20qaYXud/yDMD2TgMBAD03L4JTeqrxcwOA6741saf9CxAA9NqwEKr7GQ98sQCuBtbDoba9IQhA7x/nQpFv+rsXV6sxjrfqAQDou+JDk757MRooejwl6f9zH8RgTkREVkUmE+CglCNDbj6xmKeTPVRaNTKd7ZGsNL/Q1FvnCPsazkjXqpFiZ/6/wDp+LlDW0OKehwapKqVZf90At4IvhToN7qrM168X4FbwpdBdjfRi1m9YWwcAuKPTIMPBtF9Q2aNpWA0AwO19TsiKszfpl7uq0apFIADg1n4X3L9l2q9wd0SrZn4AgMStjsi5Y9pv5+6IVo0LvgLddHdEbrppv72XBpHN/QEA19c6Ij8v3aQ/2M8VnSNDAAAJPzlCr8gz6a9T0x1RXeoAAK6udYSYbfr5h9b2QO/C/ivLHfBvDRrWwKBeYQXhaIvGrL95m2C49gkvCEcHnMz6W7YLgfPT4QXh6LB5f6uOteHUMbwgHP1p3t+22xNwbB2B7DNOSPrbvD+yR73CExJK3D5v3v9krwaFJyTykXzZvL9977DCExIZSLmyz6y/Q9+GhSckbiH1+hGz/o79GheekLiGu0mxZv1fDWxa8LunPI/01DNm/d8ObQ4AuGP4CxmZl036BJUKzwyPAADczo5BVs41k365qyt6F/bfSt2H+4ZbJv0Kbx2eL+xPTNyOHFmqSb9dkCcGFPbfjNuM3Pgsk/7Gdb0wpLD/+pmfkZ+Yb9LfJMwHw4cV9Cccd4M+zfQLc5Mmvvi/6HAAwNW9LmYnJJo188dLgwv6r/zP/NhYEkEs7W8/1Uh4eDhiYmKkLoOIiIiIbFxJuZPzmBMRERERWQAGcyIiIiIiC8BgTkRERERkARjMiYiIiIgsAIM5EREREZEFYDAnIiIiIrIADOZERERERBaAwZyIiIiIyAIwmBMRERERWQAGcyIiIiIiC8BgTkRERERkARjMiYiIiIgsgCCKoih1EZZAp9MhKChIkn3fvn0bHh4ekuybqh6Pd/XC41298HhXPzzm1UtFHe/4+HgkJyebtTOYW4Dw8HDExMRIXQZVER7v6oXHu3rh8a5+eMyrl8o+3hzKQkRERERkARjMiYiIiIgsAIO5BRg1apTUJVAV4vGuXni8qxce7+qHx7x6qezjzTHmREREREQWgGfMiYiIiIgsAIM5EREREZEFYDCX0FdffYXg4GCoVCo0a9YMe/fulbokqiB79uxBVFQUfH19IQgCvvvuO5N+URTx7rvvwsfHBw4ODnjyySfx999/S1MsPZbZs2ejefPmcHZ2hoeHB3r27Im//vrLZBkeb9vy5ZdfomHDhnB2doazszNatWqFLVu2GPt5vG3X7NmzIQgCXnvtNWMbj7dteffddyEIgsnD29vb2F/Zx5vBXCJr1qzB2LFjMXXqVPz5559o3bo1nnrqKVy9elXq0qgCZGRkoEGDBliwYAEcHBzM+j/++GN88sknWLhwIY4ePQpPT0906dIF6enpElRLj2PXrl149dVXceDAAezYsQMKhQKdO3dGSkqKcRkeb9vi5+eHOXPm4Pjx44iJiUHHjh3Rq1cvnDx5EgCPt606dOgQFi9ejIYNG5q083jbnieeeAI3b940Pk6dOmXsq/TjLZIkIiIixP/7v/8zaatVq5b45ptvSlQRVRZHR0dx2bJlxtcGg0H09vYWP/jgA2NbVlaWqNFoxEWLFklQIVWk9PR0USaTiRs3bhRFkce7unBzcxMXLVrE422j0tLSxJCQEHHHjh1i+/btxdGjR4uiyH/ftmjGjBli/fr1i+2riuPNM+YSyM3NxbFjx9C1a1eT9q5du+LAgQMSVUVVJS4uDomJiSbH38HBAe3atePxtwHp6ekwGAxwc3MDwONt6/R6PX788UdkZGSgdevWPN42atSoUejbty86dOhg0s7jbZsuX74MHx8fBAcH48UXX8Tly5cBVM3xZjCXQHJyMvR6Pby8vEzavby8kJiYKFFVVFWKjjGPv20aO3YsGjdujFatWgHg8bZVp06dgkajgb29PV5++WVs2LABYWFhPN42aMmSJbh48SI++OADsz4eb9vTokULfPfdd9i6dSuWLFmCxMREtG7dGnfu3KmS462okK0QEREmTJiAffv2Yd++fZDL5VKXQ5XoiSeeQGxsLO7evYuff/4Z0dHR2LVrl9RlUQU7d+4cpk6din379kGpVEpdDlWBp556yuR1y5YtERISgu+//x4tW7as9P3zjLkEdDod5HI5kpKSTNqTkpJMrvwl21R0jHn8bcv48eOxevVq7NixAyEhIcZ2Hm/bZGdnh1q1aqFZs2aYPXs2GjdujE8//ZTH28YcPHgQycnJqF+/PhQKBRQKBXbv3o2vvvoKCoUC7u7uAHi8bZlGo0H9+vVx4cKFKvn3zWAuATs7OzRr1gzbtm0zad+2bRtat24tUVVUVYKDg+Ht7W1y/LOzs7F3714efys1duxYYygPDQ016ePxrh4MBgNycnJ4vG1Mr169cOrUKcTGxhof4eHhePHFFxEbG4s6derweNu47OxsnD17FjVq1KiSf98cyiKRCRMmYPDgwYiIiECbNm2waNEi3LhxAy+//LLUpVEFyMjIwMWLFwEU/A/76tWriI2NhVarRUBAAMaNG4dZs2YhNDQUderUwQcffACNRoMBAwZIXDmV1+jRo7FixQr88ssvcHNzM44z1Gg00Gg0EASBx9vGvPnmm+jRowf8/f2Rnp6OVatWYdeuXdiyZQuPt41xdXWFq6urSZujoyO0Wi0aNGgAADzeNmbSpEno2bMnAgICcOvWLbz//vvIzMxEdHR01fz7rpC5XeiRfPnll2JgYKBoZ2cnNm3aVNy9e7fUJVEF2blzpwjA7BEdHS2KYsGUSzNmzBC9vb1Fe3t7sV27duKpU6ekLZoeSXHHGYA4Y8YM4zI83rYlOjpaDAgIEO3s7EQPDw+xU6dO4tatW439PN627cHpEkWRx9vW9OvXT6xRo4aoVCpFHx8fsU+fPuLff/9t7K/s4y2IoihWTMQnIiIiIqJHxTHmREREREQWgMGciIiIiMgCMJgTEREREVkABnMiIiIiIgvAYE5EREREZAEYzImIiIiILACDORERVap3333XeDMWIiIqGecxJyKyIUOHDkVycjI2b95s8rwqxMfHIzg4GEePHkV4eLixPSMjAzk5OXB3d6+SOoiIrJVC6gKIiMiy5efnQy6XQxCER1pfo9FAo9FUcFVERLaHQ1mIiGzQu+++i++//x5btmyBIAgQBAG7du0CAFy/fh0vvvgi3Nzc4Obmhh49euDChQsm6zZo0ADfffcdatasCXt7e2RmZmLr1q2IjIyEm5sbtFotunXrhjNnzhjXCw4OBgA0b94cgiDgySefNNleEYPBgPfffx/+/v6wt7dHWFgYfv31V2N/fHw8BEHAunXr0KVLF6jVatSrVw/btm2rxE+MiEh6DOZERDZo0qRJeOGFF9C5c2fcvHkTN2/eROvWrZGVlYUOHTpApVJh9+7dOHjwIGrUqIHOnTsjKyvLuH5cXBxWrVqFn376CSdOnIBKpUJmZibGjRuHI0eOYNeuXXBxcUHPnj2Rm5sLADhy5AgAYOvWrbh58ybWr19fbG0LFizA3LlzMWfOHJw6dQq9e/dGnz59EBsba7LctGnT8Prrr+PEiRNo3rw5XnzxRWRkZFTOB0ZEZAE4lIWIyAZpNBo4ODjA3t4e3t7exvYffvgBoihi2bJlxqEpX3/9NTw9PbF582a88MILAIDc3FysWLECXl5exnWfe+45k30sW7YMzs7OOHLkCNq2bQsPDw8AgLu7u8k+/23evHmYNGkSBgwYAAB47733sGfPHsybNw8//PCDcbnx48ejZ8+eAIBZs2Zh+fLliI2NRdu2bR/noyEislg8Y05EVI0cO3YMcXFxcHJyMo79dnFxQWpqKi5dumRczs/PzySUA8ClS5cwYMAA1KxZE87OzvDy8oLBYMDVq1fLvP979+7hxo0baNOmjUl727Ztcfr0aZO2hg0bGp/7+PgAAG7dulXmfRERWRueMSciqkYMBgMaN26MH3/80axPq9Uanzs6Opr1P/PMM/Dz88PXX38NX19fKBQK1KtXzziU5XH9++JSpVJp1mcwGCpkX0RElojBnIjIRtnZ2UGv15u0NW3aFKtXr4ZOp4Orq2uZt3Xnzh2cPXsWX331FTp06AAAOH78OPLz8032B8Bsnw9ydnaGj48P9u/fj06dOhnb9+3bh3r16pW5HiIiW8ShLERENiooKAh//fUXzp07h+TkZOTl5WHgwIHw8vLCs88+i927dyMuLg579uzBxIkTTWZm+Tc3NzfodDosWbIEFy9exO7du/Hyyy9Dofjn/I6npyccHBzw+++/IykpCXfv3i12W5MnT8a8efOwevVqnD9/Hu+88w727t2LSZMmVfhnQERkTRjMiYhs1MiRI1G3bl2Eh4fDw8MD+/fvh1qtxp49exASEoLnn38eoaGhiI6ORmpqKtzc3Erclkwmw5o1a3Dy5Ek0aNAAo0ePxvvvvw97e3vjMgqFAp9//jm++eYb+Pj44Nlnny12W6+//jomT56MKVOmoEGDBtiwYQPWrVuHRo0aVfhnQERkTXjnTyIiIiIiC8Az5kREREREFoDBnIiIiIjIAjCYExERERFZAAZzIiIiIiILwGBORERERGQBGMyJiIiIiCwAgzkRERERkQVgMCciIiIisgAM5kREREREFuD/AV6QseUh2QMBAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The following plot compares the two Estimators - with and without noise\n", + "\n", + "plt.rcParams[\"font.size\"] = 14\n", + "\n", + "# plot loss and reference value\n", + "plt.figure(figsize=(12, 6), facecolor='white')\n", + "plt.plot(Energy_H_t, label=\"Estimator VQE H3+ IDEAL\")\n", + "plt.axhline(y=real_solution_t.real, color=\"tab:red\", ls=\"--\", label=\"Target\")\n", + "\n", + "plt.legend(loc=\"best\")\n", + "plt.xlabel(\"Iteration\")\n", + "plt.ylabel(\"Energy [H]\")\n", + "plt.title(\"VQE energy\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "51018cdb-48b6-4446-8b13-5d909db2786d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Submitting your answer. Please wait...\n", + "Congratulations 🎉! Your answer is correct and has been submitted.\n" + ] + } + ], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_ex2\n", + "\n", + "grade_lab4_ex2(result, Energy_H_t)" + ] + }, + { + "cell_type": "markdown", + "id": "cf57c8db-47d5-4a91-ae0a-5b4c5761445b", + "metadata": {}, + "source": [ + "## Building helper functions\n", + "Before proceeding further with more VQE problems, it would be convenient to make a reusable custom function that we can call to get problem related items and VQE instances. As an exercise since you built the routine previously, rebuild the functions below to have these helper functions available to be called when needed!" + ] + }, + { + "cell_type": "markdown", + "id": "9e6d281f-5a21-4ecb-a328-728865c9b13b", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise 3: \n", + " \n", + "Complete the **two custom functions** below which can be later utilized conveniently for running more molecular simulations.\n", + " \n", + ">- The **first function** is the `construct_problem` function which will take in a list of \n", + " - `geometry` coordinates, `charge`,`multiplicity` for the `Molecule` object, \n", + " - `basis` for `ElectronicStructureMoleculeDriver` and \n", + " - `num_molecular_orbitals` for the `ActiveSpaceTransformer` call.
\n", + " \n", + " **The first function will return** the `ansatz` circuit, `qubit_op_parity` Hamiltonian, `real_solution` converged using the StatevectorSimulator, `problem_reduced` which has the reduced `ElectronicStructureProblem` as done above\n", + "\n", + " \n", + ">- The **second function** is the `custom_vqe` function which will take in:\n", + " - An `estimator` object which can be any estimator derivation as long as it implements the `BaseEstimator` class\n", + " - `ansatz` circuit to be evaluated,\n", + " - `ops` observables to be estimated, \n", + " - `problem_reduced` which has the reduced `ElectronicStructureProblem` for interpreting results\n", + " - `optimizer` if required. Default will be set to `SPSA`\n", + " \n", + "**The second function will return** the `vqe_interpret` list of interpreted converged values by the optimizer, `job_list` list of stored jobs\n", + " \n", + "Please do not modify the seed values for the grader runs to be successful.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "71c3cc81-77f9-4dc7-a4ff-2f79c226a67f", + "metadata": {}, + "source": [ + "### 1. Helper Function for constructing problem" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "3c072d3f-abcf-4754-afcf-4e6637fce09a", + "metadata": {}, + "outputs": [], + "source": [ + "def construct_problem(geometry, charge, multiplicity, basis, num_electrons, num_molecular_orbitals):\n", + "\n", + " molecule = Molecule(geometry=geometry,\n", + " charge=charge, \n", + " multiplicity=multiplicity) \n", + " driver = ElectronicStructureMoleculeDriver(molecule, basis=basis, driver_type=ElectronicStructureDriverType.PYSCF) \n", + "\n", + " # Run the preliminary quantum chemistry calculation\n", + " properties = driver.run()\n", + "\n", + " # Set the active space\n", + " active_space_trafo = ActiveSpaceTransformer(num_electrons=num_electrons,\n", + " num_molecular_orbitals=num_molecular_orbitals) \n", + " transformer = ActiveSpaceTransformer(\n", + " num_electrons=num_electrons, # Number of electrons in our active space\n", + " num_molecular_orbitals=num_molecular_orbitals, # Number of orbitals in our active space\n", + " )\n", + " # Now you can get the reduced electronic structure problem\n", + " problem_reduced = ElectronicStructureProblem(driver, transformers=[transformer]) # ----------- Enter your code here\n", + "\n", + " # The second quantized Hamiltonian of the reduce problem\n", + " second_q_ops_reduced = problem_reduced.second_q_ops()\n", + "\n", + " # Set the mapper to qubits\n", + " parity_mapper = ParityMapper() # This is the example of parity mapping\n", + "\n", + " # Set the qubit converter with two qubit reduction to reduce the computational cost \n", + " parity_converter = QubitConverter(parity_mapper, two_qubit_reduction=True) # ----------- Enter your code here \n", + "\n", + " # Compute the Hamitonian in qubit form\n", + " qubit_op_parity = parity_converter.convert(second_q_ops_reduced.get('ElectronicEnergy'), num_particles=problem_reduced.num_particles)\n", + " \n", + " # Get reference solution\n", + " vqe_factory = VQEUCCFactory(quantum_instance=StatevectorSimulator(),optimizer=SLSQP(),ansatz=UCC(excitations='sd')) \n", + " solver = GroundStateEigensolver(parity_converter, vqe_factory) \n", + " real_solution = solver.solve(problem_reduced).total_energies[0] \n", + " \n", + " ansatz=vqe_factory.ansatz\n", + " \n", + " return ansatz, qubit_op_parity, real_solution, problem_reduced" + ] + }, + { + "cell_type": "markdown", + "id": "27e8982c-fb99-475b-ab01-27d48479f4ad", + "metadata": {}, + "source": [ + "### 2. Helper function for Running VQE" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f020a522-939c-4fd6-919c-c0f5ad1cd281", + "metadata": {}, + "outputs": [], + "source": [ + "def custom_vqe(estimator, ansatz, ops, problem_reduced, optimizer = None, initial_point=None):\n", + "\n", + " # Define convergence list\n", + " convergence = []\n", + "\n", + " # Keep track of jobs (Do-not-modify)\n", + " job_list = []\n", + " estimator = Estimator(ansatz)\n", + " # Define evaluate_expectation function\n", + " def evaluate_expectation(x):\n", + " x = list(x)\n", + "\n", + " # Define estimator run parameters\n", + " job = estimator.run(ansatz, ops, x).result()# ----------- Enter your code here\n", + " results = job.values[0]\n", + " job_list.append(job)\n", + "\n", + " # Pass results back to callback function\n", + " return np.real(results)\n", + "\n", + " # Call back function\n", + " def callback(x,fx,ax,tx,nx):\n", + " # Callback function to get a view on internal states and statistics of the optimizer for visualization\n", + " convergence.append(evaluate_expectation(fx))\n", + "\n", + " np.random.seed(10)\n", + "\n", + " # Define initial point. We shall define a random point here based on the number of parameters in our ansatz\n", + " if initial_point is None:\n", + " initial_point = np.random.random(ansatz.num_parameters)\n", + "\n", + " # Define optimizer and pass callback function\n", + " if optimizer == None:\n", + " optimizer = SPSA(maxiter=50, callback=callback)\n", + "\n", + " # Define minimize function\n", + " result = optimizer.minimize(evaluate_expectation, initial_point) # ----------- Enter your code here\n", + "\n", + " vqe_interpret = []\n", + " for i in range(len(convergence)):\n", + " sol = MinimumEigensolverResult()\n", + " sol.eigenvalue = convergence[i]\n", + " sol = problem_reduced.interpret(sol).total_energies[0]\n", + " vqe_interpret.append(sol)\n", + "\n", + " return vqe_interpret, job_list, result" + ] + }, + { + "cell_type": "markdown", + "id": "4e8a0959-7fa1-458b-bd26-ee6497836f55", + "metadata": {}, + "source": [ + "### 3. Custom Function to Plot Graphs\n", + "Creating a helper function to create plots for future use." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d7b7d4ae-a763-461d-a4b6-4fb3bdc31a57", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_graph(energy, real_solution, molecule, color=\"tab:blue\"):\n", + " \n", + " plt.rcParams[\"font.size\"] = 14\n", + "\n", + " # plot loss and reference value\n", + " plt.figure(figsize=(12, 6), facecolor='white')\n", + " plt.plot(energy, label=\"Estimator VQE {}\".format(molecule),color = color)\n", + " plt.axhline(y=real_solution.real, color=\"tab:red\", ls=\"--\", label=\"Target\")\n", + "\n", + " plt.legend(loc=\"best\")\n", + " plt.xlabel(\"Iteration\")\n", + " plt.ylabel(\"Energy [H]\")\n", + " plt.title(\"VQE energy\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "992e270c-35a2-49fb-8c2e-5b23629eb05b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Submitting your answer. Please wait...\n", + "Congratulations 🎉! Your answer is correct and has been submitted.\n" + ] + } + ], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_ex3\n", + "\n", + "grade_lab4_ex3(construct_problem, custom_vqe)" + ] + }, + { + "cell_type": "markdown", + "id": "08cedb57-986e-47d0-affc-28f283155d14", + "metadata": {}, + "source": [ + "Now that we have all of the ingredients ready to use, a very brief note on why computing the ground state energy of a reaction is useful for us: Having this information can give us various insights into properties that are of interest indirectly. You can explore the kinetics of a given reaction through the ground state energies of reactants/products or transition states, derive other molecular property insights like dipoles, polarizabilities, forces, calculate excitation energies and much more.\n", + "\n", + "\n", + "For example, let's now compute for the reaction below; given the reactants and products, find out the transition energy needed to make a $H_3^+$ ion. \n", + "\n", + "## Reaction Energy of H2 + H2+ → H3+ + H\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "036ffa05-c942-4ac7-87db-74d11ca33b47", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "b2f9f661-4472-4bff-a994-eaf248945f3c", + "metadata": {}, + "source": [ + "### 1. Compute the Ground State Energy of Each Ingredient\n", + "\n", + "#### Define Geometry\n", + "\n", + "Here we shall define the geometry of each of the molecules mentioned above." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "808e24fd-7aa7-49e6-8d13-b9c28fc75bc2", + "metadata": {}, + "outputs": [], + "source": [ + "# Constructing H2\n", + "hydrogen_m = [[\"H\", [0.3714, 0.0, 0.0]], \n", + " [\"H\",[ -0.3714, 0.0, 0.0]]] \n", + "\n", + "# Constructing H2+\n", + "hydrogen_c = [[\"H\", [0.546211, 0.0, 0.0]], \n", + " [\"H\",[ -0.546211, 0.0, 0.0]]]\n", + "\n", + "# Constructing H\n", + "hydrogen_a = [[\"H\",[0.0,0.0,0.0]]] " + ] + }, + { + "cell_type": "markdown", + "id": "655cb542-d22e-47f5-a45e-82c174adf90d", + "metadata": {}, + "source": [ + "### Construct Problem\n", + "\n", + "We shall use our helper functions to construct the problem and run our simulation to get the ground state of each of the reactants/products." + ] + }, + { + "cell_type": "markdown", + "id": "8100f150-b5aa-476b-a0aa-04596a18a3cc", + "metadata": {}, + "source": [ + "#### $H_2$ - VQE Run" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "19fb672c-d58f-4bb6-afd5-5f2a289bacfd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "algorithm_globals.random_seed = 1024\n", + "# For H2\n", + "ansatz_m, ops_m, real_solution_m, problem_reduced_m = construct_problem(geometry=hydrogen_m, charge=0, multiplicity=1, basis=\"ccpvdz\", num_electrons=2, num_molecular_orbitals=2)\n", + "\n", + "# Estimator VQE for H2\n", + "Energy_H_m,_,jobs = custom_vqe(estimator=Estimator(), ansatz=ansatz_m, ops=ops_m,problem_reduced=problem_reduced_m)\n", + "\n", + "# Plot Graph H2\n", + "plot_graph(Energy_H_m, real_solution_m, \"H2\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "5b01ae12-f722-4715-a952-7e95792ca04d", + "metadata": {}, + "source": [ + "#### $H_2^+$ - VQE Run" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d72d6429-31a2-4afe-aab4-d8461d9f1c30", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+y+//CKLxaIVK1aobdu2stvtqlOnjtatW1eInxgAlAwEfABArqKjo9WjRw+1adNGCQkJSkhIULNmzXTx4kW1bt1aPj4+2rRpk7Zv366KFSuqTZs2unjxonP7o0ePasmSJVq+fLm+//57+fj4KCUlRSNHjtR3332njRs3qkyZMurcubPS09MlSd99950kae3atUpISNDKlStz7dvrr7+u6dOna9q0adq7d6+6deum7t27Ky4uzmW9cePGacSIEfr+++91++23q1evXrpw4ULhfGAAUEJQogMAyJW/v798fX3l7e2tkJAQ5/LFixfL4XBo3rx5zpKbd999V0FBQVq9erV69OghSUpPT9eiRYsUHBzs3PbBBx90Oca8efNUunRpfffdd2revLkCAwMlSRUqVHA55p/NmDFD0dHR6tOnjyTpxRdf1ObNmzVjxgwtXrzYud7TTz+tzp07S5KmTJmihQsXKi4uTs2bN7+RjwYASjRG8AEA12Tnzp06evSoSpUq5ayNL1OmjE6fPq3Dhw8716tcubJLuJekw4cPq0+fPrrllltUunRpBQcHKysrS8eOHcv38c+dO6fff/9dd911l8vy5s2b66effnJZVr9+feefQ0NDJUnHjx/P97EA4GbECD4A4JpkZWXptttu04cffujWVr58eeef/fz83No7deqkypUr691331WlSpXk5eWlOnXqOEt0btSfL+K1Wq1ubVlZWQVyLAAoqQj4AICrstlsyszMdFnWqFEjLV26VAEBASpbtmy+93Xy5Ent379fb7/9tlq3bi1J2rVrly5fvuxyPElux7xS6dKlFRoaqm+++Ub33nuvc/nWrVtVp06dfPcHAIyKEh0AwFVVrVpVP/zwgw4cOKDk5GRlZGSob9++Cg4O1gMPPKBNmzbp6NGj2rx5s5555hmXmXT+rFy5cgoICNDcuXN16NAhbdq0SY8//ri8vP5/rCkoKEi+vr768ssvlZSUpLNnz+a6r9GjR2vGjBlaunSpfv75Z73wwgvasmWLoqOjC/wzAICbDQEfAHBVjz32mGrXrq3IyEgFBgbqm2++kd1u1+bNm1W9enU9/PDDioiIUFRUlE6fPq1y5cpddV8eHh766KOPtGfPHt16660aNmyYJk+eLG9vb+c6Xl5eeuONN/Tee+8pNDRUDzzwQK77GjFihEaPHq0xY8bo1ltv1SeffKIVK1aoQYMGBf4ZAMDNhjvZAgAAAAbCCD4AAABgIAR8AAAAwEAI+AAAAICBEPABAAAAAyHgAwAAAAZCwAcAAAAMhIAPAAAAGAgBHwAAADAQAj4AAABgIP8Hu7FPkza3DikAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "algorithm_globals.random_seed = 1024\n", + "# For H2+\n", + "ansatz_c, ops_c, real_solution_c, problem_reduced_c = construct_problem(geometry=hydrogen_c, charge=1, multiplicity=2, basis=\"ccpvdz\", num_electrons=(1,0), num_molecular_orbitals=2)\n", + "\n", + "# Estimator VQE for H2+\n", + "Energy_H_c,_,jobs = custom_vqe(estimator=Estimator(), ansatz=ansatz_c, ops=ops_c,problem_reduced=problem_reduced_c)\n", + "\n", + "# Plot Graph H2+\n", + "plot_graph(Energy_H_c, real_solution_c, \"H2+\",color = \"tab:orange\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b40f4b2-8702-4aa0-a382-26569cc9d8c8", + "metadata": { + "tags": [] + }, + "source": [ + "#### $H_3^+$ - VQE Run" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4c843e45-78b6-46f7-8015-8eec2fbc4475", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot Graph H3+\n", + "plot_graph(Energy_H_t, real_solution_t, \"H3+\",color = \"tab:green\")" + ] + }, + { + "cell_type": "markdown", + "id": "1d369f94-e357-4e73-ac52-94a43c7d1f09", + "metadata": {}, + "source": [ + "#### H - VQE Run" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e8b1834c-9b16-4279-84cc-3250441d00f6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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kSNHSjx+5MiRevrpp/XWW29pz549qlmzpm6++eZLujYAVCTm4AOAQQwdOlReXl6aPXu29uzZoyFDhhQL8L6+vpoyZYpSU1Pd9sY/b9OmTXr11Vc1aNAgtWvXrlz61bdvXwUEBOjJJ59UXl5esfrjx49f9DmHDBmiwsJCPf7448XqHA6H23Se0vrlcDj08ssvu8oKCwv173//u8Tj27Vrpw4dOmjZsmVau3atbr/9dnl7e1903wGgojGCDwAG0ahRI/Xo0UPvvPOOJF3wpVRTpkxRcnKy5s6dq8TERN16663y9vbW7t27tWrVKrVr1861B/zvFRYWlrhVpCQNHDhQtWrVKrGuZs2aWrhwoYYNG6YOHTrorrvuUkhIiI4dO6bNmzerTZs2JV6vNNdff73GjRunefPm6eDBg+rbt6/sdruOHDmiN998U48//rhGjRpV6jmio6PVuXNnTZkyRd98841atWqld955RydOnJAkmUymYm1iYmL04IMPSpJGjBhxUX0GgMpCwAcAAxk+fLi2bdumFi1a6Oqrry7xGLPZrNdff1033XSTFi9erOnTp7sW1vbt21fvvPOObDZbsXb5+fkXDLWHDh26YMCXikbcGzRooCeffFJPP/20cnJy1KBBA1133XVuu9hcjH/961/q2LGjFi5cqGnTpslisSg0NFR33HGHbrzxxj9tbzabtWnTJj3wwANavny5vLy8dMstt+jRRx9Vt27dShydHzp0qCZPnqyGDRvq+uuvv6R+A0BFMzmdTmdVdwIAULXy8/M1cOBAffjhh9q0adMFd7zxBBs3btQtt9yi3bt367rrrnOr++WXX1SvXj1NmjRJTzzxRBX1EABKxxx8AICsVqvWr1+v9u3b67bbbtOBAwequkuV4ty5c27fOxwOLViwQDVr1lTHjh2LHf/aa68pLy+v2NtuAaA6YYoOAECS5Ofnp08++aSqu1Gpxo8fr3Pnzunaa69Vbm6uNmzYoD179ujJJ59021rzww8/VEpKih5//HENGDBALVq0qMJeA0DpmKIDAPBYq1ev1tNPP60jR44oJydHzZo103333ae4uDi342644Qbt2bNH1157rVauXKnGjRtXUY8B4M8R8AEAAAADYQ4+AAAAYCDMwS9nQUFBatKkSVV3AwAAAAb27bffKisrq8Q6An45a9KkiZKSkqq6GwAAADCw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zc3V+PHjFRQU5Jo/lpaWVub2c+bMkclkUlxcnFv5mTNnNH78eDVq1Eg+Pj5q2bKlnn322WLt9+3bp969e8vf3181atRQ165dlZVVPV8m5RrBZw4+AAAeJTc3VxkZGW5fx48flyS99957ev755/Xpp5/qu+++0+rVq3X69GnXfPMmTZro888/V2pqqrKyspSfn19u/WrRooXeeustHThwQIcOHdLw4cNL3FN+165d+uGHH1wZa+LEidqxY4cee+wxffXVV1q1apWefvrpEhfBltWYMWO0dOlSbdu2rdjUGl9fXy1ZskTvv/++xowZo08//VTHjh3T66+/rkGDBqlfv36655573NqcPn262Gd+8uTJS+5fRai2AX/ChAlav3691qxZo127dunUqVMaMGBAmX7TTExM1KJFi0qc5xUfH69NmzZpxYoVSklJ0bRp0zR16lTXCnKp6GUHffr00Q033KDExETt379fkyZNcvtTVHXCLjoAAHimrVu3qn79+m5fHTp0kFQ0F3/jxo2KiopSeHi45s+fr1deeUXdu3eXJN19991q1aqVIiMjFRwcXGzk/HI888wzqlu3rrp3767+/fvrmmuucV33vMcff1zff/+9rrzySteoeseOHbVu3TqtX79ebdu21dSpUzV16tRiA7YXY+TIkcrOzlajRo3Ut2/fYvWDBg3Szp07dfz4cd14442ubTIHDx6sd999V2azuVi///iZjxs37pL7VxFMzgvtLVSFTp48qeDgYC1btsy1t+n333+vsLAw/ec//ynx4fy+bceOHfXKK69o5syZatu2rWsrJElq27atbrvtNs2cOdNV1qNHD7Vr1851XNeuXdWzZ0898cQTF933yMhIJSUlXXS7y5F7rkCvPLhT1w1upquiQiv12gAAGEFKSsoFd1KBZ3E4HBo2bJh27dqlHTt2XPR8+/JU2s9laZmzWo7g79+/X/n5+erTp4+rrHHjxmrVqpX27NlTatvY2FgNHjxYPXv2LLG+W7duevfdd/X9999Lkvbs2aPk5GT169dPkvTTTz9p7969ql+/vrp16+b67fODDz4op7srf1bb+V10GMEHAAC4HGazWatWrdLEiRO1c+fOqu7OJamWu+hkZGTIbDYrKCjIrTwkJEQZGRkXbLd48WIdOXJEK1euvOAxL7zwgu655x6FhobKYim6/QULFmjA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "algorithm_globals.random_seed = 1024\n", + "# For H\n", + "ansatz_a, ops_a, real_solution_a, problem_reduced_a = construct_problem(geometry=hydrogen_a, charge=0, multiplicity=2, basis=\"ccpvdz\", num_electrons=(1,0), num_molecular_orbitals=2)\n", + "\n", + "# Estimator VQE for H\n", + "Energy_H_a,_,jobs = custom_vqe(estimator=Estimator(), ansatz=ansatz_a, ops=ops_a, problem_reduced=problem_reduced_a)\n", + "\n", + "\n", + "# Plot Graph H\n", + "plot_graph(Energy_H_a, real_solution_a, \"H\",color = \"tab:purple\")" + ] + }, + { + "cell_type": "markdown", + "id": "a7177883-f421-4fec-9032-1e55ae55a237", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise 4: \n", + " \n", + "Compute the reaction energy by running the above VQE routines (in units of eV). Please note that our VQE result is in Hartree units hence you may need to convert it to get a result in eV.
" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ceb9a254-1a4c-42a3-8559-f11e5fcdb1bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-1.1311826662830753+0j)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Energy_H_m[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "234a38c9-b7d8-4e33-90c6-e1fa4e9c3145", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(-1.796662118000966+0j)\n" + ] + } + ], + "source": [ + "\n", + "#### enter your code below ####\n", + "# Please note the reaction energy should be in eV and not in Hartree units for successful grading.\n", + "\n", + "re0 = Energy_H_m[-1]+Energy_H_c[-1]\n", + "re1 = Energy_H_a[-1]+Energy_H_t[-1]\n", + "print(re1)\n", + "\n", + "react_vqe_ev = re1 #*27.2114\n", + "\n", + "#### enter your code below ####\n", + "\n", + "\n", + "#print(\"Reaction energy VQE estimator eV\", ,\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "a06abe55-58f6-499a-8335-b34c4d58f797", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Submitting your answer. Please wait...\n", + "Congratulations 🎉! Your answer is correct and has been submitted.\n" + ] + } + ], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_ex4\n", + "\n", + "grade_lab4_ex4(react_vqe_ev) # Hint: Answer is in eV! :)" + ] + }, + { + "cell_type": "markdown", + "id": "1524a60b-6543-432e-b490-21881339fcf4", + "metadata": {}, + "source": [ + "The reference reaction energy of the formation of $H_3^+$ is -1.7eV **[[12]](https://www.pnas.org/doi/10.1073/pnas.0601242103)** which matches well with our calculated result!\n", + "\n", + "The above reaction is extremely efficient and leads to $H_3^+$ being the dominant ion in hydrogen plasma, rather than $H_2^+$ or $H^+$. Due to this and its low proton affinity (4.4eV), $H_3^+$ plays an important role in interstellar chemistry and results in the proton hop reaction $H_3^+$ + $X$ → $HX^+$ +$H_2$ where X is an atom or molecule. \n", + "\n", + "Now that we have examined one of the possible information points gaine by computing the ground state energies of molecules, let us investigate what other properties and information of interests can we gain from this information. We shall now proceed to investigate **Cyclopropenylidene** " + ] + }, + { + "cell_type": "markdown", + "id": "703dbeaa", + "metadata": {}, + "source": [ + "\n", + "# Part II: Exploring Interstellar Cyclopropenylidene($C_3H_2$)\n", + "\n", + "Cyclopropenylidene is an unstable molecule which we cannot easily observe on earth, and the first interstellar hydrocarbon ring molecule. \n", + "\n", + "$C_3H_2$ is found to be very widespread throughout the Galaxy - it is found in significant concentrations in the interstellar medium (ISM) and on Saturn's moon, Titan. This, together with its small dipole moment and many observable transitions, makes cyclopropenylidene a promising probe for physical conditions in the interstellar medium **[[13]](https://pubmed.ncbi.nlm.nih.gov/11542419/)**.\n", + "\n", + "In this section, we will explore Cyclopropenylidene by using abundant feature of Qiskit Nature - 1) We shall explore a few more cases and algorithms where the ground state energy information can be used to decipher other molecular properties and characteristics on further processing. We will calculate the spectral properties of this molecule that allows us to learn more about the presence of cycloprophenylidene outside of the Earth. 2) We will also calculate the dipole moment of this molecule by using molecular hamiltonian.\n", + "\n", + "Also, we will try to noisy backend to seet the effect of noise of a quantum backend by using Estimator and FakeBackend. \n" + ] + }, + { + "cell_type": "markdown", + "id": "441b7dc7-f948-4e74-9236-d047434cbd82", + "metadata": {}, + "source": [ + "## 1. Compute Absorption Spectra Using the Excited Energy State of Cyclopropenylidene($C_3H_2$)\n", + "\n", + "Wavelength absorption analysis plays a very important role when exploring the interstellar medium. The absorption wavelength can be easily computed by using the transition energy, which is the difference between the ground state energy and the excited energy.\n", + "\n", + "We shall be approaching this problem using the Variational Quantum Deflation algorighm (VQD) Using Qiskit, you can compute the excited energy of molecule by calling the VQD to run the VQD algorithm. Let's try this and check the excited state energies and dipole moment of Cyclopropenylidene. Before we start, we will first need to define the structure **[[14]](https://webbook.nist.gov/cgi/cbook.cgi?ID=C16165405&Units=CAL&Mask=3FFF)**:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "408d0efb-92a7-4c1b-8e64-45cd2ee94c72", + "metadata": {}, + "outputs": [], + "source": [ + "cyclic = [[\"C\", [2.2883, 0.6993, 0.3468 ]],\n", + " [\"C\",[ 1.9543, 2.0133, 0.7806]],\n", + " [\"C\",[ 1.0108, 0.9522, 0.6802]],\n", + " [\"H\",[ 3.0291, 0.0000, 0.0000 ]],\n", + " [\"H\",[ 0.0000, 0.5997, 0.7904]]] " + ] + }, + { + "cell_type": "markdown", + "id": "b58f1eda-f005-4bbb-92a6-a8d1c68b2a80", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise 5: \n", + "\n", + "Welcome to the last grading problem of Lab 4! We shall try to compute two things here: \n", + " \n", + "* The first excited state transition energy in units of nm using the Variational Quantum Deflation (VQD) routine **(Example: Ungraded)**\n", + "* The total dipole moment of Cyclopropenylidene. **(Graded)**
\n" + ] + }, + { + "cell_type": "markdown", + "id": "552ab43b-1610-41cd-8cda-aa783b88f11c", + "metadata": {}, + "source": [ + " The **Variational Quantum Deflation** (**[VQD](https://qiskit.org/documentation/stubs/qiskit.algorithms.eigensolvers.VQD.html#qiskit.algorithms.eigensolvers.VQD)**) is a quantum algorithm that uses a variational technique to find the k eigenvalues of the Hamiltonian $H$ of a given system. It is essentially a tweaked version of the VQE algorithm we constructed above to calculate higher excited state energies using the previous excited state energy result. Please refer to **[[18]](https://arxiv.org/abs/1805.08138)** for more detailed information about the algorithm.\n", + "\n", + "The algorithm computes excited state energies of generalised hamiltonians by optimizing over a modified cost function where each successive eigenvalue is calculated iteratively by introducing an overlap term with all the previously computed eigenstates that must be minimised, thus ensuring higher energy eigenstates are found.\n", + "\n", + "We will now compute the excited state by setting `k=2` (compute ground state energy and first excited state energy). This simulation is likely to take a few minutes according to your environment, so please feel free to take a break until the result is computed!" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "7582e6df-32d8-432a-a205-d335ed491c42", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 2min 50s, sys: 3.78 s, total: 2min 54s\n", + "Wall time: 2min 33s\n" + ] + } + ], + "source": [ + "%%time\n", + "from qiskit.algorithms.eigensolvers import VQD\n", + "from qiskit.algorithms.state_fidelities import ComputeUncompute\n", + "from qiskit.primitives import Sampler, Estimator\n", + "from qiskit.algorithms.optimizers import COBYLA, L_BFGS_B\n", + "algorithm_globals.random_seed = 1024\n", + "\n", + "molecule = Molecule(geometry=cyclic,\n", + " charge=0, \n", + " multiplicity=1)\n", + "driver = ElectronicStructureMoleculeDriver(molecule, basis=\"sto3g\", driver_type=ElectronicStructureDriverType.PYSCF) # This is an example of using STO-3G basis set, and performing preliminary Quantum Chemistry calculation using PySCF\n", + "\n", + "# Run the preliminary quantum chemistry calculation\n", + "properties = driver.run()\n", + "\n", + "# Set the active space\n", + "active_space_trafo = ActiveSpaceTransformer(num_electrons=2,\n", + " num_molecular_orbitals=3) # This is an example of using an active space of minimal 2 electrons with 2 spatial orbitals\n", + "\n", + "# Now you can get the reduced electronic structure problem\n", + "problem_reduced = ElectronicStructureProblem(driver, transformers=[active_space_trafo]) \n", + "\n", + "# The second quantized Hamiltonian of the reduce problem\n", + "second_q_ops_reduced = problem_reduced.second_q_ops()\n", + "\n", + "# Set the mapper to qubits\n", + "parity_mapper = ParityMapper() # This is the example of parity mapping\n", + "\n", + "# Set the qubit converter with two qubit reduction to reduce the computational cost \n", + "parity_converter = QubitConverter(parity_mapper, two_qubit_reduction=True) \n", + "\n", + "# Compute the Hamitonian in qubit form\n", + "qubit_op_parity = parity_converter.convert(second_q_ops_reduced.get('ElectronicEnergy'), num_particles=problem_reduced.num_particles)\n", + " \n", + " \n", + "ansatz=UCCSD(qubit_converter=parity_converter,\n", + " num_particles=problem_reduced.num_particles,\n", + " num_spin_orbitals=problem_reduced.num_spin_orbitals)\n", + " #excitations='sd') \n", + " \n", + "estimator = Estimator()\n", + "fidelity = ComputeUncompute(Sampler())\n", + "\n", + "np.random.seed(10)\n", + "\n", + "initial_point = np.random.random(ansatz.num_parameters)\n", + "optimizer = SPSA(maxiter=50)\n", + "\n", + "vqd = VQD(\n", + " estimator=estimator,\n", + " fidelity=fidelity,\n", + " ansatz=ansatz,\n", + " optimizer=L_BFGS_B(),\n", + " #optimizer=optimizer,\n", + " k=2,\n", + " initial_point=initial_point,\n", + " )\n", + "\n", + "result = vqd.compute_eigenvalues(operator=qubit_op_parity)" + ] + }, + { + "cell_type": "markdown", + "id": "796277ed-f5cf-4288-8f89-40d9e38a63ba", + "metadata": {}, + "source": [ + "We will divide *45.56337117* by the transition energy (the difference between the resulting optimal values of the ground state the the excited state) to **[convert our Hartree unit to nanometers.](http://www.u.arizona.edu/~stefanb/linkpages/conversions.html)**" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "db4b302e-be4f-4b04-a61f-557da993fdfe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spectrum property in nm: 269.2795625809665\n" + ] + } + ], + "source": [ + "# Compute transition energy of 1st excited state in nm unit\n", + "spec = 45.56337117/(result.optimal_values[1] - result.optimal_values[0])\n", + "print(\"spectrum property in nm: \", spec)" + ] + }, + { + "cell_type": "markdown", + "id": "1ded2117-ff5f-4cf3-813a-acce7239d135", + "metadata": {}, + "source": [ + "Cyclopropenylidene is known to have spectrum bands in the 260 ~ 270nm region **[[15]](https://pubs.acs.org/doi/10.1021/jz900114r)**. Despite our calculations making some approximations, we can see that our results still lie within this spectrum range. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "38e4ce90-985f-4db9-9391-61667120f6c7", + "metadata": {}, + "source": [ + "## 2. Computing the dipole moments of Cyclopropenylidene($C_3H_2$) molecule\n", + "\n", + "In Qiskit, there are several ways to calculate the dipole moment of a molecule. Here, we will introduce a method of calculating dipole moment by selecting and defining our observables individually from our `second_q_ops_reduced` operator. We will use the `Estimator` primitive to compute the results individually. Proceed to compute the properties shown below. For the grader, we shall be looking into the Dipole moments as our properties of interest from the list computed below. Let us first generate second quantized fermionic operators from our previously defined `ElectronicStructureProblem` for Cyclopropenylidene" + ] + }, + { + "cell_type": "markdown", + "id": "396a16de", + "metadata": {}, + "source": [ + "
\n", + " Why do Dipole Moments Matter? \n", + "\n", + "When atoms in a molecule share electrons unequally, they create what is called a **dipole moment**. In other words, the dipole moment is a measure of the polarity of the molecule, which arise from differences in electronegativity within that molecule. The larger the difference in electronegativity, the larger the dipole moment.
\n", + "
\n", + "We can loosely group molecules into polar molecules and non-polar molecules. You can usually distinguish these two by looking at the structure of the molecule. If a molecule is completely symmetric, then the dipole moment vectors on each molecule atom will cancel each other out, making the molecule nonpolar. A molecule can only be polar if the structure of that molecule is not symmetric.
\n", + "
\n", + "Molecular dipole moments are very important for many properties, such as ability to dissolve solutes, melting and boiling points, and reactivity in general. Polar molecules which generally have high dipole moments are highly reactive. This is why cyclopropenylidene is only seen in the laboratory on Earth, due to its reactivity. However, cyclopropenylidene is found in significant concentrations in the interstellar medium (ISM) and most recently (October 2020) on Saturn’s moon Titan." + ] + }, + { + "cell_type": "markdown", + "id": "2d82ed29-4192-46d8-a826-07cda9619ca1", + "metadata": {}, + "source": [ + "
\n", + " Note from Sensei: Type of properties we can get from hamiltonian by using Qiskit\n", + "\n", + "We have so far computed the expectation value of the Hamiltonian, which is the molecular energy of the system. In Qiskit Nature, we can compute expectation values of other operators. We can compute the expectation values of the particle number operator, the Angular momentum operator, the magnetization operator, and the dipole moment operators. Note that dipole moments are vectors, which consist of x, y, and z components in a unit of Debye.\n", + " \n", + " \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "c8b4a723-f5d6-4084-9b93-308ff6c524c2", + "metadata": {}, + "outputs": [], + "source": [ + "second_q_ops_reduced = problem_reduced.second_q_ops() # Generating Second quantized operators from Electronic Structure Problem" + ] + }, + { + "cell_type": "markdown", + "id": "736a1a8f-a749-4ba2-9091-214dde9731ae", + "metadata": {}, + "source": [ + "From the result dictionary stored in `second_q_ops_reduced`, we shall extract all available second quantized operators associated with the problem at hand:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a888cab5-0062-4d94-b16b-9664718dc022", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.utils import algorithm_globals\n", + "algorithm_globals.random_seed = 1024\n", + "\n", + "hamiltonian_reduced = [] # List to store all operators\n", + "\n", + "# Extracting individually operators from second_q_ops_reduced:\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('ElectronicEnergy')) # Hamiltonian operator\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('ParticleNumber')) # Number operator (expectation value will be particle number)\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('AngularMomentum')) # Total Angular Momentum operator\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('Magnetization')) # Total Magnetization operator\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('DipoleMomentX')) # Dipole moment operator (X-axis)\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('DipoleMomentY')) # Dipole moment operator (Y-axis)\n", + "hamiltonian_reduced.append(second_q_ops_reduced.get('DipoleMomentZ')) # Dipole moment operator (Y-axis)" + ] + }, + { + "cell_type": "markdown", + "id": "4d033e05-a604-438e-bf92-5726b61e3a86", + "metadata": {}, + "source": [ + "Now we will proceed to map all the second quantised operators to qubit operators using the `ParityMapper` previously defined:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "c809e3fb-0bbc-4e18-be0c-cd324b20b50a", + "metadata": {}, + "outputs": [], + "source": [ + "qubit_op_parity = [] # List to store all qubit operators\n", + "\n", + "# Converting fermionic operators to qubit operators using ParityMapper\n", + "for i in range(7):\n", + " qubit_op_parity.append(parity_converter.convert(hamiltonian_reduced[i], num_particles=problem_reduced.num_particles))" + ] + }, + { + "cell_type": "markdown", + "id": "51f924a6-cbe2-4871-8147-c494c75b02c9", + "metadata": {}, + "source": [ + "Using the `Estimator` we will be calculating the active parts of dipole contributions but we will also need to calculate the non active parts for our problem molecule using the `StatevectorSimulator` before we run our active dipole estimation." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "11935b98-ed95-444f-bdf1-94d5b62c6519", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== GROUND STATE ENERGY ===\n", + " \n", + "* Electronic ground state energy (Hartree): -165.540112217893\n", + " - computed part: -1.140261210763\n", + " - ActiveSpaceTransformer extracted energy part: -164.39985100713\n", + "~ Nuclear repulsion energy (Hartree): 52.358783483228\n", + "> Total ground state energy (Hartree): -113.181328734666\n", + " \n", + "=== MEASURED OBSERVABLES ===\n", + " \n", + " 0: # Particles: 2.000 S: 0.000 S^2: 0.000 M: 0.000\n", + " \n", + "=== DIPOLE MOMENTS ===\n", + " \n", + "~ Nuclear dipole moment (a.u.): [65.28909274 42.68607856 21.98885319]\n", + " \n", + " 0: \n", + " * Electronic dipole moment (a.u.): [65.54872579 43.69778034 22.21640931]\n", + " - computed part: [7.35355537 7.48178318 2.92157308]\n", + " - ActiveSpaceTransformer extracted energy part: [58.19517042 36.21599716 19.29483623]\n", + " > Dipole moment (a.u.): [-0.25963305 -1.01170178 -0.22755612] Total: 1.06898625\n", + " (debye): [-0.65992132 -2.57148919 -0.57838991] Total: 2.71709177\n", + " \n" + ] + } + ], + "source": [ + "# Running one shot estimation using StatevectorSimulator\n", + "vqe_factory = VQEUCCFactory(quantum_instance=StatevectorSimulator(),optimizer=SLSQP(),ansatz=UCC(excitations='sd')) # This is an example of UCC\"SD\" ansatz\n", + "\n", + "# Solving for the ElectronicStructureProblem\n", + "solver = GroundStateEigensolver(parity_converter, vqe_factory) \n", + "result = solver.solve(problem_reduced)\n", + "print(result)\n", + "#print(qubit_op_parity)" + ] + }, + { + "cell_type": "markdown", + "id": "fbb90bac-0a9c-4164-8e08-cfbafb3fdec2", + "metadata": {}, + "source": [ + "Now we shall run the `Estimator` routine and estimate the properties individually. **Complete the code block below** to estimate each observable from the `qubit_op_parity` list with respect to the `vqe_factory.ansatz` (UCCSD) circuit and appending it to the `uccsd_result` list below:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "cc10b322-b701-4336-b7ac-11d4e1c8141c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Energy = (-113.18132873466556+0j)\n", + "CPU times: user 810 ms, sys: 12.4 ms, total: 823 ms\n", + "Wall time: 859 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "# Extracting solved initial point from one shot estimation done previously\n", + "initial_pt = result.raw_result.optimal_point\n", + "\n", + "# List to store all estimated observables\n", + "uccsd_result = [] \n", + "\n", + "#### Enter your code below ####\n", + "for i in range(7):\n", + " uccsd_result.append(Estimator().run([vqe_factory.ansatz], qubit_op_parity[i], initial_pt).result())\n", + "#### Enter your code above ####\n", + " \n", + "energy_c_estimator=uccsd_result[0].values[0]+result.extracted_transformer_energy+result.nuclear_repulsion_energy\n", + "\n", + "print('Energy = ', energy_c_estimator)" + ] + }, + { + "cell_type": "markdown", + "id": "bdda291d-2bee-4265-9c11-8ee8af68410f", + "metadata": {}, + "source": [ + "Now that we have computed our results, lets piece it together to get the resulting dipole moment from the data. The `uccsd_result` list contains the estimated **3 active dipole moment contributions** corresponding to each of the axis in its list. Here we will extract the inactive contributions from the applied transformer and store it in `temp_dipoles_dict`. This dictionary will contain the dipole moments extracted by any applied transformers for each X, Y, and Z axis respectively. We shall also exatract `temp_nu_dipoles` as list of nuclear dipole moments for each X, Y, and Z axis respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "7777187e-d1b9-42b7-b8ac-677af3d6b229", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b4743e25-fb03-4293-8a3d-41ffbe646dde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[65.28909274 42.68607856 21.98885319]\n", + "[((-0.25963304860890446+0j), (-1.0117017827132813+0j), (-0.22755611955520294+0j))]\n" + ] + } + ], + "source": [ + "# Returns the dipole moments extracted by any applied transformers\n", + "temp_dipoles_dict = result.extracted_transformer_dipoles[0] \n", + "temp_dipoles = temp_dipoles_dict.get('ActiveSpaceTransformer')\n", + "\n", + "# Returns nuclear dipole moment X,Y,Z components in A.U when available from driver \n", + "temp_nu_dipoles = result.nuclear_dipole_moment\n", + "print(temp_nu_dipoles )\n", + "print(result.dipole_moment)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ef9fc9a6-fb3c-419c-92fe-e638fd0141c8", + "metadata": {}, + "source": [ + "**For the exercise** we shall compute the resulting dipole moments as the **vector sum** total of contribution from all these factors. **Complete the code block below** to calculate the resulting dipole moment using the information from the lists `uccsd_result`, `temp_dipoles` and `temp_nu_dipoles` **for each axis**. Ensure your result is in debye while submitting to the grader! Do note, the `dip_tot` variable needs to have the **maginitude of the vector** from all three direction components." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "fccd6480-7f4e-4c1c-a1f1-9654678030c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "65.28909274" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#print(uccsd_result)\n", + "temp_nu_dipoles[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "ed066401-05e9-49ba-90dd-473087aa008c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6599213227588174 2.571489193162678 0.5783899092328212\n", + "Dipole (debye) : 2.7170917742848766\n" + ] + } + ], + "source": [ + "\n", + "B= []\n", + "for b in temp_dipoles:\n", + " B.append(b.real)\n", + "C = [n for n in temp_nu_dipoles]\n", + "\n", + "# Fill your codes here\n", + "dipxau = uccsd_result[4].values[0] + B[0] - C[0]# ----------- Enter your code here (Partial information in element 4 in uccsd_result list)\n", + "dipyau = uccsd_result[5].values[0] + B[1] - C[1]# ----------- Enter your code here (Partial information in element 5 in uccsd_result list)\n", + "dipzau = uccsd_result[6].values[0] + B[2] - C[2]# ----------- Enter your code here (Partial information in element 6 in uccsd_result list)\n", + "# print(dipxau, dipyau, dipzau)\n", + "au2debye = 1/0.393430307 # Convert to debye\n", + "dipxdebye = dipxau.real * au2debye\n", + "dipydebye = dipyau.real * au2debye\n", + "dipzdebye = dipzau.real * au2debye\n", + "print(dipxdebye, dipydebye, dipzdebye )\n", + "# print(r, np.linalg.norm([dipxdebye, dipydebye, dipzdebye ]))\n", + "dip_tot = np.linalg.norm([dipxdebye, dipydebye, dipzdebye]) # Compute the total dipole moment magnitude here from the individual components of the vector computed above.\n", + "print('Dipole (debye) : ', dip_tot)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "1c68942c-111e-45a0-9641-abfe031375a5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Submitting your answer. Please wait...\n", + "\n", + "\n", + "Congratulations 🎉! Your answer is correct.\n", + "\n", + "Your scanners successfully identify an abundant cosmic cloud close to the tail of your\n", + "slingshot's path.\n", + "\n", + "You perform the gravity assist maneuver, and you succeed. You escape!\n", + "\n", + "Watch the finale video here (English): https://youtu.be/cARUHc3JsC0\n", + "\n", + "(Transcript in video description.)\n", + "\n" + ] + } + ], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_ex5\n", + "\n", + "grade_lab4_ex5(temp_dipoles_dict, temp_nu_dipoles, dip_tot, \"en\")" + ] + }, + { + "cell_type": "markdown", + "id": "a7f3de44-9500-43e5-98f6-7807eddf5b73", + "metadata": {}, + "source": [ + "The dipole moment of Cyclopropenylidene is known to be approximately 3 Debye **[[16]](https://academic.oup.com/mnras/article/227/1/19P/1066005)**, which is similar to what we have calculated!" + ] + }, + { + "cell_type": "markdown", + "id": "83508547-b8aa-4071-b4eb-09a6208e1c34", + "metadata": {}, + "source": [ + "As you can see, computing the ground state energy of a candidate molecule or chemical reaction participants can be useful for gaining more insights. The following calculations are performed on an ideal simulator which is why our results are very close to ideal expected results. Now we shall work on noisy simulators to simulate and calculate the reaction energy of a reaction and _optionally_ explore to mitigate some of the noisy effects using the `prototype-zne` module. " + ] + }, + { + "cell_type": "markdown", + "id": "75c68b46-5485-4b22-99e9-d31b94c8d016", + "metadata": {}, + "source": [ + "--------" + ] + }, + { + "cell_type": "markdown", + "id": "0ece064a-8db8-4413-8752-0a696fcc6cd9", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + " \n", + " Optional Section: Final Challenge to solve for the lowest score! \n", + "\n", + "Congratulations on completing the graded exercises for the IBM Quantum Challenge Fall 2022! Feel free to proceed to the final scored exercise for this challenge! This challenge is completely optional to attempt \n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d94c8ab8-fadf-491e-890e-3175c7145459", + "metadata": {}, + "source": [ + "# 3. Running on a noisy local simulator\n", + "\n", + "Quantum computing has the potential to revolutionize high-performance computing, and chemistry is one of the most promising applications of quantum computing. However, there are many constraints due to the limitations of NISQ quantum computers - noise, qubit numbers, and limitations of depth in which entanglement is maintained.\n", + "\n", + "Until now, we have been able to obtain values similar to those of existing research results using perfect quantum simulators. However, these calculations produce results that are somewhat far from the existing research results on real quantum backends due to some of the limitations mentioned above. \n", + "\n", + "Let us take a look at the very first exercise we computed using a noisy backend. To initialize a noisy backend, we shall generate an `Estimator` instance with one of the `FakeBackend` that mimics a real device. We will use the `BackendEstimator` class and pass a noisy_backend available in `qiskit.providers.fake_provider` to simulate a noisy run." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "f358e9a1-bbf2-4177-bfe6-c51eaa349611", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.primitives import BackendEstimator\n", + "from qiskit.providers.fake_provider import FakeManilaV2, FakeAthensV2, FakeAthens, FakeLagos\n", + "from qiskit.providers.aer import AerSimulator" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7fad3f7f-1060-4ac5-944f-66dc6f796b45", + "metadata": {}, + "outputs": [], + "source": [ + "# Define fake backend\n", + "noisy_backend = FakeLagos()\n", + "\n", + "noisy_estimator = BackendEstimator(backend=noisy_backend)" + ] + }, + { + "cell_type": "markdown", + "id": "f378e8a8-a566-48f1-a704-47d5f2fc04f8", + "metadata": {}, + "source": [ + "Now let us compare results between the ideal Estimator run and our new `noisy_estimator` run with the simulated backend. For this, let's use Hydrogen molecule and will reuse our previous ideal and VQE result." + ] + }, + { + "cell_type": "markdown", + "id": "76b72866-b92c-4e76-9887-82c64f9672c2", + "metadata": {}, + "source": [ + "Do note this might take a while since noisy simulators are much slower than ideal simulators. It might took more than 5 minutes according to your environment." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "aa7f5666-ffbc-42aa-af4a-b7507111129a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 2.43 s, sys: 137 ms, total: 2.57 s\n", + "Wall time: 2.91 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# Noisy Estimator run\n", + "algorithm_globals.random_seed = 1024\n", + "\n", + "Energy_H_m_noisy,_,result = custom_vqe(estimator=noisy_estimator, ansatz=ansatz_m, ops=ops_m, problem_reduced=problem_reduced_m)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "ce47983e-4aea-4a76-a692-041c3af4f84c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuYAAAGPCAYAAAAQihVcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABuoklEQVR4nO3dd3iT5f7H8XeS7r0XXeyyBYogMmWpCCoOpqBwRD2KIgJ6hKPgwoG4PYoiiAjiEXHgUX8gW0QpiIAs2RRaSoG2tKUrye8PJBI7KNA2aft5XVcuyb2e75Ontd/nzp07BqvVakVERERERBzK6OgAREREREREibmIiIiIiFNQYi4iIiIi4gSUmIuIiIiIOAEl5iIiIiIiTkCJuYiIiIiIE1BiLiIiIiLiBJSYi4g4SP/+/fHw8CAjI6PUNg8++CAGg4Hdu3fbyqxWK3PnzqVLly74+/vj5eVFixYteOaZZ8jNzS02xp133onBYCj1kZeXVxmnJyIiF8nF0QGIiNRWw4YN4+uvv2bRokWMGjWqWL3ZbGbhwoW0a9eORo0a2cqGDBnCp59+SufOnXnqqafw9PRk9erVPPnkk3z66acsW7aMsLAwu7FcXV354IMPSozDzc2t4k9OREQumhJzEREH6d+/P35+fsyfP7/ExHzp0qWkpaUxadIkW9mLL77Ip59+yvjx43nppZds5aNHj+b222/n5ptv5q677uKbb76xG8toNDJs2LDKO5kqlJubi5eXl6PDEBGpcFrKIiLiIB4eHtxyyy2sXLmSo0ePFqv/+OOPMZlMDBo0CIAzZ87w0ksv0ahRI6ZNm1asff/+/RkxYgT/+9//+OWXXyo01v/7v/+ja9eu+Pj44OPjw7XXXsvmzZvt2tx55514eHhw5MgRbrrpJnx8fAgNDWX8+PGYzWa7tlarlTfeeIMWLVrg4eFBWFgYo0aNIj093a5dfHw81157LT/88APt27fHw8ODF198EYATJ05wxx134OfnR0BAACNGjGDz5s0YDAbmzJkDwHvvvYfBYGDTpk3Fzun111/HYDCwY8eOinuhREQugxJzEREHGjZsGBaLhU8++cSuPDc3ly+++IJevXrZlqWsXbuWU6dOMWTIEFxcSn7Dc/jw4QB8/fXXxerS09OLPTIzMy8Y4/z587n22mvx8PBg2rRpTJkyhX379tG5c2d27txp19ZisXDttdcSHBzM9OnT6dq1Ky+//DIzZ860a3ffffcxbtw42rdvz2uvvcbo0aP57LPP6N69e7E173v27OHWW2+la9euvP7663To0AGLxUK/fv2YP38+w4cP59lnnyU1NZURI0bY9b399tvx8PBg3rx5xc5r3rx5JCYm0qRJkwu+BiIiVcIqIiIOYzabrdHR0da2bdvalc+fP98KWOfNm2cre/XVV62AdfHixaWOd/LkSStgHTBggK1sxIgRVqDER/v27cuMLzs72xoYGGi96667ih0nNDTUOnjw4GLHmTp1ql3b1q1b253fjz/+aAWsH374oV27NWvWWAHru+++ayuLi4uzAtYvv/zSru2iRYusgHX69Om2MrPZbL3mmmusgHX27Nm28oEDB1ojIiKsRUVFtrJdu3ZZAetrr71W5vmLiFQlzZiLiDiQ0Whk8ODBbNy40W7nlY8//hhvb29uuukmW9np06cB8PX1LXW8c3Xn2p7j6urK0qVLiz3eeOONMuNbunSpbZb+/Jl2s9lM586dWbFiRbE+d999t93zzp07s2/fPtvzTz/91LYc5vwxExISCA8PLzZmdHQ0/fv3tyv77rvvMJlM3HPPPbYyo9HI/fffXyyeESNGkJqayrJly2xl8+bNw8XFxbZMSETEGejDnyIiDjZs2DBeeuklPv74Y6ZOnUp6ejrff/89AwcOxNvb29autKT7fOfq/r4ri9FopGfPnhcd27mbhV69epVYbzTaz++4uroSGRlpVxYYGMipU6fsxszOziY8PLzEMdPS0uye16tXr1ibgwcPEh4ejo+Pj115gwYNirXt3bs3ERERzJs3jz59+gBnb3z69OlT7HUSEXEkJeYiIg7WsmVLWrRowYIFC5g6dSqffvopRUVFxXZRadq0KQBbtmyxm0k/35YtW4CSk9lLYbFYAJgzZw516tS5YPu/J+qljRkcHFxsXf05gYGBds89PT3LEWnpTCYTQ4cO5Z133iEnJ4fffvuNffv28dxzz13WuCIiFU2JuYiIExg2bBiPPvooGzZs4OOPPyY8PLzYLPXVV19NQEAA8+fPZ9KkSZhMpmLjzJ07F4DbbrutQuKqX78+AKGhoZc0417amEuXLqVDhw7FZrzLKy4ujh9++IHs7Gy7Mfbs2VNi+xEjRvDyyy+zePFi1q1bh5+fHzfeeOMlHVtEpLJojbmIiBMYMmQIRqORZ555hnXr1jFw4MBiibeXlxcTJ05k165ddnubn/PNN98wZ84c+vfvT4sWLSokrj59+hAQEMBzzz1HQUFBsfrjx49f9JgDBw7EYrHw1FNPFaszm812y17KistsNvPuu+/ayiwWC2+99VaJ7Vu0aEHr1q2ZPXs2n376KbfddhseHh4XHbuISGXSjLmIiBOIjo6ma9eufPXVVwClfhnQxIkT2bx5My+88ALr169nwIABeHh4sHbtWj7++GNatGhh28P7fBaLpcQtAwH69euHv79/iXV+fn688847DB06lNatWzN48GDCw8M5dOgQ3333Hc2aNSvxeGXp0qUL999/Py+99BJbtmyhT58+uLu7s2fPHj777DOeeuop7rzzzjLHuOmmm7jyyiuZOHEi+/fvp0mTJnz11VecPHkSAIPBUKzP8OHDefjhhwG44447LipmEZGqoMRcRMRJDBs2jBUrVtCoUSPatWtXYhuTycQnn3zC9ddfz3vvvcfkyZNtH/js06cPX331FW5ubsX6FRYWlpqMbt26tdTEHM7OcEdFRfHcc8/x8ssvk5eXR1RUFFdffbXdrigX480336RNmza88847TJo0CRcXF2JjY7n99tu55pprLtjfZDLxzTff8NBDDzF37lyMRiM333wzTzzxBJ06dSpxNnzIkCFMmDCBOnXq0KVLl0uKW0SkMhmsVqvV0UGIiMilKywspF+/fixfvpxvvvmm1B1UaoMvvviCm2++mbVr13L11Vfb1Z06dYqIiAjGjx/Ps88+66AIRURKpzXmIiLVnKurK4sWLaJVq1bccsstJX79fE105swZu+dms5k33ngDPz8/2rRpU6z9hx9+SEFBQbFvBxURcRZOm5jn5+czZswYQkJC8Pb2pn///iQnJ5e7/7Rp0zAYDDzwwAOVGKWIiHPw9vZmw4YNZGVllZiU1kRjxoxh6NChvPnmm7z88st06dKF5cuX89hjj9ltsbh8+XLeeustnnrqKW644QYaNWrkwKhFRErntEtZ7rvvPr788ks+/PBDgoODGTduHBkZGWzcuLHELcLOt379egYPHoyfnx+dO3fmzTffrKKoRUSkqsyfP5+XX36ZPXv2kJeXR4MGDbjvvvuKTch069aNdevWcdVVVzFv3jxiYmIcFLGISNmcMjHPzMwkNDSU2bNnM3ToUAAO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OJ6857LHEhEREZGq47SJ+dixY1m0aBELFixgzZo1ZGVlccMNN2A2m0vtk5GRwdVXX43VauWbb75hx44dvPHGG5e0wXtVyjyVTjCZWIIaXPZYPuH1zo6ZsveyxxIRERGRquOU+5hnZmYya9YsZs+eTa9evQD46KOPiIuLY9myZfTp06fEfi+++CKRkZHMnTvXVla3bt0qiflypO7dgj/gEZFw2WMFRzcEIF97mYuIiIhUK045Y75x40YKCwvp3bu3rSwmJoYmTZqwbt26Uvt98cUXtG/fnoEDBxIWFsYVV1zBm2++6fRfe5yVvAOAwNimlz1WcFgd8qyuWE8dvOyxRERERKTqOGVinpqaislkIiQkxK48PDyc1NTUUvvt27ePt99+m3r16vH999/z0EMP8dhjj/HWW2+V2H7mzJkkJiaSmJjI8ePHK/QcLkbR8d0UWY1Exl/+jLnBaOSYKRy37CMVEJmIiIiIVJUqTcwnT56MwWAo87Fy5cpLHt9isdCmTRumTZtG69atueuuu3jwwQdLTcxHjx5NUlISSUlJhIZe3jaFl8M9Yx8pxgjc3D0qZLxMt0h8tZe5iIiISLVSpWvMx44dy7Bhw8psExsby/r16zGbzaSnp9slzMeOHaNz586l9o2MjKRpU/vlIE2aNOG11167vMArWeCZg5zwiOXyN0s864x3HWJO7Kyg0URERESkKlRpYh4SElJseUpJ2rZti6urK0uXLmXIkCEAJCcns2PHDjp27Fhqv6uvvppdu3bZle3evZu4uLjLC7wSmYuKiDIf5Zhf6ed1sSz+sQSeOE121il8/AIrbFwRERERqTxOucbc39+fUaNGMXHiRJYtW8avv/7KHXfcQcuWLenZs6etXUJCAm+++abt+cMPP8z69et59tln2bNnD//97395/fXXuf/++x1xGuVy7PAe3A2FGEMbVdiY2stcREREpPpxysQc4NVXX+Xmm29m4MCBXH311fj4+PD1119jMplsbXbt2kV6errtebt27fjiiy/49NNPad68OZMmTeLpp5/mn//8pyNOoVzSD2wDwKdOkwobU3uZi4iIiFQ/TrmPOYC7uztvvPEGb7zxRqltStoGsW/fvvTt27cyQ6tQuSln14KH1W1eYWNqL3MRERGR6sdpZ8xrC8OJP8jCi+CwOhU2pvYyFxEREal+lJg7mHf2AVJd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9u9HnHEPxOzli6GwEDfTsWLjZ3uHY/b3xViUh7vLkWLvXWT6RGEJ9MGYn427a0qx/pl+dbAEemHKzsLNxf61MwCZftFY/d0xZWTh5nK82I1HRkBdLL7uuJw8iZvr8WLjnwqoh9XdgKtXOq6mk3+e91/vwpxxD8NosmIyZWEwWP868J+peZ57OFYMmFwyMRnPnP/qgclIjmcUYMXF9YSt3sZoJN8tCKxWTMZMDIa/3RQaTWfrMWA0ZWA02t+UFrq4kuMZCoCLy3GMxkK7/oUubuR4nv1meFdTGgbjXzeNVqDAxYPTniFgADdTChgtdm/f5Ll5c8o3DAB3l4N/e1fIQK6HL+n+Z+s9Xfba1XoZnGspn/Yx/5P2MRcRERGRqlBa3ulctwkiIiIiIrWUEnMRERERESegxFxERERExAkoMRcRERERcQJKzEVEREREnIAScxERERERJ6DEXERERETECSgxFxERERFxAkrMRUREREScgBJzEREREREnoMRcRERERMQJKDEXEREREXECSsxFRERERJyAwWq1Wh0dhDMICQkhPj7eIcc+fvw4oaGhDjm2VD1d79pF17t20fWufXTNa5eKut4HDhwgPT29WLkScyeQmJhIUlKSo8OQKqLrXbvoetcuut61j6557VLZ11tLWUREREREnIAScxERERERJ6DE3AmMHj3a0SFIFdL1rl10vWsXXe/aR9e8dqns66015iIiIiIiTkAz5iIiIiIiTkCJuYiIiIiIE1Bi7kBvv/02devWxcPDg7Zt27JmzRpHhyQVZPXq1fTv3586depgMBiYM2eOXb3VamXKlClERUXh6elJt27d+P333x0TrFyWadOm0a5dO/z8/AgNDaVfv35s27bNro2ud83y1ltv0bJlS/z8/PDz8+Oqq67im2++sdXretdc06ZNw2Aw8MADD9jKdL1rlilTpmAwGOweERERtvrKvt5KzB1k4cKFPPTQQzz++OP8+uuvdOzYkeuuu45Dhw45OjSpANnZ2TRv3pzXXnsNT0/PYvUvvvgiL7/8Mm+88QYbNmwgLCyMXr16cfr0aQdEK5dj5cqV/POf/2TdunUsX74cFxcXevbsycmTJ21tdL1rlujoaF544QU2bdpEUlIS11xzDTfddBNbtmwBdL1rqvXr1zNz5kxatmxpV67rXfM0btyYlJQU22Pr1q22ukq/3lZxiCuvvNL6j3/8w66sQYMG1scee8xBEUll8fb2ts6ePdv23GKxWCMiIqzPPPOMrSw3N9fq4+NjfeeddxwQoVSk06dPW41Go/Wrr76yWq263rVFYGCg9Z133tH1rqEyMjKs9erVsy5fvtzatWtX6/3332+1WvX7XRM9+eST1mbNmpVYVxXXWzPmDlBQUMDGjRvp3bu3XXnv3r1Zt26dg6KSqrJ//35SU1Ptrr+npyddunTR9a8BTp8+jcViITAwEND1runMZjOffPIJ2dnZdOzYUde7hho9ejS33nor3bt3tyvX9a6Z9u3bR1RUFHXr1mXQoEHs27cPqJrrrcTcAdLT0zGbzYSHh9uVh4eHk5qa6qCopKqcu8a6/jXTQw89xBVXXMFVV10F6HrXVFu3bsXHxwd3d3fuvfdeFi9eTIsWLXS9a6D33nuPPXv28MwzzxSr0/Wuedq3b8+cOXP47rvveO+990hNTaVjx46cOHGiSq63S4WMIiIijBs3jrVr17J27VpMJpOjw5FK1LhxYzZv3kxmZiafffYZI0aMYOXKlY4OSyrYrl27ePzxx1m7di2urq6ODkeqwHXXXWf3vEOHDtSrV48PP/yQDh06VPrxNWPuACEhIZhMJo4dO2ZXfuzYMbtP/krNdO4a6/rXLA8//DALFixg+fLl1KtXz1au610zubm50aBBA9q2bcu0adO44ooreOWVV3S9a5iffvqJ9PR0mjVrhouLCy4uLqxatYq3334bFxcXgoODAV3vmszHx4dmzZrxxx9/VMnvtxJzB3Bzc6Nt27YsXbrUrnzp0qV07NjRQVFJValbty4RERF21z8vL481a9bo+ldTDz30kC0pT0hIsKvT9a4dLBYL+fn5ut41zE033cTWrVvZvHmz7ZGYmMigQYPYvHkzjRo10vWu4fLy8ti5cyeRkZFV8vutpSwOMm7cOO644w6uvPJKrr76at555x2OHj3Kvffe6+jQpAJkZ2ezZ88e4Owf7EOHDrF582aCgoKIjY1l7NixPPfccyQkJNCoUSOeeeYZfHx8GDJkiIMjl4t1//3389FHH/HFF18QGBhoW2fo4+ODj48PBoNB17uGeeyxx+jbty8xMTGcPn2a+fPns3LlSr755htd7xomICCAgIAAuzJvb2+CgoJo3rw5gK53DTN+/Hj69etHbGwsaWlpPP300+Tk5DBixIiq+f2ukL1d5JK89dZb1ri4OKubm5u1TZs21lWrVjk6JKkgK1assALFHiNGjLBarWe3XHryySetERERVnd3d2uXLl2sW7dudWzQcklKus6A9cknn7S10fWuWUaMGGGNjY21urm5WUNDQ609evSwfvfdd7Z6Xe+a7fztEq1WXe+aZuDAgdbIyEirq6urNSoqyjpgwADr77//bquv7OttsFqt1opJ8UVERERE5FJpjbmIiIiIiBNQYi4iIiIi4gSUmIuIiIiIOAEl5iIiIiIiTkCJuYiIiIiIE1BiLiIiIiLiBJSYi4hIpZoyZYrty1hERKR02sdcRKQGufPOO0lPT2fJkiV2/64KBw4coG7dumzYsIHExERbeXZ2Nvn5+QQHB1dJHCIi1ZWLowMQERHnVlRUhMlkwmAwXFJ/Hx8ffHx8KjgqEZGaR0tZRERqoClTpvDhhx/yzTffYDAYMBgMrFy5EoAjR44waNAgAgMDCQwMpG/fvvzxxx92fZs3b86cOXOoX78+7u7u5OTk8N1339G5c2cCAwMJCgqiT58+7Nixw9avbt26ALRr1w6DwUC3bt3sxjvHYrHw9NNPExMTg7u7Oy1atODLL7+01R84cACDwcCiRYvo1asXXl5eNG3alKVLl1biKyYi4nhKzEVEaqDx48dz++2307NnT1JSUkhJSaFjx47k5ubSvXt3PDw8WLVqFT/99BORkZH07NmT3NxcW//9+/czf/58/vvf//Lbb7/h4eFBTk4OY8eO5ZdffmHlypX4+/vTr18/CgoKAPjll18A+O6770hJSeHzzz8vMbbXXnuNl156iRdeeIGtW7dy8803M2DAADZv3mzXbtKkSTz44IP89ttvtGvXjkGDBpGdnV05L5iIiBPQUhYRkRrIx8cHT09P3N3diYiIsJXPmzcPq9XK7NmzbUtT3n33XcLCwliyZAm33347AAUFBXz00UeEh4fb+t5yyy12x5g9ezZ+fn788ssvdOrUidDQUACCg4Ptjvl306dPZ/z48QwZMgSAp556itWrVzN9+nTmzZtna/fwww/Tr18/AJ577jnmzp3L5s2b6dSp0+W8NCIiTksz5iIitcjGjRvZv38/vr6+trXf/v7+nDp1ir1799raRUdH2yXlAHv37mXIkCHUr18fPz8/wsPDsVgsHDp0qNzHz8rK4ujRo1x99dV25Z06dWL79u12ZS1btrT9OyoqCoC0tLRyH0tEpLrRjLmISC1isVi44oor+OSTT4rVBQUF2f7t7e1drP6GG24gOjqad999lzp16uDi4kLTpk1tS1ku198/XOrq6lqszmKxVMixRESckRJzEZEays3NDbPZbFfWpk0bFixYQEhICAEBAeUe68SJE+zcuZO3336b7t27A7Bp0yaKiorsjgcUO+b5/Pz8iIqK4scff6RHjx628rVr19K0adNyxyMiUhNpKYuISA0VHx/Ptm3b2LVrF+np6RQWFjJ06FDCw8O58cYbWbVqFfv372f16tU88sgjdjuz/F1gYCAhISG899577Nmzh1WrVnHvvffi4vLX/E5YWBienp58//33HDt2jMzMzBLHmjBhAtOnT2fBggXs3r2bJ554gjVr1jB+/PgKfw1ERKoTJeYiIjXU3XffTZMmTUhMTCQ0NJQff/wRLy8vVq9eTb169bjttttISEhgxIgRnDp1isDAwFLHMhqNLFy4kC1bttC8eXPuv/9+nn76adzd3W1tXFxceP3113n//feJiorixhtvLHGsBx98kAkTJjBx4kSaN2/O4sWLWbRoEa1atarw10BEpDrRN3+KiIiIiDgBzZiLiIiIiDgBJeYiIiIiIk5AibmIiIiIiBNQYi4iIiIi4gSUmIuIiIiIOAEl5iIiIiIiTkCJuYiIiIiIE1BiLiIiIiLiBJSYi4iIiIg4gf8HHfp07cF1+MYAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The following plot compares the two Estimators - with and without noise\n", + "plt.rcParams[\"font.size\"] = 14\n", + "\n", + "# plot loss and reference value\n", + "plt.figure(figsize=(12, 6), facecolor='white')\n", + "plt.plot(Energy_H_m, label=\"Estimator VQE H2 IDEAL\")\n", + "plt.plot(Energy_H_m_noisy, label=\"Estimator VQE H2 with noise\")\n", + "plt.axhline(y=real_solution_m.real, color=\"tab:red\", ls=\"--\", label=\"Target\")\n", + "\n", + "plt.legend(loc=\"best\")\n", + "plt.xlabel(\"Iteration\")\n", + "plt.ylabel(\"Energy [H]\")\n", + "plt.title(\"VQE energy\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a49c2da6-96d2-4c98-99dd-7f9a0f84f576", + "metadata": {}, + "source": [ + "As you can see, that convergence didn't quite went well on our noisy simulation. There could be multiple reasons for it that could contribute to the result above.\n", + "- The depth of the ansatz - The ansatz we are passing right now is too deep for current systems\n", + "- Specific optimizations with respect to mapping, routing and transpiling for the backend\n", + "- Addition of error mitigation or suppression routines\n" + ] + }, + { + "cell_type": "markdown", + "id": "dda7d801-cea4-49de-8e28-d3eb171f1208", + "metadata": {}, + "source": [ + "
\n", + " Final challenge: Scored exercise -
\n", + "Congratulations on making it so far! You have now entered the final exercise section! This section forth introduces to the final exercise and what you will need to build up for it. Here you will be able to solve a chemistry problem on a noisy simulator to aim for the lowest possible score! \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "a7a2513c-e407-4fbf-abd4-78e35525382c", + "metadata": { + "tags": [] + }, + "source": [ + "\n", + "# Part III: Final Challenge - Exploring the Interstellar Cyclopropenylidene($C_3H_2$) Reaction Chain" + ] + }, + { + "cell_type": "markdown", + "id": "4270e4df-a9e3-4a16-9149-0c6b5542059c", + "metadata": {}, + "source": [ + "As we saw above that the run did not converge and our noisy simulation isnt giving us the best of the results. **This is an exercise for you to completely design the approach yourself from ground up to get the best result for a noisy simulation run!**\n", + "\n", + "Here we will ask you to follow reaction processes which Cyclopropenylidene is involved in. This reaction process is related to the creation of $C_3H_2$:\n", + "\n", + "$C + C_2H_2 → C_3H_2$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "0ed63ac6-9559-4b14-961d-f801ed9c5d16", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "6404b4d6-5a08-46c6-9a03-ca487f352e88", + "metadata": {}, + "source": [ + "This reaction process is known as a key reaction process as it provides a starting point to a mechanism for the growth of carbon chains. This reaction process occurs with almost zero potential barrier at the room temperature, and it is believed that this reaction also occurs fast in low temperature environments like in interstellar space. **[[17]](https://pubs.acs.org/doi/10.1021/jp020310z)**. This reaction produces $C_3H_2$, the key element which starts carbon chain reactions, and finally resulting in:\n", + "$C_3H_2 → H + C_3H$" + ] + }, + { + "cell_type": "markdown", + "id": "6e9db513-0556-452b-ad69-495c24c8634c", + "metadata": { + "tags": [] + }, + "source": [ + "\n", + "\n", + "# Final Challenge - Compute Reaction energy of C + C2H2 →C3H2\n", + "\n", + "We shall now proceed to compute the reaction energy of target process. As we already saw from the noisy simulation run, basic calculations and idealistic ansatz will return a far from reference result and this also translates to a real quantum backend run.\n", + "\n", + "For this challenge, we will provide you a classical quantum chemistry computation reference value as computed by Dr. Yukio Kawashima Sensei." + ] + }, + { + "cell_type": "markdown", + "id": "d28b5094-e262-4d38-8277-5a461b66931d", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "d54179f1-fbfc-47bb-bb49-8113ef0580f9", + "metadata": {}, + "outputs": [], + "source": [ + "# Define geometry\n", + "carbon = [[\"C\",[0.0,0.0,0.0]]]\n", + "\n", + "# https://webbook.nist.gov/cgi/cbook.cgi?Name=acetylene&Units=SI\n", + "acetylene = [[\"C\", [0.0000, 0.0000, -0.6025]], \n", + " [\"H\",[ 0.0000, 0.0000, -1.6691]], \n", + " [\"C\",[ 0.0000, 0.0000, 0.6025]], \n", + " [\"H\",[ 0.0000, 0.0000, 1.6691]]]\n", + "\n", + "# https://atct.anl.gov/Thermochemical%20Data/version%201.122/species/?species_number=442\n", + "Cyclopropenylidene = [[\"C\", [2.2883, 0.6993, 0.3468 ]],\n", + " [\"C\",[ 1.9543, 2.0133, 0.7806]],\n", + " [\"C\",[ 1.0108, 0.9522, 0.6802]],\n", + " [\"H\",[ 3.0291, 0.0000, 0.0000]],\n", + " [\"H\",[ 0.0000, 0.5997, 0.7904]]]" + ] + }, + { + "cell_type": "markdown", + "id": "e49390b9-1b79-49ca-8051-3420789c298f", + "metadata": {}, + "source": [ + "
\n", + " Note from Sensei: Tips to get a better computation results \n", + "\n", + "You can try to change the basis set (there are many basis sets found here **[[19]](https://www.basissetexchange.org/)**. \n", + " \n", + "Here is a good reference about the basis sets **[[20]](http://vergil.chemistry.gatech.edu/courses/chem6485/pdf/basis-sets.pdf)**. \n", + " \n", + "You can also try different ansatz. Here is an example of another ansatz **[[21]](https://qiskit.org/documentation/stubs/qiskit.circuit.library.EfficientSU2.html)** \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "71ba483b-aa36-424a-a163-22f41dc23a09", + "metadata": {}, + "outputs": [], + "source": [ + "# Sample definitions for all 3 molecules for reference. Please feel free to change accordingly if you wish.\n", + "\n", + "# Sample definition Carbon\n", + "ansatz_c, ops_c, real_solution_c, problem_reduced_c = construct_problem(geometry=carbon, charge=0, multiplicity=3, basis=\"ccpvdz\", num_electrons=4, num_molecular_orbitals=4)\n", + "\n", + "# Sample definition Acetylene\n", + "ansatz_ac, ops_ac, real_solution_ac, problem_reduced_ac = construct_problem(geometry=acetylene, charge=0, multiplicity=1, basis=\"ccpvdz\", num_electrons=4, num_molecular_orbitals=4)\n", + "\n", + "# Sample defininition Cyclopropenylidene\n", + "ansatz_cy, ops_cy, real_solution_cy, problem_reduced_cy = construct_problem(geometry=Cyclopropenylidene, charge=0, multiplicity=1, basis=\"sto3g\", num_electrons=2, num_molecular_orbitals=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "e617db33-f3f6-42ae-b608-8ed67dd3c37f", + "metadata": {}, + "outputs": [], + "source": [ + " ##################\n", + " # YOUR CODE HERE #\n", + " ################## \n", + " def grade_lab4_final_1 (ansatzs, ops, problems):\n", + " model_length= len(ansatzs)\n", + " for i in range(model_length):\n", + " energy, _, job = custom_vqe(estimator=Estimator(), ansatz=ansatzs[i], ops=ops[i], problem_reduced=problems[i])\n", + " #Energy_c, _, job_c = custom_vqe(estimator=Estimator(), ansatz=ansatz_c, ops=ops_c,problem_reduced=problem_reduced_c)\n", + " #Energy_ac, _, job_ac = custom_vqe(estimator=Estimator(), ansatz=ansatz_ac, ops=ops_ac,problem_reduced=problem_reduced_ac)\n", + " #Energy_cy, _, job_cy = custom_vqe(estimator=Estimator(), ansatz=ansatz_cy, ops=ops_cy,problem_reduced=problem_reduced_cy)" + ] + }, + { + "cell_type": "markdown", + "id": "086af006-0524-46e1-9757-49198ec099e3", + "metadata": {}, + "source": [ + "
\n", + " Notes \n", + "\n", + "- Submit the following for the VQE grading run to run successfully. There will be **3 VQE runs** on a noisy FakeBackend and the calculated result will be scored by the grader \n", + " - `ansatz_list` = list of ansatz circuits\n", + " - `ops_list` = list of operators to evaluate\n", + " - `problem_reduced_list` = list of ElectronicStructureProblem\n", + " - `initial_point_list`: list of initial points for optimizer (optional, if not passed, will be taken at random)\n", + " - `optimizer_list`: list of optimizers (optional, if not passed will default to `SPSA`)\n", + "\n", + "- The ordered index of the list submited is:\n", + " - **Index 0** - $C_3H_2$ (Cyclopropenylidene)\n", + " - **Index 1** - $C$ (Carbon)\n", + " - **Index 2** - $C_2H_2$ (Acetylene)\n", + " \n", + "- The reference value was calculated using a classical computer and is posted below.
\n", + "\n", + "- The scoring will depend on **3 factors**:\n", + " - **Depth of ansatz**: Try to build a low score quantum circuit. The circuit score is the sum of the total circuit cost, where the total circuit cost is calculated as below.
\n", + " $$circuit\\ score = 50 * depth + 10 * (\\text{# of CX Gates}) + \\text{# of Single Gates} $$\n", + "\n", + " - **Optimizer score**: Number of optimizer iterations\n", + " - **Reaction Energy**: Closeness of converged value to the computed reaction energy in eV\n", + "\n", + "- **Please feel free to PR and submit your solutions to the challenge repo located here after the challenge: [htps://github.com/qiskit-community/ibm-quantum-challenge-fall-22](https://github.com/qiskit-community/ibm-quantum-challenge-fall-22)**. Please name your notebooks in the following format while submiting a PR to the challenge repo - `Name_Score_Fall22_Lab4.ipynb`\n", + "\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "58da6961-07f7-47e0-80c6-b42e2c4d425a", + "metadata": {}, + "source": [ + "
\n", + " Reference Value\n", + " \n", + " \n", + "- Chemistry engine: Pyscf, version 2.0.1\n", + "- Python version: 3.9.12\n", + "- Computation options used: \n", + " - method: CCSD\n", + " - basis: cc-pVDZ\n", + "\n", + " \n", + "**Expected Reaction energy: -4.26923078561136 eV**\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "fff48b37-8c23-47d6-b98e-b5a4e07b9cc7", + "metadata": {}, + "outputs": [], + "source": [ + "ansatz_list = [ansatz_cy, ansatz_c, ansatz_ac] # List of ansatz circuits\n", + "ops_list = [ops_cy, ops_c, ops_ac] # List of operators\n", + "problem_reduced_list = [problem_reduced_cy, problem_reduced_c, problem_reduced_ac] # List of ElectronicStrucutreProblem" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "f7ed347c-a8a5-444c-bd5d-12cb6c4a144e", + "metadata": {}, + "outputs": [], + "source": [ + "## Grade and submit your solution\n", + "from qc_grader.challenges.fall_2022 import grade_lab4_final\n", + "\n", + "grade_lab4_final_1(ansatz_list, ops_list, problem_reduced_list)\n", + "# Optional - grade_lab4_final(ansatz_list, ops_list, problem_reduced_list, initial_point_list, optimizer_list)\n", + "# Optional prototype-zne - grade_lab4_final(ansatz_list, ops_list, problem_reduced_list, initial_point_list, optimizer_list, zne_strategy)" + ] + }, + { + "cell_type": "markdown", + "id": "e6bae2c1-01fd-40c2-a1ba-2a64ede26c9b", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + " \n", + "Optional Section \n", + "\n", + "This is an **optional section** on showcasing how you can explore using and defining a Digital ZNE routine using `prototype-zne`. This section is completely optional and purely for your curiosity with this new module so feel free to explore if you wish to incorporate in your solution and enjoy!\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "88474711-04b9-4fa4-9134-8e6b04df9911", + "metadata": { + "tags": [] + }, + "source": [ + "# Introducing `prototype-zne` module" + ] + }, + { + "cell_type": "markdown", + "id": "875aecbb-dc93-4568-b930-c9095bfe9f79", + "metadata": { + "tags": [] + }, + "source": [ + "For your problem you can also leverage Digital ZNE to get your best solution. We shall look how to mitigate errors in your expectation value calculations using a technique known as _Zero noise extrapolation_ (ZNE). This section is adapted from the **[tutorial docs](https://github.com/qiskit-community/prototype-zne/tree/main/docs/tutorials)** in the `prototype-zne` module\n", + "\n", + "This module is built on top the `Estimator` primitive by injecting ZNE capabilities in any given implementation of the `Estimator` primitive. Once this functionality is in place, it can be controlled through a `ZNEStrategy` object that encapsulates all necessary information for customizing the error mitigation process.\n", + "\n", + "\n", + "## Brief overview of ZNE\n" + ] + }, + { + "cell_type": "markdown", + "id": "6c5141a7-81e0-41a1-8860-3ea2cbe6d7fd", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "a0ff6d27-a104-486f-99aa-aa1d3d37dde9", + "metadata": { + "tags": [] + }, + "source": [ + "### Noise amplification\n", + "The original implementation of ZNE as shown in the paper carried out noise amplification at the hardware level (i.e. _analog_ noise amplification), by modulating the microwave pulses that implement the circuit's unitary gates. This process is significantly involved and requires calibration of the device before each noisy experiment, which is why a more relaxed alternative was devised: gate folding at the gate level rather than the pulse level (i.e. _digital_ noise amplification).\n" + ] + }, + { + "cell_type": "markdown", + "id": "511dda7f-a99a-4e44-a26a-d8c014984494", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "9930e843-f1fa-4213-8f0d-b45a860705b4", + "metadata": {}, + "source": [ + "\n", + "### Extrapolation\n", + "This process was first carried out with a technique known as _Richardson extrapolation_. Nonetheless, we often use general regression methods to account for several different noise profiles and extrapolate the result back to get our value of interest\n" + ] + }, + { + "cell_type": "markdown", + "id": "312c9ffd-0d39-4753-8757-066ca7846f72", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "32ca5139-ab0e-4b16-84fa-ca3bd482394b", + "metadata": { + "tags": [] + }, + "source": [ + "## Building a ZNE Estimator\n", + "Since we are going to be showcasing error mitigation, we need our calculations to be noisy. We shall make a new noisy_estimator using the same _FakeBackend_ that we used previously. For this, what call in the `zne()` function and pass in a `BackendEstimator`. This will output another class with the same implementation but with added ZNE capabilities. As with this, you can pass in any `Estimator` class here that implements the `BaseEstimator` interface i.e. all the Estimators in the picture explained in Section 1 are compatible! Since we need to do a noisy simulation here, we shall pass in a `BackendEstimator` class here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca54fb8f-cb7e-4fa8-be09-969d799728d5", + "metadata": {}, + "outputs": [], + "source": [ + "from zne import zne\n", + "\n", + "# Define fake backend\n", + "noisy_backend = FakeLagos()\n", + "\n", + "# Define Estimator with the fake backend\n", + "ZNEEstimator = zne(BackendEstimator)" + ] + }, + { + "cell_type": "markdown", + "id": "e0a2ac96-925b-4bd7-a280-f8cef968abb6", + "metadata": { + "tags": [] + }, + "source": [ + "## ZNE Strategies\n", + "\n", + "For now, we have the following strategies available which can be used for noist_amplification and extrapolation. These can be applied by defining the `ZNEStrategy` object with the parameters\n", + "> - noise_amplifier: A noise amplification strategy implementing the `NoiseAmplifier` interface. Current options: `CXAmplifier`, `LocalFoldingAmplifier`, `GlobalFoldingAmplifier`\n", + "> - noise_factors: An list of real valued noise factors that determine by what amount the circuits' noise is amplified.\n", + "> - extrapolator: Extrapolation strategies available to be implemented. Current options: `LinearExtrapolator`, `PolynomialExtraploator`\n", + " \n", + "You can also specify `transpilation_levels` or `transpiler class` if required. An example to apply a `ZNEStrategy` for our case with is shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa4d6e5f-7803-4442-8045-2361c20f5659", + "metadata": {}, + "outputs": [], + "source": [ + "from zne import ZNEStrategy\n", + "from zne.extrapolation import PolynomialExtrapolator, LinearExtrapolator\n", + "from zne.noise_amplification import LocalFoldingAmplifier, GlobalFoldingAmplifier\n", + "\n", + "# Define Extrapolator\n", + "extrapolator = PolynomialExtrapolator(degree=2)\n", + "# Define Amplifier\n", + "noise_amplifier = LocalFoldingAmplifier(gates_to_fold=2) \n", + "\n", + "# Define strategy\n", + "zne_strategy = ZNEStrategy(\n", + " noise_factors=[1, 3, 5],\n", + " noise_amplifier = noise_amplifier,\n", + " extrapolator=extrapolator\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cbe62d24-d976-4fa5-be85-df68a9adb8b0", + "metadata": {}, + "source": [ + "Lets apply this `zne_strategy` to a new estimator using the `ZNEEstimator` class we defined above!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4972348b-5b97-45be-b29c-9b021c20f78e", + "metadata": {}, + "outputs": [], + "source": [ + "# Apply strategy to ZNE Estimator\n", + "noisy_estimator_zne = ZNEEstimator(backend=noisy_backend, zne_strategy=zne_strategy)" + ] + }, + { + "cell_type": "markdown", + "id": "17a8db0c-4eee-4cab-952d-8032f4cce12c", + "metadata": { + "tags": [] + }, + "source": [ + "## Lets see how it fares!\n", + "This run will apply the strategies and give us some results. **Do note this may take time to run even on simulators due to the nature of operation, so feel free to stretch your legs and take a walk while this is computed.** Estimated time run depends on the size of the ansatz and strategy and can go upto 40-50minutes for bigger ansatz and heavier strategies!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "faee218b-77c1-4281-b78b-26612c982dad", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "# Noisy Estimator run\n", + "algorithm_globals.random_seed = 1024\n", + "\n", + "Energy_H_m_noisy_zne,_,_ = custom_vqe(estimator=noisy_estimator_zne, ansatz=ansatz_m, ops=ops_m, problem_reduced=problem_reduced_m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00f6722d-5279-4cda-be84-578a446c1dd9", + "metadata": {}, + "outputs": [], + "source": [ + "# The following plot compares the two Estimators - with and without noise\n", + "\n", + "plt.rcParams[\"font.size\"] = 14\n", + "\n", + "# plot loss and reference value\n", + "plt.figure(figsize=(12, 6), facecolor='white')\n", + "plt.plot(Energy_H_m, label=\"Estimator VQE H2 IDEAL\")\n", + "plt.plot(Energy_H_m_noisy, label=\"Estimator VQE H2 with noise\")\n", + "plt.plot(Energy_H_m_noisy_zne, label=\"Estimator VQE H2 Noise + ZNE mitigated\")\n", + "plt.axhline(y=real_solution_m.real, color=\"tab:red\", ls=\"--\", label=\"Target\")\n", + "\n", + "plt.legend(loc=\"best\")\n", + "plt.xlabel(\"Iteration\")\n", + "plt.ylabel(\"Energy [H]\")\n", + "plt.title(\"VQE energy\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "38511bd2-c53c-47e3-9f0b-eb614f61caf1", + "metadata": {}, + "source": [ + "## Still not good?\n", + "\n", + "Indeed here we see is a classic convergence problem which could be due to a variety of factors and for this noisy run, the predominant one can be the depth of the ansatz. \n", + "\n", + "This is where you can experiment with for your open ended challenge above and for the right ansatz and right strategies you can see the results are quite promising. The `prototype-zne` module has very basic amplification and extrapolation strategies here but what is enables you is the power to define your own extrapolation and amplification strategies and apply it to any `Estimator` object which is something that can be really useful.\n", + "\n", + "For instance, you can take a look at this result that was done for a different ansatz and a different strategy applied.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c9e35665-d94c-45ae-811f-14926b1ac9a7", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "7dc5799d-e0ac-45d8-ae68-a72f9d516009", + "metadata": {}, + "source": [ + "## Custom ZNE strategies\n", + "\n", + "Feel free to go ahead and make the best strategy for the problem! The current implementation of `ZneEstimator` allows us build custom noise amplification, and extrapolation techniques as custom classes which can be imported and called by the library:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa5af4a7-44b3-4297-9260-ac566a257242", + "metadata": {}, + "outputs": [], + "source": [ + "from zne.extrapolation import Extrapolator\n", + "from zne.noise_amplification import CircuitNoiseAmplifier\n", + "\n", + "\n", + "############################ NOISE AMPLIFIER ############################\n", + "class CustomAmplifier(CircuitNoiseAmplifier):\n", + " def amplify_circuit_noise(self, circuit, noise_factor):\n", + " return circuit.copy() # Dummy, nonperforming\n", + "\n", + "\n", + "############################ EXTRAPOLATOR ############################\n", + "class CustomExtrapolator(Extrapolator):\n", + " @property\n", + " def min_points(self):\n", + " return 2\n", + " \n", + " def _fit_regression_model(self, data):\n", + " prediction = 1.0\n", + " variance = 0.0\n", + " model = lambda target: (prediction, variance)\n", + " return model, {\"metadata\": None} # Dummy, nonperforming" + ] + }, + { + "cell_type": "markdown", + "id": "9efef103-7db3-40cb-aa9c-2ef0b6a8477e", + "metadata": {}, + "source": [ + "We can then proceed to provide these custom built classes during instantiation through a `ZNEStrategy` object:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7d7377c-36f9-48e3-b22e-63f476f189bc", + "metadata": {}, + "outputs": [], + "source": [ + "zne_strategy = ZNEStrategy(\n", + " noise_amplifier=CustomAmplifier(),\n", + " noise_factors=(1, 3),\n", + " extrapolator=CustomExtrapolator(),\n", + ")\n", + "\n", + "estimator = ZNEEstimator(backend=Backend(), zne_strategy=zne_strategy)" + ] + }, + { + "cell_type": "markdown", + "id": "319ec916-f86f-4b7f-8765-6f2cc8f827a0", + "metadata": {}, + "source": [ + "**Think you can make the next best zne amplifier or extrapolation strategy?** ;) Feel free to give it a go and implement it in the final problem above to get a better result for the noisy simulation! " + ] + }, + { + "cell_type": "markdown", + "id": "d47de180", + "metadata": {}, + "source": [ + "# References\n", + "- [1] **[Physics of the Interstellar Medium Lecture Notes: Interstellar Molecules](https://www.astronomy.ohio-state.edu/pogge.1/Ast871/Notes/Molecules.pdf)**\n", + "- [2] **[Chemistry and Dynamics in the Interstellar Medium](https://pubs.rsc.org/en/content/chapterhtml/2017/bk9781782627760-00001?isbn=978-1-78262-776-0)**\n", + "- [3] **[Interstellar chemistry](https://www.pnas.org/doi/full/10.1073/pnas.0605352103)**\n", + "- [4] **[Interstellar $H_3^+$](https://www.pnas.org/doi/10.1073/pnas.0601242103)**\n", + "- [5] **[Spectroscopic properties of interstellar molecules: Theory and experiment](https://pubs.rsc.org/en/content/articlelanding/2003/CP/b303753n)**\n", + "- [6] **[Cyclopropenylidene (Wikipedia)](https://en.wikipedia.org/wiki/Cyclopropenylidene)**\n", + "- [7] **[$H_3^+$: the initiator of interstellar chemistry](https://www.cambridge.org/core/journals/international-journal-of-astrobiology/article/abs/h3-the-initiator-of-interstellar-chemistry/69C0753DDB337E4475416CB6FA3D802D)**\n", + "- [8] **[The interstellar chemistry of $C_3H$ and $C_3H_2$ isomers]( https://arxiv.org/ftp/arxiv/papers/1707/1707.07926.pdf)**\n", + "- [9] **[PubChem](https://pubchem.ncbi.nlm.nih.gov/)**\n", + "- [10] **[NIST Chemistry WebBook, SRD 69](https://webbook.nist.gov/chemistry/form-ser/)**\n", + "- [11] **[$H_3^+$: Ab initio calculation of the vibration spectrum](https://aip.scitation.org/doi/abs/10.1063/1.433585)**\n", + "- [12] **[Quantum algorithms for electronic structure calculations: particle/hole Hamiltonian and optimized wavefunction expansions](https://arxiv.org/abs/1805.04340)**\n", + "- [13] **[A survey of cyclopropenylidene (C3H2) in galactic sources](https://pubmed.ncbi.nlm.nih.gov/11542419/)**\n", + "- [14] **[Cyclopropenylidene properties provided by NIST Chemistry WebBook, SRD 69](https://webbook.nist.gov/cgi/cbook.cgi?ID=C16165405&Units=CAL&Mask=3FFF)**\n", + "- [15] **[The B 1B1 State of Cyclopropenylidene, c-C3H2](https://pubs.acs.org/doi/10.1021/jz900114r)**\n", + "- [16] **[The dipole moment of $C_3H_2$](https://academic.oup.com/mnras/article/227/1/19P/1066005)**\n", + "- [17] **[C + C2H2: A Key Reaction in Interstellar Chemistry](https://pubs.acs.org/doi/10.1021/jp020310z)**\n", + "- [18] **[Variational Quantum Computation of Excited States](https://arxiv.org/abs/1805.08138)**" + ] + }, + { + "cell_type": "markdown", + "id": "4db8cc62-e8ce-4bcb-b0ec-1ceb3393dc34", + "metadata": {}, + "source": [ + "# Additional information\n", + "\n", + "Created by: Desiree Vogt-Lee, Sophy Shin, Vishal Bajpe, Yuri Kobayashi\n", + "\n", + "Advisor: Yukio Kawashima, Pedro Rivero\n", + "\n", + "Creative assets by: Radha Pyari Sandhir\n", + "\n", + "IBM Open Science Prize \n", + "Congratulations on making it all the way to the end of The IBM Quantum Challenge Fall 2022! If you’re looking to apply your new-found knowledge further, we encourage you to participate in the IBM Open Science Prize that will be announced later this year. Every year, a new technical challenge at the forefront of quantum computing is posed to the entire world and those who generate the strongest solutions win thousands of dollars in prizes! We hope to see you there!\n", + "\n", + "\n", + "Version: 1.0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88b4bada-56e0-482f-8056-4a7d1c7210a5", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.tools.jupyter import *\n", + "%qiskit_version_table" + ] + } + ], + "metadata": { + "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.8.13" + }, + "vscode": { + "interpreter": { + "hash": "2314985414265184cbcbf39283c3ac2af8a6b2659fa88be3910ade054ec8b29d" + } + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}