diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 1cb82d976736..bf31e54872c2 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -45,8 +45,8 @@ jobs: stestr run # We set the --source-dir to '.' because we want all paths to appear relative to the repo # root (we need to combine them with the Python ones), but we only care about `grcov` - # keeping the `src/*` files; we don't care about coverage in dependencies. - grcov . --binary-path target/debug/ --source-dir . --output-type lcov --output-path rust.info --llvm --branch --parallel --keep-only 'src/*' + # keeping the `crates/*` files; we don't care about coverage in dependencies. + grcov . --binary-path target/debug/ --source-dir . --output-type lcov --output-path rust.info --llvm --branch --parallel --keep-only 'crates/*' env: QISKIT_TEST_CAPTURE_STREAMS: 1 QISKIT_PARALLEL: FALSE diff --git a/Cargo.lock b/Cargo.lock index e392767ad8e6..becd4597ed46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,9 +45,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -66,31 +66,31 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.13" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset 0.7.1", + "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", ] [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "fixedbitset" @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "indoc" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2d6f23ffea9d7e76c53eee25dfb67bcd8fde7f1198b0855350698c9f07c780" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" [[package]] name = "libc" @@ -192,15 +192,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.8.0" @@ -291,9 +282,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "parking_lot" @@ -307,9 +298,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", @@ -320,9 +311,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", "indexmap", @@ -336,9 +327,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "priority-queue" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7685ca4cc0b3ad748c22ce6803e23b55b9206ef7715b965ebeaf41639238fdc" +checksum = "5ca9c6be70d989d21a136eb86c2d83e4b328447fac4a88dace2143c179c86267" dependencies = [ "autocfg", "indexmap", @@ -346,9 +337,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -364,7 +355,7 @@ dependencies = [ "indexmap", "indoc", "libc", - "memoffset 0.8.0", + "memoffset", "num-bigint", "num-complex", "parking_lot", @@ -418,7 +409,7 @@ dependencies = [ ] [[package]] -name = "qiskit-terra" +name = "qiskit_accelerate" version = "0.24.0" dependencies = [ "ahash 0.8.3", @@ -567,9 +558,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -578,15 +569,15 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d" +checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unindent" @@ -608,9 +599,18 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", diff --git a/Cargo.toml b/Cargo.toml index 1db82bf185fe..ece643e5c8fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,42 +1,14 @@ -[package] -name = "qiskit-terra" +[workspace] +members = ["crates/*"] + +# This has no meaning until we're on Rust 1.64, but once we get there, the subpackages will be able +# to inherit from this rather than needing to duplicate its content themselves. Until we get there, +# keep this in sync with each subpackage `Cargo.toml`'s `package` key. +[workspace.package] version = "0.24.0" edition = "2021" -# Keep in sync with README.md and rust-toolchain.toml. -rust-version = "1.61" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "qiskit_accelerate" -crate-type = ["cdylib"] - -[dependencies] -rayon = "1.7" -numpy = "0.18.0" -rand = "0.8" -rand_pcg = "0.3" -rand_distr = "0.4.3" -ahash = "0.8.3" -num-complex = "0.4" -num-bigint = "0.4" -rustworkx-core = "0.12" - -[dependencies.pyo3] -version = "0.18.1" -features = ["extension-module", "hashbrown", "num-complex", "num-bigint", "indexmap"] - -[dependencies.ndarray] -version = "^0.15.6" -features = ["rayon"] - -[dependencies.hashbrown] -version = "0.13.2" -features = ["rayon"] - -[dependencies.indexmap] -version = "1.9" -features = ["rayon"] +rust-version = "1.61" # Keep in sync with README.md and rust-toolchain.toml. +license = "Apache-2.0" [profile.release] lto = 'fat' diff --git a/MANIFEST.in b/MANIFEST.in index 9d3fae282ed0..4af4594ace58 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -18,4 +18,4 @@ include test/python/notebooks/*.ipynb include Cargo.toml include Cargo.lock -recursive-include src * +recursive-include crates * diff --git a/crates/accelerate/Cargo.toml b/crates/accelerate/Cargo.toml new file mode 100644 index 000000000000..5021bb523c33 --- /dev/null +++ b/crates/accelerate/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "qiskit_accelerate" +# The following options can be inherited with (e.g.) `version.workspace = true` once we hit Rust +# 1.64. Until then, keep in sync with the root `Cargo.toml`. +version = "0.24.0" +edition = "2021" +rust-version = "1.61" +license = "Apache-2.0" + +[lib] +name = "qiskit_accelerate" +crate-type = ["cdylib"] + +[dependencies] +rayon = "1.7" +numpy = "0.18.0" +rand = "0.8" +rand_pcg = "0.3" +rand_distr = "0.4.3" +ahash = "0.8.3" +num-complex = "0.4" +num-bigint = "0.4" +rustworkx-core = "0.12" + +# The base version of PyO3 and setting a minimum feature set (e.g. probably just 'extension-module') +# can be done in the workspace and inherited once we hit Rust 1.64. +[dependencies.pyo3] +version = "0.18.1" +features = ["extension-module", "hashbrown", "indexmap", "num-complex", "num-bigint"] + +[dependencies.ndarray] +version = "^0.15.6" +features = ["rayon"] + +[dependencies.hashbrown] +version = "0.13.2" +features = ["rayon"] + +[dependencies.indexmap] +version = "1.9" +features = ["rayon"] diff --git a/crates/accelerate/README.md b/crates/accelerate/README.md new file mode 100644 index 000000000000..65f4eebe5844 --- /dev/null +++ b/crates/accelerate/README.md @@ -0,0 +1,21 @@ +# `qiskit._accelerate` + +This crate provides a bits-and-pieces Python extension module for small, self-contained functions +that are used by the main Python-space components to accelerate certain tasks. If you're trying to +speed up one particular Python function by replacing its innards with a Rust one, this is the best +place to put the code. This is _usually_ the right place to put Rust/Python interfacing code. + +The crate is made accessible as a private submodule, `qiskit._accelerate`. There are submodules +within that (largely matching the structure of the Rust code) mostly for grouping similar functions. + +Some examples of when it might be more appropriate to start a new crate instead of using the +ready-made solution of `qiskit._accelerate`: + +* The feature you are developing will have a large amount of domain-specific Rust code and is a + large self-contained module. If it reasonably works in a single Rust file, you probably just want + to put it here. + +* The Rust code is for re-use within other Qiskit crates and maintainability of the code will be + helped by using the crate system to provide API boundaries between the different sections. + +* You want to start writing your own procedural macros. diff --git a/src/dense_layout.rs b/crates/accelerate/src/dense_layout.rs similarity index 100% rename from src/dense_layout.rs rename to crates/accelerate/src/dense_layout.rs diff --git a/src/edge_collections.rs b/crates/accelerate/src/edge_collections.rs similarity index 100% rename from src/edge_collections.rs rename to crates/accelerate/src/edge_collections.rs diff --git a/src/error_map.rs b/crates/accelerate/src/error_map.rs similarity index 100% rename from src/error_map.rs rename to crates/accelerate/src/error_map.rs diff --git a/src/euler_one_qubit_decomposer.rs b/crates/accelerate/src/euler_one_qubit_decomposer.rs similarity index 100% rename from src/euler_one_qubit_decomposer.rs rename to crates/accelerate/src/euler_one_qubit_decomposer.rs diff --git a/src/lib.rs b/crates/accelerate/src/lib.rs similarity index 100% rename from src/lib.rs rename to crates/accelerate/src/lib.rs diff --git a/src/nlayout.rs b/crates/accelerate/src/nlayout.rs similarity index 100% rename from src/nlayout.rs rename to crates/accelerate/src/nlayout.rs diff --git a/src/optimize_1q_gates.rs b/crates/accelerate/src/optimize_1q_gates.rs similarity index 100% rename from src/optimize_1q_gates.rs rename to crates/accelerate/src/optimize_1q_gates.rs diff --git a/src/pauli_exp_val.rs b/crates/accelerate/src/pauli_exp_val.rs similarity index 100% rename from src/pauli_exp_val.rs rename to crates/accelerate/src/pauli_exp_val.rs diff --git a/src/results/converters.rs b/crates/accelerate/src/results/converters.rs similarity index 100% rename from src/results/converters.rs rename to crates/accelerate/src/results/converters.rs diff --git a/src/results/marginalization.rs b/crates/accelerate/src/results/marginalization.rs similarity index 100% rename from src/results/marginalization.rs rename to crates/accelerate/src/results/marginalization.rs diff --git a/src/results/mod.rs b/crates/accelerate/src/results/mod.rs similarity index 100% rename from src/results/mod.rs rename to crates/accelerate/src/results/mod.rs diff --git a/src/sabre_layout.rs b/crates/accelerate/src/sabre_layout.rs similarity index 100% rename from src/sabre_layout.rs rename to crates/accelerate/src/sabre_layout.rs diff --git a/src/sabre_swap/layer.rs b/crates/accelerate/src/sabre_swap/layer.rs similarity index 100% rename from src/sabre_swap/layer.rs rename to crates/accelerate/src/sabre_swap/layer.rs diff --git a/src/sabre_swap/mod.rs b/crates/accelerate/src/sabre_swap/mod.rs similarity index 100% rename from src/sabre_swap/mod.rs rename to crates/accelerate/src/sabre_swap/mod.rs diff --git a/src/sabre_swap/neighbor_table.rs b/crates/accelerate/src/sabre_swap/neighbor_table.rs similarity index 100% rename from src/sabre_swap/neighbor_table.rs rename to crates/accelerate/src/sabre_swap/neighbor_table.rs diff --git a/src/sabre_swap/sabre_dag.rs b/crates/accelerate/src/sabre_swap/sabre_dag.rs similarity index 100% rename from src/sabre_swap/sabre_dag.rs rename to crates/accelerate/src/sabre_swap/sabre_dag.rs diff --git a/src/sabre_swap/swap_map.rs b/crates/accelerate/src/sabre_swap/swap_map.rs similarity index 100% rename from src/sabre_swap/swap_map.rs rename to crates/accelerate/src/sabre_swap/swap_map.rs diff --git a/src/sampled_exp_val.rs b/crates/accelerate/src/sampled_exp_val.rs similarity index 100% rename from src/sampled_exp_val.rs rename to crates/accelerate/src/sampled_exp_val.rs diff --git a/src/sparse_pauli_op.rs b/crates/accelerate/src/sparse_pauli_op.rs similarity index 100% rename from src/sparse_pauli_op.rs rename to crates/accelerate/src/sparse_pauli_op.rs diff --git a/src/stochastic_swap.rs b/crates/accelerate/src/stochastic_swap.rs similarity index 100% rename from src/stochastic_swap.rs rename to crates/accelerate/src/stochastic_swap.rs diff --git a/src/vf2_layout.rs b/crates/accelerate/src/vf2_layout.rs similarity index 100% rename from src/vf2_layout.rs rename to crates/accelerate/src/vf2_layout.rs diff --git a/setup.py b/setup.py index ac1716ab4f48..7f6f2cb5b918 100755 --- a/setup.py +++ b/setup.py @@ -99,7 +99,9 @@ "Documentation": "https://qiskit.org/documentation/", "Source Code": "https://github.com/Qiskit/qiskit-terra", }, - rust_extensions=[RustExtension("qiskit._accelerate", "Cargo.toml", binding=Binding.PyO3)], + rust_extensions=[ + RustExtension("qiskit._accelerate", "crates/accelerate/Cargo.toml", binding=Binding.PyO3) + ], zip_safe=False, entry_points={ "qiskit.unitary_synthesis": [