#![warn(clippy::perf, clippy::style)]
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
use laddu_core::ThreadPoolManager;
use pyo3::{prelude::*, types::PyDict};
#[pyfunction]
pub fn available_parallelism() -> usize {
num_cpus::get()
}
#[pyfunction]
pub fn set_threads(n_threads: Option<usize>) {
ThreadPoolManager::set_global_thread_count(n_threads.unwrap_or(0));
}
#[pyfunction]
pub fn get_threads() -> usize {
ThreadPoolManager::global_thread_count().unwrap_or(0)
}
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod amplitudes;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod data;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod generation;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod math;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod quantum;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod variables;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod vectors;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod extensions;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod mpi {
#[cfg(not(feature = "mpi"))]
use pyo3::exceptions::PyModuleNotFoundError;
use super::*;
#[pyfunction]
pub fn is_mpi_available() -> bool {
#[cfg(feature = "mpi")]
return true;
#[cfg(not(feature = "mpi"))]
return false;
}
#[pyfunction]
#[allow(unused_variables)]
#[pyo3(signature = (*, trigger=true))]
pub fn use_mpi(trigger: bool) -> PyResult<()> {
#[cfg(feature = "mpi")]
{
laddu_core::mpi::use_mpi(trigger);
Ok(())
}
#[cfg(not(feature = "mpi"))]
return Err(PyModuleNotFoundError::new_err(
"`laddu` was not compiled with MPI support! Please use `laddu-mpi` instead.",
));
}
#[pyfunction]
pub fn finalize_mpi() -> PyResult<()> {
#[cfg(feature = "mpi")]
{
laddu_core::mpi::finalize_mpi();
Ok(())
}
#[cfg(not(feature = "mpi"))]
return Err(PyModuleNotFoundError::new_err(
"`laddu` was not compiled with MPI support! Please use `laddu-mpi` instead.",
));
}
#[pyfunction]
pub fn using_mpi() -> bool {
#[cfg(feature = "mpi")]
return laddu_core::mpi::using_mpi();
#[cfg(not(feature = "mpi"))]
return false;
}
#[pyfunction]
pub fn is_root() -> bool {
#[cfg(feature = "mpi")]
return laddu_core::mpi::is_root();
#[cfg(not(feature = "mpi"))]
return true;
}
#[pyfunction]
pub fn get_rank() -> i32 {
#[cfg(feature = "mpi")]
return laddu_core::mpi::get_rank();
#[cfg(not(feature = "mpi"))]
return 0;
}
#[pyfunction]
pub fn get_size() -> i32 {
#[cfg(feature = "mpi")]
return laddu_core::mpi::get_size();
#[cfg(not(feature = "mpi"))]
return 1;
}
}
pub trait GetStrExtractObj {
fn get_extract<T>(&self, key: &str) -> PyResult<Option<T>>
where
T: for<'a, 'py> FromPyObject<'a, 'py, Error = PyErr>;
}
#[cfg_attr(coverage_nightly, coverage(off))]
impl GetStrExtractObj for Bound<'_, PyDict> {
fn get_extract<T>(&self, key: &str) -> PyResult<Option<T>>
where
T: for<'a, 'py> FromPyObject<'a, 'py, Error = PyErr>,
{
self.get_item(key)?
.map(|value| value.extract::<T>())
.transpose()
}
}