diff --git a/crates/accelerate/src/convert_2q_block_matrix.rs b/crates/accelerate/src/convert_2q_block_matrix.rs index 12cfc8aa98ce..313a5a8c3611 100644 --- a/crates/accelerate/src/convert_2q_block_matrix.rs +++ b/crates/accelerate/src/convert_2q_block_matrix.rs @@ -66,7 +66,6 @@ fn change_basis(matrix: ArrayView2) -> Array2 { trans_matrix } -#[pymodule] pub fn convert_2q_block_matrix(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(blocks_to_matrix))?; Ok(()) diff --git a/crates/accelerate/src/dense_layout.rs b/crates/accelerate/src/dense_layout.rs index 4570eafc0bf1..bcd53fee97fb 100644 --- a/crates/accelerate/src/dense_layout.rs +++ b/crates/accelerate/src/dense_layout.rs @@ -223,7 +223,6 @@ pub fn best_subset( )) } -#[pymodule] pub fn dense_layout(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(best_subset))?; Ok(()) diff --git a/crates/accelerate/src/error_map.rs b/crates/accelerate/src/error_map.rs index 607813d3930b..3cde05b9fac4 100644 --- a/crates/accelerate/src/error_map.rs +++ b/crates/accelerate/src/error_map.rs @@ -111,7 +111,6 @@ impl ErrorMap { } } -#[pymodule] pub fn error_map(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; Ok(()) diff --git a/crates/accelerate/src/euler_one_qubit_decomposer.rs b/crates/accelerate/src/euler_one_qubit_decomposer.rs index 1a37528dbc8e..96bf309c7ce7 100644 --- a/crates/accelerate/src/euler_one_qubit_decomposer.rs +++ b/crates/accelerate/src/euler_one_qubit_decomposer.rs @@ -791,7 +791,6 @@ pub fn params_zxz(unitary: PyReadonlyArray2) -> [f64; 4] { params_zxz_inner(mat) } -#[pymodule] pub fn euler_one_qubit_decomposer(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(params_zyz))?; m.add_wrapped(wrap_pyfunction!(params_xyx))?; diff --git a/crates/accelerate/src/lib.rs b/crates/accelerate/src/lib.rs index d00d17644b83..533856e57a79 100644 --- a/crates/accelerate/src/lib.rs +++ b/crates/accelerate/src/lib.rs @@ -13,7 +13,6 @@ use std::env; use pyo3::prelude::*; -use pyo3::wrap_pymodule; use pyo3::Python; mod convert_2q_block_matrix; @@ -45,25 +44,47 @@ pub fn getenv_use_multiple_threads() -> bool { !parallel_context || force_threads } +#[inline(always)] +#[doc(hidden)] +fn add_submodule(py: Python, m: &PyModule, constructor: F, name: &str) -> PyResult<()> +where + F: FnOnce(Python, &PyModule) -> PyResult<()>, +{ + let new_mod = PyModule::new(py, name)?; + constructor(py, new_mod)?; + m.add_submodule(new_mod) +} + #[pymodule] -fn _accelerate(_py: Python<'_>, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pymodule!(nlayout::nlayout))?; - m.add_wrapped(wrap_pymodule!(stochastic_swap::stochastic_swap))?; - m.add_wrapped(wrap_pymodule!(sabre_swap::sabre_swap))?; - m.add_wrapped(wrap_pymodule!(pauli_exp_val::pauli_expval))?; - m.add_wrapped(wrap_pymodule!(dense_layout::dense_layout))?; - m.add_wrapped(wrap_pymodule!(error_map::error_map))?; - m.add_wrapped(wrap_pymodule!(sparse_pauli_op::sparse_pauli_op))?; - m.add_wrapped(wrap_pymodule!(results::results))?; - m.add_wrapped(wrap_pymodule!(optimize_1q_gates::optimize_1q_gates))?; - m.add_wrapped(wrap_pymodule!(sampled_exp_val::sampled_exp_val))?; - m.add_wrapped(wrap_pymodule!(sabre_layout::sabre_layout))?; - m.add_wrapped(wrap_pymodule!(vf2_layout::vf2_layout))?; - m.add_wrapped(wrap_pymodule!( - euler_one_qubit_decomposer::euler_one_qubit_decomposer - ))?; - m.add_wrapped(wrap_pymodule!( - convert_2q_block_matrix::convert_2q_block_matrix - ))?; +fn _accelerate(py: Python<'_>, m: &PyModule) -> PyResult<()> { + add_submodule(py, m, nlayout::nlayout, "nlayout")?; + add_submodule(py, m, stochastic_swap::stochastic_swap, "stochastic_swap")?; + add_submodule(py, m, sabre_swap::sabre_swap, "sabre_swap")?; + add_submodule(py, m, pauli_exp_val::pauli_expval, "pauli_expval")?; + add_submodule(py, m, dense_layout::dense_layout, "dense_layout")?; + add_submodule(py, m, error_map::error_map, "error_map")?; + add_submodule(py, m, sparse_pauli_op::sparse_pauli_op, "sparse_pauli_op")?; + add_submodule(py, m, results::results, "results")?; + add_submodule( + py, + m, + optimize_1q_gates::optimize_1q_gates, + "optimize_1q_gates", + )?; + add_submodule(py, m, sampled_exp_val::sampled_exp_val, "sampled_exp_val")?; + add_submodule(py, m, sabre_layout::sabre_layout, "sabre_layout")?; + add_submodule(py, m, vf2_layout::vf2_layout, "vf2_layout")?; + add_submodule( + py, + m, + euler_one_qubit_decomposer::euler_one_qubit_decomposer, + "euler_one_qubit_decomposer", + )?; + add_submodule( + py, + m, + convert_2q_block_matrix::convert_2q_block_matrix, + "convert_2q_block_matrix", + )?; Ok(()) } diff --git a/crates/accelerate/src/nlayout.rs b/crates/accelerate/src/nlayout.rs index 68dd8b3edc5e..1e58e9ef6a70 100644 --- a/crates/accelerate/src/nlayout.rs +++ b/crates/accelerate/src/nlayout.rs @@ -215,7 +215,6 @@ impl NLayout { } } -#[pymodule] pub fn nlayout(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; Ok(()) diff --git a/crates/accelerate/src/optimize_1q_gates.rs b/crates/accelerate/src/optimize_1q_gates.rs index 450cf3f10a3b..effed868f752 100644 --- a/crates/accelerate/src/optimize_1q_gates.rs +++ b/crates/accelerate/src/optimize_1q_gates.rs @@ -91,7 +91,6 @@ pub fn compose_u3_rust( out_angles } -#[pymodule] pub fn optimize_1q_gates(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(compose_u3_rust))?; Ok(()) diff --git a/crates/accelerate/src/pauli_exp_val.rs b/crates/accelerate/src/pauli_exp_val.rs index 35db1db165c5..fe5dcae986fe 100644 --- a/crates/accelerate/src/pauli_exp_val.rs +++ b/crates/accelerate/src/pauli_exp_val.rs @@ -208,7 +208,6 @@ pub fn density_expval_pauli_with_x( } } -#[pymodule] pub fn pauli_expval(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(expval_pauli_no_x))?; m.add_wrapped(wrap_pyfunction!(expval_pauli_with_x))?; diff --git a/crates/accelerate/src/results/mod.rs b/crates/accelerate/src/results/mod.rs index 2ac40bb307fe..7d4d36947712 100644 --- a/crates/accelerate/src/results/mod.rs +++ b/crates/accelerate/src/results/mod.rs @@ -16,7 +16,6 @@ pub mod marginalization; use pyo3::prelude::*; use pyo3::wrap_pyfunction; -#[pymodule] pub fn results(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(marginalization::marginal_counts))?; m.add_wrapped(wrap_pyfunction!(marginalization::marginal_distribution))?; diff --git a/crates/accelerate/src/sabre_layout.rs b/crates/accelerate/src/sabre_layout.rs index decfe590c050..4889d31802b5 100644 --- a/crates/accelerate/src/sabre_layout.rs +++ b/crates/accelerate/src/sabre_layout.rs @@ -215,7 +215,6 @@ fn layout_trial( (initial_layout, final_permutation, sabre_result) } -#[pymodule] pub fn sabre_layout(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(sabre_layout_and_routing))?; Ok(()) diff --git a/crates/accelerate/src/sabre_swap/mod.rs b/crates/accelerate/src/sabre_swap/mod.rs index d4345a02e2c1..700515d3a43c 100644 --- a/crates/accelerate/src/sabre_swap/mod.rs +++ b/crates/accelerate/src/sabre_swap/mod.rs @@ -741,7 +741,6 @@ fn choose_best_swap( *best_swaps.choose(rng).unwrap() } -#[pymodule] pub fn sabre_swap(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(build_swap_map))?; m.add_class::()?; diff --git a/crates/accelerate/src/sampled_exp_val.rs b/crates/accelerate/src/sampled_exp_val.rs index d71219ff16f6..4dd272c01822 100644 --- a/crates/accelerate/src/sampled_exp_val.rs +++ b/crates/accelerate/src/sampled_exp_val.rs @@ -86,7 +86,6 @@ pub fn sampled_expval_complex( Ok(out.re) } -#[pymodule] pub fn sampled_exp_val(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(sampled_expval_float))?; m.add_wrapped(wrap_pyfunction!(sampled_expval_complex))?; diff --git a/crates/accelerate/src/sparse_pauli_op.rs b/crates/accelerate/src/sparse_pauli_op.rs index 7ed3beb4dd82..ac6e9b3facf7 100644 --- a/crates/accelerate/src/sparse_pauli_op.rs +++ b/crates/accelerate/src/sparse_pauli_op.rs @@ -60,7 +60,6 @@ pub fn unordered_unique(py: Python, array: PyReadonlyArray2) -> (PyObject, ) } -#[pymodule] pub fn sparse_pauli_op(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(unordered_unique))?; Ok(()) diff --git a/crates/accelerate/src/stochastic_swap.rs b/crates/accelerate/src/stochastic_swap.rs index 6d5ed693be42..6c08819de9e6 100644 --- a/crates/accelerate/src/stochastic_swap.rs +++ b/crates/accelerate/src/stochastic_swap.rs @@ -336,7 +336,6 @@ pub fn swap_trials( Ok((best_edges, best_layout, best_depth)) } -#[pymodule] pub fn stochastic_swap(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(swap_trials))?; m.add_class::()?; diff --git a/crates/accelerate/src/vf2_layout.rs b/crates/accelerate/src/vf2_layout.rs index fe361b079410..d9cfc8dec29d 100644 --- a/crates/accelerate/src/vf2_layout.rs +++ b/crates/accelerate/src/vf2_layout.rs @@ -106,7 +106,6 @@ pub fn score_layout( Ok(1. - fidelity) } -#[pymodule] pub fn vf2_layout(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(score_layout))?; m.add_class::()?;