1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#![deny(missing_docs)]
#![deny(rustdoc::missing_crate_level_docs)]
#![deny(missing_debug_implementations)]
use pyo3::prelude::*;
use pyo3::types::PyDict;
use pyo3::wrap_pymodule;
pub mod operations;
use operations::*;
pub mod measurements;
use measurements::*;
pub mod devices;
use devices::__PYO3_PYMODULE_DEF_DEVICES;
use devices::*;
mod circuit;
pub use circuit::{convert_into_circuit, CircuitWrapper, OperationIteratorWrapper};
mod quantum_program;
pub use quantum_program::{convert_into_quantum_program, QuantumProgramWrapper};
pub const QOQO_VERSION: &str = env!("CARGO_PKG_VERSION");
use roqoqo::{RoqoqoBackendError, RoqoqoError};
use thiserror::Error;
#[derive(Error, Debug, PartialEq)]
pub enum QoqoError {
#[error("Converting PyAny to Operation not possible")]
ConversionError,
#[error("Cannot extract roqoqo object from python object")]
CannotExtractObject,
#[error("Package versions of qoqo and roqoqo do not match versions of qoqo object passed from python")]
VersionMismatch,
#[error(transparent)]
RoqoqoError(#[from] RoqoqoError),
}
#[derive(Error, Debug, PartialEq)]
pub enum QoqoBackendError {
#[error("Cannot extract rust object from python object")]
CannotExtractObject,
#[error("Package versions of qoqo backend and roqoqo backend do not match versions of qoqo object passed from python")]
VersionMismatch,
#[error(transparent)]
RoqoqoBackendError(#[from] RoqoqoBackendError),
}
#[pymodule]
fn qoqo(_py: Python, module: &PyModule) -> PyResult<()> {
module.add_class::<CircuitWrapper>()?;
module.add_class::<QuantumProgramWrapper>()?;
module.add_class::<GenericChainWrapper>()?;
module.add_class::<GenericDeviceWrapper>()?;
module.add_class::<AllToAllDeviceWrapper>()?;
let wrapper = wrap_pymodule!(operations);
module.add_wrapped(wrapper)?;
let wrapper2 = wrap_pymodule!(measurements);
module.add_wrapped(wrapper2)?;
let wrapper3 = wrap_pymodule!(devices);
module.add_wrapped(wrapper3)?;
let system = PyModule::import(_py, "sys")?;
let system_modules: &PyDict = system.getattr("modules")?.downcast()?;
system_modules.set_item("qoqo.operations", module.getattr("operations")?)?;
system_modules.set_item("qoqo.measurements", module.getattr("measurements")?)?;
system_modules.set_item("qoqo.devices", module.getattr("devices")?)?;
Ok(())
}