Skip to content
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
2f1e42f
Added how-to section
Guillermo-Mijares-Vilarino Aug 26, 2022
d39833c
added how to compose circuits guide
Guillermo-Mijares-Vilarino Aug 26, 2022
bb661fd
added how to visualize circuit guide
Guillermo-Mijares-Vilarino Aug 26, 2022
59e06f9
add how to create parameterized circuit guide
Guillermo-Mijares-Vilarino Aug 26, 2022
9c87269
Merge branch 'main' of https://github.com/Guillermo-Mijares-Vilarino/…
Guillermo-Mijares-Vilarino Aug 26, 2022
109b049
Merge branch 'Qiskit:main' into add-how-tos
Guillermo-Mijares-Vilarino Aug 26, 2022
63d6f81
add guides
Guillermo-Mijares-Vilarino Aug 26, 2022
9cc7f76
Merge branch 'add-how-tos' of https://github.com/Guillermo-Mijares-Vi…
Guillermo-Mijares-Vilarino Aug 26, 2022
d28748a
removed latex circuit visualization
Guillermo-Mijares-Vilarino Aug 29, 2022
e7b2e47
fixed title underlines
Guillermo-Mijares-Vilarino Aug 29, 2022
352a7c4
Fix typo
Guillermo-Mijares-Vilarino Aug 29, 2022
ba14c27
explicitly set cregbundle to False when appending circuit with classi…
Guillermo-Mijares-Vilarino Aug 29, 2022
4cf2634
Fix typo
Guillermo-Mijares-Vilarino Aug 30, 2022
ed2115c
Added explanation about needed latex distribution
Guillermo-Mijares-Vilarino Aug 31, 2022
a7b38d8
added link to qiskit.visualization module
Guillermo-Mijares-Vilarino Aug 31, 2022
861baaa
Simplified references
Guillermo-Mijares-Vilarino Sep 1, 2022
9354aa0
Change 'we' to 'you'
Guillermo-Mijares-Vilarino Sep 12, 2022
02298c6
Changed how_to.rst to how_to/index.rst
Guillermo-Mijares-Vilarino Sep 28, 2022
0dbd593
Merge branch 'main' into add-how-tos
Guillermo-Mijares-Vilarino Feb 28, 2023
6ad73b0
Removed jupyter-execute from create_a_quantum_circuit
Guillermo-Mijares-Vilarino Feb 28, 2023
571db61
Removed jupyter-execute from create_a_parameterized_circuit
Guillermo-Mijares-Vilarino Feb 28, 2023
2081f4a
Removed jupyter-execute from compose_quantum_circuits
Guillermo-Mijares-Vilarino Feb 28, 2023
082b04e
Removed jupyter-execute from visualize_a_quantum_circuit
Guillermo-Mijares-Vilarino Feb 28, 2023
205370c
Add sphinx.ext.doctest to conf.py
Guillermo-Mijares-Vilarino Feb 28, 2023
84f98cf
Change header symbol for index and visualization guide
Guillermo-Mijares-Vilarino Mar 1, 2023
a6053bb
Added guides for sampler and estimator and simplified toctree
Guillermo-Mijares-Vilarino Mar 1, 2023
3ac6be1
Fixed underline
Guillermo-Mijares-Vilarino Mar 1, 2023
3b260e8
Add links to how-to create circuit
Guillermo-Mijares-Vilarino Mar 1, 2023
5a3a74a
Added section about parameterized circuits to primitives how-tos
Guillermo-Mijares-Vilarino Mar 3, 2023
5a30873
Remove other how-tos
Guillermo-Mijares-Vilarino Mar 3, 2023
54071ee
Remove links
Guillermo-Mijares-Vilarino Mar 3, 2023
89da1ac
Added reference to other implementations of primitives
Guillermo-Mijares-Vilarino Mar 6, 2023
130f5ac
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Mar 7, 2023
8f83d18
Improved titles
Guillermo-Mijares-Vilarino Mar 9, 2023
6daed2f
set global doctest flags and disable automatic doctests
Guillermo-Mijares-Vilarino Mar 9, 2023
ffbc8de
Added part about changing options
Guillermo-Mijares-Vilarino Mar 9, 2023
bc3da86
Merge branch 'main' into add-primitive-guides
Guillermo-Mijares-Vilarino Mar 10, 2023
8fc6f30
Add new aer docs page to intersphinx
Guillermo-Mijares-Vilarino Mar 10, 2023
e9f7924
Added notes about circuit measurements
Guillermo-Mijares-Vilarino Mar 23, 2023
cdf6745
Improved notes about circuit measurements
Guillermo-Mijares-Vilarino Mar 23, 2023
16977be
Merge branch 'main' into add-primitive-guides
Guillermo-Mijares-Vilarino Mar 28, 2023
6f837cc
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Mar 30, 2023
9ad583a
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Mar 30, 2023
1dc2ef7
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Mar 30, 2023
25141f2
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Mar 30, 2023
9c92b80
Added numpy to intersphinx and note about doctest and plot directive
Guillermo-Mijares-Vilarino Mar 30, 2023
bbd57b1
Added note about quasi-probabilities
Guillermo-Mijares-Vilarino Mar 30, 2023
ce362e1
Merge branch 'main' into add-primitive-guides
HuangJunye Mar 31, 2023
053b7c6
rename how to to How-to Guides
HuangJunye Mar 31, 2023
cf8def3
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
1e1044c
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
6a7c92c
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
3d7ee62
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
215a0a8
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
919e316
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
f0dd1ab
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
849396f
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
d514216
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
645792f
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
6d89eb0
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
f37e2e5
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
f27d7ee
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
1d6e25a
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
bf39db2
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
bc24efe
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
38ce964
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
80213cc
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
0e170c3
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
af5aceb
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
d653451
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
f46be30
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
87de7c0
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
0255ce8
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
785bdd2
Remove generally
Guillermo-Mijares-Vilarino Apr 4, 2023
47c4e27
Changed sampler initial note to mention BackendSampler
Guillermo-Mijares-Vilarino Apr 4, 2023
18c90cc
Update docs/how_to/use_sampler.rst
Guillermo-Mijares-Vilarino Apr 4, 2023
8906ea8
Added code example for backend primitives and link to providers page
Guillermo-Mijares-Vilarino Apr 5, 2023
e60b253
Merge branch 'main' into add-primitive-guides
Guillermo-Mijares-Vilarino Apr 5, 2023
32ab2f3
Update intersphinx mapping to ecosystem for aer and runtime
Guillermo-Mijares-Vilarino Apr 18, 2023
23fbd02
Merge branch 'main' into add-primitive-guides
Guillermo-Mijares-Vilarino Apr 18, 2023
f819ebe
Change rustworkx link
Guillermo-Mijares-Vilarino Apr 18, 2023
d4c5802
Merge branch 'main' into add-primitive-guides
HuangJunye May 9, 2023
c125f06
Merge branch 'main' into add-primitive-guides
Guillermo-Mijares-Vilarino May 10, 2023
b352958
Add "primitive" to estimator how-to title
Guillermo-Mijares-Vilarino May 10, 2023
278df5a
Change hypothetical import to avoid confusion
Guillermo-Mijares-Vilarino May 10, 2023
e51e29e
Update docs/how_to/use_estimator.rst
Guillermo-Mijares-Vilarino May 10, 2023
644d8c7
Include "primitive" word in sampler how-to title
Guillermo-Mijares-Vilarino May 10, 2023
1607aac
Improve phrasing
Guillermo-Mijares-Vilarino May 10, 2023
36d54f3
Include notice about doctest and plot directive incompatibility in sa…
Guillermo-Mijares-Vilarino May 10, 2023
254c8de
change->modify sampler options
Guillermo-Mijares-Vilarino May 10, 2023
3ee6158
change qiskit_provider to <some_qiskit_provider>
Guillermo-Mijares-Vilarino May 10, 2023
004f4ad
shots->amount of shots in estimator how-to
Guillermo-Mijares-Vilarino May 10, 2023
3d7e5a8
Add quick explanation about using multiple circuits and observables a…
Guillermo-Mijares-Vilarino May 10, 2023
51a1260
singular
1ucian0 May 19, 2023
973f1e0
singular
1ucian0 May 19, 2023
9418b52
Merge branch 'main' into add-primitive-guides
1ucian0 May 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"sphinx.ext.viewcode",
"sphinx.ext.extlinks",
"sphinx.ext.intersphinx",
"sphinx.ext.doctest",
"reno.sphinxext",
"sphinx_design",
"matplotlib.sphinxext.plot_directive",
Expand Down Expand Up @@ -62,6 +63,9 @@

