mirror of https://github.com/Qiskit/qiskit.git
270 lines
14 KiB
TOML
270 lines
14 KiB
TOML
[build-system]
|
|
requires = ["setuptools", "wheel", "setuptools-rust"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "qiskit"
|
|
description = "An open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives."
|
|
requires-python = ">=3.9"
|
|
license = {text = "Apache 2.0"}
|
|
authors = [
|
|
{ name = "Qiskit Development Team", email = "qiskit@us.ibm.com" },
|
|
]
|
|
keywords = [
|
|
"qiskit",
|
|
"quantum circuit",
|
|
"quantum computing",
|
|
"quantum programming language",
|
|
"quantum",
|
|
"sdk",
|
|
]
|
|
classifiers = [
|
|
"Environment :: Console",
|
|
"Intended Audience :: Developers",
|
|
"Intended Audience :: Science/Research",
|
|
"License :: OSI Approved :: Apache Software License",
|
|
"Operating System :: MacOS",
|
|
"Operating System :: Microsoft :: Windows",
|
|
"Operating System :: POSIX :: Linux",
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
"Programming Language :: Python :: 3.9",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Topic :: Scientific/Engineering",
|
|
]
|
|
# These are configured in the `tool.setuptools.dynamic` table.
|
|
dynamic = ["version", "readme", "dependencies"]
|
|
|
|
# If modifying this table, be sure to sync with `requirements-optional.txt` and
|
|
# `qiskit.utils.optionals`.
|
|
[project.optional-dependencies]
|
|
qasm3-import = [
|
|
"qiskit-qasm3-import >= 0.1.0",
|
|
]
|
|
visualization = [
|
|
"matplotlib >= 3.3",
|
|
"pydot",
|
|
"Pillow >= 4.2.1",
|
|
"pylatexenc >= 1.4",
|
|
"seaborn >= 0.9.0",
|
|
]
|
|
crosstalk-pass = [
|
|
"z3-solver >= 4.7",
|
|
]
|
|
csp-layout-pass = [
|
|
"python-constraint >= 1.4",
|
|
]
|
|
# This will make the resolution work for installers from PyPI, but `pip install .[all]` will be
|
|
# unreliable because `qiskit` will resolve to the PyPI version, so local changes in the
|
|
# optionals won't be reflected.
|
|
all = ["qiskit[qasm3-import,visualization,crosstalk-pass,csp-layout-pass]"]
|
|
|
|
[project.urls]
|
|
Homepage = "https://www.ibm.com/quantum/qiskit"
|
|
Documentation = "https://docs.quantum.ibm.com"
|
|
"API Reference" = "https://docs.quantum.ibm.com/api/qiskit"
|
|
Repository = "https://github.com/Qiskit/qiskit"
|
|
Issues = "https://github.com/Qiskit/qiskit/issues"
|
|
Changelog = "https://docs.quantum.ibm.com/api/qiskit/release-notes"
|
|
|
|
[project.entry-points."qiskit.unitary_synthesis"]
|
|
default = "qiskit.transpiler.passes.synthesis.unitary_synthesis:DefaultUnitarySynthesis"
|
|
aqc = "qiskit.transpiler.passes.synthesis.aqc_plugin:AQCSynthesisPlugin"
|
|
sk = "qiskit.transpiler.passes.synthesis.solovay_kitaev_synthesis:SolovayKitaevSynthesis"
|
|
|
|
[project.entry-points."qiskit.synthesis"]
|
|
"clifford.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisClifford"
|
|
"clifford.ag" = "qiskit.transpiler.passes.synthesis.hls_plugins:AGSynthesisClifford"
|
|
"clifford.bm" = "qiskit.transpiler.passes.synthesis.hls_plugins:BMSynthesisClifford"
|
|
"clifford.greedy" = "qiskit.transpiler.passes.synthesis.hls_plugins:GreedySynthesisClifford"
|
|
"clifford.layers" = "qiskit.transpiler.passes.synthesis.hls_plugins:LayerSynthesisClifford"
|
|
"clifford.lnn" = "qiskit.transpiler.passes.synthesis.hls_plugins:LayerLnnSynthesisClifford"
|
|
"linear_function.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisLinearFunction"
|
|
"linear_function.kms" = "qiskit.transpiler.passes.synthesis.hls_plugins:KMSSynthesisLinearFunction"
|
|
"linear_function.pmh" = "qiskit.transpiler.passes.synthesis.hls_plugins:PMHSynthesisLinearFunction"
|
|
"mcx.n_dirty_i15" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisNDirtyI15"
|
|
"mcx.n_clean_m15" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisNCleanM15"
|
|
"mcx.1_clean_b95" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesis1CleanB95"
|
|
"mcx.gray_code" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisGrayCode"
|
|
"mcx.noaux_v24" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisNoAuxV24"
|
|
"mcx.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisDefault"
|
|
"mcmt.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisDefault"
|
|
"mcmt.noaux" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisNoAux"
|
|
"mcmt.vchain" = "qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisVChain"
|
|
"permutation.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:BasicSynthesisPermutation"
|
|
"permutation.kms" = "qiskit.transpiler.passes.synthesis.hls_plugins:KMSSynthesisPermutation"
|
|
"permutation.basic" = "qiskit.transpiler.passes.synthesis.hls_plugins:BasicSynthesisPermutation"
|
|
"permutation.acg" = "qiskit.transpiler.passes.synthesis.hls_plugins:ACGSynthesisPermutation"
|
|
"qft.full" = "qiskit.transpiler.passes.synthesis.hls_plugins:QFTSynthesisFull"
|
|
"qft.line" = "qiskit.transpiler.passes.synthesis.hls_plugins:QFTSynthesisLine"
|
|
"qft.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:QFTSynthesisFull"
|
|
"permutation.token_swapper" = "qiskit.transpiler.passes.synthesis.hls_plugins:TokenSwapperSynthesisPermutation"
|
|
"ModularAdder.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisDefault"
|
|
"ModularAdder.ripple_c04" = "qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisC04"
|
|
"ModularAdder.ripple_v95" = "qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisV95"
|
|
"ModularAdder.qft_d00" = "qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisD00"
|
|
"HalfAdder.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisDefault"
|
|
"HalfAdder.ripple_c04" = "qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisC04"
|
|
"HalfAdder.ripple_v95" = "qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisV95"
|
|
"HalfAdder.qft_d00" = "qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisD00"
|
|
"FullAdder.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04"
|
|
"FullAdder.ripple_c04" = "qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04"
|
|
"FullAdder.ripple_v95" = "qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisV95"
|
|
"Multiplier.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17"
|
|
"Multiplier.qft_r17" = "qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17"
|
|
"Multiplier.cumulative_h18" = "qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisH18"
|
|
"PauliEvolution.default" = "qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisDefault"
|
|
|
|
[project.entry-points."qiskit.transpiler.init"]
|
|
default = "qiskit.transpiler.preset_passmanagers.builtin_plugins:DefaultInitPassManager"
|
|
|
|
[project.entry-points."qiskit.transpiler.translation"]
|
|
synthesis = "qiskit.transpiler.preset_passmanagers.builtin_plugins:UnitarySynthesisPassManager"
|
|
translator = "qiskit.transpiler.preset_passmanagers.builtin_plugins:BasisTranslatorPassManager"
|
|
|
|
[project.entry-points."qiskit.transpiler.routing"]
|
|
basic = "qiskit.transpiler.preset_passmanagers.builtin_plugins:BasicSwapPassManager"
|
|
lookahead = "qiskit.transpiler.preset_passmanagers.builtin_plugins:LookaheadSwapPassManager"
|
|
none = "qiskit.transpiler.preset_passmanagers.builtin_plugins:NoneRoutingPassManager"
|
|
sabre = "qiskit.transpiler.preset_passmanagers.builtin_plugins:SabreSwapPassManager"
|
|
stochastic = "qiskit.transpiler.preset_passmanagers.builtin_plugins:StochasticSwapPassManager"
|
|
|
|
[project.entry-points."qiskit.transpiler.optimization"]
|
|
default = "qiskit.transpiler.preset_passmanagers.builtin_plugins:OptimizationPassManager"
|
|
|
|
[project.entry-points."qiskit.transpiler.layout"]
|
|
default = "qiskit.transpiler.preset_passmanagers.builtin_plugins:DefaultLayoutPassManager"
|
|
dense = "qiskit.transpiler.preset_passmanagers.builtin_plugins:DenseLayoutPassManager"
|
|
sabre = "qiskit.transpiler.preset_passmanagers.builtin_plugins:SabreLayoutPassManager"
|
|
trivial = "qiskit.transpiler.preset_passmanagers.builtin_plugins:TrivialLayoutPassManager"
|
|
|
|
[project.entry-points."qiskit.transpiler.scheduling"]
|
|
alap = "qiskit.transpiler.preset_passmanagers.builtin_plugins:AlapSchedulingPassManager"
|
|
asap = "qiskit.transpiler.preset_passmanagers.builtin_plugins:AsapSchedulingPassManager"
|
|
default = "qiskit.transpiler.preset_passmanagers.builtin_plugins:DefaultSchedulingPassManager"
|
|
|
|
[tool.setuptools]
|
|
include-package-data = true
|
|
|
|
[tool.setuptools.dynamic]
|
|
version = { file = "qiskit/VERSION.txt" }
|
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
dependencies = {file = "requirements.txt" }
|
|
|
|
[tool.setuptools.packages.find]
|
|
include = ["qiskit", "qiskit.*"]
|
|
|
|
[tool.black]
|
|
line-length = 100
|
|
target-version = ['py39', 'py310', 'py311']
|
|
|
|
[tool.cibuildwheel]
|
|
manylinux-x86_64-image = "manylinux2014"
|
|
manylinux-i686-image = "manylinux2014"
|
|
skip = "pp* cp36-* cp37-* cp38-* *musllinux* *win32 *i686 cp38-macosx_arm64"
|
|
test-skip = "*win32 *linux_i686"
|
|
test-command = "cp -r {project}/test . && QISKIT_PARALLEL=FALSE stestr --test-path test/python run --abbreviate"
|
|
# We need to use pre-built versions of Numpy and Scipy in the tests; they have a
|
|
# tendency to crash if they're installed from source by `pip install`, and since
|
|
# Numpy 1.22 there are no i686 wheels, so we force pip to use older ones without
|
|
# restricting any dependencies that Numpy and Scipy might have.
|
|
before-test = "pip install --prefer-binary --only-binary=numpy,scipy numpy scipy -c constraints.txt -r requirements-dev.txt"
|
|
# Some jobs locally override the before-build and environment configuration if a
|
|
# specific job override is needed. For example tier 1 platforms locally override
|
|
# the before-build and environment configuration to enable PGO,
|
|
# see: .github/workflows/wheels.yml for the jobs where this is done
|
|
environment = 'RUSTUP_TOOLCHAIN="stable"'
|
|
|
|
[tool.cibuildwheel.linux]
|
|
before-all = "yum install -y wget && {package}/tools/install_rust.sh"
|
|
environment = 'PATH="$PATH:$HOME/.cargo/bin" CARGO_NET_GIT_FETCH_WITH_CLI="true" RUSTUP_TOOLCHAIN="stable"'
|
|
repair-wheel-command = "auditwheel repair -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel}"
|
|
|
|
[tool.cibuildwheel.macos]
|
|
environment = "MACOSX_DEPLOYMENT_TARGET=10.12"
|
|
repair-wheel-command = "delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && pipx run abi3audit --strict --report {wheel}"
|
|
|
|
[tool.cibuildwheel.windows]
|
|
test-command = "cp -r {project}/test . && stestr --test-path test/python run --abbreviate"
|
|
repair-wheel-command = "cp {wheel} {dest_dir}/. && pipx run abi3audit --strict --report {wheel}"
|
|
|
|
[tool.ruff]
|
|
select = [
|
|
# Rules in alphabetic order
|
|
"C4", # category: flake8-comprehensions
|
|
"EXE", # Category: flake8-executable
|
|
"F631", # assert-tuple
|
|
"F632", # is-literal
|
|
"F634", # if-tuple
|
|
"F823", # undefined-local
|
|
"G", # flake8-logging-format
|
|
"T10", # category: flake8-debugger
|
|
]
|
|
|
|
[tool.pylint.main]
|
|
extension-pkg-allow-list = [
|
|
"numpy",
|
|
"qiskit._accelerate",
|
|
"qiskit._qasm2",
|
|
"qiskit._qasm3",
|
|
# We can't allow pylint to load qiskit._qasm2 because it's not able to
|
|
# statically resolve the cyclical load of the exception and it bugs out.
|
|
"retworkx",
|
|
"rustworkx",
|
|
"tweedledum",
|
|
]
|
|
load-plugins = ["pylint.extensions.docparams", "pylint.extensions.docstyle"]
|
|
py-version = "3.9" # update it when bumping minimum supported python version
|
|
|
|
[tool.pylint.basic]
|
|
good-names = ["a", "b", "i", "j", "k", "d", "n", "m", "ex", "v", "w", "x", "y", "z", "Run", "_", "logger", "q", "c", "r", "qr", "cr", "qc", "nd", "pi", "op", "b", "ar", "br", "p", "cp", "ax", "dt", "__unittest", "iSwapGate", "mu"]
|
|
method-rgx = "(([a-z_][a-z0-9_]{2,49})|(assert[A-Z][a-zA-Z0-9]{2,43})|(test_[_a-zA-Z0-9]{2,}))$"
|
|
variable-rgx = "[a-z_][a-z0-9_]{1,30}$"
|
|
|
|
[tool.pylint.format]
|
|
max-line-length = 105 # default 100
|
|
|
|
[tool.pylint."messages control"]
|
|
disable = [
|
|
# intentionally disabled:
|
|
"spelling", # too noisy
|
|
"fixme", # disabled as TODOs would show up as warnings
|
|
"protected-access", # disabled as we don't follow the public vs private convention strictly
|
|
"duplicate-code", # disabled as it is too verbose
|
|
"redundant-returns-doc", # for @abstractmethod, it cannot interpret "pass"
|
|
"too-many-lines", "too-many-branches", "too-many-locals", "too-many-nested-blocks", "too-many-statements",
|
|
"too-many-instance-attributes", "too-many-arguments", "too-many-public-methods", "too-few-public-methods", "too-many-ancestors",
|
|
"unnecessary-pass", # allow for methods with just "pass", for clarity
|
|
"unnecessary-dunder-call", # do not want to implement
|
|
"no-else-return", # relax "elif" after a clause with a return
|
|
"docstring-first-line-empty", # relax docstring style
|
|
"import-outside-toplevel", "import-error", # overzealous with our optionals/dynamic packages
|
|
"nested-min-max", # this gives false equivalencies if implemented for the current lint version
|
|
"consider-using-max-builtin", "consider-using-min-builtin", # unnecessary stylistic opinion
|
|
# TODO(#9614): these were added in modern Pylint. Decide if we want to enable them. If so,
|
|
# remove from here and fix the issues. Else, move it above this section and add a comment
|
|
# with the rationale
|
|
"no-member", # for dynamically created members
|
|
"not-context-manager",
|
|
"unnecessary-lambda-assignment", # do not want to implement
|
|
"unspecified-encoding", # do not want to implement
|
|
]
|
|
|
|
enable = [
|
|
"use-symbolic-message-instead"
|
|
]
|
|
|
|
[tool.pylint.spelling]
|
|
spelling-private-dict-file = ".local-spellings"
|
|
|
|
[tool.coverage.report]
|
|
exclude_also = [
|
|
"def __repr__", # Printable epresentational string does not typically execute during testing
|
|
"raise NotImplementedError", # Abstract methods are not testable
|
|
"raise RuntimeError", # Exceptions for defensive programming that cannot be tested a head
|
|
"if TYPE_CHECKING:", # Code that only runs during type checks
|
|
"@abstractmethod", # Abstract methods are not testable
|
|
]
|