[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.8" 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.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "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.high_level_synthesis:DefaultSynthesisClifford" "clifford.ag" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:AGSynthesisClifford" "clifford.bm" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:BMSynthesisClifford" "clifford.greedy" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:GreedySynthesisClifford" "clifford.layers" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:LayerSynthesisClifford" "clifford.lnn" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:LayerLnnSynthesisClifford" "linear_function.default" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:DefaultSynthesisLinearFunction" "linear_function.kms" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:KMSSynthesisLinearFunction" "linear_function.pmh" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:PMHSynthesisLinearFunction" "permutation.default" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:BasicSynthesisPermutation" "permutation.kms" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:KMSSynthesisPermutation" "permutation.basic" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:BasicSynthesisPermutation" "permutation.acg" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:ACGSynthesisPermutation" "qft.full" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:QFTSynthesisFull" "qft.line" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:QFTSynthesisLine" "qft.default" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:QFTSynthesisFull" "permutation.token_swapper" = "qiskit.transpiler.passes.synthesis.high_level_synthesis:TokenSwapperSynthesisPermutation" [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 = ['py38', 'py39', 'py310', 'py311'] [tool.cibuildwheel] manylinux-x86_64-image = "manylinux2014" manylinux-i686-image = "manylinux2014" skip = "pp* cp36-* cp37-* *musllinux* *win32 *i686 cp38-macosx_arm64" test-skip = "*win32 *linux_i686" test-command = "python {project}/examples/python/stochastic_swap.py" # 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 --only-binary=numpy,scipy numpy scipy" # 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] 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.8" # 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 ]