intersphinx_mapping = {
"retworkx": ("https://qiskit.org/documentation/retworkx/", None),
"qiskit-ibm-runtime": ("https://qiskit.org/documentation/partners/qiskit_ibm_runtime/", None),
"qiskit-aer": ("https://qiskit.org/documentation/aer/", None),
"numpy": ("https://numpy.org/doc/stable/", None)
}

# -- Options for HTML output -------------------------------------------------
Expand Down Expand Up @@ -108,3 +112,18 @@
}

autoclass_content = "both"

# -- Options for Doctest --------------------------------------------------------

import sphinx.ext.doctest

# This option will make doctest ignore whitespace when testing code.
# It's specially important for circuit representation as it gives an
# error otherwise
doctest_default_flags = sphinx.ext.doctest.doctest.NORMALIZE_WHITESPACE

# Leaving this string empty disables testing of doctest blocks from docstrings.
# Doctest blocks are structures like this one:
# >> code
# output
doctest_test_doctest_blocks = ""
15 changes: 15 additions & 0 deletions docs/how_to/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.. _how_to:

#############
How-to Guides
#############


Use the primitives
==================

.. toctree::
:maxdepth: 1

use_sampler
use_estimator
256 changes: 256 additions & 0 deletions docs/how_to/use_estimator.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
###############################################
Compute an expectation value with ``Estimator``
###############################################
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

