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
// Copyright © 2021 HQS Quantum Simulations GmbH. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing permissions and
// limitations under the License.
#![deny(missing_docs)]
#![deny(missing_crate_level_docs)]
#![deny(missing_debug_implementations)]
//! Qoqo quantum computing toolkit
//!
//! Quantum Operation Quantum Operation
//! Yes we use [reduplication](https://en.wikipedia.org/wiki/Reduplication)
use pyo3::prelude::*;
use pyo3::types::PyDict;
use pyo3::wrap_pymodule;
pub mod operations;
use operations::*;
pub mod measurements;
use measurements::*;
mod circuit;
pub use circuit::{convert_into_circuit, CircuitWrapper, OperationIteratorWrapper};
/// qoqo version information, used for qoqo import/export checks
pub const QOQO_VERSION: &str = env!("CARGO_PKG_VERSION");
use roqoqo::{RoqoqoBackendError, RoqoqoError};
use thiserror::Error;
/// Errors that can occur in qoqo.
#[derive(Error, Debug, PartialEq)]
pub enum QoqoError {
/// Error an Operation cannot be extracted from PyAny object passed from python.
#[error("Converting PyAny to Operation not possible")]
ConversionError,
/// Error a Circuit cannot be extracted from PyAny object passed from python.
#[error("Cannot extract Circuit from python object")]
CannotExtractCircuit,
/// Error for version mismatch between separately compiled packages.
///
/// Error when trying to extract a Circuit from a PyAny python object that has been created
/// from a python package that has been compiled separately.
/// To avoid unexpected behaviour this is only allowed when qoqo and roqoqo in both packages are the same version.
#[error("Package versions of qoqo and roqoqo do not match versions of qoqo object passed from python")]
VersionMismatch,
/// Transparent forwarding of roqoqo errors.
#[error(transparent)]
RoqoqoError(#[from] RoqoqoError),
}
/// Errors that can occur in qoqo backends.
#[derive(Error, Debug, PartialEq)]
pub enum QoqoBackendError {
/// Error a Circuit cannot be extracted from PyAny object passed from python.
#[error("Cannot extract rust object from python object")]
CannotExtractObject,
/// Error for version mismatch between separately compiled packages.
///
/// Error when trying to extract a Backend or Device from a PyAny python object that has been created
/// from a python package that has been compiled separately.
/// To avoid unexpected behaviour this is only allowed when qoqo and roqoqo in both packages are the same version.
#[error("Package versions of qoqo backend and roqoqo backend do not match versions of qoqo object passed from python")]
VersionMismatch,
/// Transparent forwarding of roqoqo errors.
#[error(transparent)]
RoqoqoBackendError(#[from] RoqoqoBackendError),
}
/// Quantum Operation Quantum Operation (qoqo)
///
/// Yes, we use reduplication.
///
/// qoqo is the HQS python package to represent quantum circuits.
///
/// .. autosummary::
/// :toctree: generated/
///
/// Circuit
/// operations
/// measurements
///
#[pymodule]
fn qoqo(_py: Python, module: &PyModule) -> PyResult<()> {
module.add_class::<CircuitWrapper>()?;
let wrapper = wrap_pymodule!(operations);
module.add_wrapped(wrapper)?;
let wrapper2 = wrap_pymodule!(measurements);
module.add_wrapped(wrapper2)?;
// Adding nice imports corresponding to maturin example
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")?)?;
Ok(())
}