diff --git a/.gitignore b/.gitignore index c5f7926a87..d382e2d69c 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,7 @@ test/**/*.npz # Django stuff: *.log +!docs/tutorials/aux_files/*.log .static_storage/ .media/ local_settings.py diff --git a/docs/conf.py b/docs/conf.py index 48f1d9f702..baaaf32085 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,30 +74,13 @@ templates_path = ['theme/'] html_css_files = ['style.css', 'custom.css'] -nbsphinx_timeout = 180 +nbsphinx_timeout = 360 nbsphinx_execute = os.getenv('QISKIT_DOCS_BUILD_TUTORIALS', 'never') nbsphinx_widgets_path = '' exclude_patterns = ['_build', '**.ipynb_checkpoints'] nbsphinx_thumbnails = { } -nbsphinx_prolog = """ -{% set docname = env.doc2path(env.docname, base=None) %} - -.. only:: html - - .. role:: raw-html(raw) - :format: html - - .. note:: - This page was generated from `{{ docname }}`__. - - Run interactively in the `IBM Quantum lab `_. - - __ https://github.com/Qiskit/qiskit-optimization/blob/master/docs/{{ docname }} - -""" - # ----------------------------------------------------------------------------- # Autosummary # ----------------------------------------------------------------------------- diff --git a/docs/index.rst b/docs/index.rst index d3b822a36e..bac2873735 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,6 +7,7 @@ Qiskit Nature documentation API References Release Notes + Tutorials .. Hiding - Indices and tables :ref:`genindex` diff --git a/tutorials/01_electronic_structure.ipynb b/docs/tutorials/01_electronic_structure.ipynb similarity index 61% rename from tutorials/01_electronic_structure.ipynb rename to docs/tutorials/01_electronic_structure.ipynb index de4f2e4ea0..ffb4048b48 100644 --- a/tutorials/01_electronic_structure.ipynb +++ b/docs/tutorials/01_electronic_structure.ipynb @@ -87,11 +87,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/bpa/opt/anaconda3/envs/qiskit-nature/lib/python3.7/site-packages/pyscf/lib/misc.py:46: H5pyDeprecationWarning: Using default_file_mode other than 'r' is deprecated. Pass the mode to h5py.File() instead.\n", + " h5py.get_config().default_file_mode = 'a'\n" + ] + } + ], "source": [ - "from qiskit.chemistry.drivers import PySCFDriver, UnitsType, Molecule\n", + "from qiskit_nature.drivers import PySCFDriver, UnitsType, Molecule\n", "molecule = Molecule(geometry=[['H', [0., 0., 0.]],\n", " ['H', [0., 0., 0.735]]],\n", " charge=0, multiplicity=1)\n", @@ -119,192 +128,138 @@ "* The Jordan-Wigner 'jordan_wigner' mapping (über das paulische äquivalenzverbot. In The Collected Works of Eugene Paul Wigner (pp. 109-129). Springer, Berlin, Heidelberg (1993)).\n", "* The Parity 'parity' (The Journal of chemical physics, 137(22), 224109 (2012))\n", "* The Bravyi-Kitaev 'bravyi_kitaev' (Annals of Physics, 298(1), 210-226 (2002))\n", - "* The Bravyi-Kitaev Super Fast 'bksf' (Annals of Physics, 298(1), 210-226 (2002))\n", "\n", "The Jordan-Wigner mapping is particularly interesting as it maps each Spin Orbital to a qubit (as shown on the Figure above). \n", "\n", - "Here we set up an object which contains all the information about any transformation of the fermionic Hamiltonian to the qubits Hamiltonian. In this example we simply ask for the Jordan-Wigner mapping. " + "Here we set up the Electronic Structure Problem to generate the Second quantized operator and a qubit converter that will map it to a qubit operator." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "from qiskit.chemistry.transformations import (FermionicTransformation, \n", - " FermionicTransformationType, \n", - " FermionicQubitMappingType)\n", - "\n", - "fermionic_transformation = FermionicTransformation(\n", - " transformation=FermionicTransformationType.FULL,\n", - " qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER,\n", - " two_qubit_reduction=False,\n", - " freeze_core=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we now transform this Hamiltonian for the given driver defined above we get our qubit operator:" + "from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem\n", + "from qiskit_nature.operators.second_quantization.qubit_converter import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import JordanWignerMapper, ParityMapper" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "SummedOp([\n", - " -0.8105479805373266 * IIII,\n", - " 0.17218393261915552 * IIIZ,\n", - " -0.22575349222402472 * IIZI,\n", - " 0.1721839326191556 * IZII,\n", - " -0.22575349222402466 * ZIII,\n", - " 0.1209126326177663 * IIZZ,\n", - " 0.16892753870087912 * IZIZ,\n", - " 0.045232799946057854 * XXYY,\n", - " 0.045232799946057854 * YYYY,\n", - " 0.045232799946057854 * XXXX,\n", - " 0.045232799946057854 * YYXX,\n", - " 0.16614543256382414 * ZIIZ,\n", - " 0.16614543256382414 * IZZI,\n", - " 0.17464343068300453 * ZIZI,\n", - " 0.1209126326177663 * ZZII\n", - "])\n", - "{'num_particles': [1, 1], 'num_orbitals': 4, 'two_qubit_reduction': False, 'z2_symmetries': }\n" + " +-+- * (0.18093119978423136+0j)\n", + "+ +--+ * (-0.18093119978423142+0j)\n", + "+ -++- * (-0.18093119978423142+0j)\n", + "+ -+-+ * (0.18093119978423144+0j)\n", + "+ IIIN * (-0.4718960072811406+0j)\n", + "+ IINI * (-1.2563390730032502+0j)\n", + "+ IINN * (0.4836505304710652+0j)\n", + "+ INII * (-0.4718960072811406+0j)\n", + "+ ININ * (0.6985737227320181+0j)\n", + "+ INNI * (0.6645817302552965+0j)\n", + "+ NIII * (-1.2563390730032502+0j)\n", + "+ NIIN * (0.6645817302552965+0j)\n", + "+ NINI * (0.6757101548035165+0j)\n", + "+ NNII * (0.4836505304710652+0j)\n" ] } ], "source": [ - "qubit_op, _ = fermionic_transformation.transform(driver)\n", - "print(qubit_op)\n", - "print(fermionic_transformation.molecule_info)" + "es_problem = ElectronicStructureProblem(driver)\n", + "second_q_op = es_problem.second_q_ops()\n", + "print(second_q_op[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In the minimal (STO-3G) basis set 4 qubits are required. We could even lower the qubit count by using the Parity mapping which allows to get rid of to qubits by symmetry considerations. " + "If we now transform this Hamiltonian for the given driver defined above we get our qubit operator:" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "SummedOp([\n", - " -1.052373245772859 * II,\n", - " 0.39793742484318007 * IZ,\n", - " -0.39793742484318007 * ZI,\n", - " -0.01128010425623538 * ZZ,\n", - " 0.18093119978423136 * XX\n", - "])\n" + "-0.8105479805373264 * IIII\n", + "- 0.22575349222402463 * ZIII\n", + "+ 0.17218393261915566 * IZII\n", + "+ 0.1209126326177663 * ZZII\n", + "- 0.22575349222402466 * IIZI\n", + "+ 0.17464343068300453 * ZIZI\n", + "+ 0.16614543256382414 * IZZI\n", + "+ 0.17218393261915566 * IIIZ\n", + "+ 0.16614543256382414 * ZIIZ\n", + "+ 0.16892753870087912 * IZIZ\n", + "+ 0.1209126326177663 * IIZZ\n", + "+ 0.045232799946057854 * XXXX\n", + "+ 0.045232799946057854 * YYXX\n", + "+ 0.045232799946057854 * XXYY\n", + "+ 0.045232799946057854 * YYYY\n" ] } ], "source": [ - "fermionic_transformation_2 = FermionicTransformation(\n", - " transformation=FermionicTransformationType.FULL,\n", - " qubit_mapping=FermionicQubitMappingType.PARITY,\n", - " two_qubit_reduction=True,\n", - " freeze_core=False)\n", - "qubit_op_2, _ = fermionic_transformation_2.transform(driver)\n", - "print(qubit_op_2)" + "qubit_converter = QubitConverter(mapper=JordanWignerMapper())\n", + "qubit_op = qubit_converter.convert(second_q_op[0])\n", + "print(qubit_op)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This time only 2 qubits are needed. \n", - "\n", - "Another possibility is to use the Particle-Hole tranformation (Physical Review A, 98(2), 022322 (2018)). This shifts the vacuum state to a state lying in the N-particle Fock space. In this representation the HF (reference) state has a null energy and the optimization procedure is more faster. " + "In the minimal (STO-3G) basis set 4 qubits are required. We could even lower the qubit count by using the Parity mapping which allows to get rid of to qubits by symmetry considerations. " ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "SummedOp([\n", - " 1.0264200106656571 * IIII,\n", - " 0.17218393261915554 * IIIZ,\n", - " -0.22575349222402463 * IIZI,\n", - " 0.17218393261915554 * IZII,\n", - " -0.22575349222402458 * ZIII,\n", - " 0.16892753870087912 * IZIZ,\n", - " 0.045232799946057854 * YYYY,\n", - " 0.045232799946057854 * XXYY,\n", - " 0.045232799946057854 * YYXX,\n", - " 0.045232799946057854 * XXXX,\n", - " 0.1209126326177663 * IIZZ,\n", - " 0.16614543256382414 * IZZI,\n", - " 0.16614543256382414 * ZIIZ,\n", - " 0.17464343068300453 * ZIZI,\n", - " 0.1209126326177663 * ZZII\n", - "])\n" + "(-1.0523732457728585+5.551115123125783e-17j) * II\n", + "+ (-0.3979374248431802+1.3877787807814457e-17j) * ZI\n", + "+ 0.3979374248431802 * IZ\n", + "- 0.01128010425623538 * ZZ\n", + "+ (0.18093119978423142+3.469446951953614e-18j) * XX\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/bpa/qiskit/qiskit-terra/qiskit/opflow/primitive_ops/pauli_sum_op.py:213: DeprecationWarning: Using the `__mul__` operator `A * B` as shorthand for `A.dot(B)` is deprecated as of version 0.17.0 and will be removed no earlier than 3 months after the release date. As an alternative, use the compose operator `B & A` in place of `A * B` as a replacement.\n", + " new_self.primitive * other.primitive,\n" ] } ], "source": [ - "fermionic_transformation_3 = FermionicTransformation(\n", - " transformation=FermionicTransformationType.PARTICLE_HOLE,\n", - " qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER,\n", - " two_qubit_reduction=False,\n", - " freeze_core=False)\n", - "qubit_op_3, _ = fermionic_transformation_3.transform(driver)\n", - "print(qubit_op_3)" + "qubit_converter = QubitConverter(mapper = ParityMapper(), two_qubit_reduction=True)\n", + "qubit_op = qubit_converter.convert(second_q_op[0], num_particles=es_problem.num_particles)\n", + "print(qubit_op)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The list of available mappings and transformations are" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "*Transformations\n", - "FermionicTransformationType.FULL\n", - "FermionicTransformationType.PARTICLE_HOLE\n", - "\n", - "*Mappings\n", - "FermionicQubitMappingType.JORDAN_WIGNER\n", - "FermionicQubitMappingType.PARITY\n", - "FermionicQubitMappingType.BRAVYI_KITAEV\n" - ] - } - ], - "source": [ - "print('*Transformations')\n", - "for fer_transform in FermionicTransformationType:\n", - " print(fer_transform)\n", - "\n", - "print('\\n*Mappings')\n", - "for fer_mapping in FermionicQubitMappingType:\n", - " print(fer_mapping)" + "This time only 2 qubits are needed. " ] }, { @@ -316,14 +271,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "

Version Information

