quil/program/
calibration.rs1use 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}