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/) | +|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | Cirq logo | Qiskit logo | Rigetti logo | AWS logo | PennyLane logo | Qibo logo | -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 "