Qiskit SoftwareVersion
Qiskit0.23.0
Terra0.16.0
Aer0.7.0
Ignis0.5.0
Aqua0.8.0
IBM Q Provider0.11.0
System information
Python3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) \n", - "[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs2
Memory (Gb)16.0
Tue Oct 20 18:02:17 2020 CEST
" + "

Version Information

Qiskit SoftwareVersion
Qiskit0.24.1
Terra0.17.0.dev0+ad88761
Aer0.7.6
Ignis0.5.2
AquaNone
IBM Q Provider0.12.2
System information
Python3.7.10 (default, Feb 26 2021, 10:16:00) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs4
Memory (Gb)16.0
Thu Apr 01 10:23:12 2021 CEST
" ], "text/plain": [ "" @@ -335,7 +290,7 @@ { "data": { "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" @@ -350,13 +305,6 @@ "%qiskit_version_table\n", "%qiskit_copyright" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -375,7 +323,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.10" + "version": "3.7.10" } }, "nbformat": 4, diff --git a/docs/tutorials/02_vibrational_structure.ipynb b/docs/tutorials/02_vibrational_structure.ipynb new file mode 100644 index 0000000000..7f7ce55244 --- /dev/null +++ b/docs/tutorials/02_vibrational_structure.ipynb @@ -0,0 +1,761 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Vibrational structure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction \n", + "\n", + "The molecular Hamiltonian is \n", + "\n", + "$$\n", + "\\mathcal{H} = - \\sum_I \\frac{\\nabla_{R_I}^2}{M_I} - \\sum_i \\frac{\\nabla_{r_i}^2}{m_e} - \\sum_I\\sum_i \\frac{Z_I e^2}{|R_I-r_i|} + \\sum_i \\sum_{j>i} \\frac{e^2}{|r_i-r_j|} + \\sum_I\\sum_{J>I} \\frac{Z_I Z_J e^2}{|R_I-R_J|}\n", + "$$\n", + "\n", + "Because the nuclei are much heavier than the electrons they do not move on the same time scale and therefore, the behavior of nuclei and electronc can be decoupled. This is the Born-Oppenheimer approximation.\n", + "\n", + "Within the Born-Oppenheimer approximation, a molecular wave function is factorized as a product of an electronic part, which is the solution of the electronic Schroedinger equation, and a vibro-rotational one, which is the solution of the nuclear Schroedinger equation in the potential energy surface (PES) generated by sampling the eigenvalues of the electronic Schroedinger equation for different geometries.\n", + "\n", + "The nuclear Schroedinger equation is usually solved in two steps, in analogy with its electronic counterpart. \n", + "A single-particle basis (the basis functions are called, in this case, modals) is obtained either by the harmonic approximation applied to the PES or from a vibrational self-consistent field (VSCF) calculation. \n", + "Vibrational anharmonic correlations are added a-posteriori with perturbative or variational approaches.\n", + "The latter include Vibrational Configuration Interaction (VCI) and Vibrational Coupled Cluster (VCC) for highly-accurate anharmonic energies. \n", + "The main advantage of VCI and VCC over alternative approaches (such as perturnation theories) is that their accuracy can be systematically improved towards the complete basis set limit for a given PES. \n", + "However, their applicability is limited to small molecules with up to about 10 atoms due to their unfavorable scaling with system size.\n", + "\n", + "To tackle the scaling problem we would like to use quantum algorithms.\n", + "\n", + "The nuclear Schroedinger equation is\n", + "$$\n", + "\\mathcal{H}_{\\text{vib}} |\\Psi_{n}\\rangle = E_{n} |\\Psi_{n}\\rangle\n", + "$$\n", + "\n", + "The so-called Watson Hamiltonian (neglecting vibro-rotational coupling terms) is\n", + "$$\n", + " \\mathcal{H}_\\text{vib}(Q_1, \\ldots, Q_L) \n", + " = - \\frac{1}{2} \\sum_{l=1}^{L} \\frac{\\partial^2}{\\partial Q_l^2} + V(Q_1, \\ldots, Q_L)\n", + "$$\n", + "where $Q_l$ are the harmonic mass-weighted normal coordinates.\n", + "\n", + "$\\mathcal{H}_\\text{vib}$ must be mapped to an operator that acts on the states of a given set of $N_q$ qubits in order to calculate its eigenfunctions on quantum hardware.\n", + "In electronic structure calculations, the mapping is achieved by expressing the non-relativistic electronic Hamiltonian in second quantization, \\textit{i.e.} by projecting it onto the complete set of antisymmetrized occupation number vectors (ONV) generated by a given (finite) set of orbitals.\n", + "To encode the vibrational Hamiltonian in an analogous second quantization operators, we expand the potential $V(Q_1, \\ldots, Q_L)$ with the $n$-body expansion as follows:\n", + "\n", + "$$\n", + " V(Q_1, \\ldots, Q_L) = V_0 + \\sum_{l=1}^L V^{[l]}(Q_l) \n", + " + \\sum_{lVersion Information
Qiskit SoftwareVersion
Qiskit0.24.1
Terra0.17.0.dev0+ad88761
Aer0.7.6
Ignis0.5.2
AquaNone
IBM Q Provider0.12.2
System information
Python3.7.10 (default, Feb 26 2021, 10:16:00) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs4
Memory (Gb)16.0
Thu Apr 01 10:23:40 2021 CEST
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import qiskit.tools.jupyter\n", + "%qiskit_version_table\n", + "%qiskit_copyright" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/03_ground_state_solvers.ipynb b/docs/tutorials/03_ground_state_solvers.ipynb similarity index 63% rename from tutorials/03_ground_state_solvers.ipynb rename to docs/tutorials/03_ground_state_solvers.ipynb index ef0de18837..8867f6fae6 100644 --- a/tutorials/03_ground_state_solvers.ipynb +++ b/docs/tutorials/03_ground_state_solvers.ipynb @@ -22,18 +22,23 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ - "from qiskit.chemistry.drivers import PySCFDriver, UnitsType, Molecule\n", - "from qiskit.chemistry.transformations import FermionicTransformation, FermionicQubitMappingType\n", + "from qiskit import Aer\n", + "from qiskit_nature.drivers import PySCFDriver, UnitsType, Molecule\n", + "from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem\n", + "from qiskit_nature.operators.second_quantization.qubit_converter import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import JordanWignerMapper\n", "\n", "molecule = Molecule(geometry=[['H', [0., 0., 0.]],\n", " ['H', [0., 0., 0.735]]],\n", " charge=0, multiplicity=1)\n", "driver = PySCFDriver(molecule = molecule, unit=UnitsType.ANGSTROM, basis='sto3g')\n", - "transformation = FermionicTransformation(qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER)" + "\n", + "es_problem = ElectronicStructureProblem(driver)\n", + "qubit_converter = QubitConverter(JordanWignerMapper())" ] }, { @@ -49,11 +54,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ - "from qiskit.aqua.algorithms import NumPyMinimumEigensolver\n", + "from qiskit.algorithms import NumPyMinimumEigensolver\n", "\n", "numpy_solver = NumPyMinimumEigensolver()" ] @@ -71,15 +76,17 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "from qiskit import BasicAer\n", - "from qiskit.aqua import QuantumInstance\n", - "from qiskit.chemistry.algorithms.ground_state_solvers.minimum_eigensolver_factories import VQEUCCSDFactory\n", + "from qiskit.providers.aer import StatevectorSimulator\n", + "from qiskit import Aer\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit_nature.algorithms.ground_state_solvers.minimum_eigensolver_factories import VQEUCCFactory\n", "\n", - "vqe_solver = VQEUCCSDFactory(QuantumInstance(BasicAer.get_backend('statevector_simulator')))" + "quantum_instance = QuantumInstance(backend = Aer.get_backend('statevector_simulator'))\n", + "vqe_solver = VQEUCCFactory(quantum_instance)" ] }, { @@ -92,26 +99,25 @@ "2. An initial state: the initial state of the qubits. In the factory used above, the qubits are initialized in the Hartree-Fock (see the electronic structure tutorial) initial state (the qubits corresponding to occupied MOs are $|1\\rangle$ and those corresponding to virtual MOs are $|0\\rangle$.\n", "3. The backend: this is the quantum machine on which the right part of the figure above will be performed. Here we ask for the perfect quantum emulator (```statevector_simulator```). \n", "\n", - "One could also use any available variational form / initial state or even define one's own. For instance," + "One could also use any available ansatz / initial state or even define one's own. For instance," ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ - "from qiskit.aqua.algorithms import VQE\n", + "from qiskit.algorithms import VQE\n", "from qiskit.circuit.library import TwoLocal\n", "\n", - "num_qubits = 4\n", - "tl_circuit = TwoLocal(num_qubits, ['h', 'rx'], 'cz', \n", + "tl_circuit = TwoLocal(rotation_blocks = ['h', 'rx'], entanglement_blocks = 'cz', \n", " entanglement='full', reps=3, parameter_prefix = 'y')\n", "\n", - "tl_circuit.draw(output = 'mpl')\n", + "tl_circuit.draw(output='mpl')\n", "\n", - "another_solver = VQE(var_form = tl_circuit, \n", - " quantum_instance = QuantumInstance(BasicAer.get_backend('statevector_simulator')))" + "another_solver = VQE(ansatz = tl_circuit, \n", + " quantum_instance = QuantumInstance(Aer.get_backend('statevector_simulator')))" ] }, { @@ -125,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -136,8 +142,6 @@ " \n", "* Electronic ground state energy (Hartree): -1.857275030145\n", " - computed part: -1.857275030145\n", - " - frozen energy part: 0.0\n", - " - particle hole part: 0.0\n", "~ Nuclear repulsion energy (Hartree): 0.719968994449\n", "> Total ground state energy (Hartree): -1.137306035696\n", " \n", @@ -150,21 +154,19 @@ "~ Nuclear dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " \n", " 0: \n", - " * Electronic dipole moment (a.u.): [0.0 0.0 1.38894909]\n", - " - computed part: [0.0 0.0 1.38894909]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", - " > Dipole moment (a.u.): [0.0 0.0 -0.00000039] Total: 0.00000039\n", - " (debye): [0.0 0.0 -0.000001] Total: 0.000001\n", + " * Electronic dipole moment (a.u.): [0.0 0.0 1.38894891]\n", + " - computed part: [0.0 0.0 1.38894891]\n", + " > Dipole moment (a.u.): [0.0 0.0 -0.00000021] Total: 0.00000021\n", + " (debye): [0.0 0.0 -0.00000053] Total: 0.00000053\n", " \n" ] } ], "source": [ - "from qiskit.chemistry.algorithms.ground_state_solvers import GroundStateEigensolver\n", + "from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver\n", "\n", - "calc = GroundStateEigensolver(transformation, vqe_solver)\n", - "res = calc.solve(driver)\n", + "calc = GroundStateEigensolver(qubit_converter, vqe_solver)\n", + "res = calc.solve(es_problem)\n", "\n", "print(res)" ] @@ -178,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -189,8 +191,6 @@ " \n", "* Electronic ground state energy (Hartree): -1.857275030202\n", " - computed part: -1.857275030202\n", - " - frozen energy part: 0.0\n", - " - particle hole part: 0.0\n", "~ Nuclear repulsion energy (Hartree): 0.719968994449\n", "> Total ground state energy (Hartree): -1.137306035753\n", " \n", @@ -205,8 +205,6 @@ " 0: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n" @@ -214,8 +212,8 @@ } ], "source": [ - "calc = GroundStateEigensolver(transformation, numpy_solver)\n", - "res = calc.solve(driver)\n", + "calc = GroundStateEigensolver(qubit_converter, numpy_solver)\n", + "res = calc.solve(es_problem)\n", "print(res)" ] }, @@ -235,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -244,7 +242,7 @@ "text": [ "=== GROUND STATE ENERGY ===\n", " \n", - "* Vibrational ground state energy (cm^-1): (1e-12+0j)\n", + "* Vibrational ground state energy (cm^-1): (1e-11+0j)\n", "The number of occupied modals is\n", "- Mode 0: [0.0, 0.0, 0.0, 0.0]\n", "\n", @@ -252,43 +250,32 @@ "\n", "=== GROUND STATE ENERGY ===\n", " \n", - "* Vibrational ground state energy (cm^-1): (2536.487976362422+0j)\n", + "* Vibrational ground state energy (cm^-1): (2553.464851175482+0j)\n", "The number of occupied modals is\n", - "- Mode 0: [1.0000000000000002, 1.0000000000000002, 1.0000000000000002, 1.0000000000000002]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/aul/anaconda3/envs/QiskitPip/lib/python3.6/site-packages/qiskit/chemistry/results/vibrational_structure_result.py:73: DeprecationWarning: The Python built-in `round` is deprecated for complex scalars, and will raise a `TypeError` in a future release. Use `np.round` or `scalar.round` instead.\n", - " format(round(self.computed_vibrational_energies[0], 12)))\n", - "/Users/aul/anaconda3/envs/QiskitPip/lib/python3.6/site-packages/qiskit/chemistry/results/vibrational_structure_result.py:73: DeprecationWarning: The Python built-in `round` is deprecated for complex scalars, and will raise a `TypeError` in a future release. Use `np.round` or `scalar.round` instead.\n", - " format(round(self.computed_vibrational_energies[0], 12)))\n" + "- Mode 0: [0.9999999999999999, 0.9999999999999999, 0.9999999999999999, 0.9999999999999999]\n" ] } ], "source": [ - "from qiskit.chemistry.drivers import GaussianForcesDriver\n", - "from qiskit.chemistry.algorithms.ground_state_solvers import NumPyMinimumEigensolverFactory\n", - "from qiskit.chemistry.transformations import (BosonicTransformation,\n", - " BosonicTransformationType,\n", - " BosonicQubitMappingType)\n", + "from qiskit_nature.drivers import GaussianForcesDriver\n", + "from qiskit_nature.algorithms.ground_state_solvers.minimum_eigensolver_factories import NumPyMinimumEigensolverFactory\n", + "from qiskit_nature.problems.second_quantization.vibrational.vibrational_structure_problem import VibrationalStructureProblem\n", + "from qiskit_nature.mappers.second_quantization import DirectMapper\n", "\n", "driver = GaussianForcesDriver(logfile='aux_files/CO2_freq_B3LYP_ccpVDZ.log')\n", - "bosonic_transformation = BosonicTransformation(qubit_mapping=BosonicQubitMappingType.DIRECT,\n", - " transformation_type=BosonicTransformationType.HARMONIC,\n", - " basis_size=2,\n", - " truncation=2)\n", + "\n", + "vib_problem = VibrationalStructureProblem(driver, num_modals=2, truncation_order=2)\n", + "\n", + "qubit_covnerter = QubitConverter(DirectMapper())\n", "\n", "solver_without_filter = NumPyMinimumEigensolverFactory(use_default_filter_criterion=False)\n", "solver_with_filter = NumPyMinimumEigensolverFactory(use_default_filter_criterion=True)\n", "\n", - "gsc_wo = GroundStateEigensolver(bosonic_transformation, solver_without_filter)\n", - "result_wo = gsc_wo.solve(driver)\n", + "gsc_wo = GroundStateEigensolver(qubit_converter, solver_without_filter)\n", + "result_wo = gsc_wo.solve(vib_problem)\n", "\n", - "gsc_w = GroundStateEigensolver(bosonic_transformation, solver_with_filter)\n", - "result_w = gsc_w.solve(driver)\n", + "gsc_w = GroundStateEigensolver(qubit_converter, solver_with_filter)\n", + "result_w = gsc_w.solve(vib_problem)\n", "\n", "print(result_wo)\n", "print('\\n\\n')\n", @@ -297,14 +284,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "

Version Information

Qiskit SoftwareVersion
Qiskit0.23.0
Terra0.16.0
Aer0.7.0
Ignis0.5.0
Aqua0.8.0
IBM Q Provider0.11.0
System information
Python3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) \n", - "[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs2
Memory (Gb)16.0
Tue Oct 20 18:05:31 2020 CEST
" + "

Version Information

Qiskit SoftwareVersion
Qiskit0.24.1
Terra0.17.0.dev0+bcbc13c
Aer0.7.6
Ignis0.5.2
AquaNone
IBM Q Provider0.12.2
System information
Python3.7.10 (default, Feb 26 2021, 10:16:00) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs4
Memory (Gb)16.0
Thu Apr 01 17:42:31 2021 CEST
" ], "text/plain": [ "" @@ -316,7 +303,7 @@ { "data": { "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" @@ -331,13 +318,6 @@ "%qiskit_version_table\n", "%qiskit_copyright" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -356,7 +336,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.10" } }, "nbformat": 4, diff --git a/tutorials/04_excited_states_solvers.ipynb b/docs/tutorials/04_excited_states_solvers.ipynb similarity index 75% rename from tutorials/04_excited_states_solvers.ipynb rename to docs/tutorials/04_excited_states_solvers.ipynb index a690d40019..646179041e 100644 --- a/tutorials/04_excited_states_solvers.ipynb +++ b/docs/tutorials/04_excited_states_solvers.ipynb @@ -29,20 +29,24 @@ "name": "stderr", "output_type": "stream", "text": [ - "Numpy 1.16 has memory leak bug https://github.com/numpy/numpy/issues/13808\n", - "It is recommended to downgrade to numpy 1.15 or older\n" + "/Users/bpa/opt/anaconda3/envs/qiskit-nature/lib/python3.7/site-packages/pyscf/lib/misc.py:46: H5pyDeprecationWarning: Using default_file_mode other than 'r' is deprecated. Pass the mode to h5py.File() instead.\n", + " h5py.get_config().default_file_mode = 'a'\n" ] } ], "source": [ - "from qiskit.chemistry.drivers import PySCFDriver, UnitsType, Molecule\n", - "from qiskit.chemistry.transformations import FermionicTransformation, FermionicQubitMappingType\n", + "from qiskit_nature.drivers import PySCFDriver, UnitsType, Molecule\n", + "from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem\n", + "from qiskit_nature.operators.second_quantization.qubit_converter import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import JordanWignerMapper\n", "\n", "molecule = Molecule(geometry=[['H', [0., 0., 0.]],\n", " ['H', [0., 0., 0.735]]],\n", " charge=0, multiplicity=1)\n", "driver = PySCFDriver(molecule = molecule, unit=UnitsType.ANGSTROM, basis='sto3g')\n", - "transformation = FermionicTransformation(qubit_mapping=FermionicQubitMappingType.JORDAN_WIGNER)" + "\n", + "es_problem = ElectronicStructureProblem(driver)\n", + "qubit_converter = QubitConverter(JordanWignerMapper())" ] }, { @@ -59,11 +63,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "from qiskit.chemistry.algorithms import NumPyEigensolverFactory\n", + "from qiskit_nature.algorithms.excited_states_solvers.eigensolver_factories import NumPyEigensolverFactory\n", "\n", "numpy_solver = NumPyEigensolverFactory(use_default_filter_criterion=True)" ] @@ -110,26 +114,26 @@ "$$\n", "\n", "Although the previous equation can be solved classically, each matrix element must be measured on the quantum computer with the corresponding ground state. \n", - "To use the qEOM as a solver in Qiskit, we have to define a ground state calculation first, explaining the algorithms how to find the ground state. With this the qEOM solver can be initialized:" + "To use the qEOM as a solver in Qiskit, we have to define a ground state calculation first, providing to the algorithm information on how to find the ground state. With this the qEOM solver can be initialized:" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "from qiskit import BasicAer\n", - "from qiskit.aqua import QuantumInstance\n", - "from qiskit.chemistry.algorithms.ground_state_solvers import (GroundStateEigensolver,\n", - " VQEUCCSDFactory)\n", - "from qiskit.chemistry.algorithms.excited_states_solvers import QEOM\n", + "from qiskit import Aer\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver\n", + "from qiskit_nature.algorithms.ground_state_solvers.minimum_eigensolver_factories import VQEUCCFactory\n", + "from qiskit_nature.algorithms.excited_states_solvers import QEOM\n", "\n", "# This first part sets the ground state solver\n", "# see more about this part in the ground state calculation tutorial\n", - "quantum_instance = QuantumInstance(BasicAer.get_backend('statevector_simulator'))\n", - "solver = VQEUCCSDFactory(quantum_instance)\n", - "gsc = GroundStateEigensolver(transformation, solver)\n", + "quantum_instance = QuantumInstance(Aer.get_backend('statevector_simulator'))\n", + "solver = VQEUCCFactory(quantum_instance)\n", + "gsc = GroundStateEigensolver(qubit_converter, solver)\n", "\n", "# The qEOM algorithm is simply instantiated with the chosen ground state solver\n", "qeom_excited_states_calculation = QEOM(gsc, 'sd') " @@ -146,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -157,8 +161,6 @@ " \n", "* Electronic ground state energy (Hartree): -1.857275030202\n", " - computed part: -1.857275030202\n", - " - frozen energy part: 0.0\n", - " - particle hole part: 0.0\n", "~ Nuclear repulsion energy (Hartree): 0.719968994449\n", "> Total ground state energy (Hartree): -1.137306035753\n", " \n", @@ -184,24 +186,18 @@ " 0: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 1: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 2: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", @@ -212,22 +208,20 @@ " \n", "* Electronic ground state energy (Hartree): -1.857275030145\n", " - computed part: -1.857275030145\n", - " - frozen energy part: 0.0\n", - " - particle hole part: 0.0\n", "~ Nuclear repulsion energy (Hartree): 0.719968994449\n", "> Total ground state energy (Hartree): -1.137306035696\n", " \n", "=== EXCITED STATE ENERGIES ===\n", " \n", " 1: \n", - "* Electronic excited state energy (Hartree): -1.244586753196\n", - "> Total excited state energy (Hartree): -0.524617758747\n", + "* Electronic excited state energy (Hartree): -1.244586755338\n", + "> Total excited state energy (Hartree): -0.524617760889\n", " 2: \n", - "* Electronic excited state energy (Hartree): -0.882724353597\n", - "> Total excited state energy (Hartree): -0.162755359148\n", + "* Electronic excited state energy (Hartree): -0.882724355739\n", + "> Total excited state energy (Hartree): -0.16275536129\n", " 3: \n", - "* Electronic excited state energy (Hartree): -0.224913456192\n", - "> Total excited state energy (Hartree): 0.495055538257\n", + "* Electronic excited state energy (Hartree): -0.224913458334\n", + "> Total excited state energy (Hartree): 0.495055536115\n", " \n", "=== MEASURED OBSERVABLES ===\n", " \n", @@ -238,23 +232,21 @@ "~ Nuclear dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " \n", " 0: \n", - " * Electronic dipole moment (a.u.): [0.0 0.0 1.38894909]\n", - " - computed part: [0.0 0.0 1.38894909]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", - " > Dipole moment (a.u.): [0.0 0.0 -0.00000039] Total: 0.00000039\n", - " (debye): [0.0 0.0 -0.000001] Total: 0.000001\n", + " * Electronic dipole moment (a.u.): [0.0 0.0 1.38894891]\n", + " - computed part: [0.0 0.0 1.38894891]\n", + " > Dipole moment (a.u.): [0.0 0.0 -0.00000021] Total: 0.00000021\n", + " (debye): [0.0 0.0 -0.00000053] Total: 0.00000053\n", " \n" ] } ], "source": [ - "from qiskit.chemistry.algorithms.excited_states_solvers import ExcitedStatesEigensolver\n", + "from qiskit_nature.algorithms.excited_states_solvers import ExcitedStatesEigensolver\n", "\n", - "numpy_excited_states_calculation = ExcitedStatesEigensolver(transformation, numpy_solver)\n", - "numpy_results = numpy_excited_states_calculation.solve(driver)\n", + "numpy_excited_states_calculation = ExcitedStatesEigensolver(qubit_converter, numpy_solver)\n", + "numpy_results = numpy_excited_states_calculation.solve(es_problem)\n", "\n", - "qeom_results = qeom_excited_states_calculation.solve(driver)\n", + "qeom_results = qeom_excited_states_calculation.solve(es_problem)\n", "\n", "print(numpy_results)\n", "print('\\n\\n')\n", @@ -271,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -282,8 +274,6 @@ " \n", "* Electronic ground state energy (Hartree): -1.857275030202\n", " - computed part: -1.857275030202\n", - " - frozen energy part: 0.0\n", - " - particle hole part: 0.0\n", "~ Nuclear repulsion energy (Hartree): 0.719968994449\n", "> Total ground state energy (Hartree): -1.137306035753\n", " \n", @@ -309,8 +299,8 @@ " \n", " 0: # Particles: 2.000 S: 0.000 S^2: 0.000 M: 0.000\n", " 1: # Particles: 2.000 S: 1.000 S^2: 2.000 M: 0.000\n", - " 2: # Particles: 2.000 S: 1.000 S^2: 2.000 M: -1.000\n", - " 3: # Particles: 2.000 S: 1.000 S^2: 2.000 M: 1.000\n", + " 2: # Particles: 2.000 S: 1.000 S^2: 2.000 M: 1.000\n", + " 3: # Particles: 2.000 S: 1.000 S^2: 2.000 M: -1.000\n", " 4: # Particles: 2.000 S: 0.000 S^2: 0.000 M: 0.000\n", " 5: # Particles: 2.000 S: 0.000 S^2: 0.000 M: 0.000\n", " \n", @@ -321,48 +311,36 @@ " 0: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 1: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 2: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 3: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 4: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n", " 5: \n", " * Electronic dipole moment (a.u.): [0.0 0.0 1.3889487]\n", " - computed part: [0.0 0.0 1.3889487]\n", - " - frozen energy part: [0.0 0.0 0.0]\n", - " - particle hole part: [0.0 0.0 0.0]\n", " > Dipole moment (a.u.): [0.0 0.0 0.0] Total: 0.\n", " (debye): [0.0 0.0 0.0] Total: 0.\n", " \n" @@ -376,22 +354,22 @@ " return np.isclose(aux_values[0][0], 2.)\n", "\n", "new_numpy_solver = NumPyEigensolverFactory(filter_criterion=filter_criterion)\n", - "new_numpy_excited_states_calculation = ExcitedStatesEigensolver(transformation, new_numpy_solver)\n", - "new_numpy_results = new_numpy_excited_states_calculation.solve(driver)\n", + "new_numpy_excited_states_calculation = ExcitedStatesEigensolver(qubit_converter, new_numpy_solver)\n", + "new_numpy_results = new_numpy_excited_states_calculation.solve(es_problem)\n", "\n", "print(new_numpy_results)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "

