Skip to content

Commit a45df5c

Browse files
committed
Use rust-native error for CommutationAnalysis
The following commits modify `CommutationAnalysis` to use rust-native errors throughout its pipeline. This is done mostly by implementing `DAGCircuitInnerError` based on Qiskit#16134 as a possible error in `CommutationError`.
1 parent 24734f8 commit a45df5c

2 files changed

Lines changed: 9 additions & 5 deletions

File tree

crates/transpiler/src/commutation_checker.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use ndarray::Array2;
1515
use ndarray::linalg::kron;
1616
use num_complex::Complex64;
1717
use num_complex::ComplexFloat;
18+
use qiskit_circuit::dag_circuit::DAGError;
1819
use qiskit_circuit::object_registry::PyObjectAsKey;
1920
use qiskit_circuit::standard_gate::standard_generators::standard_gate_exponent;
2021
use qiskit_quantum_info::sparse_observable::{PySparseObservable, SparseObservable};
@@ -54,6 +55,8 @@ pub enum CommutationError {
5455
HashingNaN,
5556
#[error("Invalid hash type: parameterized")]
5657
HashingParameter,
58+
#[error(transparent)]
59+
DAGCircuit(#[from] DAGError),
5760
}
5861

5962
impl From<CommutationError> for PyErr {
@@ -63,6 +66,7 @@ impl From<CommutationError> for PyErr {
6366
CommutationError::HashingParameter | CommutationError::FirstInstructionTooLarge => {
6467
QiskitError::new_err(value.to_string())
6568
}
69+
CommutationError::DAGCircuit(err) => err.into(),
6670
_ => PyRuntimeError::new_err(value.to_string()),
6771
}
6872
}

crates/transpiler/src/passes/commutation_analysis.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use indexmap::IndexMap;
1919
use rayon::prelude::*;
2020
use rustworkx_core::petgraph::stable_graph::NodeIndex;
2121

22-
use crate::commutation_checker::CommutationChecker;
22+
use crate::commutation_checker::{CommutationChecker, CommutationError};
2323
use qiskit_circuit::Qubit;
2424
use qiskit_circuit::dag_circuit::{DAGCircuit, NodeType, Wire};
2525

@@ -54,15 +54,15 @@ pub fn analyze_commutations(
5454
dag: &mut DAGCircuit,
5555
commutation_checker: &CommutationChecker,
5656
approximation_degree: f64,
57-
) -> PyResult<(CommutationSet, NodeIndices)> {
57+
) -> Result<(CommutationSet, NodeIndices), CommutationError> {
5858
let mut commutation_set = vec![vec![]; dag.num_qubits()];
5959
let mut node_indices: NodeIndices = vec![IndexMap::default(); dag.num_qubits()];
6060

6161
let evaluate_qubit =
6262
|qubit: usize,
6363
commutation_entry: &mut Vec<Vec<NodeIndex>>,
6464
node_indices: &mut IndexMap<NodeIndex, usize, ::foldhash::fast::RandomState>|
65-
-> PyResult<()> {
65+
-> Result<(), CommutationError> {
6666
let wire = Wire::Qubit(Qubit(qubit as u32));
6767

6868
for current_gate_idx in dag.nodes_on_wire(wire) {
@@ -143,12 +143,12 @@ pub fn analyze_commutations(
143143
.zip(node_indices.par_iter_mut())
144144
.enumerate()
145145
.map(
146-
|(qubit, (local_commutation_set, local_indices))| -> PyResult<()> {
146+
|(qubit, (local_commutation_set, local_indices))| -> Result<(), CommutationError> {
147147
evaluate_qubit(qubit, local_commutation_set, local_indices)?;
148148
Ok(())
149149
},
150150
)
151-
.collect::<PyResult<()>>()?;
151+
.collect::<Result<(), CommutationError>>()?;
152152
Ok((commutation_set, node_indices))
153153
} else {
154154
for qubit in 0..dag.num_qubits() {

0 commit comments

Comments
 (0)