This guide shows how to get the expected value of an observable for a given quantum circuit with the :class:`~qiskit.primitives.Estimator` primitive.

.. note::

While this guide only uses Qiskit Terra's implementation of the ``Estimator`` primitive, there are other
implementations of this primitive like Qiskit Terra's :class:`~qiskit.primitives.BackendEstimator`, Qiskit Aer's :class:`~qiskit_aer.primitives.Estimator`
and Qiskit Runtime's :class:`~qiskit_ibm_runtime.Estimator`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also this tutorial being done around selection Qiskit/qiskit-tutorials#1385 since you mention others here. That maybe helpful to link eventually to perhaps give clarity to the fact that there other others and how to select. Now the runtime has a bunch of tutorials for the runtime primitives too - would that be a "better" link than the API ref (Or in addition?)

Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated


Initialize observable
=====================

The first step is to define the observable whose expected value you want to compute. This observable can be any ``BaseOperator``, like the operators from :mod:`qiskit.quantum_info`.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
Among them it is preferable to use :class:`~qiskit.quantum_info.SparsePauliOp`.

.. testcode::

from qiskit.quantum_info import SparsePauliOp

observable = SparsePauliOp(["II", "XX", "YY", "ZZ"], coeffs=[1, 1, -1, 1])

Initialize quantum circuits
Comment thread
1ucian0 marked this conversation as resolved.
Outdated
===========================

Then you need to create the :class:`~qiskit.circuit.QuantumCircuit` for which you want to obtain the expected value.

.. plot::
:include-source:

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0,1)
qc.draw("mpl")

.. testsetup::

Comment thread
HuangJunye marked this conversation as resolved.
# This code is repeated (but hidden) because we will need to use the variables with the extension sphinx.ext.doctest (testsetup/testcode/testoutput directives)
# and we can't reuse the variables from the plot directive above because they are incompatible.
# The plot directive is used to draw the circuit with matplotlib and the code is shown because of the include-source flag.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0,1)

.. note::

The :class:`~qiskit.circuit.QuantumCircuit` you pass to :class:`~qiskit.primitives.Estimator` must not include any measurements.

Initialize the ``Estimator``
============================

Then, you need to create an :class:`~qiskit.primitives.Estimator` object.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

.. testcode::

from qiskit.primitives import Estimator

estimator = Estimator()
Comment thread
HuangJunye marked this conversation as resolved.

Run and get results
===================

Now that you have defined ``estimator``, you can create a :class:`~.PrimitiveJob` (subclass of :class:`~qiskit.providers.JobV1`) with the
:meth:`~qiskit.primitives.Estimator.run` method and, then, you can get the results (as a :class:`~qiskit.primitives.EstimatorResult` object) with
the results with the :meth:`~qiskit.providers.JobV1.result` method.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

.. testcode::

job = estimator.run(qc, observable)
result = job.result()
print(result)

.. testoutput::

EstimatorResult(values=array([4.]), metadata=[{}])

Get the expected value
----------------------

From these results you can take the expected values with the attribute :attr:`~qiskit.primitives.EstimatorResult.values`.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

Generally, :attr:`~qiskit.primitives.EstimatorResult.values` returns a :class:`numpy.ndarray`
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
whose ``i``-th element would be the expectation value corresponding to the ``i``-th circuit and ``i``-th observable.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

.. testcode::

exp_value = result.values[0]
print(exp_value)

Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
.. testoutput::

3.999999999999999

Parameterized circuits with ``Estimator``
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a how-to not a tutorial. Options in how-tos are fine

=========================================

The :class:`~qiskit.primitives.Estimator` primitive also has the option to include unbound parameterized circuits like the one below.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here this starts to get close to using an optimizer with a parameterized circuit to find minimum exp val. i.e VQE. Would we want a howto to show using an estimator for that. Of course we have a more comprehensive pre-built VQE algo - but its a nice simple howto to build a simple one. Here the parameters are applied sequentially - rather than all at once in this example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe it can be a nice topic for a future how-to. As I see it we could show both ways to get the minimum eigenvalue: with optimizer.minimize(expval_with_estimator) and with Qiskit's VQE class.

We also have several tutorials covering the usage of the VQE class.