Version Information

Qiskit SoftwareVersion
Qiskit0.23.0
Terra0.16.0
Aer0.7.0
Ignis0.5.0
Aqua0.8.0
IBM Q Provider0.11.0
System information
Python3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) \n", - "[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs2
Memory (Gb)16.0
Tue Oct 20 18:06:26 2020 CEST
" + "

Version Information

Qiskit SoftwareVersion
Qiskit0.24.1
Terra0.17.0.dev0+bcbc13c
Aer0.7.6
Ignis0.5.2
AquaNone
IBM Q Provider0.12.2
System information
Python3.7.10 (default, Feb 26 2021, 10:16:00) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs4
Memory (Gb)16.0
Thu Apr 01 12:26:00 2021 CEST
" ], "text/plain": [ "" @@ -403,7 +381,7 @@ { "data": { "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" @@ -418,13 +396,6 @@ "%qiskit_version_table\n", "%qiskit_copyright" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -443,7 +414,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.10" } }, "nbformat": 4, diff --git a/docs/tutorials/05_Sampling_potential_energy_surfaces.ipynb b/docs/tutorials/05_Sampling_potential_energy_surfaces.ipynb new file mode 100644 index 0000000000..6c5ac24303 --- /dev/null +++ b/docs/tutorials/05_Sampling_potential_energy_surfaces.ipynb @@ -0,0 +1,543 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sampling the potential energy surface " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction \n", + "\n", + "This interactive notebook demonstrates how to utilize the Potential Energy Surface (PES) samplers algorithm of qiskit chemistry to generate the dissociation profile of a molecule. We use the Born-Oppenhemier Potential Energy Surface (BOPES)and demonstrate how to exploit bootstrapping and extrapolation to reduce the total number of function evaluations in computing the PES using the Variational Quantum Eigensolver (VQE). \n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/bpa/opt/anaconda3/envs/qiskit-nature/lib/python3.7/site-packages/pyscf/lib/misc.py:46: H5pyDeprecationWarning: Using default_file_mode other than 'r' is deprecated. Pass the mode to h5py.File() instead.\n", + " h5py.get_config().default_file_mode = 'a'\n" + ] + } + ], + "source": [ + "# import common packages\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from functools import partial\n", + "\n", + "# qiskit\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit import Aer\n", + "from qiskit.algorithms.minimum_eigen_solvers import NumPyMinimumEigensolver, VQE\n", + "from qiskit.algorithms.optimizers import SLSQP\n", + "from qiskit.circuit.library import ExcitationPreserving\n", + "from qiskit import BasicAer\n", + "from qiskit.algorithms import NumPyMinimumEigensolver, VQE\n", + "from qiskit.algorithms.optimizers import SLSQP\n", + "\n", + "# qiskit nature imports\n", + "from qiskit_nature.problems.second_quantization import ElectronicStructureProblem\n", + "from qiskit_nature.operators.second_quantization.qubit_converter import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import JordanWignerMapper\n", + "from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver\n", + "from qiskit_nature.drivers import PySCFDriver, UnitsType, Molecule\n", + "from qiskit_nature.algorithms.pes_samplers import BOPESSampler, Extrapolator\n", + "\n", + "import warnings\n", + "warnings.simplefilter('ignore', np.RankWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we use the H2 molecule as a model system for testing." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "stretch1 = partial(Molecule.absolute_stretching, atom_pair=(1, 0))\n", + "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", + " ('H', [0., 0., 0.3])],\n", + " degrees_of_freedom=[stretch1],\n", + " )\n", + "\n", + "# pass molecule to PSYCF driver\n", + "driver = PySCFDriver(molecule=mol)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.3])]\n" + ] + } + ], + "source": [ + "print(mol.geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Make a perturbation to the molecule along the absolute_stretching dof" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.5])]\n", + "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.8999999999999999])]\n" + ] + } + ], + "source": [ + "mol.perturbations = [0.2]\n", + "print(mol.geometry)\n", + "\n", + "mol.perturbations = [0.6]\n", + "print(mol.geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculate bond dissociation profile using BOPES Sampler\n", + "\n", + "Here, we pass the molecular information and the VQE to a built-in type called the BOPES Sampler. The BOPES Sampler allows the computation of the potential energy surface for a specified set of degrees of freedom/points of interest." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## First we compare no bootstrapping vs bootstrapping \n", + "\n", + "Bootstrapping the BOPES sampler involves utilizing the optimal variational parameters for a given degree of freedom, say r (ex. interatomic distance) as the initial point for VQE at a later degree of freedom, say r + $\\epsilon$. By default, if boostrapping is set to True, all previous optimal parameters are used as initial points for the next runs." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "es_problem = ElectronicStructureProblem(driver)\n", + "\n", + "qubit_converter = QubitConverter(JordanWignerMapper())\n", + "quantum_instance = QuantumInstance(backend=Aer.get_backend('statevector_simulator'))\n", + "solver = VQE(quantum_instance=quantum_instance)\n", + "\n", + "me_gsc = GroundStateEigensolver(qubit_converter, solver)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "distance1 = partial(Molecule.absolute_distance, atom_pair=(1, 0))\n", + "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", + " ('H', [0., 0., 0.3])],\n", + " degrees_of_freedom=[distance1],\n", + " )\n", + "\n", + "# pass molecule to PSYCF driver\n", + "driver = PySCFDriver(molecule=mol)\n", + "\n", + "es_problem = ElectronicStructureProblem(driver)\n", + "\n", + "\n", + "# Specify degree of freedom (points of interest)\n", + "points = np.linspace(0.25, 2, 30)\n", + "results_full = {} # full dictionary of results for each condition\n", + "results = {} # dictionary of (point,energy) results for each condition\n", + "conditions = {False: 'no bootstrapping', True: 'bootstrapping'}\n", + "\n", + "\n", + "for value, bootstrap in conditions.items():\n", + " # define instance to sampler\n", + " bs = BOPESSampler(\n", + " gss=me_gsc\n", + " ,bootstrap=value\n", + " ,num_bootstrap=None\n", + " ,extrapolator=None)\n", + " # execute\n", + " res = bs.sample(es_problem,points)\n", + " results_full[f'{bootstrap}'] = res.raw_results\n", + " results[f'points_{bootstrap}'] = res.points\n", + " results[f'energies_{bootstrap}'] = res.energies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compare to classical eigensolver\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# define numpy solver\n", + "solver_numpy = NumPyMinimumEigensolver()\n", + "me_gsc_numpy = GroundStateEigensolver(qubit_converter, solver_numpy)\n", + "bs_classical = BOPESSampler(\n", + " gss=me_gsc_numpy\n", + " ,bootstrap=False\n", + " ,num_bootstrap=None\n", + " ,extrapolator=None)\n", + "# execute\n", + "res_np = bs_classical.sample(es_problem, points)\n", + "results_full['np'] = res_np.raw_results\n", + "results['points_np'] = res_np.points\n", + "results['energies_np'] = res_np.energies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Energy')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "for value, bootstrap in conditions.items():\n", + " plt.plot(results[f'points_{bootstrap}'], results[f'energies_{bootstrap}'], label = f'{bootstrap}')\n", + "plt.plot(results['points_np'], results['energies_np'], label = 'numpy')\n", + "plt.legend()\n", + "plt.title('Dissociation profile')\n", + "plt.xlabel('Interatomic distance')\n", + "plt.ylabel('Energy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compare number of evaluations" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no bootstrapping\n", + "Total evaluations for no bootstrapping:\n", + "19816\n", + "bootstrapping\n", + "Total evaluations for bootstrapping:\n", + "4710\n", + "np\n", + "Total evaluations for np:\n", + "0\n" + ] + } + ], + "source": [ + "for condition, result_full in results_full.items():\n", + " print(condition)\n", + " print('Total evaluations for ' + condition + ':')\n", + " sum = 0\n", + " for key in result_full:\n", + " if condition is not 'np':\n", + " sum += result_full[key].raw_result.cost_function_evals\n", + " else:\n", + " sum = 0\n", + " print(sum)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Extrapolation \n", + "\n", + "Here, an extrapolator added that will try to fit each (param,point) set to some specified function and suggest an initial parameter set for the next point (degree of freedom). \n", + "\n", + "- Extrapolator is based on an external extrapolator that sets the 'window', that is, the number of previous points to use for extrapolation, while the internal extrapolator proceeds with the actual extrapolation.\n", + "- In practice, the user sets the window by specifying an integer value to num_bootstrap - which is also the number of previous points to use for bootstrapping. Additionally, the external extrapolator defines the space within how to extrapolate - here PCA, clustering and the standard window approach. \n", + "\n", + "In practice, if no extrapolator is defined and bootstrapping is True, then all previous points will be bootstrapped. If an extrapolator list is defined and no points are specified for bootstrapping, then the extrapolation will be done based on all previous points." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Window Extrapolator: An extrapolator which wraps another extrapolator, limiting the internal extrapolator's ground truth parameter set to a fixed window size\n", + "2. PCA Extrapolator: A wrapper extrapolator which reduces the points' dimensionality with PCA, performs extrapolation in the transformed pca space, and untransforms the results before returning.\n", + "3. Sieve Extrapolator: A wrapper extrapolator which performs an extrapolation, then clusters the extrapolated parameter values into two large and small clusters, and sets the small clusters' parameters to zero.\n", + "4. Polynomial Extrapolator: An extrapolator based on fitting each parameter to a polynomial function of a user-specified degree.\n", + "5. Differential Extrapolator: An extrapolator based on treating each param set as a point in space, and performing regression to predict the param set for the next point. A user-specified degree also adds derivatives to the values in the point vectors which serve as features in the training data for the linear regression." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Here we test two different extrapolation techniques" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# define different extrapolators\n", + "degree = 1\n", + "extrap_poly = Extrapolator.factory(\"poly\", degree = degree)\n", + "extrap_diff = Extrapolator.factory(\"diff_model\", degree = degree)\n", + "extrapolators = {'poly': extrap_poly, 'diff_model': extrap_diff}\n", + "\n", + "for key in extrapolators:\n", + " extrap_internal = extrapolators[key]\n", + " extrap = Extrapolator.factory(\"window\", extrapolator = extrap_internal)\n", + " # define extrapolator\n", + " # BOPES sampler\n", + " bs_extr = BOPESSampler(\n", + " gss=me_gsc\n", + " ,bootstrap=True\n", + " ,num_bootstrap=None\n", + " ,extrapolator=extrap)\n", + " # execute\n", + " res = bs_extr.sample(es_problem, points)\n", + " \n", + " results_full[f'{key}']= res.raw_results\n", + " results[f'points_{key}'] = res.points\n", + " results[f'energies_{key}'] = res.energies\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot results" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "poly\n", + "diff_model\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Energy')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "for value, bootstrap in conditions.items():\n", + " plt.plot(results[f'points_{bootstrap}'], results[f'energies_{bootstrap}'], label = f'{bootstrap}')\n", + "plt.plot(results['points_np'], results['energies_np'], label = 'numpy')\n", + "for condition in extrapolators.keys():\n", + " print(condition)\n", + " plt.plot(results[f'points_{condition}'], results[f'energies_{condition}'], label = condition)\n", + "plt.legend()\n", + "plt.title('Dissociation profile')\n", + "plt.xlabel('Interatomic distance')\n", + "plt.ylabel('Energy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compare number of evaluations" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no bootstrapping\n", + "Total evaluations for no bootstrapping:\n", + "19816\n", + "bootstrapping\n", + "Total evaluations for bootstrapping:\n", + "4710\n", + "np\n", + "Total evaluations for np:\n", + "0\n", + "poly\n", + "Total evaluations for poly:\n", + "1499\n", + "diff_model\n", + "Total evaluations for diff_model:\n", + "1757\n" + ] + } + ], + "source": [ + "for condition, result_full in results_full.items():\n", + " print(condition)\n", + " print('Total evaluations for ' + condition + ':')\n", + " sum = 0\n", + " for key in results_full[condition].keys():\n", + " if condition is not 'np':\n", + " sum += result_full[key].raw_result.cost_function_evals\n", + " else:\n", + " sum = 0\n", + " print(sum)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Version Information

