Skip to content

Commit 5b4e959

Browse files
authored
Move 2q block-consolidation logic to qiskit-synthesis (#15912)
This is dependent on both the circuit IRs _and_ the `quantum-info` objects. All of these functions are primarily used in synthesis, which makes `qiskit-synthesis` a relatively natural place for them; they're not _strictly_ about immediate synthesis of a matrix into circuit objects, but they are very much along the path to that.
1 parent 9582e27 commit 5b4e959

7 files changed

Lines changed: 22 additions & 10 deletions

File tree

crates/quantum_info/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
// that they have been altered from the originals.
1212

1313
pub mod clifford;
14-
pub mod convert_2q_block_matrix;
1514
pub mod pauli_lindblad_map;
1615
pub mod sparse_observable;
1716
pub mod sparse_pauli_op;

crates/synthesis/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub mod evolution;
1717
pub mod linalg;
1818
pub mod linear;
1919
pub mod linear_phase;
20+
pub mod matrix;
2021
mod multi_controlled;
2122
pub mod pauli_evolution;
2223
pub mod pauli_products;

crates/synthesis/src/matrix/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// This code is part of Qiskit.
2+
//
3+
// (C) Copyright IBM 2026
4+
//
5+
// This code is licensed under the Apache License, Version 2.0. You may
6+
// obtain a copy of this license in the LICENSE.txt file in the root directory
7+
// of this source tree or at https://www.apache.org/licenses/LICENSE-2.0.
8+
//
9+
// Any modifications or derivative works of this code must retain this
10+
// copyright notice, and modified files need to carry a notice indicating
11+
// that they have been altered from the originals.
12+
13+
pub mod two_qubit;

crates/quantum_info/src/convert_2q_block_matrix.rs renamed to crates/synthesis/src/matrix/two_qubit.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
// copyright notice, and modified files need to carry a notice indicating
1111
// that they have been altered from the originals.
1212

13-
use pyo3::Python;
1413
use pyo3::intern;
1514
use pyo3::prelude::*;
1615

@@ -26,9 +25,9 @@ use qiskit_circuit::imports::QI_OPERATOR;
2625
use qiskit_circuit::interner::Interner;
2726
use qiskit_circuit::operations::{ArrayType, OperationRef};
2827
use qiskit_circuit::packed_instruction::PackedInstruction;
28+
use qiskit_quantum_info::versor_u2::{VersorSU2, VersorU2, VersorU2Error};
2929

3030
use crate::QiskitError;
31-
use crate::versor_u2::{VersorSU2, VersorU2, VersorU2Error};
3231

3332
#[inline]
3433
fn matrix4_from_pyreadonly(array: &PyReadonlyArray2<Complex64>) -> Matrix4<Complex64> {

crates/synthesis/src/qsd.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ use crate::euler_one_qubit_decomposer::{
3131
use crate::linalg::{
3232
closest_unitary, is_hermitian_matrix, nalgebra_array_view, svd_decomposition, verify_unitary,
3333
};
34+
use crate::matrix::two_qubit;
3435
use crate::two_qubit_decompose::{TwoQubitBasisDecomposer, two_qubit_decompose_up_to_diagonal};
3536
use qiskit_circuit::bit::ShareableQubit;
3637
use qiskit_circuit::circuit_data::{CircuitData, CircuitDataError, PyCircuitData};
3738
use qiskit_circuit::interner::Interned;
3839
use qiskit_circuit::operations::{ArrayType, OperationRef, Param, StandardGate, UnitaryGate};
3940
use qiskit_circuit::packed_instruction::{PackedInstruction, PackedOperation};
4041
use qiskit_circuit::{BlocksMode, Qubit, VarsMode};
41-
use qiskit_quantum_info::convert_2q_block_matrix::instructions_to_matrix;
4242

4343
const EPS: f64 = 1e-10;
4444

@@ -719,7 +719,7 @@ fn apply_a2(
719719
for ind in ind2q.windows(2) {
720720
let mat1 = match diagonal_rollover.get(&ind[0]) {
721721
Some(circ) => {
722-
let mat: Matrix4<Complex64> = instructions_to_matrix(
722+
let mat: Matrix4<Complex64> = two_qubit::instructions_to_matrix(
723723
circ.data().iter(),
724724
[Qubit(0), Qubit(1)],
725725
circ.qargs_interner(),
@@ -730,7 +730,7 @@ fn apply_a2(
730730
};
731731
let mat2 = match diagonal_rollover.get(&ind[1]) {
732732
Some(circ) => nalgebra_array_view::<Complex64, U4, U4>(
733-
instructions_to_matrix(
733+
two_qubit::instructions_to_matrix(
734734
circ.data().iter(),
735735
[Qubit(0), Qubit(1)],
736736
circ.qargs_interner(),

crates/synthesis/src/two_qubit_decompose/basis_decomposer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::euler_one_qubit_decomposer::{
3434
unitary_to_gate_sequence_inner,
3535
};
3636
use crate::linalg::ndarray_to_faer;
37-
use qiskit_quantum_info::convert_2q_block_matrix::change_basis;
37+
use crate::matrix::two_qubit;
3838

3939
use qiskit_circuit::bit::ShareableQubit;
4040
use qiskit_circuit::circuit_data::{CircuitData, PyCircuitData};
@@ -1059,7 +1059,7 @@ fn compute_unitary(sequence: &TwoQubitSequenceVec, global_phase: f64) -> Array2<
10591059
let result = match q_list.as_slice() {
10601060
[0] => Some(kron(&identity, &op_matrix)),
10611061
[1] => Some(kron(&op_matrix, &identity)),
1062-
[1, 0] => Some(change_basis(op_matrix.view())),
1062+
[1, 0] => Some(two_qubit::change_basis(op_matrix.view())),
10631063
[] => Some(Array2::eye(4)),
10641064
_ => None,
10651065
};

crates/transpiler/src/passes/consolidate_blocks.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ use qiskit_circuit::interner::Interned;
3131
use qiskit_circuit::operations::StandardGate;
3232
use qiskit_circuit::operations::{ArrayType, Operation, Param, UnitaryGate};
3333
use qiskit_circuit::packed_instruction::PackedOperation;
34-
use qiskit_quantum_info::convert_2q_block_matrix::{
34+
use qiskit_synthesis::linalg::nalgebra_array_view;
35+
use qiskit_synthesis::matrix::two_qubit::{
3536
blocks_to_matrix, get_1q_matrix_from_inst, get_2q_matrix_from_inst, get_matrix_from_inst,
3637
};
37-
use qiskit_synthesis::linalg::nalgebra_array_view;
3838
use qiskit_synthesis::two_qubit_decompose::RXXEquivalent;
3939
use qiskit_synthesis::two_qubit_decompose::{
4040
TwoQubitBasisDecomposer, TwoQubitControlledUDecomposer,

0 commit comments

Comments
 (0)