Skip to main content

quil/program/
calibration.rs

1use quil_rs::{
2    instruction::{Calibration, Gate, Instruction, MeasureCalibrationDefinition, Measurement},
3    program::Calibrations,
4};
5use rigetti_pyo3::{
6    impl_as_mut_for_wrapper, impl_repr, py_wrap_type,
7    pyo3::{pymethods, PyResult, Python},
8    PyTryFrom, PyWrapper, PyWrapperMut, ToPython, ToPythonError,
9};
10
11use crate::{
12    impl_eq,
13    instruction::{
14        PyCalibration, PyGate, PyInstruction, PyMeasureCalibrationDefinition, PyMeasurement,
15    },
16};
17
18use super::ProgramError;
19
20py_wrap_type! {
21    #[derive(Debug, PartialEq)]
22    PyCalibrationSet(Calibrations) as "CalibrationSet"
23}
24impl_as_mut_for_wrapper!(PyCalibrationSet);
25impl_repr!(PyCalibrationSet);
26impl_eq!(PyCalibrationSet);
27
28#[pymethods]
29impl PyCalibrationSet {
30    #[new]
31    pub fn new(
32        calibrations: Vec<PyCalibration>,
33        measure_calibrations: Vec<PyMeasureCalibrationDefinition>,
34    ) -> PyResult<Self> {
35        Ok(Self(Calibrations {
36            calibrations: calibrations
37                .into_iter()
38                .map(|c| c.into_inner())
39                .collect::<Vec<Calibration>>()
40                .into(),
41            measure_calibrations: measure_calibrations
42                .into_iter()
43                .map(|c| c.into_inner())
44                .collect::<Vec<MeasureCalibrationDefinition>>()
45                .into(),
46        }))
47    }
48
49    #[getter]
50    pub fn calibrations(&self, py: Python<'_>) -> PyResult<Vec<PyCalibration>> {
51        self.as_inner().calibrations().to_python(py)
52    }
53
54    #[getter]
55    pub fn measure_calibrations(
56        &self,
57        py: Python<'_>,
58    ) -> PyResult<Vec<PyMeasureCalibrationDefinition>> {
59        self.as_inner().measure_calibrations().to_python(py)
60    }
61
62    pub fn expand(
63        &self,
64        py: Python<'_>,
65        instruction: PyInstruction,
66        previous_calibrations: Vec<PyInstruction>,
67    ) -> PyResult<Option<Vec<PyInstruction>>> {
68        self.as_inner()
69            .expand(
70                &Instruction::py_try_from(py, &instruction)?,
71                &Vec::<Instruction>::py_try_from(py, &previous_calibrations)?,
72            )
73            .map_err(ProgramError::from)
74            .map_err(ProgramError::to_py_err)?
75            .to_python(py)
76    }
77
78    pub fn get_match_for_measurement(
79        &self,
80        py: Python<'_>,
81        measurement: PyMeasurement,
82    ) -> PyResult<Option<PyMeasureCalibrationDefinition>> {
83        Ok(self
84            .as_inner()
85            .get_match_for_measurement(&Measurement::py_try_from(py, &measurement)?)
86            .map(PyMeasureCalibrationDefinition::from))
87    }
88
89    pub fn get_match_for_gate(
90        &self,
91        py: Python<'_>,
92        gate: PyGate,
93    ) -> PyResult<Option<PyCalibration>> {
94        Ok(self
95            .as_inner()
96            .get_match_for_gate(&Gate::py_try_from(py, &gate)?)
97            .map(PyCalibration::from))
98    }
99
100    pub fn __len__(&self) -> usize {
101        self.as_inner().len()
102    }
103
104    pub fn is_empty(&self) -> bool {
105        self.as_inner().is_empty()
106    }
107
108    pub fn insert_calibration(
109        &mut self,
110        py: Python<'_>,
111        calibration: PyCalibration,
112    ) -> PyResult<Option<PyCalibration>> {
113        Ok(self
114            .as_inner_mut()
115            .insert_calibration(Calibration::py_try_from(py, &calibration)?)
116            .map(PyCalibration::from))
117    }
118
119    pub fn insert_measurement_calibration(
120        &mut self,
121        py: Python<'_>,
122        calibration: PyMeasureCalibrationDefinition,
123    ) -> PyResult<Option<PyMeasureCalibrationDefinition>> {
124        Ok(self
125            .as_inner_mut()
126            .insert_measurement_calibration(MeasureCalibrationDefinition::py_try_from(
127                py,
128                &calibration,
129            )?)
130            .map(PyMeasureCalibrationDefinition::from))
131    }
132
133    pub fn extend(&mut self, py: Python<'_>, other: PyCalibrationSet) -> PyResult<()> {
134        self.as_inner_mut()
135            .extend(Calibrations::py_try_from(py, &other)?);
136        Ok(())
137    }
138
139    pub fn to_instructions(&self, py: Python<'_>) -> PyResult<Vec<PyInstruction>> {
140        self.as_inner().to_instructions().to_python(py)
141    }
142}