Go to file
Jake Lishman b3cf64f49c
Fix control-flow routing in StochasticSwap (#8880)
* Fix control-flow routing in StochasticSwap

The `StochasticSwap` pass has some fairly complex hand-offs between
different parts of its API, including in recursive calls and the regular
hand-off between Python and Rust.  In the course of adding the
control-flow support, some of these became muddled, and the mapping
between different virtual/physical/integer representations got mixed up,
resulting in invalid swaps being output in the final circuit.

This commit simplifies much of the internal mapping, removing many
superfluous `DAGCircuit` creations and compositions.  This also removes
instances where two layouts were "chained"; this was not well typed (the
output of a "virtual -> physical" mapping can't be the input for another
"virtual -> physical" mapping), and in general was being used to "undo"
some of compositions that were about to be applied.

This fixes a tacit assumption in the original code that the initial
layout was a trivial layout in the hand-off between Rust and Python.
This worked until the recursive call added the `initial_layout` option,
making this assumption invalid. Previously, virtual qubit bit instances
were converted to integers (to allow them to be passed to Rust) using
their indices into the original DAG, but the integer outputs were then
converted _back_ using the `initial_layout`.  In the old form, this
worked anyway, but wasn't logically correct and consequently broke when
the assumptions about `initial_layout` changed.

For the recursive calls, we now ensure that the inner passes are
essentially created with the same internal structure as the outer pass;
the passed in `DAGCircuit` uses the same bit instances and same meaning
of the virtual qubits as the outer circuit, and the `initial_layout`
ensures that the inner passes start with at the same layout as the outer
pass.  This makes the inner passes more like a logical continuation of
the current operation, rather than a completely separate entity that
needs to have its virtual qubits remapped.

The changes to the tests are twofold:

- move the `CheckMap` calls earlier and apply them directly to the
  `StochasticSwap` output rather than the expected circuit, to improve
  the quality of failure error messages

- use the same physical qubits inside the expected control-flow blocks;
  the new simpler form of doing the circuit rewriting internally in the
  pass ensures that the same bit objects are used all the way through
  the control-flow stack now, rather than creating new instances.

* Add tests for stochastic swap valid output

This commit adds full path transpile() tests for running with stochastic
swap that validates a full path transpilation outputs a valid physical
circuit. These tests are purposefully high level to provide some
validation that stochastic swap is not creating invalid output by
inserting incorrect swaps. It's not meant as a test of valid unitary
equivalent output of the full transpilation.

Co-authored-by: Jake Lishman <jake.lishman@ibm.com>

Co-authored-by: Matthew Treinish <mtreinish@kortar.org>
2022-10-12 21:15:07 +00:00
.azure Enable Rust backtraces in CI (#8639) 2022-08-30 17:05:03 +00:00
.binder Add rust to binder configuration (#7732) 2022-03-04 02:32:17 +00:00
.cargo Implement multithreaded stochastic swap in rust (#7658) 2022-02-28 21:49:54 +00:00
.github Remove nkanazawa1989 from code owner (#8840) 2022-10-05 17:34:56 +00:00
docs Bump main branch version post rc tag (#8850) 2022-10-07 15:44:33 -04:00
examples Implement multithreaded stochastic swap in rust (#7658) 2022-02-28 21:49:54 +00:00
qiskit Fix control-flow routing in StochasticSwap (#8880) 2022-10-12 21:15:07 +00:00
releasenotes Fix deprecation warning for `deprecated_functionality` (#8851) 2022-10-12 18:29:57 +00:00
src Sampled expectation value for distributions (#8748) 2022-10-01 02:15:56 +00:00
test Fix control-flow routing in StochasticSwap (#8880) 2022-10-12 21:15:07 +00:00
tools Remove stale dev dependencies from requirements-dev.txt (#8501) 2022-08-16 20:01:43 +00:00
.editorconfig Add .editorconfig (#6033) 2022-01-31 20:12:23 +00:00
.git-blame-ignore-revs Update git blame rev ignore list (#7620) 2022-02-03 21:31:01 +00:00
.gitignore Support reproducible builds of Rust library (#7728) 2022-03-03 17:47:13 +00:00
.local-spellings speeling fixes (#5858) 2021-02-19 00:54:19 +00:00
.mailmap Update garrison's name in .mailmap (#7443) 2021-12-23 15:06:18 +00:00
.mergify.yml Bump main branch version post rc tag (#8850) 2022-10-07 15:44:33 -04:00
.pylintrc Add retworkx to generated module list in the .pylintrc (#8867) 2022-10-10 14:56:35 +00:00
.stestr.conf Removes stestr's grouping configuration. (#6399) 2021-05-12 19:06:06 +00:00
CODE_OF_CONDUCT.md Pointing all Qiskit projects to main CoC file moving forward. (#5412) 2020-11-18 13:24:17 -05:00
CONTRIBUTING.md Explicitly set MSRV for rust extension (#8196) 2022-06-17 19:20:42 +00:00
Cargo.lock Bump main branch version post rc tag (#8850) 2022-10-07 15:44:33 -04:00
Cargo.toml Bump main branch version post rc tag (#8850) 2022-10-07 15:44:33 -04:00
LICENSE.txt Consistent license across all the project (#550) 2018-06-08 15:00:58 +02:00
MANIFEST.in Move `qiskit.test.mock` to `qiskit.providers.fake_provider` and deprecate (#8121) 2022-06-23 02:28:30 +00:00
Makefile Move release note in wrong location and add script to block this (#8320) 2022-07-12 12:16:03 +00:00
README.md Explicitly set MSRV for rust extension (#8196) 2022-06-17 19:20:42 +00:00
azure-pipelines.yml build the docs in python 3.9 (#8124) 2022-09-10 09:48:51 +00:00
constraints.txt Revert "Pin setuptools in CI (#8526)" (#8530) 2022-08-22 21:20:09 +00:00
pyproject.toml Revert "Pin setuptools in CI (#8526)" (#8530) 2022-08-22 21:20:09 +00:00
qiskit_bot.yaml Remove nkanazawa1989 from code owner (#8840) 2022-10-05 17:34:56 +00:00
requirements-dev.txt Pin sphinx-autodoc-typehints to avoid 1.19.3 (#8795) 2022-09-27 01:17:25 +00:00
requirements.txt Remove tweedledum from macOS arm64 immediately (#8849) 2022-10-07 15:00:16 +00:00
setup.py Bump main branch version post rc tag (#8850) 2022-10-07 15:44:33 -04:00
tox.ini Add setuptools_rust to tox.ini (#8606) 2022-08-24 19:15:08 +00:00

README.md

Qiskit Terra

LicenseBuild StatusReleaseDownloadsCoverage StatusMinimum rustc 1.56.1

Qiskit is an open-source framework for working with noisy quantum computers at the level of pulses, circuits, and algorithms.

Qiskit is made up of elements that work together to enable quantum computing. This element is Terra and is the foundation on which the rest of Qiskit is built.

Installation

We encourage installing Qiskit via the pip tool (a python package manager). The following command installs the core Qiskit components, including Terra.

pip install qiskit

Pip will handle all dependencies automatically and you will always install the latest (and well-tested) version.

To install from source, follow the instructions in the documentation.

Creating Your First Quantum Program in Qiskit Terra

Now that Qiskit is installed, it's time to begin working with Terra.

We are ready to try out a quantum circuit example, which is simulated locally using the Qiskit BasicAer element. This is a simple example that makes an entangled state.

$ python
>>> from qiskit import QuantumCircuit, transpile
>>> from qiskit.providers.basicaer import QasmSimulatorPy
>>> qc = QuantumCircuit(2, 2)
>>> qc.h(0)
>>> qc.cx(0, 1)
>>> qc.measure([0,1], [0,1])
>>> backend_sim = QasmSimulatorPy()
>>> transpiled_qc = transpile(qc, backend_sim)
>>> result = backend_sim.run(transpiled_qc).result()
>>> print(result.get_counts(qc))

In this case, the output will be:

{'00': 513, '11': 511}

A script is available here, where we also show how to run the same program on a real quantum computer via IBMQ.

Executing your code on a real quantum chip

You can also use Qiskit to execute your code on a real quantum chip. In order to do so, you need to configure Qiskit for using the credentials in your IBM Q account:

Configure your IBMQ credentials

  1. Create an IBM Q > Account if you haven't already done so.

  2. Get an API token from the IBM Q website under My Account > API Token.

  3. Take your token from step 2, here called MY_API_TOKEN, and run:

    >>> from qiskit import IBMQ
    >>> IBMQ.save_account('MY_API_TOKEN')
    

After calling IBMQ.save_account(), your credentials will be stored on disk. Once they are stored, at any point in the future you can load and use them in your program simply via:

>>> from qiskit import IBMQ
>>> IBMQ.load_account()

Those who do not want to save their credentials to disk should use instead:

>>> from qiskit import IBMQ
>>> IBMQ.enable_account('MY_API_TOKEN')

and the token will only be active for the session. For examples using Terra with real devices we have provided a set of examples in examples/python and we suggest starting with using_qiskit_terra_level_0.py and working up in the levels.

Contribution Guidelines

If you'd like to contribute to Qiskit Terra, please take a look at our contribution guidelines. This project adheres to Qiskit's code of conduct. By participating, you are expected to uphold this code.

We use GitHub issues for tracking requests and bugs. Please join the Qiskit Slack community and use our Qiskit Slack channel for discussion and simple questions. For questions that are more suited for a forum we use the Qiskit tag in the Stack Exchange.

Next Steps

Now you're set up and ready to check out some of the other examples from our Qiskit Tutorials repository.

Authors and Citation

Qiskit Terra is the work of many people who contribute to the project at different levels. If you use Qiskit, please cite as per the included BibTeX file.

Changelog and Release Notes

The changelog for a particular release is dynamically generated and gets written to the release page on Github for each release. For example, you can find the page for the 0.9.0 release here:

https://github.com/Qiskit/qiskit-terra/releases/tag/0.9.0

The changelog for the current release can be found in the releases tab: Releases The changelog provides a quick overview of notable changes for a given release.

Additionally, as part of each release detailed release notes are written to document in detail what has changed as part of a release. This includes any documentation on potential breaking changes on upgrade and new features. For example, You can find the release notes for the 0.9.0 release in the Qiskit documentation here:

https://qiskit.org/documentation/release_notes.html#terra-0-9

License

Apache License 2.0