Qiskit SoftwareVersion
Qiskit0.24.1
Terra0.17.0.dev0+bcbc13c
Aer0.7.6
Ignis0.5.2
AquaNone
IBM Q Provider0.12.2
System information
Python3.7.10 (default, Feb 26 2021, 10:16:00) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs4
Memory (Gb)16.0
Thu Apr 01 17:30:15 2021 CEST
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import qiskit.tools.jupyter\n", + "%qiskit_version_table\n", + "%qiskit_copyright" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/tutorials/06_calculating_thermodynamic_observables.ipynb b/docs/tutorials/06_calculating_thermodynamic_observables.ipynb new file mode 100644 index 0000000000..d1ead9deda --- /dev/null +++ b/docs/tutorials/06_calculating_thermodynamic_observables.ipynb @@ -0,0 +1,516 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculating Thermodynamics Observables with a quantum computer" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/bpa/opt/anaconda3/envs/qiskit-nature/lib/python3.7/site-packages/pyscf/lib/misc.py:46: H5pyDeprecationWarning: Using default_file_mode other than 'r' is deprecated. Pass the mode to h5py.File() instead.\n", + " h5py.get_config().default_file_mode = 'a'\n" + ] + } + ], + "source": [ + "# imports\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from functools import partial\n", + "\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit import Aer\n", + "from qiskit.algorithms import NumPyMinimumEigensolver, VQE\n", + "\n", + "from qiskit_nature.drivers import PySCFDriver, UnitsType, Molecule\n", + "from qiskit_nature.problems.second_quantization.electronic.electronic_structure_problem import ElectronicStructureProblem\n", + "from qiskit_nature.operators.second_quantization.qubit_converter import QubitConverter\n", + "from qiskit_nature.mappers.second_quantization import JordanWignerMapper\n", + "from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver\n", + "from qiskit_nature.algorithms.pes_samplers import BOPESSampler\n", + "import qiskit_nature.constants as const\n", + "from qiskit_nature.algorithms.pes_samplers.potentials.energy_surface_spline import EnergySurface1DSpline\n", + "from thermodynamics_utils.thermodynamics import constant_volume_heat_capacity\n", + "from thermodynamics_utils.vibrational_structure_fd import VibrationalStructure1DFD\n", + "from thermodynamics_utils.partition_function import DiatomicPartitionFunction\n", + "from thermodynamics_utils.thermodynamics import Thermodynamics\n", + "\n", + "import warnings\n", + "warnings.simplefilter('ignore', np.RankWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A preliminary draft with more information related to this tutorial can be foung in preprint: Stober et al, arXiv 2003.02303 (2020)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculation of the Born Openheimer Potenitial Energy Surface (BOPES) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compute thermodynamic observables we begin with single point energy calculation which calculates the wavefunction and charge density and therefore the energy of a particular arrangement of nuclei. Here we compute the Born-Oppenheimer potential energy surface of a hydrogen molecule, as an example, which is simply the electronic energy as a function of bond length. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "qubit_converter = QubitConverter(mapper = JordanWignerMapper())\n", + "quantum_instance = QuantumInstance(backend=Aer.get_backend('statevector_simulator'))\n", + "solver = VQE(quantum_instance=quantum_instance)\n", + "\n", + "me_gss = GroundStateEigensolver(qubit_converter, solver)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "stretch1 = partial(Molecule.absolute_distance, atom_pair=(1, 0))\n", + "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", + " ('H', [0., 0., 0.2])],\n", + " degrees_of_freedom=[stretch1],\n", + " masses=[1.6735328E-27, 1.6735328E-27]\n", + " )\n", + "\n", + "\n", + "# pass molecule to PSYCF driver\n", + "driver = PySCFDriver(molecule=mol)\n", + "\n", + "es_problem = ElectronicStructureProblem(driver)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# BOPES sampler testing\n", + "bs = BOPESSampler(gss=me_gss, \n", + " bootstrap=True)\n", + "points = np.linspace(0.45, 5, 50)\n", + "res = bs.sample(es_problem,points)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "energies = []\n", + "bs_res_full = res.raw_results\n", + "for point in points:\n", + " energy = bs_res_full[point].computed_energies + bs_res_full[point].nuclear_repulsion_energy\n", + " energies.append(energy)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Energy')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "plt.plot(points,energies)\n", + "plt.title('Dissociation profile')\n", + "plt.xlabel('Interatomic distance')\n", + "plt.ylabel('Energy')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "energy_surface = EnergySurface1DSpline()\n", + "\n", + "xdata = res.points\n", + "ydata = res.energies\n", + "energy_surface.fit(xdata=xdata, ydata=ydata)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-1.1576697027335805, -0.9127536865212236)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(xdata, ydata, 'kx')\n", + "x = np.arange(min(xdata) - 0.25, max(xdata) + 0.25, 0.05)\n", + "plt.plot(x, energy_surface.eval(x), 'r-')\n", + "plt.xlabel(r'distance, $\\AA$')\n", + "plt.ylabel('energy, Hartree')\n", + "dist = max(ydata) - min(ydata)\n", + "plt.ylim(min(ydata) - 0.1 * dist, max(ydata) + 0.1 * dist)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculation of the molecular Vibrational Energy levels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Born-Oppeheimer approximation removes internuclear vibrations from the molecular Hamiltonian and the energy computed from quantum mechanical ground-state energy calculations using this approximation contain only the electronic energy. Since even at absolute zero internuclear vibrations still occur, a correction is required to obtain the true zero-temperature energy of a molecule. This correction is called the zero-point vibrational energy (ZPE), which is computed by summing the contribution from internuclear vibrational modes. Therefore, the next step in computing thermodynamic observables is determining the vibrational energy levels. This can be done by constructing the Hessian matrix based on computed single point energies close to the equilibrium bond length. The eigenvalues of the Hessian matrix can then be used to determine the vibrational energy levels and the zero-point vibrational energy \t\n", + "\\begin{equation}\n", + "{\\rm ZPE} = \\frac{1}{2}\\, \\sum_i ^M \\nu_i \\, ,\n", + "\\end{equation}\n", + "with $\\nu_i$ being the vibrational frequencies, $M = 3N − 6$ or $M = 3N − 5$ for non-linear or linear molecules, respectively, and $N$ is number of the particles. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we fit a \"full\" energy surface using a 1D spline potential and use it to evaluate molecular vibrational energy levels.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "vibrational_structure = VibrationalStructure1DFD(mol, energy_surface)\n", + "\n", + "plt.plot(xdata, ydata, 'kx')\n", + "x = np.arange(min(xdata) - 0.25, max(xdata) + 0.25, 0.05)\n", + "plt.plot(x, energy_surface.eval(x), 'r-')\n", + "plt.xlabel(r'distance, $\\AA$')\n", + "plt.ylabel('energy, Hartree')\n", + "dist = max(ydata) - min(ydata)\n", + "plt.ylim(min(ydata) - 0.1 * dist, max(ydata) + 0.1 * dist)\n", + "for N in range(15):\n", + " on = np.ones(x.shape)\n", + " on *= (energy_surface.eval(energy_surface.get_equilibrium_geometry()) +\n", + " vibrational_structure.vibrational_energy_level(N))\n", + " plt.plot(x, on, 'g:')\n", + "on = np.ones(x.shape)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a partition function for the calculation of heat capacity\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The partition function for a molecule is the product of contributions from translational, rotational, vibrational, electronic, and nuclear degrees of freedom. Having the vibrational frequencies, now we can obtain the vibrational partition function $q_{\\rm vibration}$ to compute the whole molecular partition function \n", + "\\begin{equation}\n", + "q_{\\rm vibration} = \\prod_{i=1} ^M \\frac{\\exp\\,(-\\Theta_{\\nu_i}/2T)}{1-\\exp\\,(-\\Theta_{\\nu_i}/2T} \\, . \n", + "\\end{equation} \n", + "Here $\\Theta_{\\nu_i}= h\\nu_i/k_B$, $T$ is the temperature and $k_B$ is the Boltzmann constant. \n", + "\n", + "The single-point energy calculations and the resulting partition function can be used to calculate the (constant volume or constant pressure) heat capacity of the molecules. The constant volume heat capacity, for example, is given by \n", + "\n", + "\\begin{equation}\n", + "C_v = \\left.\\frac{\\partial U}{\\partial T}\\right|_{N,V}\\, ,\n", + "\\qquad\n", + "{\\rm with} \\quad\n", + "U=k_B T^2 \\left.\\frac{\\partial {\\rm ln} Q}{\\partial T}\\right|_{N,V} .\n", + "\\end{equation}\n", + "\n", + "$U$ is the internal energy, $V$ is the volume and $Q$ is the partition function. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we illustrate the simplest usage of the partition function, namely creating a Thermodynamics object to compute properties like the constant pressure heat capacity defined above. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "Q = DiatomicPartitionFunction(mol, energy_surface, vibrational_structure)\n", + "\n", + "P = 101350 # Pa\n", + "temps = np.arange(10, 1050, 5) # K\n", + "\n", + "mol.spins = [1/2,1/2]\n", + "\n", + "td = Thermodynamics(Q, pressure = 101350)\n", + "td.set_pressure(101350)\n", + "temps = np.arange(10, 1500, 5)\n", + "ymin = 5\n", + "ymax = 11\n", + "\n", + "plt.plot(temps,\n", + " td.constant_pressure_heat_capacity(temps) / const.CAL_TO_J)\n", + "plt.xlim(0, 1025)\n", + "plt.ylim(ymin, ymax)\n", + "plt.xlabel('Temperature, K')\n", + "plt.ylabel('Cp, cal mol$^{-1}$ K$^{-1}$')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we demonstrate how to access particular components (the rotational part) of the partition function, which in the H2 case we can further split to para-hydrogen and ortho-hydrogen components." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "eq = Q.get_partition(part=\"rot\", split=\"eq\")\n", + "para = Q.get_partition(part=\"rot\", split=\"para\")\n", + "ortho = Q.get_partition(part=\"rot\", split=\"ortho\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will now plot the constant volume heat capacity (of the rotational part) demonstrating how we can call directly the functions in the 'thermodynamics' module, providing a callable object for the partition function (or in this case its rotational component). Note that in the plot we normalize the plot dividing by the universal gas constant R (Avogadro's number times Boltzman's constant) and we use crossed to compare with experimental data found in literature." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# REFERENCE DATA from literature\n", + "df_brink_T = [80.913535,135.240157,176.633783,219.808499,246.226899]\n", + "df_brink_Cv = [0.118605,0.469925,0.711510,0.833597,0.895701]\n", + "\n", + "df_eucken_T = [25.120525, 30.162485, 36.048121, 41.920364, 56.195875, 62.484934, 72.148692, 73.805910, 73.804236, 92.214423,180.031917,230.300866]\n", + "df_eucken_Cv = [0.012287,0.012354,0.008448,0.020478,0.032620,0.048640,0.048768,0.076678,0.078670,0.170548,0.667731,0.847681]\n", + "\n", + "df_gia_T = [190.919338,195.951254,202.652107,204.292585,209.322828,225.300754,234.514217,243.747768]\n", + "df_gia_Cv = [0.711700,0.723719,0.749704,0.797535,0.811546,0.797814,0.833793,0.845868]\n", + "\n", + "df_parting_T = [80.101665, 86.358919,185.914204,239.927797]\n", + "df_parting_Cv = [0.084730,0.138598,0.667809,0.891634]\n", + "\n", + "df_ce_T = [80.669344,135.550569,145.464190,165.301153,182.144856,203.372528,237.993108,268.696642,294.095771,308.872014]\n", + "df_ce_Cv = [0.103048,0.467344,0.541364,0.647315,0.714078,0.798258,0.891147,0.944848,0.966618,0.985486]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "HeatCapacity = constant_volume_heat_capacity\n", + "\n", + "R = const.N_A * const.KB_J_PER_K\n", + "plt.plot(temps,\n", + " HeatCapacity(eq, temps) / R, '-k',\n", + " label='Cv_rot Equilibrium')\n", + "plt.plot(temps, HeatCapacity(para, temps) / R, '-b',\n", + " label='Cv_rot Para')\n", + "plt.plot(temps, HeatCapacity(ortho, temps) / R, '-r',\n", + " label='Cv_rot Ortho')\n", + "plt.plot(temps, 0.25 * HeatCapacity(para, temps) / R\n", + " + 0.75 * HeatCapacity(ortho, temps) / R, '-g',\n", + " label='Cv_rot 1:3 para:ortho')\n", + "plt.plot(df_brink_T, df_brink_Cv, '+g')\n", + "plt.plot(df_eucken_T, df_eucken_Cv, '+g')\n", + "plt.plot(df_gia_T, df_gia_Cv, '+g')\n", + "plt.plot(df_parting_T, df_parting_Cv, '+g')\n", + "plt.plot(df_ce_T, df_ce_Cv, '+g', label = 'experimental data')\n", + "plt.legend(loc='upper right', frameon=False)\n", + "plt.xlim(10, 400)\n", + "plt.ylim(-0.1, 2.8)\n", + "plt.xlabel('Temperature, K')\n", + "plt.ylabel('Cv (rotational)/R')\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.17.0.dev0+7dde867
Aer0.8.0
Ignis0.6.0.dev0+1537c75
Aqua0.9.0.dev0+f7e1440
IBM Q Provider0.12.0.dev0+8f3168b
System information
Python3.7.9 (default, Aug 31 2020, 07:22:35) \n", + "[Clang 10.0.0 ]
OSDarwin
CPUs2
Memory (Gb)12.0
Thu Apr 01 09:50:07 2021 EDT
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import qiskit.tools.jupyter\n", + "%qiskit_version_table\n", + "%qiskit_copyright" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/aux_files/CO2_freq_B3LYP_ccpVDZ.log b/docs/tutorials/aux_files/CO2_freq_B3LYP_ccpVDZ.log similarity index 100% rename from tutorials/aux_files/CO2_freq_B3LYP_ccpVDZ.log rename to docs/tutorials/aux_files/CO2_freq_B3LYP_ccpVDZ.log diff --git a/tutorials/aux_files/H2_es.png b/docs/tutorials/aux_files/H2_es.png similarity index 100% rename from tutorials/aux_files/H2_es.png rename to docs/tutorials/aux_files/H2_es.png diff --git a/tutorials/aux_files/H2_gs.png b/docs/tutorials/aux_files/H2_gs.png similarity index 100% rename from tutorials/aux_files/H2_gs.png rename to docs/tutorials/aux_files/H2_gs.png diff --git a/tutorials/aux_files/jw_mapping.png b/docs/tutorials/aux_files/jw_mapping.png similarity index 100% rename from tutorials/aux_files/jw_mapping.png rename to docs/tutorials/aux_files/jw_mapping.png diff --git a/tutorials/aux_files/vqe.png b/docs/tutorials/aux_files/vqe.png similarity index 100% rename from tutorials/aux_files/vqe.png rename to docs/tutorials/aux_files/vqe.png diff --git a/tutorials/index.rst b/docs/tutorials/index.rst similarity index 62% rename from tutorials/index.rst rename to docs/tutorials/index.rst index 2474ed56ea..8ec7dcf857 100644 --- a/tutorials/index.rst +++ b/docs/tutorials/index.rst @@ -1,6 +1,6 @@ -################ -Nature Tutorials -################ +####################### +Qiskit Nature Tutorials +####################### .. nbgallery:: @@ -13,3 +13,4 @@ Nature Tutorials :ref:`genindex` :ref:`modindex` :ref:`search` + diff --git a/tutorials/thermodynamics_utils/partition_function.py b/docs/tutorials/thermodynamics_utils/partition_function.py similarity index 99% rename from tutorials/thermodynamics_utils/partition_function.py rename to docs/tutorials/thermodynamics_utils/partition_function.py index 2fa781e8b8..c56d113bd4 100644 --- a/tutorials/thermodynamics_utils/partition_function.py +++ b/docs/tutorials/thermodynamics_utils/partition_function.py @@ -19,7 +19,7 @@ from abc import ABC, abstractmethod import numpy as np -import qiskit.chemistry.constants as const +import qiskit_nature.constants as const class PartitionFunctionBase(ABC): diff --git a/tutorials/thermodynamics_utils/thermodynamics.py b/docs/tutorials/thermodynamics_utils/thermodynamics.py similarity index 99% rename from tutorials/thermodynamics_utils/thermodynamics.py rename to docs/tutorials/thermodynamics_utils/thermodynamics.py index 35d757df7d..33c5d050b0 100644 --- a/tutorials/thermodynamics_utils/thermodynamics.py +++ b/docs/tutorials/thermodynamics_utils/thermodynamics.py @@ -18,7 +18,7 @@ from functools import partial import numpy as np -import qiskit.chemistry.constants as const +import qiskit_nature.constants as const from thermodynamics_utils.partition_function import PartitionFunctionBase diff --git a/tutorials/thermodynamics_utils/vibronic_structure_fd.py b/docs/tutorials/thermodynamics_utils/vibrational_structure_fd.py similarity index 97% rename from tutorials/thermodynamics_utils/vibronic_structure_fd.py rename to docs/tutorials/thermodynamics_utils/vibrational_structure_fd.py index 74bcf61022..5724ad28ed 100644 --- a/tutorials/thermodynamics_utils/vibronic_structure_fd.py +++ b/docs/tutorials/thermodynamics_utils/vibrational_structure_fd.py @@ -18,8 +18,8 @@ import numpy as np from scipy.linalg import eigh_tridiagonal, eigvalsh_tridiagonal -import qiskit.chemistry.constants as const -from qiskit.chemistry.algorithms.pes_samplers.potentials.potential_base import VibrationalStructureBase +import qiskit_nature.constants as const +from qiskit_nature.algorithms.pes_samplers.potentials.potential_base import VibrationalStructureBase class VibrationalStructure1DFD(VibrationalStructureBase): diff --git a/qiskit_nature/drivers/pyscfd/integrals.py b/qiskit_nature/drivers/pyscfd/integrals.py index e75d3963c7..38ef45d4b8 100644 --- a/qiskit_nature/drivers/pyscfd/integrals.py +++ b/qiskit_nature/drivers/pyscfd/integrals.py @@ -15,7 +15,7 @@ import logging import tempfile import os - +import warnings import numpy as np from qiskit_nature import QiskitNatureError @@ -29,6 +29,7 @@ from pyscf.lib import param from pyscf.lib import logger as pylogger from pyscf.tools import dump_mat + warnings.filterwarnings('ignore', category=DeprecationWarning, module='pyscf') except ImportError: logger.info("PySCF is not installed. See https://sunqm.github.io/pyscf/install.html") diff --git a/tutorials/02_vibronic_structure.ipynb b/tutorials/02_vibronic_structure.ipynb deleted file mode 100644 index 2827739cbc..0000000000 --- a/tutorials/02_vibronic_structure.ipynb +++ /dev/null @@ -1,442 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Vibrational structure" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction \n", - "\n", - "The molecular Hamiltonian is \n", - "\n", - "$$\n", - "\\mathcal{H} = - \\sum_I \\frac{\\nabla_{R_I}^2}{M_I} - \\sum_i \\frac{\\nabla_{r_i}^2}{m_e} - \\sum_I\\sum_i \\frac{Z_I e^2}{|R_I-r_i|} + \\sum_i \\sum_{j>i} \\frac{e^2}{|r_i-r_j|} + \\sum_I\\sum_{J>I} \\frac{Z_I Z_J e^2}{|R_I-R_J|}\n", - "$$\n", - "\n", - "Because the nuclei are much heavier than the electrons they do not move on the same time scale and therefore, the behavior of nuclei and electronc can be decoupled. This is the Born-Oppenheimer approximation.\n", - "\n", - "Within the Born-Oppenheimer approximation, a molecular wave function is factorized as a product of an electronic part, which is the solution of the electronic Schroedinger equation, and a vibro-rotational one, which is the solution of the nuclear Schroedinger equation in the potential energy surface (PES) generated by sampling the eigenvalues of the electronic Schroedinger equation for different geometries.\n", - "\n", - "The nuclear Schroedinger equation is usually solved in two steps, in analogy with its electronic counterpart. \n", - "A single-particle basis (the basis functions are called, in this case, modals) is obtained either by the harmonic approximation applied to the PES or from a vibrational self-consistent field (VSCF) calculation. \n", - "Vibrational anharmonic correlations are added a-posteriori with perturbative or variational approaches.\n", - "The latter include Vibrational Configuration Interaction (VCI) and Vibrational Coupled Cluster (VCC) for highly-accurate anharmonic energies. \n", - "The main advantage of VCI and VCC over alternative approaches (such as perturnation theories) is that their accuracy can be systematically improved towards the complete basis set limit for a given PES. \n", - "However, their applicability is limited to small molecules with up to about 10 atoms due to their unfavorable scaling with system size.\n", - "\n", - "To tackle the scaling problem we would like to use quantum algorithms.\n", - "\n", - "The nuclear Schroedinger equation is\n", - "$$\n", - "\\mathcal{H}_{\\text{vib}} |\\Psi_{n}\\rangle = E_{n} |\\Psi_{n}\\rangle\n", - "$$\n", - "\n", - "The so-called Watson Hamiltonian (neglecting vibro-rotational coupling terms) is\n", - "$$\n", - " \\mathcal{H}_\\text{vib}(Q_1, \\ldots, Q_L) \n", - " = - \\frac{1}{2} \\sum_{l=1}^{L} \\frac{\\partial^2}{\\partial Q_l^2} + V(Q_1, \\ldots, Q_L)\n", - "$$\n", - "where $Q_l$ are the harmonic mass-weighted normal coordinates.\n", - "\n", - "$\\mathcal{H}_\\text{vib}$ must be mapped to an operator that acts on the states of a given set of $N_q$ qubits in order to calculate its eigenfunctions on quantum hardware.\n", - "In electronic structure calculations, the mapping is achieved by expressing the non-relativistic electronic Hamiltonian in second quantization, \\textit{i.e.} by projecting it onto the complete set of antisymmetrized occupation number vectors (ONV) generated by a given (finite) set of orbitals.\n", - "To encode the vibrational Hamiltonian in an analogous second quantization operators, we expand the potential $V(Q_1, \\ldots, Q_L)$ with the $n$-body expansion as follows:\n", - "\n", - "$$\n", - " V(Q_1, \\ldots, Q_L) = V_0 + \\sum_{l=1}^L V^{[l]}(Q_l) \n", - " + \\sum_{lVersion Information
Qiskit SoftwareVersion
Qiskit0.23.0
Terra0.16.0
Aer0.7.0
Ignis0.5.0
Aqua0.8.0
IBM Q Provider0.11.0
System information
Python3.7.4 (default, Aug 13 2019, 15:17:50) \n", - "[Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs6
Memory (Gb)16.0
Wed Oct 21 12:22:51 2020 CEST
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import qiskit.tools.jupyter\n", - "%qiskit_version_table\n", - "%qiskit_copyright" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.6.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/05_Sampling_potential_energy_surfaces.ipynb b/tutorials/05_Sampling_potential_energy_surfaces.ipynb deleted file mode 100644 index 6c2170209f..0000000000 --- a/tutorials/05_Sampling_potential_energy_surfaces.ipynb +++ /dev/null @@ -1,541 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sampling the potential energy surface " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction \n", - "\n", - "This interactive notebook demonstrates how to utilize the Potential Energy Surface (PES) samplers algorithm of qiskit chemistry to generate the dissociation profile of a molecule. We use the Born-Oppenhemier Potential Energy Surface (BOPES)and demonstrate how to exploit bootstrapping and extrapolation to reduce the total number of function evaluations in computing the PES using the Variational Quantum Eigensolver (VQE). \n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# import common packages\n", - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "from functools import partial\n", - "\n", - "# qiskit\n", - "from qiskit.aqua import QuantumInstance\n", - "from qiskit import BasicAer\n", - "from qiskit.aqua.algorithms import NumPyMinimumEigensolver, VQE, IQPE\n", - "from qiskit.aqua.components.optimizers import SLSQP\n", - "from qiskit.circuit.library import ExcitationPreserving\n", - "from qiskit import BasicAer\n", - "from qiskit.aqua.algorithms import NumPyMinimumEigensolver, VQE\n", - "from qiskit.aqua.components.optimizers import SLSQP\n", - "\n", - "# chemistry components\n", - "from qiskit.chemistry.components.initial_states import HartreeFock\n", - "from qiskit.chemistry.components.variational_forms import UCCSD\n", - "from qiskit.chemistry.drivers import PySCFDriver, UnitsType\n", - "from qiskit.chemistry.core import Hamiltonian, TransformationType, QubitMappingType\n", - "from qiskit.aqua.algorithms import VQAlgorithm, VQE, MinimumEigensolver\n", - "from qiskit.chemistry.transformations import FermionicTransformation\n", - "from qiskit.chemistry.drivers import PySCFDriver\n", - "from qiskit.chemistry.algorithms.ground_state_solvers import GroundStateEigensolver\n", - "from qiskit.chemistry.algorithms.pes_samplers.bopes_sampler import BOPESSampler\n", - "from qiskit.chemistry.drivers.molecule import Molecule\n", - "from qiskit.chemistry.algorithms.pes_samplers.extrapolator import *\n", - "\n", - "import warnings\n", - "warnings.simplefilter('ignore', np.RankWarning)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here, we use the H2 molecule as a model system for testing." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "ft = FermionicTransformation()\n", - "driver = PySCFDriver()\n", - "solver = VQE(quantum_instance=\n", - " QuantumInstance(backend=BasicAer.get_backend('statevector_simulator')))\n", - "me_gsc = GroundStateEigensolver(ft, solver)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "stretch1 = partial(Molecule.absolute_stretching, atom_pair=(1, 0))\n", - "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", - " ('H', [0., 0., 0.3])],\n", - " degrees_of_freedom=[stretch1],\n", - " )\n", - "\n", - "# pass molecule to PSYCF driver\n", - "driver = PySCFDriver(molecule=mol)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.3])]\n" - ] - } - ], - "source": [ - "print(mol.geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Make a perturbation to the molecule along the absolute_stretching dof" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.5])]\n", - "[('H', [0.0, 0.0, 0.0]), ('H', [0.0, 0.0, 0.8999999999999999])]\n" - ] - } - ], - "source": [ - "mol.perturbations = [0.2]\n", - "print(mol.geometry)\n", - "\n", - "mol.perturbations = [0.6]\n", - "print(mol.geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Calculate bond dissociation profile using BOPES Sampler\n", - "\n", - "Here, we pass the molecular information and the VQE to a built-in type called the BOPES Sampler. The BOPES Sampler allows the computation of the potential energy surface for a specified set of degrees of freedom/points of interest." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## First we compare no bootstrapping vs bootstrapping \n", - "\n", - "Bootstrapping the BOPES sampler involves utilizing the optimal variational parameters for a given degree of freedom, say r (ex. interatomic distance) as the initial point for VQE at a later degree of freedom, say r + $\\epsilon$. By default, if boostrapping is set to True, all previous optimal parameters are used as initial points for the next runs." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "distance1 = partial(Molecule.absolute_distance, atom_pair=(1, 0))\n", - "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", - " ('H', [0., 0., 0.3])],\n", - " degrees_of_freedom=[distance1],\n", - " )\n", - "\n", - "# pass molecule to PSYCF driver\n", - "driver = PySCFDriver(molecule=mol)\n", - "\n", - "# Specify degree of freedom (points of interest)\n", - "points = np.linspace(0.25, 2, 30)\n", - "results_full = {} # full dictionary of results for each condition\n", - "results = {} # dictionary of (point,energy) results for each condition\n", - "conditions = {False: 'no bootstrapping', True: 'bootstrapping'}\n", - "\n", - "\n", - "for value, bootstrap in conditions.items():\n", - " # define instance to sampler\n", - " bs = BOPESSampler(\n", - " gss=me_gsc\n", - " ,bootstrap=value\n", - " ,num_bootstrap=None\n", - " ,extrapolator=None)\n", - " # execute\n", - " res = bs.sample(driver,points)\n", - " results_full[f'{bootstrap}'] = res.raw_results\n", - " results[f'points_{bootstrap}'] = res.points\n", - " results[f'energies_{bootstrap}'] = res.energies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compare to classical eigensolver\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# define numpy solver\n", - "solver_numpy = NumPyMinimumEigensolver()\n", - "me_gsc_numpy = GroundStateEigensolver(ft, solver_numpy)\n", - "bs_classical = BOPESSampler(\n", - " gss=me_gsc_numpy\n", - " ,bootstrap=False\n", - " ,num_bootstrap=None\n", - " ,extrapolator=None)\n", - "# execute\n", - "res_np = bs_classical.sample(driver, points)\n", - "results_full['np'] = res_np.raw_results\n", - "results['points_np'] = res_np.points\n", - "results['energies_np'] = res_np.energies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot results" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'Energy')" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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RSl1FqZPn85777131stZs2YN8+bV/X2Qm5vLm2++edbrCsbzzz/P66/b80NWC4UlMaEXHTxeCisO2B1FKdUEnG2hcLvdDZpn5syZ3HjjjQ26zGBpofCT4HZyyHvE7hhKtWq5ubn079+fW265hYEDB3LxxRdz/PhxwPflPWrUKAYPHsyUKVM4dOhQwGUsWLCAzMxMUlNT+fTTTwFfI/1NN91Eeno6Q4cOZdGiRbWOr6io4P777+ftt98mIyODt99+m6+++oqMjAwyMjIYOnQopaWl3HvvvXz99ddkZGTw+OOPM3v2bC6//HIuvPBCJkyYwNGjR5kwYQLDhg0jPT2djz76qPo9pqWlccMNN9C/f3+uvvpqysrKAF83RL/97W9JT09n5MiRbN/uuyfVH/7wBx599FEAxo0bxz333MPIkSNJTU3l66+/BqCsrIxrr72WAQMGMGXKFM4555wG6dJIT4/1E2vastd51O4YSjUZD3yygY35DfvjaUBiB/530sA659m2bRtz5szhxRdf5Nprr+X9999n6tSp3HjjjTz11FNccMEF3H///TzwwAM88cQTp7w+NzeXFStWsGPHDsaPH8/27dt55plnEBHWr1/P5s2bufjii9m6dWut4//4xz+SlZXF008/DcCkSZN45plnGDNmDEePHiUyMpIHH3yQRx99tLoYzZ49m1WrVrFu3TpiY2Nxu93MnTuXDh06UFhYyKhRo7j88ssB2LJlCy+//DJjxoxhxowZPPvss9x9t+/OudHR0axfv57XX3+dWbNmVS/fn9vtZsWKFcybN48HHniABQsW8OyzzxITE8PGjRvJzs4mIyPjLP5SP9A9Cj+xrhgKXFBRccLuKEq1asnJydVfcsOHDyc3N5fDhw9TUlLCBRdcAMC0adNYsmRJwNdfe+21OBwOUlJS6N27N5s3b2bp0qVMnToVgLS0NHr16sXWrVtrHV/TmDFj+PWvf82TTz5JSUkJLlfg39kXXXQRsbGxgO+6hf/5n/9h8ODBTJw4kb1793LggO/wdo8ePRgzZgwAU6dOZenSpdXLuP7666v/Xb58ecD1XHnllSdtH4ClS5dy3XXXATBo0CAGDx4c8LVnSvco/HRq053Kyjw271rN4JRRdsdRynan++UfKhEREdXDTqez+tBTsGqeAtoQp/vee++9/OQnP2HevHmMGTOGL774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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure()\n", - "for value, bootstrap in conditions.items():\n", - " plt.plot(results[f'points_{bootstrap}'], results[f'energies_{bootstrap}'], label = f'{bootstrap}')\n", - "plt.plot(results['points_np'], results['energies_np'], label = 'numpy')\n", - "plt.legend()\n", - "plt.title('Dissociation profile')\n", - "plt.xlabel('Interatomic distance')\n", - "plt.ylabel('Energy')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compare number of evaluations" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "no bootstrapping\n", - "Total evaluations for no bootstrapping:\n", - "2931\n", - "bootstrapping\n", - "Total evaluations for bootstrapping:\n", - "991\n", - "np\n", - "Total evaluations for np:\n", - "0\n" - ] - } - ], - "source": [ - "for condition, result_full in results_full.items():\n", - " print(condition)\n", - " print('Total evaluations for ' + condition + ':')\n", - " sum = 0\n", - " for key in result_full:\n", - " if condition is not 'np':\n", - " sum += result_full[key]['raw_result']['cost_function_evals']\n", - " else:\n", - " sum = 0\n", - " print(sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Extrapolation \n", - "\n", - "Here, an extrapolator added that will try to fit each (param,point) set to some specified function and suggest an initial parameter set for the next point (degree of freedom). \n", - "\n", - "- Extrapolator is based on an external extrapolator that sets the 'window', that is, the number of previous points to use for extrapolation, while the internal extrapolator proceeds with the actual extrapolation.\n", - "- In practice, the user sets the window by specifying an integer value to num_bootstrap - which is also the number of previous points to use for bootstrapping. Additionally, the external extrapolator defines the space within how to extrapolate - here PCA, clustering and the standard window approach. \n", - "\n", - "In practice, if no extrapolator is defined and bootstrapping is True, then all previous points will be bootstrapped. If an extrapolator list is defined and no points are specified for bootstrapping, then the extrapolation will be done based on all previous points." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1. Window Extrapolator: An extrapolator which wraps another extrapolator, limiting the internal extrapolator's ground truth parameter set to a fixed window size\n", - "2. PCA Extrapolator: A wrapper extrapolator which reduces the points' dimensionality with PCA, performs extrapolation in the transformed pca space, and untransforms the results before returning.\n", - "3. Sieve Extrapolator: A wrapper extrapolator which performs an extrapolation, then clusters the extrapolated parameter values into two large and small clusters, and sets the small clusters' parameters to zero.\n", - "4. Polynomial Extrapolator: An extrapolator based on fitting each parameter to a polynomial function of a user-specified degree.\n", - "5. Differential Extrapolator: An extrapolator based on treating each param set as a point in space, and performing regression to predict the param set for the next point. A user-specified degree also adds derivatives to the values in the point vectors which serve as features in the training data for the linear regression." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Here we test two different extrapolation techniques" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# define different extrapolators\n", - "degree = 1\n", - "extrap_poly = Extrapolator.factory(\"poly\", degree = degree)\n", - "extrap_diff = Extrapolator.factory(\"diff_model\", degree = degree)\n", - "extrapolators = {'poly': extrap_poly, 'diff_model': extrap_diff}\n", - "\n", - "for key in extrapolators:\n", - " extrap_internal = extrapolators[key]\n", - " extrap = Extrapolator.factory(\"window\", extrapolator = extrap_internal)\n", - " # define extrapolator\n", - " # BOPES sampler\n", - " bs_extr = BOPESSampler(\n", - " gss=me_gsc\n", - " ,bootstrap=True\n", - " ,num_bootstrap=None\n", - " ,extrapolator=extrap)\n", - " # execute\n", - " res = bs_extr.sample(driver, points)\n", - " \n", - " results_full[f'{key}']= res.raw_results\n", - " results[f'points_{key}'] = res.points\n", - " results[f'energies_{key}'] = res.energies\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot results" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "poly\n", - "diff_model\n" - ] - }, - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'Energy')" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure()\n", - "for value, bootstrap in conditions.items():\n", - " plt.plot(results[f'points_{bootstrap}'], results[f'energies_{bootstrap}'], label = f'{bootstrap}')\n", - "plt.plot(results['points_np'], results['energies_np'], label = 'numpy')\n", - "for condition in extrapolators.keys():\n", - " print(condition)\n", - " plt.plot(results[f'points_{condition}'], results[f'energies_{condition}'], label = condition)\n", - "plt.legend()\n", - "plt.title('Dissociation profile')\n", - "plt.xlabel('Interatomic distance')\n", - "plt.ylabel('Energy')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compare number of evaluations" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "no bootstrapping\n", - "Total evaluations for no bootstrapping:\n", - "2931\n", - "bootstrapping\n", - "Total evaluations for bootstrapping:\n", - "991\n", - "np\n", - "Total evaluations for np:\n", - "0\n", - "poly\n", - "Total evaluations for poly:\n", - "563\n", - "diff_model\n", - "Total evaluations for diff_model:\n", - "1089\n" - ] - } - ], - "source": [ - "for condition, result_full in results_full.items():\n", - " print(condition)\n", - " print('Total evaluations for ' + condition + ':')\n", - " sum = 0\n", - " for key in results_full[condition].keys():\n", - " if condition is not 'np':\n", - " sum += results_full[condition][key]['raw_result']['cost_function_evals']\n", - " else:\n", - " sum = 0\n", - " print(sum)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

Version Information

Qiskit SoftwareVersion
Qiskit0.23.6
Terra0.16.4
Aer0.7.5
Ignis0.5.2
Aqua0.8.2
IBM Q Provider0.11.1
System information
Python3.8.6 | packaged by conda-forge | (default, Jan 25 2021, 23:21:18) \n", - "[GCC 9.3.0]
OSLinux
CPUs8
Memory (Gb)31.409000396728516
Tue Feb 23 18:07:35 2021 UTC
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import qiskit.tools.jupyter\n", - "%qiskit_version_table\n", - "%qiskit_copyright" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/06_calculating_thermodynamic_observables.ipynb b/tutorials/06_calculating_thermodynamic_observables.ipynb deleted file mode 100644 index 6a9dc62da6..0000000000 --- a/tutorials/06_calculating_thermodynamic_observables.ipynb +++ /dev/null @@ -1,518 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Calculating Thermodynamics Observables with a quantum computer" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# imports\n", - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "from functools import partial\n", - "\n", - "from qiskit.aqua import QuantumInstance\n", - "from qiskit import BasicAer\n", - "from qiskit.aqua.algorithms import NumPyMinimumEigensolver, VQE, IQPE\n", - "from qiskit.aqua.components.optimizers import SLSQP\n", - "from qiskit.chemistry.components.initial_states import HartreeFock\n", - "from qiskit.circuit.library import ExcitationPreserving\n", - "\n", - "from qiskit.circuit.library import ExcitationPreserving\n", - "\n", - "from qiskit import BasicAer\n", - "from qiskit.aqua.algorithms import NumPyMinimumEigensolver, VQE\n", - "from qiskit.aqua.components.optimizers import SLSQP\n", - "from qiskit.chemistry.components.initial_states import HartreeFock\n", - "from qiskit.chemistry.components.variational_forms import UCCSD\n", - "from qiskit.chemistry.drivers import PySCFDriver, UnitsType\n", - "from qiskit.chemistry.core import TransformationType, QubitMappingType\n", - "from qiskit.aqua.algorithms import VQAlgorithm, VQE, MinimumEigensolver\n", - "from qiskit.chemistry.transformations import FermionicTransformation\n", - "from qiskit.chemistry.drivers import PySCFDriver\n", - "from qiskit.chemistry.algorithms.ground_state_solvers import GroundStateEigensolver\n", - "from qiskit.chemistry.algorithms.pes_samplers.extrapolator import *\n", - "from qiskit.chemistry.algorithms.pes_samplers.bopes_sampler import BOPESSampler\n", - "from qiskit.chemistry.drivers.molecule import Molecule\n", - "import qiskit.chemistry.constants as const\n", - "from qiskit.chemistry.algorithms.pes_samplers.potentials.energy_surface_spline import EnergySurface1DSpline\n", - "from thermodynamics_utils.thermodynamics import constant_volume_heat_capacity\n", - "from thermodynamics_utils.vibrational_structure_fd import VibrationalStructure1DFD\n", - "from thermodynamics_utils.partition_function import DiatomicPartitionFunction\n", - "from thermodynamics_utils.thermodynamics import Thermodynamics\n", - "\n", - "import warnings\n", - "warnings.simplefilter('ignore', np.RankWarning)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A preliminary draft with more information related to this tutorial can be foung in preprint: Stober et al, arXiv 2003.02303 (2020)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculation of the Born Openheimer Potenitial Energy Surface (BOPES) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To compute thermodynamic observables we begin with single point energy calculation which calculates the wavefunction and charge density and therefore the energy of a particular arrangement of nuclei. Here we compute the Born-Oppenheimer potential energy surface of a hydrogen molecule, as an example, which is simply the electronic energy as a function of bond length. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "ft = FermionicTransformation()\n", - "driver = PySCFDriver()\n", - "solver = VQE(quantum_instance=\n", - " QuantumInstance(backend=BasicAer.get_backend('statevector_simulator')))\n", - "me_gss = GroundStateEigensolver(ft, solver)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "stretch1 = partial(Molecule.absolute_distance, atom_pair=(1, 0))\n", - "mol = Molecule(geometry=[('H', [0., 0., 0.]),\n", - " ('H', [0., 0., 0.2])],\n", - " degrees_of_freedom=[stretch1],\n", - " masses=[1.6735328E-27, 1.6735328E-27]\n", - " )\n", - "\n", - "\n", - "# pass molecule to PSYCF driver\n", - "driver = PySCFDriver(molecule=mol)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# BOPES sampler testing\n", - "bs = BOPESSampler(gss=me_gss, \n", - " bootstrap=True)\n", - "points = np.linspace(0.45, 5, 50)\n", - "res = bs.sample(driver,points)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "energies = []\n", - "bs_res_full = res.raw_results\n", - "for point in points:\n", - " energy = bs_res_full[point]['computed_energies'][0] + bs_res_full[point]['nuclear_repulsion_energy']\n", - " energies.append(energy)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'Energy')" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure()\n", - "plt.plot(points,energies)\n", - "plt.title('Dissociation profile')\n", - "plt.xlabel('Interatomic distance')\n", - "plt.ylabel('Energy')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "energy_surface = EnergySurface1DSpline()\n", - "\n", - "xdata = res.points\n", - "ydata = res.energies\n", - "energy_surface.fit(xdata=xdata, ydata=ydata)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-1.1576826065021262, -0.9127521770514491)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(xdata, ydata, 'kx')\n", - "x = np.arange(min(xdata) - 0.25, max(xdata) + 0.25, 0.05)\n", - "plt.plot(x, energy_surface.eval(x), 'r-')\n", - "plt.xlabel(r'distance, $\\AA$')\n", - "plt.ylabel('energy, Hartree')\n", - "dist = max(ydata) - min(ydata)\n", - "plt.ylim(min(ydata) - 0.1 * dist, max(ydata) + 0.1 * dist)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculation of the molecular Vibrational Energy levels" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Born-Oppeheimer approximation removes internuclear vibrations from the molecular Hamiltonian and the energy computed from quantum mechanical ground-state energy calculations using this approximation contain only the electronic energy. Since even at absolute zero internuclear vibrations still occur, a correction is required to obtain the true zero-temperature energy of a molecule. This correction is called the zero-point vibrational energy (ZPE), which is computed by summing the contribution from internuclear vibrational modes. Therefore, the next step in computing thermodynamic observables is determining the vibrational energy levels. This can be done by constructing the Hessian matrix based on computed single point energies close to the equilibrium bond length. The eigenvalues of the Hessian matrix can then be used to determine the vibrational energy levels and the zero-point vibrational energy \t\n", - "\\begin{equation}\n", - "{\\rm ZPE} = \\frac{1}{2}\\, \\sum_i ^M \\nu_i \\, ,\n", - "\\end{equation}\n", - "with $\\nu_i$ being the vibrational frequencies, $M = 3N − 6$ or $M = 3N − 5$ for non-linear or linear molecules, respectively, and $N$ is number of the particles. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we fit a \"full\" energy surface using a 1D spline potential and use it to evaluate molecular vibrational energy levels.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "vibrational_structure = VibrationalStructure1DFD(mol, energy_surface)\n", - "\n", - "plt.plot(xdata, ydata, 'kx')\n", - "x = np.arange(min(xdata) - 0.25, max(xdata) + 0.25, 0.05)\n", - "plt.plot(x, energy_surface.eval(x), 'r-')\n", - "plt.xlabel(r'distance, $\\AA$')\n", - "plt.ylabel('energy, Hartree')\n", - "dist = max(ydata) - min(ydata)\n", - "plt.ylim(min(ydata) - 0.1 * dist, max(ydata) + 0.1 * dist)\n", - "for N in range(15):\n", - " on = np.ones(x.shape)\n", - " on *= (energy_surface.eval(energy_surface.get_equilibrium_geometry()) +\n", - " vibrational_structure.vibrational_energy_level(N))\n", - " plt.plot(x, on, 'g:')\n", - "on = np.ones(x.shape)\n", - "\n", - "plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a partition function for the calculation of heat capacity\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The partition function for a molecule is the product of contributions from translational, rotational, vibrational, electronic, and nuclear degrees of freedom. Having the vibrational frequencies, now we can obtain the vibrational partition function $q_{\\rm vibration}$ to compute the whole molecular partition function \n", - "\\begin{equation}\n", - "q_{\\rm vibration} = \\prod_{i=1} ^M \\frac{\\exp\\,(-\\Theta_{\\nu_i}/2T)}{1-\\exp\\,(-\\Theta_{\\nu_i}/2T} \\, . \n", - "\\end{equation} \n", - "Here $\\Theta_{\\nu_i}= h\\nu_i/k_B$, $T$ is the temperature and $k_B$ is the Boltzmann constant. \n", - "\n", - "The single-point energy calculations and the resulting partition function can be used to calculate the (constant volume or constant pressure) heat capacity of the molecules. The constant volume heat capacity, for example, is given by \n", - "\n", - "\\begin{equation}\n", - "C_v = \\left.\\frac{\\partial U}{\\partial T}\\right|_{N,V}\\, ,\n", - "\\qquad\n", - "{\\rm with} \\quad\n", - "U=k_B T^2 \\left.\\frac{\\partial {\\rm ln} Q}{\\partial T}\\right|_{N,V} .\n", - "\\end{equation}\n", - "\n", - "$U$ is the internal energy, $V$ is the volume and $Q$ is the partition function. \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we illustrate the simplest usage of the partition function, namely creating a Thermodynamics object to compute properties like the constant pressure heat capacity defined above. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEKCAYAAADn+anLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAjiUlEQVR4nO3deZQc5Xnv8e/T07NoFm2j0S6hDSRhFgHD6tiAAYd4tw92IBvBi+zEONg39ybmOPfazonPse91vHEcEmLjJcbYMTYxwTEYCBhjgxIJZLSyCK1IQtJom0XTPd393D+qetQaTUvdM9XTPd2/zzl9uraperqmp55537fqfc3dERERGU6s3AGIiEjlUpIQEZG8lCRERCQvJQkREclLSUJERPJSkhARkbzGPEmY2d1mts/M1ucse6+ZbTCzjJl1jnVMIiIyvHKUJL4NXD9k2XrgPcCTYx6NiIjkFR/rA7r7k2a2YMiyTQBmNtbhiIjIKYx5khgtM1sJrARoaWm5aNmyZWWOSERkfFmzZs0Bd+8oZNtxlyTc/S7gLoDOzk5fvXp1mSMSERlfzGx7odvq7iYREclLSUJERPIqxy2w9wJPA0vNbJeZfcDM3m1mu4DLgZ+Z2cNjHZeIiJysHHc33ZRn1f1jGoiIiJyWqptERCQvJQkREclLSUJERPJSkhARkbyUJEREJC8lCRERyUtJQkRE8lKSEBGRvJQkREQkLyUJERHJS0lCRETyUpIQEZG8lCRERCQvJQkREclLSUJERPJSkhARkbyUJEREJC8lCRERyUtJQkRE8lKSEBGRvJQkREQkLyUJERHJS0lCRETyUpIQEZG8lCRERCQvJQkREclLSUJERPIa8yRhZneb2T4zW5+zbKqZPWJmL4XvU8Y6LhEROVk5ShLfBq4fsuyTwGPufibwWDgvIiJlNuZJwt2fBA4OWfxO4Dvh9HeAd41lTCIiMrxKaZOY4e57wum9wIxyBiMiIoFKSRKD3N0Bz7fezFaa2WozW71///4xjExEpPZUSpJ4zcxmAYTv+/Jt6O53uXunu3d2dHSMWYAiIrWoUpLEA8DN4fTNwE/LGIuIiITKcQvsvcDTwFIz22VmHwA+D1xnZi8B14bzIiJSZvGxPqC735Rn1TVjGoiIiJxWpVQ3iYhIBVKSEBGRvJQkREQkLyUJERHJS0lCRETyUpIQEZG8lCRERCQvJQkREclLSUJERPJSkhARkbyUJEREJC8lCRERyUtJQkRE8lKSEBGRvJQkREQkLyUJERHJS0lCRETyUpIQEZG8lCRERCQvJQkREclLSUJERPJSkhARkbyUJEREJC8lCRERyUtJQkRE8lKSEBGRvIpOEmb216UIREREKk/8dBuY2b/mzgIrgC+UKqCxsm7XEV472s+1Z88odygiIhWrkJLEUXd/X/h6L/BoqYIxs9vMbL2ZbTCzj5fqOAB/97ONfOhfVvPzdXtKeRgRkXGtkCTxuSHznypFIGZ2DvAh4BLgfOBtZrakFMcaSGf47a7DGPDxH65l/atHSnEYEZFx77RJwt23ApjZtHD+YIliWQ6scvc+d08BvwTeU4oDbdpzlP6BDJ99x+uImXHfml2lOIyIyLhXTMP13SWLIrAeeIOZtZtZM/AWYN7QjcxspZmtNrPV+/fvH9GB1mw/BMC1Z8/g3LmTWLvz8MijFhGpYsUkCStZFIC7byJoEP8F8BCwFkgPs91d7t7p7p0dHR0jOtaa7YeYPamJWZMmcMG8yWzcfZRE6qRDiYjUvGKShJcsiuwB3L/p7he5+xuBQ8CLpTjOs9sPceEZUwBYMW8yyXSGTXu6S3EoEZFxrWJKEgBmNj18n0/QHvH9qI+x+/Axdh/p56IwSZw/bzIAa3ccivpQIiLj3mmfk8hxe8miOO7HZtYODAAfdffDUR9gw+6jwPHkMGtSE9PbGtUuISIyjIKShJnNc/f1eda9zd0fjCIYd39DFPs5lf3dCSBIDgBmxop5k5UkRESGUWh10yNmtmDoQjN7P/DVSCMqsa6eIEm0tzQOLlsxfzLbuvo43JcsV1giIhWp0CTxP4BfmNmZ2QVmdjvwCeDKUgRWKl29SSY2xWmIH//oy2a2AbBlf0+5whIRqUgFVTe5+3+YWQL4uZm9C/ggwZPRb3T3cdXiu78nwbTWxhOWLe5oBWDLvl4uOmNqOcISEalIBd/d5O6PAbcATwCLgDeNtwQBQXXT0CQxd0ozDXUxlSRERIYotOG6m+A5CQMagWuAfWZmgLv7xNKFGK2uniRLpreesKwuZiyc1qIkISIyRKHVTW2lDmSsHOhJcOmik6uUFk9v0QN1IiJD1NTIdKl0hkN9Ayfc2ZS1aForOw72kUxlyhCZiEhlqqkkcTC8xXVa28lJYvH0FtIZZ8fB3rEOS0SkYtVUkjjQHSaJloaT1mXvcHp5n5KEiEhWTSWJrt7wQbrWYaqbsrfBqvFaRGRQ0UnCzP66FIGMha6esCTRenJJorUxzsyJTUoSIiI5Tnt3k5n9a+4ssIJg3Idx50BP/pIEwKKOFl7Zr+omEZGsQm6BPeruH8zOmNmdJYynpA70JGmoizGxafiPvWBaC/+xbs8YRyUiUrkKqW76HBwf4xr4VOnCKa2ungTtrQ0EzwCebGF7C4f7BtTRn4hI6LRJwt23hpN3h/MHSxpRCXX1Jmkfpj0ia+G0FgC2HlCVk4gIVNjIdKV2oCcx7IN0WQuUJERETlBRY1yXWlfPqUsS86c2EzPYpiQhIgLUWEniUF+Sqc35k0RDPMacKRPY2tU3hlGJiFSuYpLEWIxxXTLpjNOXTNPWVH/K7RZOa2XrAT0rISICxY0nMewY1+NFTyIFQGue21+zFrY3s+1AH+7jvnZNRGTUih1PYnARx8eXGBfjSWSTRFvjqT/ygmkt9CRSHOhJ0jFMR4AiIrWkZsaT6OkvsCQR3uG0ratXSUJEat5I+m4638xuDV/nlSKoUujuHwCCPppOZfBZCXXPISJSXJIws9uAe4Dp4eseM/tYKQKLWneBbRJzJk8gHjO2dilJiIgUVN2U4wPApe7eC2BmXwCeBu6IOrCoZaubTtcmEa+LMb+9Wc9KiIhQfHWTAemc+TTj5PmJQu9ugqAPJz11LSJSfEniW8AqM7s/nH8X8M1IIyqRwYbr05QkILjD6ddbDpDJOLHYuMiBIiIlUVRJwt2/BLwfOBi+bnH3r0QVjJl9wsw2mNl6M7vXzJqi2ne2TaKlobAk0T+Q4bXu/qgOLyIyLhVbksDd1wBrog7EzOYAfwGc7e7HwsGObgS+HcX+e/pTtDbGCyoZLMrp6G/WpAlRHF5EZFwq9u6mTjO738yeNbPnzWydmT0fYTxxYIKZxYFmYHdUO+5JDBRU1QTHe4PddkB9OIlIbSu2JHEP8L+AdUAmykDc/VUz+yKwAzgG/MLdfzF0OzNbCawEmD9/fsH770mkCmq0Bpg1sYnGeEx9OIlIzSv27qb97v6Au2919+3ZVxSBmNkU4J3AQmA20GJmfzR0O3e/y9073b2zo6Oj4P13h9VNhYjFjAXtLWxVSUJEalyxJYlPm9k3gMeARHahu/8kgliuBba6+34AM/sJcAXwvQj2TU8iRVuBJQmABdOa2aKnrkWkxhWbJG4BlgH1HK9uciCKJLEDuMzMmgmqm64BVkewXyBouJ45sfCbpRZMa+HxzftJpTPE64ruvUREpCoUmyQudvelpQjE3VeZ2X3As0AKeA64K6r9F1uSWNzRSjKdYeehY4P9OYmI1Jpi/0X+jZmdXZJIAHf/tLsvc/dz3P2P3T1x+p8qTHAL7KkHHMp15vRWAF7ep8ZrEaldxSaJy4C1ZvZCiW6BLYlMxulJFn53E8BiJQkRkaKrm64vSRQl1jeQxv30nfvlmthUz4yJjby0r7uEkYmIVLaikkRUt7uOtUIHHBpqyfRWtqgkISI1rCZu2+lJFDbg0FBnTm/j5X09Gu9aRGpWTSSJ7hGWJBZPb6U3mWbPEXX0JyK1qSaSRHYsiWLaJACWdKjxWkRqW0FJwsy6zezoMK9uMzta6iBHazRtEqAkISK1q6Crpru3lTqQUhoc37rIksS01gYmN9frDicRqVlFjycRdsR3JjDYx4W7PxllUFE7Pr514Q/TAZgZZ81oY/NeJQkRqU3FjifxQeBJ4GHgs+H7Z6IPK1rZNomWxrqif/bsWRN5YW83mYzucBKR2lNsw/VtwMXAdne/GrgAOBx1UFHrSaSYUF83oo76ls9qoy+ZZvtBdRsuIrWn2Ktmv7v3A5hZo7tvBkrS4V+UehKpEZUiAJbPmgjA5j0V3z4vIhK5YpPELjObDPwb8IiZ/RSo+Kew+xIpWopstM46a0YbMYNNShIiUoOK7Zbj3eHkZ8zscWAS8FDkUUWsN5mmuWFkSaKpvo5FHa1s3KPGaxGpPSO7cgLu/ssoAymlY8k0zQ0jq24CWDazjed2HI4uIBGRcaLYu5u+E1Y3ZeenmNndkUcVsd5kalRJYvmsibx6+BhHjg1EGJWISOUrtk3iPHc/nJ1x90MEdzhVtL5EmpYRVjdBcBssqF1CRGpPsUkiFj5MB4CZTWUUVVZjpTeZonmEdzcBnDt3EgDrdh2JKiQRkXGh2Av83wNPm9mPwvn3Ap+LNqTo9SVHV5KY1trI3CkTWLvzcHRBiYiMA8Xe3fRdM1sNvClc9B533xh9WNHqTYyuJAFw/rzJrFXjtYjUmKL/vQ6TQsUnhqx0xkmkMjTXj65W7IJ5k/nZ83vY352go60xouhERCpb1Y8n0Zcceb9Nuc6fNxmA36rKSURqSA0kiTTAiB+myzpn9iTqYqZ2CRGpKaNKEmY2y8wquu6ldxQ9wOaa0FDH0hlt/HbX4QiiEhEZH0ZbkvgXYLOZfTGKYEohqpIEwAXzg8brtLoNF5EaMaok4e7XAouAb0UTTvSOJ4nRlSQALl3UTncixcbdeqhORGrDqNskPLAhimBKoTdsuI4iSVy2cCoAT79yYNT7EhEZD4qqgzGzJuDPgd8BHHgKuDM7xsRomNlS4Ic5ixYB/8fdvzKa/fYlgpLESLsKzzV9YhOLOlp45pWDrHzj4lHvT0SkWO7Bbf09iRS9iRQ9iRQ9/Sl6kym6+1P0JtL0JlJ0Z9f3p+hJ5kyH7bSFKvbK+V2gG7gjnP8DgnaJ9xa5n5O4+wvACgAzqwNeBe4f7X6jLEkAXLaonX9fu5tUOjOike5EpDZkL+Z9yTR9yRTHkmn6kmmODaQHp/uSKY4NZKfTHEumwvdgu95kcMHvTYQJIBlc6FMFtou2NNTR0hintTFOa1OcloY4c6c0F/U5ik0S57j72Tnzj5tZKR6suwbY4u6jHtCoL3t3UwQN1wCXL2rn+6t2sGH30cFnJ0Sksrk7qYzTP5AmkcqQSGWC6YEMiVSa/vB9cHm4TSI7PXDyuv6cZbkX9uzF/thAmmLvcZlQX0dzQx0TGrLvcVob65jW2kxLY5y2xjgt4astvOgPTjcG27Y21tPSWEdLQ5xYzIY9zjf/tPCYir1yPmtml7n7MwBmdimwush9FOJG4N7hVpjZSmAlwPz580+7o95sw/Uob4HNunRRtl2iS0lCxoS7k3HIuJNxxweng3fPHF+X8QK2z10f/izk2SYzgn0Obn98/ydtn/1c4f7TGSeZzjCQzpBKOwPpzAnzwbQzkMqQymRIhtMD6QwDmZzp7HbDTI/mpkQzaIzHaKqvozEeozFeR1N98N4Yj9HWFGfGxEaaG+LBBT682DcNTsdzLvzBfHNDHRPqjyeEpnhd3ot6ORWbJC4CfmNmO8L5ecCLZraOoA37vNEGZGYNwDuA24db7+53AXcBdHZ2nvbXfiyZpi5mNERUNTS9rYllM9t4fPM+PnKl2iXGSiqdOaHo3ZtM05dI0Z9Kkwz/s0umggtLMpXzCucTqeyFwklnnHR48UpnnHR4sUpnPGcZg8vSgxez4S6YORdEH3pBDC6SRW0frs+9qNaauphRX2fUx2LUx2PBdF0sfJ043RCP0TLMuoa4EY+Fy+PBvgYv6vUxmsL3xsH3PAkg3La+zjCrvAv4WCgoSZjZEmAGcP2QVfOAvUCUo/H8HvCsu78Wxc6yAw5F+Qu+Zvl0/vGXr3Ckb4BJzfWR7bdWpNIZ9vck2HOkn9eO9HOgJ8HB3gEO9SU53JfkUF92emCwcS6RyozoWGbQUBejIR6joS5GLGbUmVEXM2IxqDM7cdngOqPOGFzWEI8RC7eNGcG0gVnuvGE564L5nPWx02/PqX5+8Hi563O2jxWzfXZ9Idsc339h+xzmM2Z/luG3icUYvMDXVeB/07Ws0JLEV4Dbh7YRmNlE4Mvu/vYIY7qJPFVNIzHaAYeGc83yGXz98S088eI+3rliTqT7rgbuzr7uBK/s72VbVy/bDvSyvauPPUeOsfdoP/u7E8P+h9zaGGdKSz1TmhuY3NzAgvYW2pqCRrfmhnhQz9p4vO61uSFOU33dYBJojB9PBg3hdDxWu/8BikSh0KvnDHdfN3Shu68zswVRBWNmLcB1wIej2udoBxwazoq5k5nW2sCjm5Qk+pIpNu3pZtOeo4OvF/Z2D7YFQfCf/LypE5g9eQJnzWhj1qQmZkxqYubEJmZOaqKjrZHJExpoiOtuMZFKU2iSmHyKdRMiiAMAd+8F2qPaH4x+wKHhxGLG1Uun8/CGvQykM9TX0K2we44cY/W2Q6zedpDV2w+xac/RwVJBW1Oc5bMmcsNFc1kyvZUF01pY0N7C7MkTVIUgMk4VevVcbWYfcvd/zl1oZh8E1kQfVnR6EykmRPSMRK7rzp7Bj9bs4tcvH+CqpdMj33+l6EumeHpLF0+8sJ8nXtzHzoPHgOBWvQvmT+bWq5dw7tzJLJ/VxpzJE1S1I1JlCk0SHwfuN7M/5HhS6AQagHeXIK7IHBtI097SEPl+r1zawaQJ9dz/3KtVlyT2dffz83V7eXTTa6zaepBkKsOE+jpev6SdW65YSOeCKSyfNbGmSlAitaqgJBHeaXSFmV0NnBMu/pm7/2fJIotIbyLFvKnFPWFYiMZ4HW87bxY/fnYXPYkUrRF0+1FOR/oGeGjDHh747W6e3tJFxmFxRwt/ctkZXLV0OhcvnEJjPPoSmYhUtmLHuH4ceLxEsZRE0CZRmovbey6cwz2rdvDQ+r3ccNHckhyjlDIZ59dbDnDPMzt4bPNrDKSdBe3N3Hr1Et5+/mzOnNFW7hBFpMzG97+/BehNpCIZS2I4F86fwhntzdy3Zue4ShKHepP8aM1Ovr9qB9u6+pja0sCfXL6Ad66YzblzJqldQUQGVX2S6EumRz0qXT5mxk2XzOfzP9/Mxt1HOXv2xJIcJyov7+vhrie38G9rd5NMZbh4wRQ+fu1Z/N65M1WVJCLDquokkUxlSGW8ZCUJgJsuns/XHnuJbzz1Cl9634qSHWc01u48zD8+sYWHN+6loS7G+zrn8keXncGymZWd1ESk/Ko6SfRF3E34cCY11/O+znncs2o7f339MmZMbCrZsYr19JYu7vjPl/jNli4mNsW59eol3HzFAqa1VvSw5CJSQao6SWSf+o36Ybqhbnn9Ar779DbufGILn3nH60p6rEI8t+MQX/zFC/z65S5mTGzkU29Zzk2Xzh/3d2CJyNir6qtGdiyJqLvlGOqM9hZ+/+L5fO+Z7dx8xQIWTmsp6fHy2bj7KF965AUe3bSP9pYG/uaty/mjy86gqV7tDSIyMlWdJAbHkihhdVPWJ647k5+ufZXP/3wT//THnSU/Xq4t+3v48iMv8uDze2hrivM/33wWt7x+YSRDtopIbavqq0hPf1CSaG0sfXfe09ua+LMrF/P3j7zIwxv28ruvm1nyY756+BhfffRF7luzi6b6Oj569WJWvmGxui8XkchUd5LIDl1a4uqmrA9fuZiHNuzlkz9+ngvmTWZ6iRqxD/Qk+PrjL3PPM8HYTzdfsYA/v2oJHW1qkBaRaFV1kuhNZEsSY/MxG+IxvnrjCt76tae49d7n+O77L4m0PeBo/wDfePIVvvnUVo4NpLnhorncdu1ZzJkcWUe8IiInqO4kkRzbJAGwZHob//eG87jtB2u57QfP8fU/uJD4KDvCO3JsgO89s51//tUrHO4b4K3nzuIT153FkumtEUUtIjK8qk4S3f3Z6qax/ZjvXDGHg71JPvvvG3n/d1Zzx40XjKidYO+Rfr71663cs2oHPYkUVy3t4C+vW8q5cyeVIGoRkZNVdZLoTaSIx4zGMox4dsvrFzKhvo7//dP1vPWOX/E3bz2b333djNP2i5RIpXls0z5+tHonv3xxPwBvO282H75yEa+breQgImOr6pNEa1O8bB3W3XjJfM6c0crtP1nHR763hmUz23jXBXPoPGMK89ubmVBfR08ixe7D/Wzcc5RnXuniqZcOcOTYADMnNvGRKxdz48Xzmd8efVfnIiKFqOok0Z1Ilfxp69O56Iyp/MdfvIH71uziB/+9k8//fHPebae3NXLt8hm8/fxZvOHMDg35KSJlV9VJordCBgOK18W48ZL53HjJfPYe6WfD7iPsPnyM/oEMLY1xprc1snz2RGZPalI33SJSUcp/BS2h3kTpugkfqZmTmpg5qXI6ARQROZWqHqS4J5GitUlPH4uIjFT1J4kKK0mIiIwnVZ0keiug4VpEZDyr6iTRk0ipJ1QRkVGo2iTh7vQmUrQ1KUmIiIxU1SaJYwNpMj72XXKIiFSTikoSZjbZzO4zs81mtsnMLh/pvo53E64kISIyUpV2Bf0q8JC732BmDcCI+6PIDjjUpiQhIjJiFXMFNbNJwBuBPwVw9ySQHOn+ehPB0KUqSYiIjFwlVTctBPYD3zKz58zsG2bWMtKdjfWodCIi1aiSkkQcuBC4090vAHqBTw7dyMxWmtlqM1u9f//+vDsb61HpRESqUSUliV3ALndfFc7fR5A0TuDud7l7p7t3dnR05N1Zj5KEiMioVUyScPe9wE4zWxouugbYONL9KUmIiIxepV1BPwbcE97Z9Apwy0h31KtbYEVERq2irqDuvhbojGJfPYkUZtDcoIZrEZGRqpjqpqj1JFK0NpRv6FIRkWpQtUmiV537iYiMWhUnicoblU5EZLyp2iTRrVHpRERGrWqTRK9GpRMRGbWqThIalU5EZHSqNkkc7E0ypbmh3GGIiIxrVZkk3J2DvUnaW5UkRERGoyqTxNFjKVIZp721sdyhiIiMa1WZJA70JgCYppKEiMioVGWS6OoJxiqa2qIkISIyGlWaJIKSRHuLqptEREajKpPEgd6gJKHqJhGR0anKJJEtSUxRdZOIyKhUZZI42Jtk0oR66uuq8uOJiIyZqryKdvXoGQkRkShUZZI40JNgmhqtRURGrSqTRJeethYRiUR1JomehJKEiEgEqi5JpNIZDvUNMFXVTSIio1Z1SeJQ3wCgZyRERKJQdUmiq1dPW4uIRKX6kkTYb5PaJERERq/qksSBHvUAKyISlapLEsd7gFV1k4jIaFVdkli/+whTWxqYPKG+3KGIiIx7VZUk3J1ntnRx+aJ2YjErdzgiIuNeVSWJ7V197D7Sz+WL28sdiohIVYiXO4BcZrYN6AbSQMrdO4v5+d9s6QLgCiUJEZFIVFSSCF3t7gdG8oO/2XKAmRObWDitJeqYRERqUtVUNx3uS/L0li4uX9yOmdojRESiYO5e7hgGmdlW4BDgwD+5+13DbLMSWBnOngOsH7sIK9I0YEQlryqicxDQedA5gMLOwRnu3lHIziotScxx91fNbDrwCPAxd3/yFNuvLrbdotroHOgcZOk86BxA9Oegoqqb3P3V8H0fcD9wSXkjEhGpbRWTJMysxczastPAm1FVkohIWVXS3U0zgPvDRuc48H13f+g0P3NSm0UN0jnQOcjSedA5gIjPQUW1SYiISGWpmOomERGpPEoSIiKS17hMEmZ2vZm9YGYvm9knyx1PqZjZPDN73Mw2mtkGM7stXD7VzB4xs5fC9ynhcjOzr4Xn5Xkzu7C8nyA6ZlZnZs+Z2YPh/EIzWxV+1h+aWUO4vDGcfzlcv6CsgUfIzCab2X1mttnMNpnZ5bX2XTCzT4R/C+vN7F4za6qF74KZ3W1m+8xsfc6yon/3ZnZzuP1LZnZzIcced0nCzOqArwO/B5wN3GRmZ5c3qpJJAX/p7mcDlwEfDT/rJ4HH3P1M4LFwHoJzcmb4WgncOfYhl8xtwKac+S8AX3b3JQQPYH4gXP4B4FC4/MvhdtXiq8BD7r4MOJ/gfNTMd8HM5gB/AXS6+zlAHXAjtfFd+DZw/ZBlRf3uzWwq8GngUoLHCz6dTSyn5O7j6gVcDjycM387cHu54xqjz/5T4DrgBWBWuGwW8EI4/U/ATTnbD243nl/A3PCP4E3Ag4ARPFEaH/qdAB4GLg+n4+F2Vu7PEME5mARsHfpZaum7AMwBdgJTw9/tg8Dv1sp3AVgArB/p7x64iaAnC4bbLt9r3JUkOP5FydoVLqtqYVH5AmAVMMPd94Sr9hLcPgzVe26+AvwVkAnn24HD7p4K53M/5+A5CNcfCbcf7xYC+4FvhdVu3wifJ6qZ74IHD9t+EdgB7CH43a6h9r4LWcX+7kf0nRiPSaLmmFkr8GPg4+5+NHedB/8SVO19zGb2NmCfu68pdyxlFgcuBO509wuAXo5XLwA18V2YAryTIGHOBlo4uQqmJpXydz8ek8SrwLyc+bnhsqpkZvUECeIed/9JuPg1M5sVrp8F7AuXV+O5eT3wjnCskR8QVDl9FZhsZtmHQXM/5+A5CNdPArrGMuAS2QXscvdV4fx9BEmjlr4L1wJb3X2/uw8APyH4ftTadyGr2N/9iL4T4zFJ/DdwZnhHQwNBw9UDZY6pJCx4/PybwCZ3/1LOqgeA7J0JNxO0VWSX/0l4d8NlwJGc4ui45O63u/tcd19A8Lv+T3f/Q+Bx4IZws6HnIHtubgi3H/f/Xbv7XmCnmS0NF10DbKSGvgsE1UyXmVlz+LeRPQc19V3IUezv/mHgzWY2JSyVvTlcdmrlbowZYQPOW4AXgS3Ap8odTwk/5+8QFCGfB9aGr7cQ1Ks+BrwEPApMDbc3gju/tgDrCO4CKfvniPB8XAU8GE4vAv4LeBn4EdAYLm8K518O1y8qd9wRfv4VwOrw+/BvwJRa+y4AnwU2E/Tr9i9AYy18F4B7CdphBghKlR8Yye8eeH94Pl4Gbink2OqWQ0RE8hqP1U0iIjJGlCRERCQvJQkREclLSUJERPJSkhARkbyUJGRcM7N2M1sbvvaa2as58w3lji+XmV1lZleM0bG2mdm0cPoiM9tqZheMxbGlulTS8KUiRXP3LoLnBzCzzwA97v7FcsVjZnE/3o/QUFcBPcBvItpfIT9/HsHT2b/v7s+NdD9Su1SSkKoT/uf8SzNbY2YP53Rd8ISZfdnMVlswHsPFZvaTsG/9vwu3WWDBeA33hNvcZ2bNBez3K2a2GrjNzN4ejl/wnJk9amYzwg4aPwJ8IizlvMHMvm1mN+TE3RO+X2VmvzKzB4CNFoyl8f/M7L/D8QE+XOCpWE7w0N0fu/t/RXJypeYoSUi1MeAO4AZ3vwi4G/hczvqku3cC/0jQjcFHgXOAPzWzbA+hS4F/cPflwFHgz8M+tE613wZ373T3vweeAi7zoCO+HwB/5e7bwmN+2d1XuPuvTvM5LgRuc/ezCJ6uPeLuFwMXAx8ys4UFnIufAre6+1MFbCsyLFU3SbVpJLjoPxJ070MdQXcGWdl+vtYBGzzsz8jMXiHo/OwwsNPdfx1u9z2CgW4eOs1+f5gzPRf4YVjSaCAYB6JY/+Xu2Z97M3BeTqljEsGAMqfb76PAB83sYXdPjyAGESUJqTpGcPG/PM/6RPieyZnOzmf/Hob2VeMF7Lc3Z/oO4Evu/oCZXQV8Js/PpAhL82YWI0gow+3PgI+5++k7YzvRrQSll38ACq2iEjmBqpuk2iSADjO7HIKu1s3sdUXuY37254E/IKg+eqGI/U7ieBfMueMIdwNtOfPbgIvC6XcA9Xn29zDwZ2GVF2Z2lgUDDmFmm0/xOTJh/MvM7G9PsZ1IXkoSUm0yBN1Cf8HMfkvQc26xt52+QDCe+CaCnlbvdPdkEfv9DPAjM1tDMGRm1r8D7842XAP/DFwZ7u9yTiw95PoGQZfYz5rZeoJhJ+PhLa52qg/i7v0ECegdZvbRU39skZOpF1iRHOFdSA+6+znljuV0LBi1b5G7f63csUj1UpuEyDjl7g+WOwapfipJiIhIXmqTEBGRvJQkREQkLyUJERHJS0lCRETyUpIQEZG8/j9fmzcvEoPidAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "Q = DiatomicPartitionFunction(mol, energy_surface, vibrational_structure)\n", - "\n", - "P = 101350 # Pa\n", - "temps = np.arange(10, 1050, 5) # K\n", - "\n", - "mol.spins = [1/2,1/2]\n", - "\n", - "td = Thermodynamics(Q, pressure = 101350)\n", - "td.set_pressure(101350)\n", - "temps = np.arange(10, 1500, 5)\n", - "ymin = 5\n", - "ymax = 11\n", - "\n", - "plt.plot(temps,\n", - " td.constant_pressure_heat_capacity(temps) / const.CAL_TO_J)\n", - "plt.xlim(0, 1025)\n", - "plt.ylim(ymin, ymax)\n", - "plt.xlabel('Temperature, K')\n", - "plt.ylabel('Cp, cal mol$^{-1}$ K$^{-1}$')\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we demonstrate how to access particular components (the rotational part) of the partition function, which in the H2 case we can further split to para-hydrogen and ortho-hydrogen components." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "eq = Q.get_partition(part=\"rot\", split=\"eq\")\n", - "para = Q.get_partition(part=\"rot\", split=\"para\")\n", - "ortho = Q.get_partition(part=\"rot\", split=\"ortho\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now plot the constant volume heat capacity (of the rotational part) demonstrating how we can call directly the functions in the 'thermodynamics' module, providing a callable object for the partition function (or in this case its rotational component). Note that in the plot we normalize the plot dividing by the universal gas constant R (Avogadro's number times Boltzman's constant) and we use crossed to compare with experimental data found in literature." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# REFERENCE DATA from literature\n", - "df_brink_T = [80.913535,135.240157,176.633783,219.808499,246.226899]\n", - "df_brink_Cv = [0.118605,0.469925,0.711510,0.833597,0.895701]\n", - "\n", - "df_eucken_T = [25.120525, 30.162485, 36.048121, 41.920364, 56.195875, 62.484934, 72.148692, 73.805910, 73.804236, 92.214423,180.031917,230.300866]\n", - "df_eucken_Cv = [0.012287,0.012354,0.008448,0.020478,0.032620,0.048640,0.048768,0.076678,0.078670,0.170548,0.667731,0.847681]\n", - "\n", - "df_gia_T = [190.919338,195.951254,202.652107,204.292585,209.322828,225.300754,234.514217,243.747768]\n", - "df_gia_Cv = [0.711700,0.723719,0.749704,0.797535,0.811546,0.797814,0.833793,0.845868]\n", - "\n", - "df_parting_T = [80.101665, 86.358919,185.914204,239.927797]\n", - "df_parting_Cv = [0.084730,0.138598,0.667809,0.891634]\n", - "\n", - "df_ce_T = [80.669344,135.550569,145.464190,165.301153,182.144856,203.372528,237.993108,268.696642,294.095771,308.872014]\n", - "df_ce_Cv = [0.103048,0.467344,0.541364,0.647315,0.714078,0.798258,0.891147,0.944848,0.966618,0.985486]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "HeatCapacity = constant_volume_heat_capacity\n", - "\n", - "R = const.N_A * const.KB_J_PER_K\n", - "plt.plot(temps,\n", - " HeatCapacity(eq, temps) / R, '-k',\n", - " label='Cv_rot Equilibrium')\n", - "plt.plot(temps, HeatCapacity(para, temps) / R, '-b',\n", - " label='Cv_rot Para')\n", - "plt.plot(temps, HeatCapacity(ortho, temps) / R, '-r',\n", - " label='Cv_rot Ortho')\n", - "plt.plot(temps, 0.25 * HeatCapacity(para, temps) / R\n", - " + 0.75 * HeatCapacity(ortho, temps) / R, '-g',\n", - " label='Cv_rot 1:3 para:ortho')\n", - "plt.plot(df_brink_T, df_brink_Cv, '+g')\n", - "plt.plot(df_eucken_T, df_eucken_Cv, '+g')\n", - "plt.plot(df_gia_T, df_gia_Cv, '+g')\n", - "plt.plot(df_parting_T, df_parting_Cv, '+g')\n", - "plt.plot(df_ce_T, df_ce_Cv, '+g', label = 'experimental data')\n", - "plt.legend(loc='upper right', framealpha=100, frameon=False)\n", - "plt.xlim(10, 400)\n", - "plt.ylim(-0.1, 2.8)\n", - "plt.xlabel('Temperature, K')\n", - "plt.ylabel('Cv (rotational)/R')\n", - "plt.tight_layout()\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

Version Information

Qiskit SoftwareVersion
Qiskit0.23.0
Terra0.16.0
Aer0.7.0
Ignis0.5.0
Aqua0.8.0
IBM Q Provider0.11.0
System information
Python3.6.12 |Anaconda, Inc.| (default, Sep 8 2020, 17:50:39) \n", - "[GCC Clang 10.0.0 ]
OSDarwin
CPUs6
Memory (Gb)16.0
Wed Oct 21 18:45:59 2020 CEST
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import qiskit.tools.jupyter\n", - "%qiskit_version_table\n", - "%qiskit_copyright" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.6.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/_static/custom.css b/tutorials/_static/custom.css deleted file mode 100644 index 3f981b6581..0000000000 --- a/tutorials/_static/custom.css +++ /dev/null @@ -1,27 +0,0 @@ -.toggle .header { - display: block; - clear: both; - background-color: #785EF0; - color: #f9f9f9; - height: 40px; - padding-top: 10px; - padding-left: 5px; - margin-bottom: 20px; -} - -.toggle .header:before { - float: left; - content: "▶ "; - font-size: 20px; - -} - -.toggle .header.open:before { - float: left; - content: "▼ "; - font-size: 20px; -} - -.toggle{ - background: #FBFBFB; -} diff --git a/tutorials/_static/gallery.css b/tutorials/_static/gallery.css deleted file mode 100644 index e5f79a8c5a..0000000000 --- a/tutorials/_static/gallery.css +++ /dev/null @@ -1,195 +0,0 @@ -/* -Sphinx-Gallery has compatible CSS to fix default sphinx themes -Tested for Sphinx 1.3.1 for all themes: default, alabaster, sphinxdoc, -scrolls, agogo, traditional, nature, haiku, pyramid -Tested for Read the Docs theme 0.1.7 */ -.sphx-glr-thumbcontainer { - background: #fff; - border: solid #fff 1px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - box-shadow: none; - float: left; - margin: 5px; - min-height: 230px; - padding-top: 5px; - position: relative; -} -.sphx-glr-thumbcontainer:hover { - border: solid #6200EE 1px; - box-shadow: 0 0 15px rgba(163, 142, 202, 0.5); -} -.sphx-glr-thumbcontainer a.internal { - bottom: 0; - display: block; - left: 0; - padding: 150px 10px 0; - position: absolute; - right: 0; - top: 0; -} -/* Next one is to avoid Sphinx traditional theme to cover all the -thumbnail with its default link Background color */ -.sphx-glr-thumbcontainer a.internal:hover { - background-color: transparent; -} - -.sphx-glr-thumbcontainer p { - margin: 0 0 .1em 0; -} -.sphx-glr-thumbcontainer .figure { - margin: 10px; - width: 160px; -} -.sphx-glr-thumbcontainer img { - display: inline; - max-height: 112px; - max-width: 160px; -} -.sphx-glr-thumbcontainer[tooltip]:hover:after { - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - color: #fff; - content: attr(tooltip); - left: 95%; - padding: 5px 15px; - position: absolute; - z-index: 98; - width: 220px; - bottom: 52%; -} -.sphx-glr-thumbcontainer[tooltip]:hover:before { - border: solid; - border-color: #333 transparent; - border-width: 18px 0 0 20px; - bottom: 58%; - content: ''; - left: 85%; - position: absolute; - z-index: 99; -} - -.sphx-glr-script-out { - color: #888; - margin: 0; -} -p.sphx-glr-script-out { - padding-top: 0.7em; -} -.sphx-glr-script-out .highlight { - background-color: transparent; - margin-left: 2.5em; - margin-top: -2.1em; -} -.sphx-glr-script-out .highlight pre { - background-color: #fafae2; - border: 0; - max-height: 30em; - overflow: auto; - padding-left: 1ex; - margin: 0px; - word-break: break-word; -} -.sphx-glr-script-out + p { - margin-top: 1.8em; -} -blockquote.sphx-glr-script-out { - margin-left: 0pt; -} -.sphx-glr-script-out.highlight-pytb .highlight pre { - color: #000; - background-color: #ffe4e4; - border: 1px solid #f66; - margin-top: 10px; - padding: 7px; -} - -div.sphx-glr-footer { - text-align: center; -} - -div.sphx-glr-download { - margin: 1em auto; - vertical-align: middle; -} - -div.sphx-glr-download a { - background-color: #ffc; - background-image: linear-gradient(to bottom, #FFC, #d5d57e); - border-radius: 4px; - border: 1px solid #c2c22d; - color: #000; - display: inline-block; - font-weight: bold; - padding: 1ex; - text-align: center; -} - -div.sphx-glr-download code.download { - display: inline-block; - white-space: normal; - word-break: normal; - overflow-wrap: break-word; - /* border and background are given by the enclosing 'a' */ - border: none; - background: none; -} - -div.sphx-glr-download a:hover { - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - text-decoration: none; - background-image: none; - background-color: #d5d57e; -} - -.sphx-glr-example-title > :target::before { - display: block; - content: ""; - margin-top: -50px; - height: 50px; - visibility: hidden; -} - -ul.sphx-glr-horizontal { - list-style: none; - padding: 0; -} -ul.sphx-glr-horizontal li { - display: inline; -} -ul.sphx-glr-horizontal img { - height: auto !important; -} - -.sphx-glr-single-img { - margin: auto; - display: block; - max-width: 100%; -} - -.sphx-glr-multi-img { - max-width: 42%; - height: auto; -} - -p.sphx-glr-signature a.reference.external { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 3px; - font-size: 75%; - text-align: right; - margin-left: auto; - display: table; -} - -.sphx-glr-clear{ - clear: both; -} - -a.sphx-glr-backref-instance { - text-decoration: none; -} diff --git a/tutorials/_static/no_image.png b/tutorials/_static/no_image.png deleted file mode 100644 index d08b40bd8e..0000000000 Binary files a/tutorials/_static/no_image.png and /dev/null differ diff --git a/tutorials/_static/style.css b/tutorials/_static/style.css deleted file mode 100644 index 84980a3a4a..0000000000 --- a/tutorials/_static/style.css +++ /dev/null @@ -1,12 +0,0 @@ -.wy-nav-content { - max-width: 90% !important; -} - -.wy-side-scroll { - background:#8c8c8c; -} - -.pre -{ -color:#BE8184; -} diff --git a/tutorials/_templates/autosummary/base.rst b/tutorials/_templates/autosummary/base.rst deleted file mode 100644 index a58aa35ff9..0000000000 --- a/tutorials/_templates/autosummary/base.rst +++ /dev/null @@ -1,10 +0,0 @@ -{% if referencefile %} -.. include:: {{ referencefile }} -{% endif %} - -{{ objname }} -{{ underline }} - -.. currentmodule:: {{ module }} - -.. auto{{ objtype }}:: {{ objname }} diff --git a/tutorials/_templates/autosummary/class.rst b/tutorials/_templates/autosummary/class.rst deleted file mode 100644 index e4d661a008..0000000000 --- a/tutorials/_templates/autosummary/class.rst +++ /dev/null @@ -1,49 +0,0 @@ -{% if referencefile %} -.. include:: {{ referencefile }} -{% endif %} - -{{ objname }} -{{ underline }} - -.. currentmodule:: {{ module }} - -.. autoclass:: {{ objname }} - :no-members: - :no-inherited-members: - :no-special-members: - - {% block attributes_summary %} - {% if attributes %} - - .. rubric:: Attributes - - .. autosummary:: - :toctree: ../stubs/ - {% for item in all_attributes %} - {%- if not item.startswith('_') %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - {% endif %} - {% endblock %} - - {% block methods_summary %} - {% if methods %} - - .. rubric:: Methods - - .. autosummary:: - :toctree: ../stubs/ - {% for item in all_methods %} - {%- if not item.startswith('_') or item in ['__call__', '__mul__', '__getitem__', '__len__'] %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - {% for item in inherited_members %} - {%- if item in ['__call__', '__mul__', '__getitem__', '__len__'] %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - - {% endif %} - {% endblock %} diff --git a/tutorials/_templates/autosummary/module.rst b/tutorials/_templates/autosummary/module.rst deleted file mode 100644 index 11208a25c6..0000000000 --- a/tutorials/_templates/autosummary/module.rst +++ /dev/null @@ -1,41 +0,0 @@ -{% if referencefile %} -.. include:: {{ referencefile }} -{% endif %} - -{{ objname }} -{{ underline }} - -.. automodule:: {{ fullname }} - - {% block functions %} - {% if functions %} - .. rubric:: Functions - - .. autosummary:: - {% for item in functions %} - {{ item }} - {%- endfor %} - {% endif %} - {% endblock %} - - {% block classes %} - {% if classes %} - .. rubric:: Classes - - .. autosummary:: - {% for item in classes %} - {{ item }} - {%- endfor %} - {% endif %} - {% endblock %} - - {% block exceptions %} - {% if exceptions %} - .. rubric:: Exceptions - - .. autosummary:: - {% for item in exceptions %} - {{ item }} - {%- endfor %} - {% endif %} - {% endblock %} diff --git a/tutorials/_templates/page.html b/tutorials/_templates/page.html deleted file mode 100644 index 429a7dedd9..0000000000 --- a/tutorials/_templates/page.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "!page.html" %} - -{% block footer %} - -{% endblock %} \ No newline at end of file diff --git a/tutorials/conf.py b/tutorials/conf.py deleted file mode 100644 index 5611b22e81..0000000000 --- a/tutorials/conf.py +++ /dev/null @@ -1,127 +0,0 @@ -# This code is part of Qiskit. -# -# (C) Copyright IBM 2021. -# -# This code is licensed under the Apache License, Version 2.0. You may -# obtain a copy of this license in the LICENSE.txt file in the root directory -# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -# -# Any modifications or derivative works of this code must retain this -# copyright notice, and modified files need to carry a notice indicating -# that they have been altered from the originals. - -# pylint: disable=invalid-name -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -""" -Sphinx documentation builder -""" - -import os -import sys -# Set env flag so that we can doc functions that may otherwise not be loaded -# see for example interactive visualizations in qiskit.visualization. -os.environ['QISKIT_DOCS'] = 'TRUE' -if sys.platform == 'darwin': - os.environ['QISKIT_IN_PARALLEL'] = 'TRUE' - -# -- Project information ----------------------------------------------------- -project = 'Qiskit Nature' -copyright = '2021, Qiskit Development Team' # pylint: disable=redefined-builtin -author = 'Qiskit Development Team' - -# The short X.Y version -version = '' -# The full version, including alpha/beta/rc tags -release = '0.1.0' - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.mathjax', - 'sphinx.ext.extlinks', - 'nbsphinx', -] -html_static_path = ['_static'] -templates_path = ['_templates'] -html_css_files = ['style.css', 'custom.css', 'gallery.css'] - -html_sourcelink_suffix = '' -exclude_patterns = ['_build', '**.ipynb_checkpoints'] - -cell_timeout = int(os.getenv('QISKIT_CELL_TIMEOUT', 180)) -nbsphinx_timeout = cell_timeout -nbsphinx_execute = 'always' -nbsphinx_execute_arguments = [ - "--InlineBackend.figure_formats={'png', 'pdf'}", - "--InlineBackend.rc={'figure.dpi': 96}", -] - -# If true, figures, tables and code-blocks are automatically numbered if they -# have a caption. -numfig = True - -# A dictionary mapping 'figure', 'table', 'code-block' and 'section' to -# strings that are used for format of figure numbers. As a special character, -# %s will be replaced to figure number. -numfig_format = { - 'table': 'Table %s' -} -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'colorful' - -# A boolean that decides whether module names are prepended to all object names -# (for object types where a “module” of some kind is defined), e.g. for -# py:function directives. -add_module_names = False - - -# -- Configuration for extlinks extension ------------------------------------ -# Refer to https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' # use the theme in subdir 'theme' -html_last_updated_fmt = '%Y/%m/%d' - -html_theme_options = { - 'logo_only': False, - 'display_version': True, - 'prev_next_buttons_location': 'bottom', - 'style_external_links': True, - 'style_nav_header_background': '#212121', -} - -autoclass_content = 'both'