diff --git a/.circleci/config.yml b/.circleci/config.yml
index f7799b20..96f2eaf9 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,15 +1,46 @@
-version: 2
+version: 2.1
-jobs:
- build:
- working_directory: ~/open-controls
- docker:
- - image: continuumio/anaconda3
- steps:
- - run: apt-get -y install build-essential
- - checkout
- - run: python3 setup.py install
- - run: pytest
- - run: pytest --nbval-lax examples/*.ipynb --sanitize-with examples/notebook-sanitize.cfg
- - run: pylint qctrlopencontrols --rcfile=.pylintrc
- - run: pylint tests --rcfile=.pylintrc
\ No newline at end of file
+orbs:
+ q-ctrl: q-ctrl/python@dev:0.1.0
+
+workflows:
+ version: 2
+
+ "PyPi Project":
+ jobs:
+ - q-ctrl/pytest_python_36_open:
+ context: q-ctrl-api-development
+ filters:
+ tags: # Tag filter required because the release job has a tag filter
+ only: /.*/
+ - q-ctrl/open_build:
+ context: q-ctrl-api-development
+ filters:
+ branches:
+ only:
+ - master
+ - development
+ tags: # Tag filter required because the release job has a tag filter
+ only: /.*/
+ - q-ctrl/pypi_publish:
+ context: q-ctrl-api-development
+ requires:
+ - q-ctrl/pytest_python_36_open
+ - q-ctrl/open_build
+ filters:
+ branches:
+ only:
+ - development
+ tags:
+ only: /^v?\d+(\.\d+){1,2}rc\d+$/ # RC version required for publish from development
+ - q-ctrl/pypi_publish:
+ context: q-ctrl-api-production
+ requires:
+ - q-ctrl/pytest_python_36_open
+ - q-ctrl/open_build
+ filters:
+ branches:
+ only:
+ - master
+ tags:
+ only: /^v?\d+(\.\d+){1,2}$/
diff --git a/.gitignore b/.gitignore
index 23e84f85..5fc11071 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
+# Example controls
+*.csv
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
@@ -102,6 +105,7 @@ ENV/
# pytest
.pytest_cache/*
+junit.xml
#Mac related files
*.DS_Store
@@ -112,3 +116,4 @@ qctrl_library.code-workspace
# docs
docs-source
docs
+
diff --git a/README.md b/README.md
index 1dae9d6f..0d7a4176 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,14 @@
# Q-CTRL Open Controls
-Q-CTRL Open Controls is an open-source Python package that makes it easy to create and deploy established error-robust quantum control protocols from the open literature. The aim of the package is to be the most comprehensive library of published and tested quantum control techniques developed by the community, with easy to use export functions allowing users to deploy these controls on:
+Q-CTRL Open Controls is an open-source Python package that makes it easy to create
+and deploy established error-robust quantum control protocols from the open literature.
+The aim of the package is to be the most comprehensive library of published and
+tested quantum control techniques developed by the community, with easy to use
+export functions allowing users to deploy these controls on:
-* Custom quantum hardware
-* Publicly available cloud quantum computers
-* The [Q-CTRL product suite](https://q-ctrl.com/products/)
+- Custom quantum hardware
+- Publicly available cloud quantum computers
+- The [Q-CTRL product suite](https://q-ctrl.com/products/)
Anyone interested in quantum control is welcome to contribute to this project.
@@ -18,65 +22,108 @@ Anyone interested in quantum control is welcome to contribute to this project.
## Installation
-Q-CTRL Open Controls can be install through `pip` or from source. We recommend the `pip` distribution to get the most recent stable release. If you want the latest features then install from source.
+Q-CTRL Open Controls can be install through `pip` or from source. We recommend
+the `pip` distribution to get the most recent stable release. If you want the
+latest features then install from source.
### Requirements
-To use Q-CTRL Open Controls you will need an installation of Python. We recommend using the [Anaconda](https://www.anaconda.com/) distribution of Python. Anaconda includes standard numerical and scientific Python packages which are optimally compiled for your machine. Follow the [Anaconda Installation](https://docs.anaconda.com/anaconda/install/) instructions and consult the [Anaconda User guide](https://docs.anaconda.com/anaconda/user-guide/) to get started.
+To use Q-CTRL Open Controls you will need an installation of Python. We recommend
+using the [Anaconda](https://www.anaconda.com/) distribution of Python. Anaconda
+includes standard numerical and scientific Python packages which are optimally
+compiled for your machine. Follow the [Anaconda Installation](https://docs.anaconda.com/anaconda/install/)
+instructions and consult the [Anaconda User guide](https://docs.anaconda.com/anaconda/user-guide/)
+to get started.
-We use interactive jupyter notebooks for our usage examples. The Anaconda python distribution comes with editors for these files, or you can [install the jupyter notebook editor](https://jupyter.org/install) on its own.
+We use interactive jupyter notebooks for our usage examples. The Anaconda python
+distribution comes with editors for these files, or you can [install the jupyter
+notebook editor](https://jupyter.org/install) on its own.
### Using PyPi
Use `pip` to install the latest version of Q-CTRL Open Controls.
```shell
-$ pip install qctrl-open-controls
+pip install qctrl-open-controls
```
### From Source
-The source code is hosted on [Github](https://github.com/qctrl/python-open-controls). The repository can be cloned using
+The source code is hosted on [Github](https://github.com/qctrl/python-open-controls).
+The repository can be cloned using
```shell
-$ git clone git@github.com:qctrl/python-open-controls.git
+git clone git@github.com:qctrl/python-open-controls.git
```
-Once the clone is complete, you can run the install script.
+Once the clone is complete, you have two options:
-```shell
-$ cd python-open-controls
-$ python setup.py develop
-```
+1. Using setup.py
+
+ ```shell
+ cd python-open-controls
+ python setup.py develop
+ ```
+
+ **Note:** We recommend installing using `develop` to point your installation at
+ the source code in the directory where you cloned the repository.
-**Note:** We recommend installing using `develop` to point your installation at the source code in the directory where you cloned the repository.
+1. Using Poetry
-To test your installation run `pytest` in the `python-open-controls` directory.
+ ```shell
+ cd python-open-controls
+ ./setup-poetry.sh
+ ```
+
+ **Note:** if you are on Windows, you'll need to install [Poetry](https://poetry.eustace.io)
+ manually, and use:
+
+ ```cmd
+ cd python-open-controls
+ poetry install
+ ```
+
+Once installed via one of the above methods, test your installation by running `pytest`
+in the `python-open-controls` directory.
```shell
-$ pytest
+pytest
```
## Usage
-Usage depends on the application. We've provided a set of [example Jupyter notebooks](examples) addressing a variety of quantum control problems. Below is a short description of each notebook grouped by application. For further details on usage, use the inline documentation in the source code.
+Usage depends on the application. We've provided a set of [example Jupyter notebooks](examples)
+addressing a variety of quantum control problems. Below is a short description
+of each notebook grouped by application. For further details on usage, use the
+inline documentation in the source code.
### Dynamical Decoupling Sequences (DDS)
-Q-CTRL Open Controls can create a large library of standard DDS which can be exported in a variety of formats.
+Q-CTRL Open Controls can create a large library of standard DDS which can be exported
+in a variety of formats.
#### Create a DDS
-[`examples/creating_a_dds.ipynb`](examples/creating_a_dds.ipynb) demonstrates how to use Q-CTRL Open Controls to create a DDS from a large library of published dynamical decoupling protocols. It also shows how to make Custom DDS with timings, offsets and unitaries defined by the user. The notebook shows how to export a DDS for deployment in the [Q-CTRL products](https://q-ctrl.com/products/) or your quantum hardware.
+[`examples/creating_a_dds.ipynb`](examples/creating_a_dds.ipynb) demonstrates
+how to use Q-CTRL Open Controls to create a DDS from a large library of published
+dynamical decoupling protocols. It also shows how to make Custom DDS with timings,
+offsets and unitaries defined by the user. The notebook shows how to export a
+DDS for deployment in the [Q-CTRL products](https://q-ctrl.com/products/) or your
+quantum hardware.
#### Export a DDS to Qiskit
-[`examples/export_a_dds_to_qiskit.ipynb`](examples/export_a_dds_to_qiskit.ipynb) demonstrates how to take a DDS and convert it to a Qiskit circuit so it can be run on IBM's quantum computers. It also demonstrates using a DDS to improve the performance of a quantum circuit execution by extending the coherence time of a qubit.
+[`examples/export_a_dds_to_qiskit.ipynb`](examples/export_a_dds_to_qiskit.ipynb)
+demonstrates how to take a DDS and convert it to a Qiskit circuit so it can be
+run on IBM's quantum computers. It also demonstrates using a DDS to improve the
+performance of a quantum circuit execution by extending the coherence time of
+a qubit.
#### Export a DDS to Cirq
-[`examples/export_a_dds_to_cirq.ipynb`](examples/export_a_dds_to_cirq.ipynb) demonstrates how to take a DDS and convert it to a Cirq circuit or schdule. It also shows how to run a circuit or schedule in a Cirq simulator.
-
+[`examples/export_a_dds_to_cirq.ipynb`](examples/export_a_dds_to_cirq.ipynb) demonstrates
+how to take a DDS and convert it to a Cirq circuit or schdule. It also shows how
+to run a circuit or schedule in a Cirq simulator.
## Contributing
diff --git a/README.rst b/README.rst
new file mode 100644
index 00000000..aa60e1a0
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,158 @@
+
+Q-CTRL Open Controls
+====================
+
+Q-CTRL Open Controls is an open-source Python package that makes it easy to create
+and deploy established error-robust quantum control protocols from the open literature.
+The aim of the package is to be the most comprehensive library of published and
+tested quantum control techniques developed by the community, with easy to use
+export functions allowing users to deploy these controls on:
+
+
+* Custom quantum hardware
+* Publicly available cloud quantum computers
+* The `Q-CTRL product suite `_
+
+Anyone interested in quantum control is welcome to contribute to this project.
+
+Table of Contents
+-----------------
+
+
+* `Installation <#installation>`_
+* `Usage <#usage>`_
+* `Contributing <#contributing>`_
+* `Credits <#credits>`_
+* `License <#license>`_
+
+Installation
+------------
+
+Q-CTRL Open Controls can be install through ``pip`` or from source. We recommend
+the ``pip`` distribution to get the most recent stable release. If you want the
+latest features then install from source.
+
+Requirements
+^^^^^^^^^^^^
+
+To use Q-CTRL Open Controls you will need an installation of Python. We recommend
+using the `Anaconda `_ distribution of Python. Anaconda
+includes standard numerical and scientific Python packages which are optimally
+compiled for your machine. Follow the `Anaconda Installation `_
+instructions and consult the `Anaconda User guide `_
+to get started.
+
+We use interactive jupyter notebooks for our usage examples. The Anaconda python
+distribution comes with editors for these files, or you can `install the jupyter
+notebook editor `_ on its own.
+
+Using PyPi
+^^^^^^^^^^
+
+Use ``pip`` to install the latest version of Q-CTRL Open Controls.
+
+.. code-block:: shell
+
+ pip install qctrl-open-controls
+
+From Source
+^^^^^^^^^^^
+
+The source code is hosted on `Github `_.
+The repository can be cloned using
+
+.. code-block:: shell
+
+ git clone git@github.com:qctrl/python-open-controls.git
+
+Once the clone is complete, you have two options:
+
+
+#.
+ Using setup.py
+
+ .. code-block:: shell
+
+ cd python-open-controls
+ python setup.py develop
+
+ **Note:** We recommend installing using ``develop`` to point your installation at
+ the source code in the directory where you cloned the repository.
+
+#.
+ Using Poetry
+
+ .. code-block:: shell
+
+ cd python-open-controls
+ ./setup-poetry.sh
+
+ **Note:** if you are on Windows, you'll need to install `Poetry `_
+ manually, and use:
+
+ .. code-block:: cmd
+
+ cd python-open-controls
+ poetry install
+
+Once installed via one of the above methods, test your installation by running ``pytest``
+in the ``python-open-controls`` directory.
+
+.. code-block:: shell
+
+ pytest
+
+Usage
+-----
+
+Usage depends on the application. We've provided a set of `example Jupyter notebooks `_
+addressing a variety of quantum control problems. Below is a short description
+of each notebook grouped by application. For further details on usage, use the
+inline documentation in the source code.
+
+Dynamical Decoupling Sequences (DDS)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Q-CTRL Open Controls can create a large library of standard DDS which can be exported
+in a variety of formats.
+
+Create a DDS
+~~~~~~~~~~~~
+
+`\ ``examples/creating_a_dds.ipynb`` `_ demonstrates
+how to use Q-CTRL Open Controls to create a DDS from a large library of published
+dynamical decoupling protocols. It also shows how to make Custom DDS with timings,
+offsets and unitaries defined by the user. The notebook shows how to export a
+DDS for deployment in the `Q-CTRL products `_ or your
+quantum hardware.
+
+Export a DDS to Qiskit
+~~~~~~~~~~~~~~~~~~~~~~
+
+`\ ``examples/export_a_dds_to_qiskit.ipynb`` `_
+demonstrates how to take a DDS and convert it to a Qiskit circuit so it can be
+run on IBM's quantum computers. It also demonstrates using a DDS to improve the
+performance of a quantum circuit execution by extending the coherence time of
+a qubit.
+
+Export a DDS to Cirq
+~~~~~~~~~~~~~~~~~~~~
+
+`\ ``examples/export_a_dds_to_cirq.ipynb`` `_ demonstrates
+how to take a DDS and convert it to a Cirq circuit or schdule. It also shows how
+to run a circuit or schedule in a Cirq simulator.
+
+Contributing
+------------
+
+See `Contributing `_.
+
+Credits
+-------
+
+See `Contributors `_.
+
+License
+-------
+
+See `LICENSE `_.
diff --git a/examples/creating_a_dds.ipynb b/examples/creating_a_dds.ipynb
deleted file mode 100644
index bbd0d8d7..00000000
--- a/examples/creating_a_dds.ipynb
+++ /dev/null
@@ -1,504 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Creating a Dynamical Decoupling Sequence\n",
- "\n",
- "This notebook illustrates how to use Q-CTRL Open Controls to create a [Dynamical Decoupling Sequence (DDS)](https://en.wikipedia.org/wiki/Dynamical_decoupling). \n",
- "\n",
- "Dynamical decoupling is the use of fast pulses, often treated as instant ideal unitary operations, on a qubit to decouple it from its environment and improve its coherence time. The train of pulses is called a sequence, hence DDS. DDS can be used to increase the coherence time of a qubit or they can be used as part of a characterization process to identify coherence time and/or noise spectra.\n",
- "\n",
- "Q-CTRL Open Controls can be used to create a DDS from a library of well-known dynamical decoupling schemes. Once created, it can be printed, plotted, exported in CSV or JSON format for use on a quantum computer or any of [Q-CTRL's products](https://q-ctrl.com/products/)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from qctrlopencontrols import new_predefined_dds, DynamicDecouplingSequence"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Predefined Dynamical Decoupling Schemes\n",
- "\n",
- "Q-CTRL Open Controls can create DDSs according to the following protocols:\n",
- "\n",
- "1. `Ramsey`\n",
- "2. `spin echo`\n",
- "3. `Carr-Purcell`\n",
- "4. `Carr-Purcell-Meiboom-Gill`\n",
- "5. `Uhrig`\n",
- "6. `periodic`\n",
- "7. `Walsh single-axis`\n",
- "8. `quadratic`\n",
- "9. `X concatenated`\n",
- "10. `XY concatenated`\n",
- "\n",
- "See the [technical documentation](https://docs.q-ctrl.com/control-formats#dynamical-decoupling-sequences) for details."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Creating and Printing a Dynamical Decoupling Sequence\n",
- "\n",
- "A DDS is defined as a set of instant unitary operations, each defined with by a `rabi_rotation`, a `azimuthal_angle`, a `detuning_angle`, and applied at a particular time (`offset`). The mathematical definition of a sequence is explained in the [technical documentation](http://docs.q-ctrl.com/control-library#dynamical-decoupling-sequences).\n",
- "\n",
- "Q-CTRL Open controls can generate a DDS from a library of dynamical decoupling schemes, mathematically defined in the [technical documentation](https://docs.q-ctrl.com/control-formats#dynamical-decoupling-sequences). Below we give a few examples of generating DDSs. The schemes are grouped into cells if they have common keywords."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "SE DDS:\n",
- "Duration = 1e-05\n",
- "Offsets = [0.5] x 1e-05\n",
- "Rabi Rotations = [1.0] x pi\n",
- "Azimuthal Angles = [0.0] x pi\n",
- "Detuning Rotations = [0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Spin echo sequence\n",
- "se_dds = new_predefined_dds(scheme='spin echo', duration=10e-6, name='SE DDS')\n",
- "print(se_dds)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CP DDS:\n",
- "Duration = 1e-05\n",
- "Offsets = [0.125,0.375,0.625,0.875] x 1e-05\n",
- "Rabi Rotations = [1.0,1.0,1.0,1.0] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,0.0,0.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Carr-Purcell sequence\n",
- "## 'Carr-Purcell-Meiboom-Gill', 'Uhrig single-axis' or 'Periodic single-axis' schemes use same keywords\n",
- "cp_dds = new_predefined_dds(\n",
- " scheme='Carr-Purcell', \n",
- " duration=10e-6, \n",
- " number_of_offsets = 4.,\n",
- " name='CP DDS')\n",
- "print(cp_dds)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Walsh DDS:\n",
- "Duration = 1e-05\n",
- "Offsets = [0.125,0.25,0.375,0.5,0.625,0.75,0.875] x 1e-05\n",
- "Rabi Rotations = [1.0,1.0,1.0,1.0,1.0,1.0,1.0] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Walsh single-axis\n",
- "walsh_dds = new_predefined_dds(\n",
- " scheme='Walsh single-axis', \n",
- " duration=10e-6, \n",
- " paley_order = 4.,\n",
- " name='Walsh DDS')\n",
- "print(walsh_dds)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Quadratic DDS:\n",
- "Duration = 1e-05\n",
- "Offsets = [0.06249999999999998,0.18749999999999994,0.24999999999999994,0.37499999999999994,0.6249999999999999,0.7499999999999999,0.8124999999999999,0.9375] x 1e-05\n",
- "Rabi Rotations = [0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Quadratic sequence\n",
- "quadratic_dds = new_predefined_dds(\n",
- " scheme='quadratic', \n",
- " duration=10e-6, \n",
- " number_inner_offsets = 2,\n",
- " number_outer_offsets = 2,\n",
- " name='Quadratic DDS')\n",
- "print(quadratic_dds)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "XC DDS:\n",
- "Duration = 1e-05\n",
- "Offsets = [0.25,0.75] x 1e-05\n",
- "Rabi Rotations = [1.0,1.0] x pi\n",
- "Azimuthal Angles = [0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## X concatenated sequence\n",
- "## 'XY concatenated' scheme uses the same keyword\n",
- "xc_dds = new_predefined_dds(\n",
- " scheme='X concatenated', \n",
- " duration=10e-6, \n",
- " concatenation_order = 2,\n",
- " name='XC DDS')\n",
- "print(xc_dds)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ramsey DDS:\n",
- "Duration = 1e-06\n",
- "Offsets = [] x 1e-06\n",
- "Rabi Rotations = [] x pi\n",
- "Azimuthal Angles = [] x pi\n",
- "Detuning Rotations = [] x pi\n"
- ]
- }
- ],
- "source": [
- "## Ramsay DDS\n",
- "ramsey_dds = new_predefined_dds(scheme='Ramsey', duration=1e-6, name='Ramsey DDS')\n",
- "print(ramsey_dds)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting a DDS\n",
- "\n",
- "Once created, Q-CTRL Open Controls provides the method `get_plot_formatted_arrays` to create a set of formatted arrays ready to be immediately plotted with Matplotlib. We use the `quadratic_dds` as a sample sequence to generate plots of the `rabi_rotations`, `azimuthal_angles` and `detuning_rotations`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0,0.5,'Detuning Rotation (rad)')"
- ]
- },
- "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": [
- "formatted_plot_data = quadratic_dds.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times'])\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 1, 3, figsize=(20,5))\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (s)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (s)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (s)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Exporting the Dynamical Decoupling Sequence\n",
- "\n",
- "Q-CTRL Open Controls enables exporting DDS in CSV or JSON format. An exported sequence is [formatted](https://docs.q-ctrl.com/control-formats) to be compatible with [Q-CTRL BLACK OPAL](https://app.q-ctrl.com).\n",
- "\n",
- "An ideal DDS is defined as a sequence of instantaneously-applied pulses (typically rotations around one or more of the Cartesian control axes - x,y,z). However, in reality, the rate of rotation is limited by the `maximum_rabi_rate` and/or `maximum_detuning_rate` for a given pulse. Due to this limiting factor, the target rotation is implemented over a control segment with finite duration. Q-CTRL Open Controls converts a `DynamicDecouplingSequence` into a `DrivenControl` before exporting the resulting `DrivenControl`. This conversion requires the `maximum_rabi_rate` and `maximum_detuning_rate` to be specified and raises an error if the conversion is not successful (i.e. overlapping control segments due to low `maximum_rabi_rate` or `maximum_detuning_rate` etc.).\n",
- "\n",
- "Q-CTRL Open Controls can export a sequence in either `cartesian` or `cylindrical` coordinates. For details, consult the [technical documentation](https://docs.q-ctrl.com/output-data-formats#q-ctrl-hardware).\n",
- "\n",
- "In the example below, we chose the `quadratic_dds` (created above) for exporting to a CSV file."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "file_type='CSV'\n",
- "filename='example_sequence.csv'\n",
- "\n",
- "\n",
- "quadratic_dds.export_to_file(\n",
- " filename=filename, \n",
- " file_type=file_type,\n",
- " maximum_rabi_rate=2e6*np.pi,\n",
- " maximum_detuning_rate=4e6*np.pi)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "rabi_rate,azimuthal_angle,detuning,duration,maximum_rabi_rate\n",
- "\n",
- "0.0,0.0,0.0,4.999999999999999e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.4999999999999994e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,9.999999999999997e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.4999999999999994e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,2.5000000000000015e-07,6283185.307179586\n",
- "\n",
- "1.0,0.0,0.0,5.000000000000003e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,8.749999999999997e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.499999999999997e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,2.2500000000000005e-06,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.499999999999993e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,8.750000000000001e-07,6283185.307179586\n",
- "\n",
- "1.0,0.0,0.0,4.999999999999994e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,2.50000000000001e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.499999999999993e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,1.0000000000000023e-06,6283185.307179586\n",
- "\n",
- "0.0,0.0,3.141592653589793,2.499999999999993e-07,6283185.307179586\n",
- "\n",
- "0.0,0.0,0.0,5.000000000000003e-07,6283185.307179586\n"
- ]
- }
- ],
- "source": [
- "## Reload the file and check its content to better understand the format\n",
- "with open(filename, 'rt') as handle:\n",
- " file_content = handle.readlines()\n",
- "for line in file_content:\n",
- " print(line)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Opening the Exported Sequence in Q-CTRL BLACK OPAL"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The exported CSV files are compatible for analysis by a suite of tools offered by [Q-CTRL BLACK OPAL](https://app.q-ctrl.com). For example, you can upload the exported file in the [1-QUBIT Workspace](https://app.q-ctrl.com/oneQubit) for further analysis. The process to upload a custom control is described in [Uploading and Evaluating Custom Controls](https://help.q-ctrl.com/black-opal/guides/uploading-and-evaluating-custom-controls). For a full capability of BLACK OPAL, consult [Q-CTRL Help](https://help.q-ctrl.com/black-opal)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Custom Definition of Dynamic Decoupling Sequence\n",
- "\n",
- "An arbitrary `DynamicDecouplingSequence` can be created by providing a `duration` along with arrays for the `rabi_rotations`, `azimuthal_angles`, `detuning_rotations` and offsets."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0,0.5,'Detuning Rotation (rad)')"
- ]
- },
- "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": [
- "_duration = 1.50\n",
- "_rabi_rotations = [np.pi, np.pi, 0., np.pi, np.pi]\n",
- "_azimuthal_angles = [np.pi/2, 0., 0., 0., np.pi/2]\n",
- "_detuning_rotations = [0., 0., np.pi, 0., 0.]\n",
- "_offsets = [0.25, 0.50, 0.75, 1.00, 1.25]\n",
- "_name = 'Custom DDS'\n",
- "\n",
- "custom_dds = DynamicDecouplingSequence(duration=_duration,\n",
- " rabi_rotations=_rabi_rotations,\n",
- " azimuthal_angles=_azimuthal_angles,\n",
- " detuning_rotations=_detuning_rotations,\n",
- " offsets=_offsets,\n",
- " name=_name)\n",
- "\n",
- "## let us plot and verify\n",
- "formatted_plot_data = custom_dds.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times'])\n",
- "\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 1, 3, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlim([0, _duration])\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlim([0, _duration])\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlim([0, _duration])\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n"
- ]
- },
- {
- "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.8"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/creating_a_driven_control.ipynb b/examples/creating_a_driven_control.ipynb
deleted file mode 100644
index 66df69f1..00000000
--- a/examples/creating_a_driven_control.ipynb
+++ /dev/null
@@ -1,427 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Creating a Driven Control\n",
- "\n",
- "This notebook illustrates how to use Q-CTRL Open Controls to create a driven control.\n",
- "\n",
- "A driven control represents a continuous drive on a the transition of a qubit with a tunable detuning. The Open Controls package allows you to generate driven controls that enact dynamically corrected gates (DCG). These dynamically corrected gates are able to achieve an arbitrary rotation of the bloch sphere (around any point on the equator), in a manner that is robust to dephasing and/or control noise. DCGs can be used as drop-in gate replacements to suppress errors in a quantum computation.\n",
- "\n",
- "Q-CTRL Open Controls can be used to create a driven control from a library of well-known control schemes. Once created, it can be printed, plotted, exported in CSV or JSON format for use on a quantum computer or any of [Q-CTRL's products](https://q-ctrl.com/products/)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from qctrlopencontrols import new_predefined_driven_control, DrivenControl"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Predefined Driven Control Schemes\n",
- "\n",
- "Q-CTRL Open Controls can create driven controls according to the following dynamically corrected gate protocols:\n",
- "\n",
- "1. `primitive`\n",
- "2. `BB1`\n",
- "3. `SK1`\n",
- "4. `CORPSE`\n",
- "5. `WAMF1`\n",
- "6. `SCROFULOUS`\n",
- "7. `COPRSE in BB1`\n",
- "8. `CORPSE in SK1`\n",
- "9. `CORPSE in SCROFULOUS`\n",
- "\n",
- "See the [technical documentation](https://docs.q-ctrl.com/control-library) for details."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Creating and Printing a Driven Control\n",
- "\n",
- "A driven control is made of a continuous drive on the qubits transition with a tunable detuning. The continuous drive is described by a piecewise constant function made of a set of segments. Each drive segment has a `rabi_rate` applied at a `azimuthal_angle` for a `duration`, with a `detuning`. The mathematical definition of a driven control is explained in the [technical documentation](http://docs.q-ctrl.com/control-library#dynamical-decoupling-sequences).\n",
- "\n",
- "Q-CTRL Open controls can generate a driven control from a library of dynamically corrected gate schemes, mathematically defined in the [technical documentation](https://docs.q-ctrl.com/control-formats#dynamical-decoupling-sequences). All dynamically corrected gates are derived from three quantities: \n",
- "\n",
- "* `maximum_rabi_rate` the maximum achievable rabi rate.\n",
- "* `rabi_rotation` the total rotation of the bloch sphere.\n",
- "* `azimuthal_angle` the angle to the center point of the rotation on the equator. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Primitive X-pi:\n",
- "Rabi Rates = [1.0] x 6.283185307179586\n",
- "Azimuthal Angles = [0.0] x pi\n",
- "Detunings = [0] x 0.0\n",
- "Durations = [1.0] x 0.5\n"
- ]
- }
- ],
- "source": [
- "## Primitive Pi pulse in X\n",
- "prim = new_predefined_driven_control(\n",
- " rabi_rotation=np.pi,\n",
- " azimuthal_angle=0,\n",
- " maximum_rabi_rate=2 * np.pi,\n",
- " scheme='primitive',\n",
- " name='Primitive X-pi'\n",
- ")\n",
- "print(prim)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "BB1 X-pi:\n",
- "Rabi Rates = [1.0,1.0,1.0,1.0] x 6.283185307179586\n",
- "Azimuthal Angles = [0.0,0.5804306232551663,1.7412918697654987,0.5804306232551663] x pi\n",
- "Detunings = [0,0,0,0] x 0.0\n",
- "Durations = [0.2,0.2,0.4,0.2] x 2.5\n"
- ]
- }
- ],
- "source": [
- "## BB1 Pi pulse in X (implements the same effective operation as above)\n",
- "bb1_x = new_predefined_driven_control(\n",
- " rabi_rotation=np.pi,\n",
- " azimuthal_angle=0,\n",
- " maximum_rabi_rate=2 * np.pi,\n",
- " scheme='BB1',\n",
- " name='BB1 X-pi'\n",
- ")\n",
- "print(bb1_x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "BB1 Y-pi/2:\n",
- "Rabi Rates = [1.0,1.0,1.0,1.0] x 6.283185307179586\n",
- "Azimuthal Angles = [0.5,1.0398930876747683,2.1196792630243046,1.0398930876747683] x pi\n",
- "Detunings = [0,0,0,0] x 0.0\n",
- "Durations = [0.1111111111111111,0.2222222222222222,0.4444444444444444,0.2222222222222222] x 2.25\n"
- ]
- }
- ],
- "source": [
- "## BB1 Pi/2 pulse in Y\n",
- "bb1_y = new_predefined_driven_control(\n",
- " rabi_rotation=np.pi/2,\n",
- " azimuthal_angle=np.pi/2,\n",
- " maximum_rabi_rate=2 * np.pi,\n",
- " scheme='BB1',\n",
- " name='BB1 Y-pi/2'\n",
- ")\n",
- "print(bb1_y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "SK1 Y-pi/2:\n",
- "Rabi Rates = [1.0,1.0,1.0] x 6.283185307179586\n",
- "Azimuthal Angles = [0.5,-0.03989308767476825,1.0398930876747683] x pi\n",
- "Detunings = [0,0,0] x 0.0\n",
- "Durations = [0.1111111111111111,0.4444444444444444,0.4444444444444444] x 2.25\n"
- ]
- }
- ],
- "source": [
- "## SK1 Pi/2 pulse in Y\n",
- "sk1 = new_predefined_driven_control(\n",
- " rabi_rotation=np.pi/2,\n",
- " azimuthal_angle=np.pi/2,\n",
- " maximum_rabi_rate=2 * np.pi,\n",
- " scheme='SK1',\n",
- " name='SK1 Y-pi/2'\n",
- ")\n",
- "print(sk1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CORPSE X-pi/2:\n",
- "Rabi Rates = [1.0,1.0,1.0] x 6.283185307179586\n",
- "Azimuthal Angles = [0.0,1.0,0.0] x pi\n",
- "Detunings = [0,0,0] x 0.0\n",
- "Durations = [0.5284727158825664,0.43811717424831853,0.033410109869114954] x 2.0199465438373845\n"
- ]
- }
- ],
- "source": [
- "## CORPSE Pi/2 pulse in X\n",
- "corpse = new_predefined_driven_control(\n",
- " rabi_rotation=np.pi/2,\n",
- " azimuthal_angle=0,\n",
- " maximum_rabi_rate=2 * np.pi,\n",
- " scheme='CORPSE',\n",
- " name='CORPSE X-pi/2'\n",
- ")\n",
- "print(corpse)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting a driven control\n",
- "\n",
- "Once created, Q-CTRL Open Controls provides the method `get_plot_formatted_arrays` to create a set of formatted arrays ready to be immediately plotted with Matplotlib. We use the `BB1` as a driven control to generate plots of the `rabi_rates`, `azimuthal_angles` and `detunings`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = bb1_x.get_plot_formatted_arrays(coordinates='cylindrical')\n",
- "rabi_rates, azimuthal_angles, detunings, times = (formatted_plot_data['rabi_rates'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detunings'],\n",
- " formatted_plot_data['times'])\n",
- "# prepare the axes\n",
- "figure, (x_axis, y_axis, z_axis) = plt.subplots(1, 3, figsize=(20,5))\n",
- "\n",
- "x_axis.fill_between(times, rabi_rates, 0, alpha=0.15, color='#680cea')\n",
- "x_axis.plot(times, rabi_rates, color='#680cea')\n",
- "x_axis.set_xlabel('Time (s)')\n",
- "x_axis.set_ylabel('Rabi Rate (radHz)')\n",
- "\n",
- "y_axis.fill_between(times, azimuthal_angles, 0, alpha=0.15, color='#680cea')\n",
- "y_axis.plot(times, azimuthal_angles, color='#680cea')\n",
- "y_axis.set_xlabel('Time (s)')\n",
- "y_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "z_axis.fill_between(times, detunings, 0, alpha=0.15, color='#680cea')\n",
- "z_axis.plot(times, detunings, color='#680cea')\n",
- "z_axis.set_xlabel('Time (s)')\n",
- "z_axis.set_ylabel('Detuning (radHz)')\n",
- "\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Exporting the Driven Control\n",
- "\n",
- "Q-CTRL Open Controls enables exporting driven controls in CSV or JSON format. An exported driven control is [formatted](https://docs.q-ctrl.com/control-formats) to be compatible with [Q-CTRL BLACK OPAL](https://app.q-ctrl.com).\n",
- "\n",
- "Q-CTRL Open Controls can export a driven control in either `cartesian` or `cylindrical` coordinates. For details, consult the [technical documentation](https://docs.q-ctrl.com/output-data-formats#q-ctrl-hardware).\n",
- "\n",
- "In the example below, we chose the `bb1_x` control (created above) for exporting to a CSV file."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "file_type='CSV'\n",
- "filename='example_driven_control.csv'\n",
- "\n",
- "bb1_x.export_to_file(\n",
- " filename=filename, \n",
- " file_type=file_type,\n",
- " coordinates='cartesian')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "amplitude_x,amplitude_y,detuning,duration,maximum_rabi_rate\n",
- "\n",
- "6.283185307179586,0.0,0.0,0.5,6.283185307179586\n",
- "\n",
- "-1.570796326794896,6.083668013960418,0.0,0.5,6.283185307179586\n",
- "\n",
- "4.319689898685962,-4.562751010470316,0.0,1.0,6.283185307179586\n",
- "\n",
- "-1.570796326794896,6.083668013960418,0.0,0.5,6.283185307179586\n"
- ]
- }
- ],
- "source": [
- "## Reload the file and check its content to better understand the format\n",
- "with open(filename, 'rt') as handle:\n",
- " file_content = handle.readlines()\n",
- "for line in file_content:\n",
- " print(line)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Opening the Exported Sequence in Q-CTRL BLACK OPAL"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The exported CSV files are compatible for analysis by a suite of tools offered by [Q-CTRL BLACK OPAL](https://app.q-ctrl.com). For example, you can upload the exported file in the [1-QUBIT Workspace](https://app.q-ctrl.com/oneQubit) for further analysis. The process to upload a custom control is described in [Uploading and Evaluating Custom Controls](https://help.q-ctrl.com/black-opal/guides/uploading-and-evaluating-custom-controls). For a full capability of BLACK OPAL, consult [Q-CTRL Help](https://help.q-ctrl.com/black-opal)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Custom Definition of a Driven Control\n",
- "\n",
- "An arbitrary `DrivenControl` can be defined defined using arrays of `rabi_rotations`, `azimuthal_angles`, `detuning_rotations` and `durations`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABJkAAAFACAYAAAAfw61rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xu0XXV97/33JwEEFUSbIJcQQZragwrK2AZUtFCrBY5K\ntaLgrRU0xUqP1aet1J56O+cZwz5Wn6qgMVoE2yrVo2DUKIoPFdRaExC506YUJSk2EblfDXyfP9YM\nLDZ776ydtdeaa+/9fo2xxp63NeeHyU5+Wd/1m79fqgpJkiRJkiSpHwvaDiBJkiRJkqTZzyKTJEmS\nJEmS+maRSZIkSZIkSX2zyCRJkiRJkqS+WWSSJEmSJElS3ywySZIkSZIkqW8WmSRJkiRJktQ3i0yS\nJEmSJEnqm0UmSZIkSZIk9W2HtgPMpEWLFtV+++3XdgxJGjkXX3zxz6tqcds52mQbIUmTs52wnZCk\nqfTaTsypItN+++3HunXr2o4hSSMnyU/aztA22whJmpzthO2EJE2l13bCx+UkSZIkSZLUN4tMkiRJ\nkiRJ6ptFJkmSJEmSJPXNIpMkSZIkSZL6ZpFJkiRJkiRJfbPIJEmSJEmSpL5ZZJIkSZIkSVLfLDJJ\nkkZOkjOSbEpyxST7k+QjSdYnuSzJIcPOKEmSJOnhLDJJkkbRmcBRU+w/GljWvFYAHx9CJkmSJElT\n2KHtAJI0ai46427WfuHetmM8wrOOexTPO3GXtmMMRVVdmGS/KQ45FvhMVRXwgyS7J9mrqm4cSkBJ\n89aothEwv9qJUeLvhCQ9xCKTJI2z9gv38tNLt7DHAaPT2XPT+vu5767yH4oP2Qe4oWt9Q7PNIpOk\ngRrFNgJsJ9rk74QkPcQikyRNYI8DFnDSp3drO8aDPv2m23lgS7UdY9ZJsoLO43QsXbq05TSS5opR\nayPAdqJt/k5IUsdoldslSerNRmDfrvUlzbaHqapVVTVWVWOLFy8eWjhJkiRpPrLIJEmajVYDr29m\nmTsMuNXxmCRpfuhhBtIjktya5NLm9a5hZ5Sk+crH5SRJIyfJ54AjgEVJNgDvBnYEqKqVwBrgGGA9\ncBfwhnaSSpJacCZwGvCZKY65qKpePJw4kqStLDJJkkZOVZ2wjf0FvGVIcSRJI6SHGUglSS3xcTlJ\nkiRJc81zklyW5OtJnjrZQUlWJFmXZN3mzZuHmU+S5iSLTJIkSZLmkkuApVV1EPBR4NzJDnSCCEma\nWRaZJEmSJM0ZVXVbVd3RLK8BdkyyqOVYkjQvWGSSJEmSNGck2TNJmuXldD7z3NRuKkmaHxz4W5Ik\nSdKs0cMMpK8A3pxkC3A3cHwzYYQkacAsMkmSJEmaNXqYgfQ04LQhxZEkdRlYkSnJGcCLgU1V9bQJ\n9v8p8JquHP8NWFxVv0hyPXA7cD+wparGBpVTkiRJkiRJ/RvkmExnAkdNtrOqPlBVz6iqZwB/Dnyn\nqn7RdciRzX4LTJIkSZIkSSNuYEWmqroQ+MU2D+w4AfjcoLJIkiRJkiRpsFqfXS7Jo+n0ePpi1+YC\nzk9ycZIV23j/iiTrkqzbvHnzIKNKkiRJkiRpEq0XmYCXAN8b96jc4c1jdEcDb0ny/MneXFWrqmqs\nqsYWL1486KySJEmSJEmawCgUmY5n3KNyVbWx+bkJOAdY3kIuSZIkSZIk9ajVIlOSxwG/AXy5a9tj\nkuy6dRl4EXBFOwklSZIkSZLUix0GdeIknwOOABYl2QC8G9gRoKpWNoe9DPhmVd3Z9dYnAuck2Zrv\ns1X1jUHllCRJkiRJUv8GVmSqqhN6OOZM4Mxx264DDh5MKkmSJEmSJA3CKIzJJEmSJEmSpFnOIpMk\nSZIkSZL6ZpFJkiRJkiRJfbPIJEmSJEmSpL5ZZJIkSZIkSVLfLDJJkiRJkiSpbxaZJEmSJEmS1Lcd\n2g6giV10xt2s/cK9bceYFZ513KN43om7tB1DkiRJkqR5zSLTiFr7hXv56aVb2OMAO5tNZdP6+7nv\nrrLIJEmSJElSyywyjbA9DljASZ/ere0YI+3Tb7qdB7ZU2zEkSZIkSZr37CYjSZIkSZKkvllkkiRJ\nkiRJUt8sMkmSJEmSJKlvFpkkSZIkSZLUN4tMkiRJkiRJ6ptFJkmSJEmSJPXNIpMkSZIkSZL6ZpFJ\nkiRJkiRJfbPIJEmSJEmSpL5ZZJIkSZIkSVLfLDJJkiRJkiSpbxaZJEmSJM0aSc5IsinJFZPsT5KP\nJFmf5LIkhww7oyTNVxaZJEmSJM0mZwJHTbH/aGBZ81oBfHwImSRJWGSSJEmSNItU1YXAL6Y45Fjg\nM9XxA2D3JHsNJ50kzW8DKzL10I31iCS3Jrm0eb2ra99RSa5turieOqiMkiRJkuacfYAbutY3NNse\nIcmKJOuSrNu8efNQwknSXDbInkxnMnU3VoCLquoZzet9AEkWAqfT6eZ6IHBCkgMHmFOSJEnSPFRV\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "_rabi_rates = [np.pi/2,np.pi/2,np.pi,np.pi]\n",
- "_azimuthal_angles = [0., -np.pi/2, 0., np.pi/2]\n",
- "_detunings = [np.pi/2, 0, -np.pi/2, 0]\n",
- "_durations = [0.5, 1, 2, 0.5]\n",
- "_name = 'Custon Driven Control'\n",
- "\n",
- "custom_driven_control = DrivenControl(rabi_rates=_rabi_rates, \n",
- " azimuthal_angles=_azimuthal_angles,\n",
- " detunings=_detunings,\n",
- " durations=_durations,\n",
- " name=_name)\n",
- "\n",
- "## let us plot and verify\n",
- "formatted_plot_data = custom_driven_control.get_plot_formatted_arrays(coordinates='cylindrical')\n",
- "rabi_rates, azimuthal_angles, detunings, times = (formatted_plot_data['rabi_rates'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detunings'],\n",
- " formatted_plot_data['times'])\n",
- "\n",
- "figure, (x_axis, y_axis, z_axis) = plt.subplots(1, 3, figsize=(20,5))\n",
- "\n",
- "x_axis.fill_between(times, rabi_rates, 0, alpha=0.15, color='#680cea')\n",
- "x_axis.plot(times, rabi_rates, color='#680cea')\n",
- "x_axis.set_xlabel('Time (s)')\n",
- "x_axis.set_ylabel('Rabi Rate (radHz)')\n",
- "\n",
- "y_axis.fill_between(times, azimuthal_angles, 0, alpha=0.15, color='#680cea')\n",
- "y_axis.plot(times, azimuthal_angles, color='#680cea')\n",
- "y_axis.set_xlabel('Time (s)')\n",
- "y_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "z_axis.fill_between(times, detunings, 0, alpha=0.15, color='#680cea')\n",
- "z_axis.plot(times, detunings, color='#680cea')\n",
- "z_axis.set_xlabel('Time (s)')\n",
- "z_axis.set_ylabel('Detuning (radHz)')\n",
- "\n",
- "plt.show()"
- ]
- }
- ],
- "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.8"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/export_a_dds_to_cirq.ipynb b/examples/export_a_dds_to_cirq.ipynb
deleted file mode 100644
index 71f908ad..00000000
--- a/examples/export_a_dds_to_cirq.ipynb
+++ /dev/null
@@ -1,362 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Export a Dynamical Decoupling Sequence to Cirq\n",
- "\n",
- "Q-CTRL Open Controls provides easy-to-use methods to construct Dynamical Decoupling Sequences (DDS) according to well-known dynamical decoupling schemes. This is described in the [creating a DDS notebook](creating_a_dds.ipynb). Here we show how a DDS from Q-CTRL Open Controls can be exported as `cirq.Circuit` or `cirq.Schedule` and run in `cirq.Simulator`.\n",
- "\n",
- "Note : You can install `cirq` by simply running `pip install cirq`. Please consult [Cirq Documentation](https://cirq.readthedocs.io/en/stable/) for installation instruction and general introduction to `cirq` package."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "#General\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from matplotlib.gridspec import GridSpec\n",
- "\n",
- "#Q-CTRL Open Controls\n",
- "from qctrlopencontrols import new_predefined_dds, convert_dds_to_cirq_circuit, convert_dds_to_cirq_schedule\n",
- "\n",
- "#Cirq : to run the circuit on simulator\n",
- "import cirq"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Running a DDS on a Cirq Simulator\n",
- "\n",
- "This section demonstrates how a DDS can be prepared, a corresponding quantum circuit made and executed on a `cirq` simulator.\n",
- "\n",
- "Q-CTRL Open Controls defines a DDS as a set of instantaneous unitary operations performed at specific offset times, see the [technical documentation](https://docs.q-ctrl.com/control-library#dynamical-decoupling-sequences) for mathematical details.\n",
- "\n",
- "`cirq` implements quantum operations through a series of [gates](https://cirq.readthedocs.io/en/stable/gates.html). Standard way to create a circuit is through `cirq.Circuit` that accepts a list of valid gates. If a user wants to add pauses (in time) during a computation they can use identity gates. Alternatively, `cirq` provides `ScheduledOperation` that specifies an operation (application of a gate on one more qubits) at a certain instant measured in \"nano-seconds\" or \"pico-seconds\" from the start of the sequence. A list of `ScheduledOperation` is collated by `cirq.Schedule`. Both `cirq.Circuit` and `cirq.Schedule` can be used in `cirq.Simulator` to simulate the circuit. We provide two methods -`convert_dds_to_cirq_circuit` and `covert_dds_to_cirq_schedule` to select between `cirq.Circuit` and `cirq.Schedule` as desired output from the conversion method.\n",
- "\n",
- "Converting a DDS into a `cirq.Circuit` or `cirq.Schedule` is an approximate process where the instantaneous unitaries are replaced with finite duration gates. Moreover, in `cirq.Circuit`, the pauses in-between unitaries are replaced with the closest integer number of identity gates. The exact algorithm used to make this approximation is documented in the [source code](../qctrlopencontrols/cirq/cirq_circuit.py).\n",
- "\n",
- "In this example we will define a Quadratic DDS and convert it into a circuit that we can later run on a simulator. Note that we add a $X_{\\pi/2}$ rotation at both ends of the sequence. See [creating_a_dds.ipynb](creating_a_dds.ipynb) to see how other sequences can be created."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Preparing the Sequences"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Quadratic sequence:\n",
- "Duration = 2e-05\n",
- "Offsets = [0.0,0.06249999999999998,0.18749999999999994,0.24999999999999994,0.37499999999999994,0.6249999999999999,0.7499999999999999,0.8124999999999999,0.9375,1.0] x 2e-05\n",
- "Rabi Rotations = [0.5,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.5] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Quadratic sequence, total duration: 20us\n",
- "quadratic_sequence = new_predefined_dds(\n",
- " scheme='quadratic',\n",
- " duration=20e-6, \n",
- " number_inner_offsets=2,\n",
- " number_outer_offsets=2,\n",
- " pre_post_rotation=True,\n",
- " name='Quadratic sequence')\n",
- "print(quadratic_sequence)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Constructing the Circuit Using Q-CTRL Open Controls\n",
- "\n",
- "To construct a circuit/schedule from a DDS, we need to provide the DDS (`dynamic_decoupling_sequence`). You can also provide a list of target qubits (each of `cirq.Qid` type) to indicate qubits on which the DDS will be applied. `gate_time` is the delay (in seconds) introduced by each of the gates. If measurement is required, use `add_measurement=True`.\n",
- "\n",
- "See the [source code](../qctrlopencontrols/cirq/cirq_circuit.py) for more information and other parameters that may be useful.\n",
- "\n",
- "In this example, we will use a single qubit on 1-D lattice. We specify the `gate_time` to be $0.4$ $\\mu$s. Finally we will add a measurement operation. In this example we will convert the DDS into a `cirq.Circuit`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "## Prepare the conversion related parameters\n",
- "'''\n",
- "target_qubits : list\n",
- " A list of cirq.Qid. In this case we are using a single\n",
- " qubit (indexed 0) on 1-D lattice.\n",
- "'''\n",
- "target_qubits = [cirq.LineQubit(0)]\n",
- "\n",
- "\n",
- "'''\n",
- "gate_time : float\n",
- " Time delay (in seconds) introduced by identity gate\n",
- "'''\n",
- "gate_time = 0.4e-6\n",
- "\n",
- "'''\n",
- "add_measurement : bool\n",
- " Indicates if the circuit requires a measurement step.\n",
- " Required for 'qasm_simulator' and real device backends\n",
- "'''\n",
- "add_measurement = True\n",
- "\n",
- "## convert the quadratic sequence to cirq.Circuit\n",
- "quadratic_cirq_circuit = convert_dds_to_cirq_circuit(\n",
- " dynamic_decoupling_sequence=quadratic_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting the DDS\n",
- "\n",
- "We can use Q-CTRL Open Controls to plot the DDS for comparison against its `cirq.Circuit` approximations."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = quadratic_sequence.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (\n",
- " formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times']\n",
- ")\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 3, 1, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n",
- "\n",
- "plt.suptitle('Quadratic Sequence')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Drawing the Circuit\n",
- "\n",
- "We can draw a text diagram of the `cirq.Circuit` generated by Q-CTRL Open Controls.\n",
- "\n",
- "Note that a $X_{\\pi/2}$ rotation will be added at beginning and end, that is, at offsets of $[0, 20]$ $\\mu$s, to create the desired superposition state. The $X_{\\pi/2}$ rotations are implemented using $Rx($0.5\\pi$)$ gate.\n",
- "\n",
- "The $Rz(\\pi)$ gates are $Z_\\pi$ pulses (a $\\pi$ rotation around $Z$-axis) and $Rx(\\pi)$ gates correspond to $X_{\\pi}$ pulses (a $\\pi$ rotation around $X$-axis). The gates match the pulses in the DDS.\n",
- "\n",
- "The `I` in the drawing corresponds to the `identity` gate. In the DDS, the first $Z_{\\pi}$-pulse is applied at a delay of $1.25$ $\\mu$s. This is approximated by introducing 3-`Id` gates with a delay of $0.4\\times 3=1.2$ $\\mu s$. Similarly, the second set of 6 Id gates introduces a delay of 2.4$\\mu s$ close to the actual delay of $3.75−1.25=2.50\\mu s$.\n",
- "\n",
- "At the end of the circuit, we placed a `measurement` ($M$) operator to read out the result."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0: ─Rx(0.5π)─I─I─I─Rz(π)─I─I─I─I─I─I─Rz(π)─I─I─I─Rx(π)─I─I─I─I─I─I─Rz(π)─I─I─I─I─I─I─I─I─I─I─I─I─Rz(π)─I─I─I─I─I─I─Rx(π)─I─I─I─Rz(π)─I─I─I─I─I─I─Rz(π)─I─I─I─Rx(0.5π)─M('qubit-0')─\n"
- ]
- }
- ],
- "source": [
- "##Drawing the Quadratic Circuit\n",
- "print(quadratic_cirq_circuit.to_text_diagram_drawer().render())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Run the Circuit on Cirq Simulator using Cirq API\n",
- "\n",
- "Consult [Simulation](https://cirq.readthedocs.io/en/stable/simulation.html) for a description of available simulation APIs and their properties. Here, we will use the `run` method of `cirq.Simulator` to run the circuit. The circuit is run upto `repetitions` times. The result is printed after the simulation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "qubit-0=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\n",
- "Counter({1: 100})\n"
- ]
- }
- ],
- "source": [
- "##### Set the simulator parameters\n",
- "'''\n",
- "repetitions : int\n",
- " The number of times the circuit will be executed\n",
- "'''\n",
- "repetitions = 100\n",
- "\n",
- "## Create the simulator\n",
- "simulator = cirq.Simulator()\n",
- "\n",
- "#Run the simulator and collect result\n",
- "result = simulator.run(quadratic_cirq_circuit, repetitions=repetitions)\n",
- "\n",
- "#print the outcome of each repetition\n",
- "print(result)\n",
- "\n",
- "#you can also collect the outcome as histogram (calculated as dict)\n",
- "print(result.histogram(key=['qubit-0']))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Creating a Schedule and running on Cirq Simulator\n",
- "\n",
- "We can create a `cirq.Schedule` from the DDS using `convert_dds_to_cirq_schedule` method."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "qubit-0=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\n",
- "Counter({1: 100})\n"
- ]
- }
- ],
- "source": [
- "## convert the quadratic sequence to cirq.Schedule\n",
- "quadratic_cirq_circuit = convert_dds_to_cirq_schedule(\n",
- " dynamic_decoupling_sequence=quadratic_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement\n",
- ")\n",
- "\n",
- "##### Set the simulator parameters\n",
- "'''\n",
- "repetitions : int\n",
- " The number of times the circuit will be executed\n",
- "'''\n",
- "repetitions = 100\n",
- "\n",
- "## Create the simulator\n",
- "simulator = cirq.Simulator()\n",
- "\n",
- "#Run the simulator and collect result\n",
- "result = simulator.run(quadratic_cirq_circuit, repetitions=repetitions)\n",
- "\n",
- "#print the outcome of each repetition\n",
- "print(result)\n",
- "\n",
- "#you can also collect the outcome as histogram (calculated as dict)\n",
- "print(result.histogram(key=['qubit-0']))"
- ]
- },
- {
- "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.8"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/export_a_dds_to_pyquil.ipynb b/examples/export_a_dds_to_pyquil.ipynb
deleted file mode 100755
index cd73618e..00000000
--- a/examples/export_a_dds_to_pyquil.ipynb
+++ /dev/null
@@ -1,853 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Export a Dynamical Decoupling Sequence to Pyquil\n",
- "\n",
- "Q-CTRL Open Controls provides easy-to-use methods to construct Dynamical Decoupling Sequences (DDS) according to well-known dynamical decoupling schemes. This is described in the [creating a DDS notebook](creating_a_dds.ipynb). Here we show how a DDS from Q-CTRL Open Controls can be exported to a `Program` defined in Pyquil.\n",
- "\n",
- "Note: To create a quantum program, you need to install `pyquil` package. Follow the [instruction](http://docs.rigetti.com/en/stable/start.html) to install `pyquil`. Moreover, in order to simulate the quantum program, you will require the [ForestSDK](https://www.rigetti.com/forest). Follow the [instruction] (http://docs.rigetti.com/en/stable/start.html) to obtain and install ForestSDK on your computer."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "#General\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from matplotlib.gridspec import GridSpec\n",
- "\n",
- "#Q-CTRL Open Controls\n",
- "from qctrlopencontrols import (\n",
- " new_predefined_dds, convert_dds_to_pyquil_program)\n",
- "\n",
- "#pyquil\n",
- "from pyquil.api import get_qc"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Running a DDS on a Pyquil Quantum Virtual Machine (QVM)\n",
- "\n",
- "This section demonstrates how a DDS can be prepared and a corresponding Pyquil program made and executed on a Quantum Virtual Simulator (QVM).\n",
- "\n",
- "Q-CTRL Open Controls defines a DDS as a set of instantaneous unitary operations performed at specific offset times, see the [technical documentation](https://docs.q-ctrl.com/control-library#dynamical-decoupling-sequences) for mathematical details.\n",
- "\n",
- "Pyquil implements quantum computation through `Program` that contains a series of [gates](http://docs.rigetti.com/en/stable/apidocs/gates.html). How these gates are physically implemented will depend on the device that it is run on. Rigetti's documentation gives an oversight on Rigetti's [native gates](http://docs.rigetti.com/en/stable/apidocs/gates.html#native-gates-for-rigetti-qpus)] and other [physically realizable gates](http://docs.rigetti.com/en/stable/apidocs/gates.html#all-gates-and-instructions).\n",
- "\n",
- "If a user wants to add pauses (in time) during a computation they can use identity gates. However, executing a quantum program with identity gates cause the compiler to remove the gates before execution to increase efficiency. This can be avoided by using `Pragma PRESERVE` blocks (see [documentation](http://docs.rigetti.com/en/stable/basics.html#pragmas) for more detail and other usages of `Pragma`).All of $I$ (identity gate), $RX$ (X-rotation gates) and $RY$ (Y-rotation gates) take a fixed time (`gate_time`).\n",
- "\n",
- "Converting a DDS into a Pyquil program is an approximate process where the instantaneous unitaries are replaced with finite duration gates and the pauses in-between unitaries are replaced with the closest integer number of identity gates. The exact algorithm used to make this approximation is documented in the [source code](XXXX).\n",
- "\n",
- "In this example we will define a Quadratic DDS and convert it into a program that we can later run on a simulator and on a real device. See [creating_a_DDS.ipynb](creating_a_DDS.ipynb) to see how other sequences can be created. We also create a Ramsey DDS of the same duration to compare as a benchmark. For both the sequences, we add a $X_{\\pi/2}$ rotation on either end of the sequence."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Preparing the Sequences"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Quadratic sequence:\n",
- "Duration = 5e-06\n",
- "Offsets = [0.0,0.06249999999999998,0.18749999999999994,0.24999999999999994,0.37499999999999994,0.6249999999999999,0.7499999999999999,0.8124999999999999,0.9375,1.0] x 5e-06\n",
- "Rabi Rotations = [0.5,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.5] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0] x pi\n",
- "Ramsey sequence:\n",
- "Duration = 5e-06\n",
- "Offsets = [0.0,1.0] x 5e-06\n",
- "Rabi Rotations = [0.5,0.5] x pi\n",
- "Azimuthal Angles = [0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Quadratic sequence, total duration: 20us\n",
- "quadratic_sequence = new_predefined_dds(\n",
- " scheme='quadratic',\n",
- " duration=5e-6, \n",
- " number_inner_offsets=2,\n",
- " number_outer_offsets=2,\n",
- " pre_post_rotation=True,\n",
- " name='Quadratic sequence')\n",
- "print(quadratic_sequence)\n",
- "\n",
- "## Ramsey sequence, total duration: 20us\n",
- "ramsey_sequence = new_predefined_dds(\n",
- " scheme='Ramsey',\n",
- " duration=5e-6,\n",
- " pre_post_rotation=True,\n",
- " name='Ramsey sequence')\n",
- "print(ramsey_sequence)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Constructing the Program Using Q-CTRL Open Controls\n",
- "\n",
- "To construct a `Program` from a DDS, we need to provide the DDS (`dynamic_decoupling_sequence`). You can also provide a list (`target_qubits`) to indicate qubit indices on which the DDS will be applied. `gate_time` is the delay (in seconds) introduced by each of the `identity` gates. If measurement is required, use `add_measurement=True`.\n",
- "\n",
- "In this example, we will use $1$st qubit and specify the `gate_time` to be $50$ $n$s (see same [specification](http://docs.rigetti.com/en/stable/apidocs/autogen/pyquil.noise.add_decoherence_noise.html#pyquil.noise.add_decoherence_noise)). Both the DDS will require a measurement operation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "## Prepare the Pyquil related parameters\n",
- "'''\n",
- "target_qubits : list\n",
- " A list of integers specifying the target qubits within the set of qubit registers\n",
- "'''\n",
- "target_qubits = [1]\n",
- "\n",
- "'''\n",
- "gate_time : float\n",
- " Time delay (in seconds) introduced by identity gate\n",
- "'''\n",
- "gate_time = 50e-9\n",
- "\n",
- "'''\n",
- "add_measurement : bool\n",
- " Indicates if the program requires a measurement step.\n",
- "'''\n",
- "add_measurement = True\n",
- "\n",
- "## convert the quadratic sequence to program\n",
- "quadratic_program = convert_dds_to_pyquil_program(\n",
- " dynamic_decoupling_sequence=quadratic_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement,\n",
- ")\n",
- "## convert the ramsey sequence to program\n",
- "ramsey_program = convert_dds_to_pyquil_program(\n",
- " dynamic_decoupling_sequence=ramsey_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement,\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting the DDS\n",
- "\n",
- "We can use Q-CTRL Open Controls to plot the DDS for comparison against their Pyquil program approximations."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Plotting the Quadratic Sequence"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ0AAAFhCAYAAADa2NuCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzde5hddX3v8feHgAQlASRBkVtQqZ5gFXRULNQjtFVUhNYLoOLxVml78BgrtYL1HNG2ovVo9XiphksFVPCCl2hRAeVSKiIJokCAiggSjBJuJlJAAt/zx16jmzCT2ZnZO2vP5P16nv3MWr91+8xMliFff5dUFZIkSZIkSVI/bdZ2AEmSJEmSJM08Fp0kSZIkSZLUdxadJEmSJEmS1HcWnSRJkiRJktR3Fp0kSZIkSZLUdxadJEmSJEmS1HcWnSRJ0oySZEGSSrJ5H+/59iQn9ut+kiRJmwKLTpIkaeCSvCbJFUn+K8kvknw8yTZt5xpLkuckWdHdVlXvqao/n8S99kxydpLbk9yZZFmSF/QvrSRJ0vCy6CRJkgYqydHA+4C3AtsA+wALgLOTbLGRsyTJxvzvn68B5wCPBnYA3gSs3ojPlyRJao1FJ0mSNDBJ5gLvAv5XVX2zqu6rqhuAQ4HHAq9ozvtUkn/ouu5BvY2SHJPkJ0nWJFme5M+6js1K8n+T3JrkeuCF62Q4P8k/JvkP4L+AxyZ5bZKrm/tdn+QvmnMfAXwDeEySXzefxyQ5Lsmnu+65X5LvNr2XbkrymjG+93nA7sAJVfWb5vMfVXVR1zkHJbm8uc93kzy569jeSS5rMn4uyRmjP6Om59hF6zyvkjy+2d6y+Zn8LMkvk3wiyVbdP9skRye5JcnKJK/tus9WST6Q5MYkv0pyUde1+3R93z9M8pz1/PolSdImzqKTJEkapD8AZgNf6m6sql8DZwHP7fE+PwH+kE5PqXcBn06yY3PsDcBBwN7ACPDSMa5/FXAkMAe4EbiluWYu8Frgn5M8taruAp4P/Lyqtm4+P+++UZLd6BSmPgLMB/YCLh/jmbcB1zVZ/zTJo9a5z97AycBfANsDnwSWNAWjhwFfAU4DHgl8AXhJLz+oxnuB32uyPR7YCfg/XccfTednuRPweuBjSbZrjv1f4Gl0fnePBP4WeCDJTsC/Af/QtP8NcGaS+RuQS5IkbUIsOkmSpEGaB9xaVWvHOLaSTtFmQlX1har6eVU9UFWfA34MPKM5fCjwoaq6qapuB44f4xafqqqrqmpt09vq36rqJ9VxAXA2naJWL14BnFtVpzf3uq2qHlJ0qqoC9gduAD4ArExyYZI9mlOOBD5ZVZdU1f1VdQpwL53hh/sAWzTf131V9UXg0l7CJUlz77+uqturag3wHuDwrtPuA97d3Pss4NfAE5qhh68DFlXVzU2u71bVvcARwFlVdVbzezgHWAo4R5UkSRqTRSdJkjRItwLzxllJbsfm+ISS/I+uYWh3Ak+iU9ACeAxwU9fpN45xi+7jJHl+ku+NTvBNp3Ayb4zrxrILnZ5XE6qqFVX1xqp6HLAbcBdwanN4N+Do0e+pybFL8/08Bri5KVyt7/say3zg4cCyrvt+kwcX+G5bpxD4X8DWdH4Gs8f5/nYDXrZO3v3o/B4lSZIewqKTJEkapIvp9N55cXdjkq3pDGM7v2m6i06hZNSju87dDTgBeCOwfVVtC1wJpDllJZ1izahdx8jx2+JNki2BM+kMI3tUc7+zuu5XD738QW4CHjfBOQ8NUHUT8DE6BbPR+/xjVW3b9Xl4VZ3efE87Nb2Wxvq+HvTzSvLormO3AncDe3bdd5uq2rqHmLcC94zz/d0EnLZO3kdU1Xt7uK8kSdoEWXSSJEkDU1W/ojMH00eSHJhkiyQLgM/TKXB8pjn1cuAFSR7ZFFDe3HWbR9ApBK0CaCa9flLX8c8Db0qyczMv0TETxHoYsGVzv7VJns+D55b6JbB9km3Guf4zwB8nOTTJ5km2T7LXuicl2S7Ju5I8PslmzcTirwO+15xyAvCXSZ6ZjkckeWGSOXSKdWub72uLJC/md8MJAX4I7JlkrySzgeNGD1TVA829/znJDk2WnZI8b4Kfy+i1JwMfbCZQn5XkWU2h7tPAi5I8r2mf3UxKvvNE95UkSZsmi06SJGmgquqfgLfT6Vm0BvgpnV46f9xM3A2dCbN/SGf+o7OBz3Vdv5zOnEgX0ykI/T7wH12POAH4VnP9ZawzafkYedYAb6JTrLqDzhxNS7qOXwOcDlzfDCN7zDrX/4zOcLyjgdvpFMyeMsajfgMsAM4FVtPpnXUv8JrmPkvpTIL+0SbHdV3HfkOnd9hrmmcc1v19VdV/Au9u7v1j4EEr2QFva+73vSSrm/OesL6fS5e/Aa6gM4fU7cD7gM2anlqH0PldrqLT8+mt+N+TkiRpHHnwVAGSJEmD1fRUejewb1PAUQ+SfApYUVXvaDuLJElSL8aa1FOSJGlgqupfk6wF/gCw6CRJkjRDWXSSJEkbXVWd1nYGSZIkDZbD6yRJkiRJktR3TvwoSZIkSZKkvrPoJEmSJEmSpL6z6CRJkiRJkqS+s+gkSZIkSZKkvrPoJEmSJEmSpL6z6CRJkiRJkqS+s+gkSZIkSZKkvrPoJEmSJEmSpL6z6CRJkiRJkqS+s+gkSZIkSZKkvrPoJEmSJEmSpL6z6CRJkiRJkqS+s+gkSZIkSZKkvtu87QCjkmwHPAa4G7ihqh5oOZIkSZIkSZImKVXV3sOTbYCjgJcDDwNWAbOBRwHfAz5eVee1FlCSJEmSJEmT0nZPpy8CpwJ/WFV3dh9I8jTgVUkeW1UntZJOkiRJkiRJk9JqTydJkiRJkiTNTK32dEry1PUdr6rLNlYWSZIkSZIk9U/bczqNztc0GxgBfggEeDKwtKqe1VY2SZIkSZIkTd5mbT68qvavqv2BlcBTq2qkqp4G7A3c3GY2SZIkSZIkTV6rRacuT6iqK0Z3qupK4L+1mEeSJEmSJElT0PbqdaN+lORE4NPN/iuBH7WYR5IkSZIkSVMwFKvXJZkN/BXw7KbpQuBfquqefj5n3rx5tWDBgn7eUpIkSZIkaZO2bNmyW6tq/rrtQ1F02lhGRkZq6dKlbceQJEmSJEmaMZIsq6qRdduHYnhdkj2A44GFdFayA6CqHttaKEmSJEmSJE3asEwk/q/AvwBrgf2BU/nd/E6StEk74sRLOOLES9qOIUmSBsS/6yXNVEPR0wnYqqq+nSRVdSNwXJJlwP9pO5gkte2i625tO4IkSRog/66XNFMNS9Hp3iSbAT9O8kbgZmDrljNJkiRJkiRpkoZleN0i4OHAm4CnAUcAr241kSRJkiRJkiat9Z5OSWYBh1XV3wC/Bl7bciRJkiRJkiRNUes9narqfmC/tnNIkiRJkiSpf1rv6dT4QZIlwBeAu0Ybq+pL7UWSJEmSJEnSZA1L0Wk2cBtwQFdbARadJEmSJEmSpqGhKDpVlfM4SZIkSZIkzSCtzumU5B1JHrme4wckOWhjZpIkSZIkSdLUtd3T6Qrga0nuAS4DVtEZarcHsBdwLvCe9uJJkiRJkiRpMlotOlXVV4GvJtkD2BfYEVgNfBo4sqrubjOfJEmSJEmSJqftnk4AVNWPgR+3nUOSJEmSJEn90eqcTpIkSZIkSZqZLDpJkiRJkiSp7yw6SZIkSZIkqe+GouiU5J+SzE2yRZJvJ1mV5Ii2c0mSJEmSJGlyhqLoBDy3qlYDBwE3AI8H3tpqIkmSJEmSJE3asBSdRlfReyHwhar6VZthJEmSJEmSNDWbT3zKRvH1JNcAdwN/lWQ+cE/LmSRJkiRJkjRJQ9HTqaqOAf4AGKmq+4C7gEPaTSVJkiRJkqTJGpaeTgBPBBYk6c50althJEmSJEmSNHlDUXRKchrwOOBy4P6mubDoJEmSJEmSNC0NRdEJGAEWVlX1ekGSXegUpR5Fp0C1uKo+PKB8kiRJkiRJ2gBDMacTcCXw6A28Zi1wdFUtBPYBjkqysO/JJEmSJEmStMGGpafTPGB5ku8D9442VtXB411QVSuBlc32miRXAzsBywecVZIkSZIkSRMYlqLTcVO5OMkCYG/gkj5kkSRJkiRJ0hQNxfC6qroAuAaY03yubtomlGRr4EzgzVW1eozjRyZZmmTpqlWr+hlbkiRJkiRJ4xiKolOSQ4HvAy8DDgUuSfLSHq7bgk7B6TNV9aWxzqmqxVU1UlUj8+fP72dsSZIkSZIkjWNYhtf9HfD0qroFIMl84Fzgi+NdkCTASXR6RX1wo6SUJEmSJElST4aipxOw2WjBqXEbE2fbF3gVcECSy5vPCwaWUJIkSZIkST0blp5O30zyLeD0Zv8w4Kz1XVBVFwEZdDBJkiRJkiRtuKEoOlXVW5O8hE7vJYDFVfXlNjNJkiRJkiRp8oai6ARQVWfSmRRckiRJkiRJ01yrRackF1XVfknWANV9CKiqmttSNEmSJEmSJE1Bq0Wnqtqv+TqnzRySJEmSJEnqr6FYvS7Jab20CY448RKOOPGStmNIkiRJkqRJ2lT+bT8sczrt2b2TZHPgaS1lGWoXXXdr2xEkSZIkSdIUbCr/tm+1p1OSY5v5nJ6cZHXzWQP8Evhqm9kkSZIkSZI0ea0Wnarq+GY+p/dX1dzmM6eqtq+qY9vMJkmSJEmSpMkbiuF1VXVsku2APYDZXe0XtpdKkiRJkiRJkzUURackfw4sAnYGLgf2AS4GDmgzlyRJkiRJkiZnKFavo1NwejpwY1XtD+wN3NluJEmSJEmSJE3WsBSd7qmqewCSbFlV1wBPaDmTJEmSJEmSJmkohtcBK5JsC3wFOCfJHcCNLWeSJEmSJEnSJA1F0amq/qzZPC7JecA2wDdajCRJkiRJkqQpGIrhdUlOG92uqguqaglwcouRJEmSJEmSNAVDUXQC9uzeSTILeFpLWSRJkiRJkjRFrRadkhybZA3w5CSrk6xp9m8BvtpmNkmSJEmSJE1eq0Wnqjq+quYA76+quVU1p/lsX1XHtplNkiRJkiRJkzcsE4kfm+Rg4NlN0/lV9fU2M0mSJEmSJGnyhmJOpyTHA4uA5c1nUZL3tJtKkiRJkiRJkzUUPZ2AFwJ7VdUDAElOAX4AvL3VVJIkSZIkSZqUoejp1Ni2a3ub1lJIkiRJkiRpyoalp9PxwA+SnAeEztxOTiQuSZIkSZI0TQ1F0amqTk9yPvD0pultVfWLFiNJkiRJkiRpCoZmeF1VrayqJVW1BJib5IS2M0mSJEmSJGlyWi06JXlykrOTXJnkH5LsmORM4Dt0VrGTJEmSJEnSNNR2T6cTgM8CLwFWAZcDPwEeX1X/3GYwSZIkSZIkTV7bczptWVWfaravTbKoqv62zUCSJEmSJEmauraLTrOT7E1nxTqAe7v3q+qy1pJJkiRJkiRp0touOq0EPti1/4uu/QIO2OiJJEmSJEmSNGWtFp2qav82ny9JkiRJkqTBaHsicUmSJEmSJM1AFp0kSZIkSZLUdxadJEmSJEmS1HetzumU5IlVdU2Sp4513NXrJEmSJEmSpqe2V697C3Ak8IExjrl6nSRJkiRJ0jTV9up1RzZfXcVOkiRJkiRpBmm7pxMASWYD/xPYj04Pp38HPlFV97QaTJIkSZIkSZMyLBOJnwrsCXwE+GizfdpEFyU5MMm1Sa5LcsyAM0qSJEmSJKlHQ9HTCXhSVS3s2j8vyfL1XZBkFvAx4E+AFcClSZZU1XqvkyRJkiRJ0uANS9HpsiT7VNX3AJI8E1g6wTXPAK6rquuba84ADgE2iaLTYZ+8uO0IkjYy33tJkmY2/66XNNO0WnRKcgWdOZy2AL6b5GfN/m7ANRNcvhNwU9f+CuCZYzzjSDor5LHrrrv2IXW7Zm+xGffc90DbMSRJkiRJ0hTM3mJYZjwanLZ7Oh006AdU1WJgMcDIyEgN+nmDds3fP7/tCJIkSZIkSRNqtehUVTd27yfZAZjd4+U3A7t07e/ctEmSJEmSJKllQ9GXK8nBSX4M/BS4ALgB+MYEl10K7JFk9yQPAw4Hlgw0qCRJkiRJknqSqvZHnCX5IXAAcG5V7Z1kf+CIqnr9BNe9APgQMAs4uar+cYLzVwE3ru+caWIecGvbIaRpwHdF6o3vitQb3xWpN74rUm9m0ruyW1XNX7dxWIpOS6tqpCk+7V1VDyT5YVU9pe1sw2j059V2DmnY+a5IvfFdkXrjuyL1xndF6s2m8K60PZH4qDuTbA1cCHwmyS3AXS1nkiRJkiRJ0iRNWHRKMgL8IfAY4G7gSuCcqrqjjzkOae7918ArgW2Ad/fx/pIkSZIkSdqIxp1IPMlrk1wGHAtsBVwL3ALsB5yb5JQku/YjRFXdVVUPVNXaqjoF+ChwYD/uPUMtbjuANE34rki98V2ReuO7IvXGd0XqzYx/V8ad0ynJUXQm5757nON7AdtX1bcn/fBkLnAUsBOdlefOafb/BvhhVR0y2XtLkiRJkiSpPa1OJJ7kq8AdwMXAHwE7AAEWVdXlrQWTJEmSJEnSlKyvp9P/W9+FVfWmKT88uaKqfr/ZngWsBHatqnumeu+ZKsmBwIeBWcCJVfXeliNJQyfJycBBwC1V9aS280jDKskuwKnAo4ACFlfVh9tNJQ2fJLPpLHizJZ05Ub9YVe9sN5U0nJp/1y0Fbq6qg9rOIw2rJDcAa4D7gbUzdRW7ced0ApY1n9nAU4EfN5+9gIf16fn3jW5U1f3ACgtO42v+B/xjwPOBhcDLkyxsN5U0lD6F88JJvVgLHF1VC4F9gKP8e0Ua073AAVX1FDr/LXxgkn1aziQNq0XA1W2HkKaJ/atqr5lacIL1rF7XTOhNkr8C9quqtc3+J4B/79Pzn5JkdbMdYKtmP50INbdPz5kpngFcV1XXAyQ5g87Kf8tbTSUNmaq6MMmCtnNIw66qVtLpZUxVrUlyNZ15Fv17RepSnaEBv252t2g+7c1RIQ2pJDsDLwT+EXhLy3EkDYH19XQatR3QXfzZummbsqqaVVVzm8+cqtq8a9uC00PtBNzUtb+iaZMkaUqaQu3ewCXtJpGGU5JZSS6ns5rzOVXluyI91IeAvwUeaDuINA0UcHaSZUmObDvMoIzb06nLe4EfJDmPTg+kZwPHDTKUJEnaeJJsDZwJvLmqVk90vrQpaqaC2CvJtsCXkzypqq5sO5c0LJKMzqe5LMlz2s4jTQP7VdXNSXYAzklyTVVd2Haofpuwp1NV/SvwTODLwJeAZ40OvdNGdzOwS9f+zk2bJEmTkmQLOgWnz1TVl9rOIw27qroTOA/nDpTWtS9wcDM58hnAAUk+3W4kaXhV1c3N11vo1Fue0W6iwehleB10Jk9cCdwB/F6SZw8uktbjUmCPJLsneRhwOLCk5UySpGkqSYCTgKur6oNt55GGVZL5TQ8nkmwF/AlwTbuppOFSVcdW1c5VtYDOv1O+U1VHtBxLGkpJHpFkzug28FxgRvaenXB4XZI/p7MCwc7A5XRWt7kYOGCw0bSuqlqb5I3At4BZwMlVdVXLsaShk+R04DnAvCQrgHdW1UntppKG0r7Aq4ArmrlqAN5eVWe1mEkaRjsCpzQrCW8GfL6qvt5yJknS9PUoOkO1oVOX+WxVfbPdSIORzmIc6zkhuQJ4OvC9qtoryROB91TVizdGQEmSJEmSJE0/vUwkfk9V3ZOEJFtW1TVJntCPhyc5EPgwnV47J1bVe9c5viVwKvA04DbgsKq6oVlh52rg2ubU71XVX070vHnz5tWCBQv6EV2SJEmSJEnAsmXLbq2q+eu291J0WtGMYf8KnRnV7wBunGqgpnvyx+iMiV8BXJpkSVUt7zrt9cAdVfX4JIcD7wMOa479pKr22pBnLliwgKVLl041uiRJkiRJkhpJxqwTTVh0qqo/azaPS3IesA3Qj7GGzwCuq6rrm4BnAIcA3UWnQ4Djmu0vAh9tJj2VJEmSJEnSEFvv6nVJZiX57cocVXVBVS2pqt/04dk7ATd17a9o2sY8p6rWAr8Ctm+O7Z7kB0kuSPKHfcgjSZIkSZKkPllv0amq7geuTbLrRsrTq5XArlW1N/AW4LNJ5o51YpIjkyxNsnTVqlUbNaQkSZIkSdKmqpc5nbYDrkryfeCu0caqOniKz74Z2KVrf+embaxzViTZnM7Qvtuqs+TevU2OZUl+Avwe8JAJm6pqMbAYYGRkZP1L9UmSJEmSJKkveik6/e8BPftSYI8ku9MpLh0OvGKdc5YArwYuBl4KfKeqKsl84Paquj/JY4E9gOsHlFOSJEmSJEkbaNyiU5JUxwUTnTOZB1fV2iRvBL4FzAJOrqqrkrwbWFpVS4CTgNOSXAfcTqcwBfBs4N1J7gMeAP6yqm6fTA5JkiRJkiT1X8arGSU5HzgT+GpV/ayr/WHAfnR6IJ1XVZ8afMz+GBkZqaVLHzICT5IkSZIkSZOUZFlVjazbvr7hdQcCrwNOb4bA3QlsRWfy8bOBD1XVDwYRVpIkSZIkSdPbuEWnqroH+Djw8SRbAPOAu6vqzo0VTpIkSZIkSdNTLxOJU1X3ASsHnEWSJEmSJEkzxGZtB5AkSZIkSdLMY9FJkiRJkiRJfddT0SnJbkn+uNneKsmcwcaSJEmSJEnSdDZh0SnJG4AvAp9smnYGvjLIUJIkSZIkSZreeunpdBSwL7AaoKp+DOwwyFCSJEmSJEma3nopOt1bVb8Z3UmyOVCDiyRJkiRJkqTprpei0wVJ3g5sleRPgC8AXxtsLEmSJEmSJE1nvRSdjgFWAVcAfwGcBbxjkKEkSZIkSZI0vW0+0QlV9QBwQvORJEmSJEmSJjRu0SnJFaxn7qaqevJAEkmSJEmSJGnaW19Pp4M2WgpJkiRJkiTNKOMWnarqxo0ZRJIkSZIkSTPHhHM6JVnDQ4fZ/QpYChxdVdcPIpgkSZIkSZKmrwmLTsCHgBXAZ4EAhwOPAy4DTgaeM6hwkiRJkiRJmp426+Gcg6vqk1W1pqpWV9Vi4HlV9TlguwHnkyRJkiRJ0jTUS9Hpv5IcmmSz5nMocE9zbNzV7SRJkiRJkrTp6qXo9ErgVcAtwC+b7SOSbAW8cYDZJEmSJEmSNE1NOKdTM1H4i8Y5fFF/40iSJEmSJGkm6GX1uvnAG4AF3edX1esGF0uSJEmSJEnTWS+r130V+HfgXOD+wcaRJEmSJEnSTNBL0enhVfW2gSeRJEmSJEnSjNHLROJfT/KCgSeRJEmSJEnSjNFL0WkRncLT3UlWJ1mTZPWgg0mSJEmSJGn66mX1ujkbI4gkSZIkSZJmjl56Ov1WkscleUeSq/rx8CQHJrk2yXVJjhnj+JZJPtccvyTJgq5jxzbt1yZ5Xj/ySJIkSZIkqT8mLDoleUyStyS5FLgKmAUcPtUHJ5kFfAx4PrAQeHmSheuc9nrgjqp6PPDPwPuaaxc2GfYEDgQ+3txPkiRJkiRJQ2DcolOSI5OcB5wPPJJOAWhlVb2rqq7ow7OfAVxXVddX1W+AM4BD1jnnEOCUZvuLwB8lSdN+RlXdW1U/Ba5r7idJkiRJkqQhsL45nT4KXAy8oqqWAiSpPj57J+Cmrv0VwDPHO6eq1ib5FbB90/69da7dqY/Zhta7vnYVy3/uPO6SJEmSJE1nCx8zl3e+aM+2YwzU+opOOwIvAz6Q5NHA54EtNkqqPkpyJHAkwK677tpyGkmSJEmSpE3DuEWnqroN+ATwiSQ7A4cBv0xyNfDlqnr7FJ99M7BL1/7OTdtY56xIsjmwDXBbj9eOfh+LgcUAIyMj/eyp1YqZXgWVJEmSJEkzQ0+r11XViqr6QFWN0JlP6Z4+PPtSYI8kuyd5GJ2JwZesc84S4NXN9kuB71RVNe2HN6vb7Q7sAXy/D5kkSZIkSZLUB+sbXjemqvpP4N1TfXAzR9MbgW/RWRHv5Kq6Ksm7gaVVtQQ4CTgtyXXA7TSr5jXnfR5YDqwFjqqq+6eaSZIkSZIkSf2RTsehTcPIyEgtXbq07RiSJEmSJEkzRpJlzei4B+lpeJ0kSZIkSZK0IcYdXpfkqeu7sKou638cSZIkSZIkzQTrm9PpA+s5VsABfc4iSZIkSZKkGWLcolNV7b8xg0iSJEmSJGnm6Gn1uiRPAhYCs0fbqurUQYWSJEmSJEnS9DZh0SnJO4Hn0Ck6nQU8H7gIsOgkSZIkSZKkMfWyet1LgT8CflFVrwWeAmwz0FSSJEmSJEma1nopOt1dVQ8Aa5PMBW4BdhlsLEmSJEmSJE1nvczptDTJtsAJwDLg18DFA00lSZIkSZKkaW3ColNV/c9m8xNJvgnMraofDTaWJEmSJEmSprNeV6/bCdht9Pwkz66qCwcZTJIkSZIkSdNXL6vXvQ84DFgO3N80F2DRSZIkSZIkSWPqpafTnwJPqKp7Bx1GkiRJkiRJM0Mvq9ddD2wx6CCSJEmSJEmaOcbt6ZTkI3SG0f0XcHmSbwO/7e1UVW8afDxJkiRJkiRNR+sbXre0+boMWLLOsRpMHEmSJEmSJM0E4xadquoUgCSLqurD3ceSLBp0MEmSJEmSJE1fvczp9Oox2l7T5xySJEmSJEmaQdY3p9PLgVcAuyfpHl43B7h90MEkSZIkSZI0fa1vTqfvAiuBecAHutrXAD8aZChJkiRJkiRNb+ub0+lG4EbgWRsvjiRJkiRJkmaC9fV0AiDJGn63Wt3DgC2Au6pq7iCDSZIkSZIkafqasOhUVXNGt5MEOATYZ5ChJEmSJEmSNL31snrdb1XHV4DnDSiPJEmSJEmSZoBehte9uGt3M2AEuGdgiSRJkiRJkjTtTVh0Al7Utb0WuIHOEDtJkiRJkiRpTL3M6fTajRFEkiRJkiRJM0cvw+t2B/4XsKD7/Ko6eLIPTfJI4HPNPW8ADq2qO8Y479XAO5rdf6iqU5r284EdgbubY8+tqlsmm0eSJEmSJEn91cvwuq8AJwFfAx7o03OPAb5dVe9Nckyz/7buE5rC1DvpzCFVwLIkS7qKU6+sqqV9yiNJkiRJkqQ+6qXodE9V/b8+P/cQ4DnN9inA+axTdKKzQt45VXU7QJJzgAOB0/ucRZIkSZIkSX3WS9Hpw0neCZwN3DvaWFWXTeG5j6qqlc32L4BHjXHOTsBNXfsrmiZ4Zz8AABdaSURBVLZR/5rkfuBMOkPvagp5JEmSJEmS1Ee9FJ1+H3gVcAC/G15Xzf64kpwLPHqMQ3/XvVNVlWRDC0avrKqbk8yhU3R6FXDqODmOBI4E2HXXXTfwMZIkSZIkSZqMXopOLwMeW1W/2ZAbV9Ufj3csyS+T7FhVK5PsCIw1CfjN/G4IHsDOdIbhUVU3N1/XJPks8AzGKTpV1WJgMcDIyIi9oSRJkiRJkjaCzXo450pg2z4/dwnw6iTPAr4EbJdkVZKfJTkryVHAd4HnJtkuyXbAc4FvJdk8yTyAJFsABzUZJUmSJEmSNCR66em0LXBNkkt58JxOB0/hue8FrgWOBX5Kp0fTfwLPAt4CzKYzwfjXgEuba95dVbcneQSd4tMWwCzgXOCEKWSRJEmSJElSn2Wi+beT/Pex2qvqgik9OJlXVbdO9ZwNfOYq4MZ+3a9F84C+/VykGcx3ReqN74rUG98VqTe+K1JvZtK7sltVzV+3ccKik4ZPkqVVNdJ2DmnY+a5IvfFdkXrjuyL1xndF6s2m8K6MO7wuyUVVtV+SNXRWq/vtITqLzs2dyoPHuO+DTPX+kiRJkiRJas+4Raeq2q/5OmcQDx69b5K/B1YCp9EpaL0S2HEQz5QkSZIkSdLGMeHqdUlOSrLXOm3H9THDwVX18apaU1Wrq+pfgEP6eP+ZaHHbAaRpwndF6o3vitQb3xWpN74rUm9m/LvSy0TiK4DbgA9W1SlN22VV9dS+BEi+C3wMOIPOcLuXA0dV1R/04/6SJEmSJEna+Cbs6QTcAjwbeGmSjyXZnM4wuH55BXAo8Mvm87KmTZIkSZIkSdNUL0WnVNWvqupFwCrgfGCbfgWoqhuq6pCqmldV86vqT6vqhn7df6ZJcmCSa5Ncl+SYtvNIwyjJyUluSXJl21mkYZZklyTnJVme5Koki9rOJA2jJLOTfD/JD5t35V1tZ5KGVZJZSX6Q5OttZ5GGWZIbklyR5PIkS9vOMyjjTiTeZcnoRlUdl2QZ8OZ+BUgyG3g9sCcwu+tZr+vXM2aKJLPoDEX8E2AFcGmSJVW1vN1k0tD5FPBR4NSWc0jDbi1wdFVdlmQOsCzJOf69Ij3EvcABVfXrJFsAFyX5RlV9r+1g0hBaBFwNuBq5NLH9q+rWtkMM0oQ9narqnes03QFc08cMpwGPBp4HXADsDKzp4/1nkmcA11XV9VX1GzrzYDnpurSOqroQuL3tHNKwq6qVVXVZs72Gzj8Sdmo3lTR8quPXze4WzWf9E6NKm6AkOwMvBE5sO4uk4dDL8DqS7J3k/UluAP6ezn+U9svjq+p/A3c1E5W/EHhmH+8/k+wE3NS1vwL/cSBJ6oMkC4C9gUvaTSINp2bI0OV05js9p6p8V6SH+hDwt8ADbQeRpoECzk6yLMmRbYcZlHGH1yX5PToryb0cuBX4HJ35nfbvc4b7mq93JnkS8Atghz4/Q5IkjSPJ1sCZwJuranXbeaRhVFX3A3sl2Rb4cpInVZVzB0qNJAcBt1TVsiTPaTuPNA3sV1U3J9kBOCfJNc2IjRllfT2drgEOAA6qqv2q6iPA/QPIsDjJdsA76MwftRx43wCeMxPcDOzStb9z0yZJ0qQ089OcCXymqr7Udh5p2FXVncB5wIFtZ5GGzL7Awc3omDOAA5J8ut1I0vCqqpubr7cAX6Yznc6Ms76i04uBlcB5SU5I8kdA+vnwJJsBq6vqjqq6sKoeW1U7VNUn+/mcGeRSYI8kuyd5GHA4XRO9S5K0IZIEOAm4uqo+2HYeaVglmd/0cCLJVnQWdennHKfStFdVx1bVzlW1gM6/U75TVUe0HEsaSkke0SziQpJHAM8FZmTv2XGLTlX1lao6HHginf83583ADkn+Jclz+/HwqnqAzphf9aCq1gJvBL5FZ16tz1fVVe2mkoZPktOBi4EnJFmR5PVtZ5KG1L7Aq+j8v9GXN58XtB1KGkI70vk/Yn9E5/8EPKeqXA5ekjRZj6KzEuoPge8D/1ZV32w500CkqveFN5phcC8DDquqP+pLgOS9/G7OqLtG26vKlackSZIkSZKmqQ0qOg0kQPLTMZqrqh7b72fNmzevFixY0O/bSpIkSZIkbbKWLVt2a1XNX7d93NXrNpaq2n1jPWvBggUsXbp0Yz1OkiRJkiRpxkty41jt65tIfKCS7DfB8blJnrSx8mh6OOLESzjixEvajqEW+LvXpsg/99Kmx/demyL/3G+6/N3PfG32dHpJkn8CvgksA1YBs4HHA/sDuwFHtxdPw+ii625tO4Ja4u9emyL/3EubHt97bYr8c7/p8nc/87VWdKqqv07ySOAldCYn3xG4m86qbJ+sqovayiZJkiRJkqSpaXVOp2aFuhOajyRJkiRJkmaI1uZ0kiRJkiRJ0sxl0UmSJEmSJEl9Z9FJkiRJkiRJfdfqnE6jkvwBsICuPFV1amuBJEmSJEmSNCWtF52SnAY8DrgcuL9pLsCikyRJkiRJ0jTVetEJGAEWVlW1HUSSJEmSJEn9MQxzOl0JPLrtEJIkSZIkSeqfYejpNA9YnuT7wL2jjVV1cHuRJEmSJEmSNBXDUHQ6ru0AkiRJkiRJ6q/Wi05VdUGSRwFPb5q+X1W3tJlJkiRJkiRJU9P6nE5JDgW+D7wMOBS4JMlL200lSZIkSZKkqWi9pxPwd8DTR3s3JZkPnAt8sdVUkiRJkiRJmrTWezoBm60znO42hiOXJEmSJEmSJmkYejp9M8m3gNOb/cOAs1rMI0mSJEmSpClqvehUVW9N8hJg36ZpcVV9uc1MkiRJkiRJmprWi04AVXUmcGbbOSRJkiRJktQfrRWdklxUVfslWQNU9yGgqmpuS9EkSZIkSZI0Ra0Vnapqv+brnLYySJIkSZIkaTBaXyUuyWm9tEmSJEmSJGn6aL3oBOzZvZNkc+BpLWWRJEmSJElSH7RWdEpybDOf05OTrG4+a4BfAl/t4fpdkpyXZHmSq5IsGnhoSZIkSZIk9aS1olNVHd/M5/T+qprbfOZU1fZVdWwPt1gLHF1VC4F9gKOSLBxoaEmSJEmSJPWktYnER1XVsUm2A/YAZne1XzjBdSuBlc32miRXAzsBywcYV5IkSZIkST1oveiU5M+BRcDOwOV0ei1dDBywAfdYAOwNXNL/hJIkSZIkSdpQwzCR+CLg6cCNVbU/neLRnb1enGRr4EzgzVW1eozjRyZZmmTpqlWr+pVZkiRJkiRJ6zEMRad7quoegCRbVtU1wBN6uTDJFnQKTp+pqi+NdU5VLa6qkaoamT9/ft9CS5IkSZIkaXytD68DViTZFvgKcE6SO4AbJ7ooSYCTgKur6oMDzihJkiRJkqQN0HrRqar+rNk8Lsl5wDbAN3q4dF/gVcAVSS5v2t5eVWcNIKYkSZIkSZI2QOtFpySnVdWrAKrqgtE2OgWlcVXVRUAGn1CSJEmSJEkbahjmdNqzeyfJLOBpLWWRJEmSJElSH7RWdEpybJI1wJOTrE6yptm/BfhqW7kkSZIkSZI0da0Vnarq+KqaA7y/quZW1Zzms31VHdtWLkmSJEmSJE1d63M6VdWxSQ4Gnt00nV9VX28zkyRJkiRJkqam9TmdkhwPLAKWN59FSd7TbipJkiRJkiRNRes9nYAXAntV1QMASU4BfgC8vdVUkiRJkiRJmrTWezo1tu3a3qa1FJIkSZIkSeqLYejpdDzwgyTnAaEzt5MTiUuSJEmSJE1jrRedqur0JOcDT2+a3lZVv2gxkiRJkiRJkqZoKIbXVdXKqlpSVUuAuUlOaDuTJEmSJEmSJq+1olOSJyc5O8mVSf4hyY5JzgS+Q2cVO0mSJEmSJE1TbfZ0OgH4LPASYBVwOfAT4PFV9c8t5pIkSZIkSdIUtTmn05ZV9alm+9oki6rqb1vMI0mSJEmSpD5ps+g0O8nedFasA7i3e7+qLmstmSRJkiRJkqakzaLTSuCDXfu/6Nov4ICNnkiSJEmSJEl90VrRqar2b+vZkiRJkiRJGqw2JxKXJEmSJEnSDGXRSZIkSZIkSX1n0UmSJEmSJEl91+ZE4gAkeeoYzb8CbqyqtRs7jyRJkiRJkqau9aIT8HHgqcCPgABPAq4CtknyV1V1dpvhJEmSJEmStOGGYXjdz4G9q2qkqp4G7A1cD/wJ8E+tJpMkSZIkSdKkDEPR6feq6qrRnapaDjyxqq5vMZMkSZIkSZKmYBiG112V5F+AM5r9w4DlSbYE7msvliRJkiRJkiZrGHo6vQa4Dnhz87m+absP2L+1VJIkSZIkSZq01ns6VdXdwAeaz7p+vZHjSJIkSZIkqQ9aLzol2Rc4DtiNrjxV9di2MkmSJEmSJGlqWi86AScBfw0sA+5vOYskSZIkSZL6YBiKTr+qqm+0HUKSJEmSJEn9MwxFp/OSvB/4EnDvaGNVXdZeJEmSJEmSJE3FMBSdntl8HelqK+CAFrJIkiRJkiSpD1ovOlXV/m1nkCRJkiRJUn+1VnRKckRVfTrJW8Y6XlUf3NiZJEmSJEmS1B9t9nR6RPN1TosZJEmSJEmSNACtFZ2q6pPN13e1lUGSJEmSJEmD0fqcTknmA28AFtCVp6pe11YmSZIkSZIkTU3rRSfgq8C/A+cC97ecRZIkSZIkSX0wDEWnh1fV2yZzYZIDgQ8Ds4ATq+q9fU0mSZIkSZKkSdms7QDA15O8YEMvSjIL+BjwfGAh8PIkC/sdTpIkSZIkSRtuGIpOi+gUnu5OsjrJmiSre7juGcB1VXV9Vf0GOAM4ZKBJJUmSJEmS1JPWh9dV1ZxJXroTcFPX/grgmVNPNNze9bWrWP7zXmpyM9thn7y47Qhqib97bYr8cy9tenzvtSnyz/2ma1P93S98zFze+aI9244xUK0XnZI8e6z2qrqwT/c/EjgSYNddd+3HLSVJkiRJkjSB1otOwFu7tmfTGTa3DDhggutuBnbp2t+5aXuQqloMLAYYGRmpKSUdAjO9CipJkiRJkmaG1otOVfWi7v0kuwAf6uHSS4E9kuxOp9h0OPCK/ieUJEmSJEnShmq96DSGFcB/m+ikqlqb5I3At4BZwMlVddWgw0mSJEmSJGliqWp3xFmSjwCjITYD9gJuqKojBvCsVcCN/b5vC+YBt7YdQpoGfFek3viuSL3xXZF647si9WYmvSu7VdX8dRuHoej06q7dtXQKTv/RVp7pIMnSqhppO4c07HxXpN74rki98V2ReuO7IvVmU3hXhmF43bZV9eHuhiSL1m2TJEmSJEnS9LFZ2wGAV4/R9pqNHUKSJEmSJEn901pPpyQvp7Pa3O5JlnQdmgPc3k6qaWNx2wGkacJ3ReqN74rUG98VqTe+K1JvZvy70tqcTkl2A3YHjgeO6Tq0BvhRVa1tJZgkSZIkSZKmrPWJxOG3Bag9qurcJFsBm1fVmrZzSZIkSZIkaXJan9MpyRuALwKfbJp2Br7SXqLhluTAJNcmuS7JMRNfIW16kpyc5JYkV7adRRpmSXZJcl6S5UmuSrKo7UzSMEoyO8n3k/yweVfe1XYmaVglmZXkB0m+3nYWaZgluSHJFUkuT7K07TyD0nrRCTgK2BdYDVBVPwZ2aDXRkEoyC/gY8HxgIfDyJAvbTSUNpU8BB7YdQpoG1gJHV9VCYB/gKP9ekcZ0L3BAVT0F2Iv/3979x2xVl3Ecf38MCgvMUVQOcjR/oXMKZeRELVyaq5Zbm1tNbS76takpzVo1a9Zy2WpWf1iboX+UzopJZj+FqcFkLMgACdGtqBXMDcgxJQoXXP1xDuMWgZ7gfjrnwfdrO3vOr+91rvvenu3c1/l+vwcuTXJuxzlJfXU9sKHrJKQxYm5Vzayqc7pOZLT0oei0q6qe37uRZBzQ/Zi/fpoN/LGqNrbf2Q+ByzrOSeqdqlqGLySQ/quqerqqft+uP0fzI2Fqt1lJ/VONHe3m+HbxflXaT5JpwHuABV3nIqkf+lB0Wprk88CxSS4GFgI/6zinvpoK/G1gexP+OJAkDUGS6cAs4LfdZiL1UztkaA2wBVhSVf6vSC/2LeAzwJ6uE5HGgAIWJ3ksyce6Tma09KHo9FlgK7AO+DjwS+CmTjOSJOklJMlE4D7ghqp6tut8pD6qqt1VNZNm/tHZSc7sOiepT5K8F9hSVY91nYs0RpxfVW+mmT7nmiQXdp3QaBjXdQJVtSfJ/cD9VbW163x6bjPwxoHtae0+SZIOS5LxNAWne6pqUdf5SH1XVduTPEIzd6AvrJD2mQO8L8m7gQnAcUnurqorO85L6qWq2tz+3ZLkJzTT6SzrNqvh66ynUxo3J9kGPAU8lWRrki92ldMYsAo4Jcmbkrwc+ADwQMc5SZLGqCQB7gQ2VNVtXecj9VWSKUmOb9ePBS4Gnuw2K6lfqupzVTWtqqbT/E552IKTdGBJXpVk0t514BKO0gcZXQ6vm09TDX9rVU2uqsnA24A5SeZ3mFdvVdW/gWuBB2kme/1xVa3vNiupf5LcC6wATkuyKcm8rnOSemoOcBVwUfu63jXtE2pJL3QC8EiSx2keAi6pKl8HL0k6XK8HHk2yFlgJ/KKqft1xTqMiVd28eCPJauDiqtq23/4pwOKqmtVJYpIkSZIkSTpiXfZ0Gr9/wQmgnddpfAf5SJIkSZIkaUi6LDo9f5jHJEmSJEmS1HNdDq/bDfzjQIeACVVlbydJkiRJkqQxqrOikyRJkiRJko5eXQ6vkyRJkiRJ0ihJcleSLUn+MKR4JyZZnGRDkieSTD/k+fZ0kiRJGpkkrwEeajffAOwGtrbbO6vqvFG45izg2qqaN6R419Lketcw4kmSpP5KciGwA/h+VZ05hHi/AW6pqiVJJgJ7qmrnQc+36CRJkvS/S3IzsKOqvjHK11kIfKWq1g4p3iuB5VU1axjxJElSv7W9kX6+t+iU5CTgdmAKsBP4aFU9OYI4ZwB3VNX5I722w+skSZKGIMmO9u87kixN8tMkG5PcmuSKJCuTrGtv9EgyJcl9SVa1y5wDxJwEnLW34JTk7UnWtMvq9jhJPt3GeDzJlwbaf6jdtzbJDwDap5F/STJ79L8VSZLUQ3cA11XVW4Abge+MsN2pwPYki9r7kK8nedmhGow7wkQlSZL0YmcDpwPPABuBBVU1O8n1wHXADcC3gW9W1aNJTgQebNsMOgcYnIPhRuCaqlredmn/V5JLgFOA2TRvAX6g7Ur/d+Am4Lyq2pZk8kCc3wEXACuH+qklSVKvtfcP5wELk+zd/Yr22PuBLx+g2eaqehdNDekCYBbwV+BHwNXAnQe7nkUnSZKk4VtVVU8DJPkTsLjdvw6Y266/Ezhj4IbvuCQTq2rHQJwT2DdnFMBy4LYk9wCLqmpTW3S6BFjdnjORpgh1NrCwqrYBVNUzA3G2ADOO/GNKkqQx5hhge1XN3P9AVS0CFh2i7SZgTVVtBEhyP3Auhyg6ObxOkiRp+HYNrO8Z2N7Dvod+xwDnVtXMdpm6X8EJ4J/AhL0bVXUr8BHgWGB5khk0vZu+OhDn5Ko66M1fa0IbW5IkvYRU1bPAn5NcDpDG2SNsvgo4PsmUdvsi4IlDNbDoJEmS1I3FNEPtAEjyoieOwAbg5IFzTqqqdVX1NZobvxk0w/I+3HaXJ8nUJK8DHgYub9+4x37D607lhcP2JEnSUSjJvcAK4LQkm5LMA64A5iVZC6wHLhtJrKraTTPU/6Ek62gefH3vUG0cXidJktSNTwK3J3mc5p5sGfCJwROq6skkr04yqaqeA25IMpemx9R64FdVtSvJ6cCKdqjeDuDKqlqf5BZgaZLdNMPvrm5DzwFuHvVPKEmSOlVVHzzIoUsPM94S4KyRnp+qOpzrSJIk6f8gyXzguapaMKR4s4BPVdVVw4gnSZJ0MA6vkyRJ6rfv8sI5oo7Ua4EvDDGeJEnSAdnTSZIkSZIkSUNnTydJkiRJkiQNnUUnSZIkSZIkDZ1FJ0mSJEmSJA2dRSdJkiRJkiQNnUUnSZIkSZIkDZ1FJ0mSJEmSJA3dfwCc8g1DfaXyfAAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = quadratic_sequence.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (\n",
- " formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times']\n",
- ")\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 3, 1, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n",
- "\n",
- "plt.suptitle('Quadratic Sequence')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Plotting the Ramsey sequence"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = ramsey_sequence.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (\n",
- " formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times']\n",
- ")\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 3, 1, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n",
- "\n",
- "plt.suptitle('Quadratic Sequence')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Printing the Quadratic DDS Program\n",
- "\n",
- "Note that Quadratic DDS will be applied with $X_{\\pi/2}$ rotations at beginning and end, that is, at offsets of $[0, 5]$ $\\mu$s, to create the desired superposition state. The $X_{\\pi/2}$ rotations are added to the programs in the form of pre-post-gates that are implemented via Pyquil's $RX(\\pi/2)$ gate.\n",
- "\n",
- "The $RZ(\\pi)$ gates are $Z_\\pi$ pulses (a $\\pi$ rotation around $Z$-axis) and $RX(\\pi)$ correspond to $X_{\\pi}$ pulses (a $\\pi$ rotation around $X$-axis). The gates match the pulses in the DDS.\n",
- "\n",
- "The `I` in the program corresponds to the `identity` gates. In the DDS, the first $Z_{\\pi}$-pulse is applied at a delay of $0.3125$ $\\mu$s. This is approximated by introducing 6-`Id` gates with a delay of $50ns\\times 6=0.3$ $\\mu s$. Similarly, the second set of 12-`Id` gates introduces a delay of $0.6$ $\\mu s$ close to the actual delay of $0.9375-0.3125=0.625\\mu s$.\n",
- "\n",
- "The `Pragma` preserve blocks are added at the start and end of the program so that the compiler preserves the entire program. Without the preserve blocks the intermediate identity gates could be removed by compiler and hence the DDS would not have achieved the gaps required between the rotation operations.\n",
- "\n",
- "At the end of each program, we place a `MEASURE` operator to read out the result."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "PRAGMA PRESERVE_BLOCK\n",
- "RX(pi/2) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RX(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RX(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RZ(pi) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RX(pi/2) 1\n",
- "DECLARE ro BIT[1]\n",
- "MEASURE 1 ro[0]\n",
- "PRAGMA END_PRESERVE_BLOCK\n",
- "\n"
- ]
- }
- ],
- "source": [
- "print(quadratic_program.out())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Printing the Ramsey DDS Program\n",
- "\n",
- "Similar to Quadratic program, Ramsey program has $X_{\\pi/2}$ rotations at beginning and end, that is, at offsets of $[0, 5]$ $\\mu$s, to create the desired superposition state. In between there are 99 `I` gates corresponding to the interval $99\\times 50ns=4.95\\mu$s interval (close to the desired $5\\mu$s) between the $X_{\\pi/2}$ intervals.\n",
- "\n",
- "At the end of each program, we place a `MEASURE` operator to read out the result."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "PRAGMA PRESERVE_BLOCK\n",
- "RX(pi/2) 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "I 1\n",
- "RX(pi/2) 1\n",
- "DECLARE ro BIT[1]\n",
- "MEASURE 1 ro[0]\n",
- "PRAGMA END_PRESERVE_BLOCK\n",
- "\n"
- ]
- }
- ],
- "source": [
- "print(ramsey_program.out())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Compiling and running the pograms on Virtual Quantum Device\n",
- "\n",
- "We can use `pyQuil` to compile the programs generated by Q-CTRL Open Controls. In order to achieve that, we need to create a suitable QVM;\n",
- "\n",
- "NOTE: You will require ForestSDK to run the following segments. You need to start the the Quil Compiler and QVM in server mode. Execute the following commands in separate prompts.\n",
- "\n",
- "```\n",
- "$ quilc -S\n",
- "$ qvm -S\n",
- "```"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "# NBVAL_SKIP\n",
- "quantum_device = get_qc(\"Aspen-4-2Q-A\", as_qvm=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Compiling the Quadratic DDS Program\n",
- "\n",
- "Note that both DDS will be applied with $X_{\\pi/2}$ rotations at beginning and end, that is, at offsets of $[0, 5]$ $\\mu$s, to create the desired superposition state. The $X_{\\pi/2}$ rotations are added to the programs in the form of pre-post-gates that are implemented via Pyquil's $RX(\\pi/2)$ gate.\n",
- "\n",
- "The $RZ(\\pi)$ gates are $Z_\\pi$ pulses (a $\\pi$ rotation around $Z$-axis) and $RX(\\pi)$ correspond to $X_{\\pi}$ pulses (a $\\pi$ rotation around $X$-axis). The gates match the pulses in the DDS.\n",
- "\n",
- "The `I()` in the compiled program corresponds to the `identity` gates. In the DDS, the first $Z_{\\pi}$-pulse is applied at a delay of $0.3125$ $\\mu$s. This is approximated by introducing 6-`Id` gates with a delay of $50ns\\times 6=0.3$ $\\mu s$. Similarly, the second set of 12-`Id` gates introduces a delay of $0.6$ $\\mu s$ close to the actual delay of $0.9375-0.3125=0.625\\mu s$.\n",
- "\n",
- "The `Pragma` preserve blocks are added at the start and end of the program so that the compiler preserves the entire program. Without the preserve blocks the intermediate identity gates could be removed by compiler and hence the DDS would not have achieved the gaps required between the rotation operations.\n",
- "\n",
- "At the end of each program, we place a `measurement` operator to read out the result."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "# NBVAL_SKIP\n",
- "\n",
- "# We loop the program in order to run it several times\n",
- "'''\n",
- "trials : int\n",
- " An integer denoting the number of repeats of the program on quantum device\n",
- "'''\n",
- "trials=1000\n",
- "quadratic_program = quadratic_program.wrap_in_numshots_loop(trials)\n",
- "\n",
- "##Compiling the quadratic program\n",
- "executable_quadratic_program_for_qvm = quantum_device.compile(quadratic_program)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "# NBVAL_SKIP\n",
- "\n",
- "# We loop the program in order to run it several times\n",
- "'''\n",
- "trials : int\n",
- " An integer denoting the number of repeats of the program on quantum device\n",
- "'''\n",
- "trials=1000\n",
- "ramsey_program = ramsey_program.wrap_in_numshots_loop(trials)\n",
- "\n",
- "##Compiling the quadratic program\n",
- "executable_ramsey_program_for_qvm = quantum_device.compile(ramsey_program)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Run the programs using Pyquil's QVM\n",
- "\n",
- "Here, we will use the quantum device we created earlier to run the program. The experiment consists of `trials` repeats of the program on a qubit. Each run collects the state of the qubit as measurement. The result is displayed as a histogram. We here define small utility method to plot the trial results for QVM."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_trial_outcomes(trial_result):\n",
- " \"\"\"Plots the trial result as probabilities. Expects results from runs involving only\n",
- " single qubit\n",
- " Parameters\n",
- " ----------\n",
- " trial_result : numpy.ndarray\n",
- " An array where each row contains the output trials in computational basis.\n",
- " \"\"\"\n",
- " \n",
- " qubit_trial_result = trial_result[:, 0]\n",
- " \n",
- " number_of_trials = qubit_trial_result.shape\n",
- " \n",
- " outcome = np.array([number_of_trials-np.sum(qubit_trial_result), np.sum(qubit_trial_result)])\n",
- " outcome_probabilities = outcome / number_of_trials\n",
- " \n",
- " plt.bar(np.array([0, 1]), outcome_probabilities)\n",
- " plt.xticks(np.array([0, 1]), [0, 1])\n",
- " plt.ylabel('Probabilities')\n",
- " plt.xlabel('States')\n",
- " \n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# NBVAL_SKIP\n",
- "quadratic_result = quantum_device.run(executable_quadratic_program_for_qvm)\n",
- "plot_trial_outcomes(quadratic_result)"
- ]
- },
- {
- "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": [
- "# NBVAL_SKIP\n",
- "\n",
- "## Run the ramsey sequence program, Get the result (counts of state |1> and |0>), plot the histogram\n",
- "ramsey_result = quantum_device.run(executable_ramsey_program_for_qvm)\n",
- "plot_trial_outcomes(ramsey_result)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Compiling and running the pograms on Rigetti Quantum Device\n",
- "\n",
- "We can use the programs created before. However, this time we need to get a real device. You have to have an access to a Rigetti lattice. Follow [the steps](https://www.rigetti.com/) to get an account to access a Rigetti lattice. Once you have account, follow the instructions to [reserve a lattice](https://www.rigetti.com/qcs/docs/reservations) and [run a jupyter notebook](https://www.rigetti.com/qcs/docs/guides#setting-up-a-jupyter-notebook-on-your-qmi)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "# NBVAL_SKIP\n",
- "\n",
- "# Get the reserved lattice. In this case we are using 'Aspen-4-2Q-A' - change this to\n",
- "# the one you reserve\n",
- "quantum_device = get_qc(\"Aspen-4-2Q-A\", as_qvm=False)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# NBVAL_SKIP\n",
- "\n",
- "## Compiling the quadratic program for the chosen real lattice\n",
- "executable_quadratic_program_for_lattice = quantum_device.compile(quadratic_program)\n",
- "\n",
- "## Run the quadratic sequence program, Get the result (counts of state |1> and |0>), plot the histogram\n",
- "quadratic_result = quantum_device.run(executable_quadratic_program_for_lattice)\n",
- "plot_trial_outcomes(quadratic_result)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# NBVAL_SKIP\n",
- "\n",
- "## Compiling the ramsey program for the chosen real lattice\n",
- "executable_ramsey_program_for_lattice = quantum_device.compile(ramsey_program)\n",
- "\n",
- "## Run the ramsey sequence program, Get the result (counts of state |1> and |0>), plot the histogram\n",
- "ramsey_result = quantum_device.run(executable_ramsey_program_for_lattice)\n",
- "plot_trial_outcomes(ramsey_result)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Reducing Errors by Increasing the Coherence Time\n",
- "\n",
- "In the ideal noiseless simulator, both the Ramsey DDS and Quadratic DDS produced exactly the same outcome, the $|1 \\rangle$ state with probability 1. However, in a real device, we can see a marked difference. The Quadratic DDS produced a probability distribution closer to the expected outcome. This is because the Quadratic DDS is able to cancel the effects of magnetic noise in the environment - extending the [T2 time](https://en.wikipedia.org/wiki/Spin–spin_relaxation), and effectively increasing the coherence of the qubit."
- ]
- },
- {
- "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.8"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/export_a_dds_to_qiskit.ipynb b/examples/export_a_dds_to_qiskit.ipynb
deleted file mode 100755
index 7b07491a..00000000
--- a/examples/export_a_dds_to_qiskit.ipynb
+++ /dev/null
@@ -1,769 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Export a Dynamical Decoupling Sequence to Qiskit\n",
- "\n",
- "Q-CTRL Open Controls provides easy-to-use methods to construct Dynamical Decoupling Sequences (DDS) according to well-known dynamical decoupling schemes. This is described in the [creating a DDS notebook](creating_a_dds.ipynb). Here we show how a DDS from Q-CTRL Open Controls can be exported to a Qiskit circuit to run on an IBM Q device. We also show how a DDS can decrease the number of errors, when executing a quantum circuit on a real quantum computer, by extending the coherence time.\n",
- "\n",
- "Note: To run the DDS on a real device, you need to have an IBM Q account and acquire an API token. [Sign Up](https://quantumexperience.ng.bluemix.net/qx/login) if you have not already done so. Additionally, you will need to have the Qiskit library installed. Consult [Installing Qiskit](https://qiskit.org/documentation/install.html) for more information."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "#General\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from matplotlib.gridspec import GridSpec\n",
- "\n",
- "#Q-CTRL Open Controls\n",
- "from qctrlopencontrols import new_predefined_dds, convert_dds_to_qiskit_quantum_circuit\n",
- "\n",
- "#Qiskit\n",
- "##To define a backend (simulated or real)\n",
- "from qiskit import execute, BasicAer\n",
- "\n",
- "##To plot the outcome\n",
- "from qiskit.tools.visualization import plot_histogram\n",
- "\n",
- "## To handle account information,find a suitable device and monitor a job\n",
- "from qiskit import IBMQ\n",
- "from qiskit.providers.ibmq import least_busy\n",
- "from qiskit.tools.monitor import job_monitor"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Running a DDS on a Qiskit Simulator\n",
- "\n",
- "This section demonstrates how a DDS can be prepared and a corresponding Qiskit circuit made and executed on a Qiskit simulator.\n",
- "\n",
- "Q-CTRL Open Controls defines a DDS as a set of instantaneous unitary operations performed at specific offset times, see the [technical documentation](https://docs.q-ctrl.com/control-library#dynamical-decoupling-sequences) for mathematical details.\n",
- "\n",
- "Qiskit implements quantum computation through a series of [gates in a quantum circuit](https://qiskit.org/documentation/getting_started.html#circuit-basics). How these gates are physically implemented will depend on the device that it is run on.\n",
- "\n",
- "On IBM Q devices, individual qubit rotations are completed using two basis elements. $Z$ rotations are performed with (almost) instantaneous clock shifts and $Y$ rotations are performed with microwave pulses over a fixed time. All single qubit gates are a combination of these two.\n",
- "\n",
- "If a user wants to add pauses (in time) during a computation they can use identity gates and barriers. The barriers ensure that the circuit is not simplified before execution on the machine. Both identity gates and $X$ or $Y$ rotation gates take a fixed time (`gate_time`).\n",
- "\n",
- "Converting a DDS into a Qiskit circuit is an approximate process where the instantaneous unitaries are replaced with finite duration gates and the pauses in-between unitaries are replaced with the closest integer number of identity gates. The exact algorithm used to make this approximation is documented in the [source code](https://github.com/qctrl/python-open-controls/blob/master/qctrlopencontrols/qiskit/quantum_circuit.py).\n",
- "\n",
- "In this example we will define a Quadratic DDS and convert it into a circuit that we can later run on a simulator and on a real device. See [creating_a_DDS.ipynb](creating_a_DDS.ipynb) to see how other sequences can be created. We also create a Ramsey DDS of the same duration to compare as a benchmark. For both the sequences, we add a $X_{\\pi/2}$ rotation on either end of the sequence."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Preparing the Sequences"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Quadratic sequence:\n",
- "Duration = 2e-05\n",
- "Offsets = [0.0,0.06249999999999998,0.18749999999999994,0.24999999999999994,0.37499999999999994,0.6249999999999999,0.7499999999999999,0.8124999999999999,0.9375,1.0] x 2e-05\n",
- "Rabi Rotations = [0.5,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.5] x pi\n",
- "Azimuthal Angles = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0] x pi\n",
- "Ramsey sequence:\n",
- "Duration = 2e-05\n",
- "Offsets = [0.0,1.0] x 2e-05\n",
- "Rabi Rotations = [0.5,0.5] x pi\n",
- "Azimuthal Angles = [0.0,0.0] x pi\n",
- "Detuning Rotations = [0.0,0.0] x pi\n"
- ]
- }
- ],
- "source": [
- "## Quadratic sequence, total duration: 20us\n",
- "quadratic_sequence = new_predefined_dds(\n",
- " scheme='quadratic',\n",
- " duration=20e-6, \n",
- " number_inner_offsets=2,\n",
- " number_outer_offsets=2,\n",
- " pre_post_rotation=True,\n",
- " name='Quadratic sequence')\n",
- "\n",
- "# Ramsey sequence, total duration: 20us\n",
- "ramsey_sequence = new_predefined_dds(\n",
- " scheme='Ramsey',\n",
- " duration=20e-6,\n",
- " pre_post_rotation=True,\n",
- " name='Ramsey sequence')\n",
- "\n",
- "print(quadratic_sequence)\n",
- "print(ramsey_sequence)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Constructing the Circuit Using Q-CTRL Open Controls\n",
- "\n",
- "To construct a `QuantumCircuit` from a DDS, we need to provide the DDS (`dynamic_decoupling_sequence`). You can also provide a list (`target_qubits`) to indicate qubit indices on which the DDS will be applied. `gate_time` is the delay (in seconds) introduced by each of the `identity` gates. If measurement is required, use `add_measurement=True`. Optionally you can provide a name to the circuit (`circuit_name`).\n",
- "\n",
- "See the [source code](https://github.com/qctrl/python-open-controls/blob/master/qctrlopencontrols/qiskit/quantum_circuit.py) for more information and other parameters that may be useful.\n",
- "\n",
- "In this example, we will use $0$th qubit and specify the `gate_time` to be $0.4$ $\\mu$s. Both the DDS will require a measurement operation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "## Prepare the Qiskit related parameters\n",
- "'''\n",
- "target_qubits : list\n",
- " A list of integers specifying the target qubits within the set of qubit registers\n",
- "'''\n",
- "target_qubits = [0]\n",
- "\n",
- "'''\n",
- "gate_time : float\n",
- " Time delay (in seconds) introduced by identity gate\n",
- "'''\n",
- "gate_time = 0.4e-6\n",
- "\n",
- "'''\n",
- "add_measurement : bool\n",
- " Indicates if the circuit requires a measurement step.\n",
- " Required for 'qasm_simulator' and real device backends\n",
- "'''\n",
- "add_measurement = True\n",
- "\n",
- "'''\n",
- "circuit_name : str\n",
- " An optional string as a name to the circuit\n",
- "'''\n",
- "circuit_name = 'quadratic-sequence-circuit'\n",
- "\n",
- "## convert the quadratic sequence to QuantumCircuit\n",
- "\n",
- "quadratic_quantum_circuit = convert_dds_to_qiskit_quantum_circuit(\n",
- " dynamic_decoupling_sequence=quadratic_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement,\n",
- " circuit_name=circuit_name\n",
- ")\n",
- "\n",
- "## convert the ramsey sequence to QuantumCircuit\n",
- "circuit_name = 'ramsey-sequence-circuit'\n",
- "ramsey_quantum_circuit = convert_dds_to_qiskit_quantum_circuit(\n",
- " dynamic_decoupling_sequence=ramsey_sequence,\n",
- " target_qubits=target_qubits,\n",
- " gate_time=gate_time,\n",
- " add_measurement=add_measurement,\n",
- " circuit_name=circuit_name\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting the DDS\n",
- "\n",
- "We can use Q-CTRL Open Controls to plot the DDS for comparison against their Qiskit circuit approximations."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = quadratic_sequence.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (\n",
- " formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times']\n",
- ")\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 3, 1, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n",
- "\n",
- "plt.suptitle('Quadratic Sequence')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "formatted_plot_data = ramsey_sequence.get_plot_formatted_arrays()\n",
- "rabi_rotations, azimuthal_angles, detuning_rotations, times = (\n",
- " formatted_plot_data['rabi_rotations'],\n",
- " formatted_plot_data['azimuthal_angles'],\n",
- " formatted_plot_data['detuning_rotations'],\n",
- " formatted_plot_data['times']\n",
- ")\n",
- "\n",
- "# prepare the axes\n",
- "figure, (rabi_plot_axis, azimuth_plot_axis, detuning_plot_axis) = plt.subplots(\n",
- " 1, 3, figsize=(20,5))\n",
- "\n",
- "rabi_plot_axis.plot(times, rabi_rotations)\n",
- "rabi_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "rabi_plot_axis.set_xlabel('Time (sec)')\n",
- "rabi_plot_axis.set_ylabel('Rabi Rotations (rad)')\n",
- "\n",
- "azimuth_plot_axis.plot(times, azimuthal_angles)\n",
- "azimuth_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "azimuth_plot_axis.set_xlabel('Time (sec)')\n",
- "azimuth_plot_axis.set_ylabel('Azimuthal Angle (rad)')\n",
- "\n",
- "detuning_plot_axis.plot(times, detuning_rotations)\n",
- "detuning_plot_axis.ticklabel_format(style='sci', axis='x', scilimits=(0, 2))\n",
- "detuning_plot_axis.set_xlabel('Time (sec)')\n",
- "detuning_plot_axis.set_ylabel('Detuning Rotation (rad)')\n",
- "\n",
- "plt.suptitle('Ramsey Sequence')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Drawing the Circuits\n",
- "\n",
- "We can use Qiskit to draw the circuits generated by Q-CTRL Open Controls."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Drawing the Quadratic DDS Circuit\n",
- "\n",
- "Note that both DDS will be applied with $X_{\\pi/2}$ rotations at beginning and end, that is, at offsets of $[0, 20]$ $\\mu$s, to create the desired superposition state. The $X_{\\pi/2}$ rotations are added to the circuits in the form of pre-post-gates that are implemented via Qiskit's $U3(\\pi/2, -\\pi/2, \\pi/2)$ gate.\n",
- "\n",
- "The $U1(\\pi)$ gates are $Z_\\pi$ pulses (a $\\pi$ rotation around $Z$-axis) and $U3(\\pi, -\\pi/2, \\pi/2)$ gates correspond to $X_{\\pi}$ pulses (a $\\pi$ rotation around $X$-axis). The gates match the pulses in the DDS.\n",
- "\n",
- "The `Id` in the drawing corresponds to the `identity` gate. In the DDS, the first $Z_{\\pi}$-pulse is applied at a delay of $1.25$ $\\mu$s. This is approximated by introducing 3-`Id` gates with a delay of $0.4\\times 3=1.2$ $\\mu s$. Similarly, the second set of 6 `Id` gates introduces a delay of $2.4$ $\\mu s$ close to the actual delay of $3.75-1.25=2.50\\mu s$.\n",
- "\n",
- "The `barrier` gates are special gates that tell the Qiskit compilers not to simplify a circuit at the specified positions.\n",
- "\n",
- "At the end of each circuit, we place a `measurement` operator to read out the result."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
"
- ],
- "text/plain": [
- ""
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "##Drawing the Quadratic Circuit\n",
- "quadratic_quantum_circuit.draw()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Drawing the Ramsey DDS Circuit\n",
- "\n",
- "The drawing below shows the Ramsey DDS circuit consists of `Id` or `identity` gates surrounded by $X_{\\pi/2}$-pulses on both ends. The `measurement` operator appears at the end as in the original definition of the circuit. This will help us run the circuit in one of the simulators."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
┌───────────────────────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "q1_0: |0>┤ U3(1.5708,-pi/2,pi/2) ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- " └───────────────────────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- " c1_0: 0 ══════════════════════════════════════════════════════════════════════»\n",
- " »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- "«c1_0: ════════════════════════════════════════════════════════════════════════»\n",
- "« »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- "«c1_0: ════════════════════════════════════════════════════════════════════════»\n",
- "« »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- "«c1_0: ════════════════════════════════════════════════════════════════════════»\n",
- "« »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- "«c1_0: ════════════════════════════════════════════════════════════════════════»\n",
- "« »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐»\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘»\n",
- "«c1_0: ════════════════════════════════════════════════════════════════════════»\n",
- "« »\n",
- "« ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ ┌────┐ ░ »\n",
- "«q1_0: ─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─┤ Id ├─░─»\n",
- "« ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ └────┘ ░ »\n",
- "«c1_0: ════════════════════════════════════════════════»\n",
- "« »\n",
- "« ┌───────────────────────┐ ░ ┌─┐\n",
- "«q1_0: ┤ U3(1.5708,-pi/2,pi/2) ├─░─┤M├\n",
- "« └───────────────────────┘ ░ └╥┘\n",
- "«c1_0: ═════════════════════════════╩═\n",
- "«