diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1de79bb2f1..393408a924 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -22,7 +22,7 @@ conda activate myenv
```
5. Install the dependencies. First, to get an updated version of [`pip`](https://pypi.org/project/pip/) inside the virtual environment run `conda install pip` followed by
```
-pip install -e ".[development]"
+make install
```
6. You should now have a development environment set up to work on Mitiq! 🎉 To go forward with making the desired changes, please consult the ["Making changes" section](https://www.asmeurer.com/git-workflow/#making-changes) of the `git` workflow article. If you've encountered any problems thus far, please let us know by opening an issue! More information about workflow can be found below in the [lifecycle](#lifecycle) section.
diff --git a/INTEGRATIONS.txt b/INTEGRATIONS.txt
new file mode 100644
index 0000000000..c7cd8be948
--- /dev/null
+++ b/INTEGRATIONS.txt
@@ -0,0 +1,6 @@
+braket
+cirq
+pennylane
+pyquil
+qibo
+qiskit
\ No newline at end of file
diff --git a/MANIFEST.in b/MANIFEST.in
index a3dbed453a..3f44eef305 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,7 +1,7 @@
include LICENSE
include README.md
include VERSION.txt
-include requirements.txt
-include dev_requirements.txt
+include requirements/*.txt
+include INTEGRATIONS.txt
recursive-include docs/ *.ini
recursive-include docs/ README-docs.md
diff --git a/Makefile b/Makefile
index 8e28ced4e0..39c30f495b 100644
--- a/Makefile
+++ b/Makefile
@@ -55,8 +55,8 @@ install-hooks:
@echo "Git hooks installed."
.PHONY: requirements
-requirements: requirements.txt
- pip install -r requirements.txt
+requirements: requirements/requirements.txt
+ pip install -r requirements/requirements.txt
.PHONY: test
test:
diff --git a/README.md b/README.md
index d48be6a566..80f77c8f5d 100644
--- a/README.md
+++ b/README.md
@@ -101,11 +101,23 @@ We refer to any programming language you can write quantum circuits in as a _fro
#### Supported frontends
-| [Cirq](https://quantumai.google/cirq) | [Qiskit](https://www.ibm.com/quantum/qiskit) | [pyQuil](https://github.com/rigetti/pyquil) | [Braket](https://github.com/aws/amazon-braket-sdk-python) | [PennyLane](https://pennylane.ai/) |[Qibo](https://qibo.science/) |
-|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+| [Cirq](https://quantumai.google/cirq) | [Qiskit](https://www.ibm.com/quantum/qiskit) | [pyQuil](https://github.com/rigetti/pyquil) | [Braket](https://github.com/aws/amazon-braket-sdk-python) | [PennyLane](https://pennylane.ai/) | [Qibo](https://qibo.science/) |
+|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|
|
|
|
|
|
-Note: Cirq is a core requirement of Mitiq and is installed when you `pip install mitiq`.
+You can install Mitiq support for these frontends by specifying them during installation,
+as optional extras, along with the main package.
+To install Mitiq with one or more frontends, you can specify each frontend in square brackets as part of the installation command.
+
+For example,
+to install Mitiq with support for Qiskit and Qibo:
+```bash
+pip install mitiq[qiskit,qibo]
+```
+
+[Here](https://github.com/unitaryfund/mitiq/blob/main/INTEGRATIONS.txt) is an up-to-date list of supported frontends.
+
+Note: Currently, Cirq is a core requirement of Mitiq and is installed when you `pip install mitiq` (even without the optional `[cirq]`)
#### Supported backends
diff --git a/docs/CONTRIBUTING_DOCS.md b/docs/CONTRIBUTING_DOCS.md
index 2b9f8b2aec..a6d4821364 100644
--- a/docs/CONTRIBUTING_DOCS.md
+++ b/docs/CONTRIBUTING_DOCS.md
@@ -5,13 +5,10 @@ the Python toolkit for implementing error mitigation on quantum computers.
## Requirements
Our documentation is generated with
[Sphinx](https://www.sphinx-doc.org/en/master/usage/installation.html).
-The necessary packages can be installed, from the root Mitiq directory
+The necessary packages can be installed, from the root Mitiq directory with the command
```bash
-pip install -e .
-pip install -r dev_requirements.txt
+make install
```
-as they are included in the `dev_requirements.txt` file.
-Alternately, you can use the docker image provided in the repo and all requirements for working with the docs are already installed there.
### Sphinx extensions used to build the docs
- [`myst-nb`](https://myst-nb.readthedocs.io/en/latest/) and [`myst-parser`](https://myst-parser.readthedocs.io/en/latest/) allow both markdown and jupyter notebooks to be included and run by the Sphinx build. Also adds support for [MyST markdown](https://myst-parser.readthedocs.io/en/latest/using/syntax.html) spec.
diff --git a/mitiq/_about.py b/mitiq/_about.py
index 99e397581c..41e1c52cf0 100644
--- a/mitiq/_about.py
+++ b/mitiq/_about.py
@@ -22,12 +22,14 @@ def about() -> None:
from pyquil import __version__ as pyquil_version
except ImportError:
pyquil_version = "Not installed"
+
try:
from qiskit import __qiskit_version__ # pragma: no cover
qiskit_version = __qiskit_version__["qiskit"] # pragma: no cover
except ImportError:
qiskit_version = "Not installed"
+
try:
from braket._sdk import __version__ as braket_version
except ImportError:
diff --git a/mitiq/tests/test_typing.py b/mitiq/tests/test_typing.py
new file mode 100644
index 0000000000..58f15b1982
--- /dev/null
+++ b/mitiq/tests/test_typing.py
@@ -0,0 +1,11 @@
+import os
+
+from mitiq.typing import SUPPORTED_PROGRAM_TYPES
+
+
+def test_supported_program_types_definition():
+ directory_of_this_file = os.path.dirname(os.path.abspath(__file__))
+ with open(f"{directory_of_this_file}/../../INTEGRATIONS.txt", "r") as file:
+ integrations_from_setup = file.read().splitlines()
+
+ assert list(SUPPORTED_PROGRAM_TYPES.keys()) == integrations_from_setup
diff --git a/mitiq/typing.py b/mitiq/typing.py
index ab079a5541..a3313fc427 100644
--- a/mitiq/typing.py
+++ b/mitiq/typing.py
@@ -34,12 +34,12 @@ def keys(cls) -> Iterable[str]:
# Supported quantum programs.
class SUPPORTED_PROGRAM_TYPES(EnhancedEnum):
- CIRQ = "cirq"
- PYQUIL = "pyquil"
- QISKIT = "qiskit"
BRAKET = "braket"
+ CIRQ = "cirq"
PENNYLANE = "pennylane"
+ PYQUIL = "pyquil"
QIBO = "qibo"
+ QISKIT = "qiskit"
try:
diff --git a/requirements/requirements-braket.txt b/requirements/requirements-braket.txt
new file mode 100644
index 0000000000..2f954b8cc6
--- /dev/null
+++ b/requirements/requirements-braket.txt
@@ -0,0 +1,2 @@
+amazon-braket-sdk~=1.69.0
+cirq-ionq>=1.0.0,<1.4.0
\ No newline at end of file
diff --git a/requirements/requirements-cirq.txt b/requirements/requirements-cirq.txt
new file mode 100644
index 0000000000..8f9e15b617
--- /dev/null
+++ b/requirements/requirements-cirq.txt
@@ -0,0 +1,4 @@
+# This file is redundant, since Cirq is the core internal representation
+# for quantum circuits in Mitiq.
+# Keeping this file anyway for consistency with other integrations.
+cirq-core>=1.0.0,<1.4.0
diff --git a/dev_requirements.txt b/requirements/requirements-dev.txt
similarity index 71%
rename from dev_requirements.txt
rename to requirements/requirements-dev.txt
index 95c6d86197..e186b72a0e 100644
--- a/dev_requirements.txt
+++ b/requirements/requirements-dev.txt
@@ -1,15 +1,3 @@
-# Third-party integration.
-qiskit~=1.0.2
-qiskit-aer~=0.14.0.1
-qiskit-ibm-provider~=0.10.0
-qiskit-ibm-runtime~=0.20.0
-ply==3.11
-pyquil~=3.5.4
-pennylane-qiskit~=0.35.1
-pennylane~=0.35.1
-amazon-braket-sdk~=1.69.0
-qibo==0.2.7 # TODO: unpin this
-
# Unit tests, coverage, and formatting/style.
pytest==8.0.0
pytest-xdist[psutil]==3.0.2
diff --git a/requirements/requirements-pennylane.txt b/requirements/requirements-pennylane.txt
new file mode 100644
index 0000000000..5baae67e54
--- /dev/null
+++ b/requirements/requirements-pennylane.txt
@@ -0,0 +1,2 @@
+pennylane-qiskit~=0.35.1
+pennylane~=0.35.1
\ No newline at end of file
diff --git a/requirements/requirements-pyquil.txt b/requirements/requirements-pyquil.txt
new file mode 100644
index 0000000000..7c8f5861f7
--- /dev/null
+++ b/requirements/requirements-pyquil.txt
@@ -0,0 +1,2 @@
+pyquil~=3.5.4
+cirq-rigetti>=1.0.0,<1.4.0
\ No newline at end of file
diff --git a/requirements/requirements-qibo.txt b/requirements/requirements-qibo.txt
new file mode 100644
index 0000000000..5cdf5415fe
--- /dev/null
+++ b/requirements/requirements-qibo.txt
@@ -0,0 +1 @@
+qibo==0.2.7 # TODO: unpin this
diff --git a/requirements/requirements-qiskit.txt b/requirements/requirements-qiskit.txt
new file mode 100644
index 0000000000..027414641e
--- /dev/null
+++ b/requirements/requirements-qiskit.txt
@@ -0,0 +1,5 @@
+qiskit~=1.0.2
+qiskit-aer~=0.14.0.1
+qiskit-ibm-provider~=0.10.0
+qiskit-ibm-runtime~=0.20.0
+ply==3.11
\ No newline at end of file
diff --git a/requirements.txt b/requirements/requirements.txt
similarity index 65%
rename from requirements.txt
rename to requirements/requirements.txt
index 63352bd57d..71df36a70d 100644
--- a/requirements.txt
+++ b/requirements/requirements.txt
@@ -1,4 +1,4 @@
numpy>=1.22.0
scipy>=1.10.1,<=1.13.0
-cirq>=1.0.0,<1.4.0
+cirq-core>=1.0.0,<1.4.0
tabulate
diff --git a/setup.py b/setup.py
index 3e464698f7..2d500d2270 100644
--- a/setup.py
+++ b/setup.py
@@ -5,14 +5,17 @@
from setuptools import find_packages, setup
-with open("VERSION.txt", "r") as f:
- __version__ = f.read().strip()
-with open("requirements.txt") as f:
- requirements = f.read().splitlines()
+def load_requirements(filename):
+ with open(f"requirements/{filename}", "r") as file:
+ return file.read().splitlines()
+
+
+with open("INTEGRATIONS.txt", "r") as f:
+ integrations = f.read().splitlines()
-with open("dev_requirements.txt") as f:
- dev_requirements = f.read().splitlines()
+with open("VERSION.txt", "r") as f:
+ __version__ = f.read().strip()
# save the source code in _version.py
with open("mitiq/_version.py", "r") as f:
@@ -22,13 +25,21 @@
with open("mitiq/_version.py", "w") as f:
f.write(f"__version__ = '{__version__}'\n")
+third_party_integration_requirements = {
+ k: load_requirements(f"requirements-{k}.txt") for k in integrations
+}
+
setup(
name="mitiq",
version=__version__,
- install_requires=requirements,
+ install_requires=load_requirements("requirements.txt"),
extras_require={
- "development": set(dev_requirements),
- },
+ "development": set().union(
+ *third_party_integration_requirements.values(),
+ load_requirements("requirements-dev.txt"),
+ )
+ }
+ | third_party_integration_requirements,
packages=find_packages(),
include_package_data=True,
description="Mitiq is an open source toolkit for implementing error "