It could also be a more generic "how to run a variational algorithm with Estimator" so that we don't overlap with the VQE tutorials

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I see people using the Estimator with an optimizer to make a simple VQE. It just seemed more like an aspect someone might be wanting to do and a howto, that includes parameterized circuits, which seemed to be the aspect the latter section was bringing in, might be a task that had more relevancy. I agree its bit more complex than what is there and maybe is more applicable for a future howto. It was less about VQE and more that this a common way to use parameterized ccts with an Estimator.

Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
You can also bind values to the parameters of the circuit and follow the steps
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
of the previous example.

.. testcode::

from qiskit.circuit import Parameter

theta = Parameter('θ')
param_qc = QuantumCircuit(2)
param_qc.ry(theta, 0)
param_qc.cx(0,1)
print(param_qc.draw())

.. testoutput::

┌───────┐
q_0: ┤ Ry(θ) ├──■──
└───────┘┌─┴─┐
q_1: ─────────┤ X ├
└───┘

The main difference from the previous case is that now you need to include the parameter values
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
for which you want to evaluate the expectation value as a ``list`` of ``list``\ s of ``float``\ s.
The idea is that the ``i``-th element of the bigger ``list`` is the set of parameter values
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
that corresponds to the ``i``-th circuit and observable.

.. testcode::

import numpy as np

parameter_values = [[0], [np.pi/6], [np.pi/2]]

job = estimator.run([param_qc]*3, [observable]*3, parameter_values=parameter_values)
values = job.result().values

for i in range(3):
print(f"Parameter: {parameter_values[i][0]:.5f}\t Expectation value: {values[i]}")

.. testoutput::

Parameter: 0.00000 Expectation value: 2.0
Parameter: 0.52360 Expectation value: 3.0
Parameter: 1.57080 Expectation value: 4.0

Change run options
==================

It is also possible that you may want to change any other option.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

For example, in the previous sections the :class:`~qiskit.primitives.Estimator`
is :class:`~qiskit.quantum_info.Statevector`-based but it can be changed
to shot-based by setting a number of ``shots``. For reproducibility purposes, in this
guide a ``seed`` will also be set.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

There are two main ways of doing this:
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated

* Setting keyword arguments in the :meth:`~qiskit.primitives.Estimator.run` method.
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
* Modify :class:`~qiskit.primitives.Estimator` options.

Set keyword arguments for :meth:`~qiskit.primitives.Estimator.run`
------------------------------------------------------------------

If you only want to change the settings for a specific run, it can be more convenient to
set the options inside the :meth:`~qiskit.primitives.Estimator.run` method. You can do this by
passing them as keyword arguments.

.. testcode::

job = estimator.run(qc, observable, shots=2048, seed=123)
result = job.result()
print(result)

.. testoutput::

EstimatorResult(values=array([4.]), metadata=[{'variance': 3.552713678800501e-15, 'shots': 2048}])

.. testcode::

print(result.values[0])

.. testoutput::

3.999999998697238

Change :class:`~qiskit.primitives.Estimator` options
Comment thread
Guillermo-Mijares-Vilarino marked this conversation as resolved.
Outdated
-----------------------------------------------------

If you want to keep some configuration values for several runs, it can be better to
change the :class:`~qiskit.primitives.Estimator` options. That way you can use the same
:class:`~qiskit.primitives.Estimator` object as many times as you wish without having to
rewrite the configuration values every time you use :meth:`~qiskit.primitives.Estimator.run`.

Modify existing :class:`~qiskit.primitives.Estimator`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you prefer to change the options of an already-defined :class:`~qiskit.primitives.Estimator`, you can use
:meth:`~qiskit.primitives.Estimator.set_options` and introduce the new options as keyword arguments.

.. testcode::

estimator.set_options(shots=2048, seed=123)

job = estimator.run(qc, observable)
result = job.result()
print(result)

.. testoutput::

EstimatorResult(values=array([4.]), metadata=[{'variance': 3.552713678800501e-15, 'shots': 2048}])

.. testcode::

print(result.values[0])

.. testoutput::

3.999999998697238


Define a new :class:`~qiskit.primitives.Estimator` with the options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you prefer to define a new :class:`~qiskit.primitives.Estimator` with new options, you need to
define a ``dict`` like this one:

.. testcode::

options = {"shots": 2048, "seed": 123}

And then you can introduce it into your new :class:`~qiskit.primitives.Estimator` with the
``options`` argument.

.. testcode::

estimator = Estimator(options=options)

job = estimator.run(qc, observable)
result = job.result()
print(result)

.. testoutput::

EstimatorResult(values=array([4.]), metadata=[{'variance': 3.552713678800501e-15, 'shots': 2048}])

.. testcode::

print(result.values[0])

.. testoutput::

3.999999998697238
Loading