use pyo3::prelude::*;
use qoqo_macros::noise_model_wrapper;
use roqoqo::noise_models::{DecoherenceOnIdleModel, NoiseModel};
#[cfg(feature = "json_schema")]
use roqoqo::{operations::SupportedVersion, ROQOQO_VERSION};
use struqture;
use struqture_py::spins::PlusMinusLindbladNoiseOperatorWrapper;
#[pyclass(frozen, name = "DecoherenceOnIdleModel")]
#[derive(Clone, Debug, PartialEq)]
pub struct DecoherenceOnIdleModelWrapper {
internal: DecoherenceOnIdleModel,
}
#[noise_model_wrapper]
impl DecoherenceOnIdleModelWrapper {
#[new]
pub fn new(noise_operator: Option<Py<PyAny>>) -> PyResult<Self> {
if let Some(lindblad_operator) = noise_operator {
let noise_operator =
struqture_py::spins::PlusMinusLindbladNoiseOperatorWrapper::from_pyany(
lindblad_operator,
)?;
Ok(Self {
internal: DecoherenceOnIdleModel::from(noise_operator),
})
} else {
Ok(DecoherenceOnIdleModelWrapper {
internal: DecoherenceOnIdleModel::new(),
})
}
}
pub fn get_noise_operator(&self) -> PlusMinusLindbladNoiseOperatorWrapper {
PlusMinusLindbladNoiseOperatorWrapper {
internal: struqture::spins::PlusMinusLindbladNoiseOperator::from(self.internal.clone()),
}
}
#[staticmethod]
#[pyo3(text_signature = "(input)")]
pub fn from_bincode(input: &PyAny) -> PyResult<DecoherenceOnIdleModelWrapper> {
let bytes = input.extract::<Vec<u8>>().map_err(|_| {
pyo3::exceptions::PyTypeError::new_err("Input cannot be converted to byte array")
})?;
let noise_model: NoiseModel = bincode::deserialize(&bytes[..]).map_err(|_| {
pyo3::exceptions::PyValueError::new_err("Input cannot be deserialized to Noise-Model.")
})?;
match noise_model {
NoiseModel::DecoherenceOnIdleModel(internal) => {
Ok(DecoherenceOnIdleModelWrapper { internal })
}
_ => Err(pyo3::exceptions::PyValueError::new_err(
"Input cannot be deserialized to selected Noise-Model.",
)),
}
}
#[staticmethod]
#[pyo3(text_signature = "(input)")]
pub fn from_json(input: &str) -> PyResult<DecoherenceOnIdleModelWrapper> {
let noise_model: NoiseModel = serde_json::from_str(input).map_err(|_| {
pyo3::exceptions::PyValueError::new_err("Input cannot be deserialized to Noise-Model.")
})?;
match noise_model {
NoiseModel::DecoherenceOnIdleModel(internal) => {
Ok(DecoherenceOnIdleModelWrapper { internal })
}
_ => Err(pyo3::exceptions::PyValueError::new_err(
"Input cannot be deserialized to selected Noise-Model.",
)),
}
}
#[cfg(feature = "json_schema")]
#[staticmethod]
pub fn json_schema() -> String {
let schema = schemars::schema_for!(DecoherenceOnIdleModel);
serde_json::to_string_pretty(&schema).expect("Unexpected failure to serialize schema")
}
pub fn add_damping_rate(&self, qubits: Vec<usize>, rate: f64) -> Self {
Self {
internal: self.internal.clone().add_damping_rate(&qubits, rate),
}
}
pub fn add_dephasing_rate(&self, qubits: Vec<usize>, rate: f64) -> Self {
Self {
internal: self.internal.clone().add_dephasing_rate(&qubits, rate),
}
}
pub fn add_depolarising_rate(&self, qubits: Vec<usize>, rate: f64) -> Self {
Self {
internal: self.internal.clone().add_depolarising_rate(&qubits, rate),
}
}
pub fn add_excitation_rate(&self, qubits: Vec<usize>, rate: f64) -> Self {
Self {
internal: self.internal.clone().add_excitation_rate(&qubits, rate),
}
}
}