Skip to content

Commit

Permalink
Follow up on Qiskit#12327
Browse files Browse the repository at this point in the history
also port circuit construction to rust and add a reno
  • Loading branch information
Cryoris committed Jun 19, 2024
1 parent 53667d1 commit 794a612
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 12 deletions.
26 changes: 26 additions & 0 deletions crates/accelerate/src/permutation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,13 @@ use ndarray::{Array1, ArrayView1};
use numpy::PyArrayLike1;
use pyo3::exceptions::PyValueError;
use pyo3::prelude::*;
use smallvec::smallvec;
use std::vec::Vec;

use qiskit_circuit::circuit_data::CircuitData;
use qiskit_circuit::operations::{Param, StandardGate};
use qiskit_circuit::Qubit;

fn validate_permutation(pattern: &ArrayView1<i64>) -> PyResult<()> {
let n = pattern.len();
let mut seen: Vec<bool> = vec![false; n];
Expand Down Expand Up @@ -111,10 +116,31 @@ fn _get_ordered_swap(py: Python, permutation_in: PyArrayLike1<i64>) -> PyResult<
Ok(get_ordered_swap(&view).to_object(py))
}

#[pyfunction]
#[pyo3(signature = (pattern))]
fn _synth_permutation_basic(py: Python, pattern: PyArrayLike1<i64>) -> PyResult<CircuitData> {
let view = pattern.as_array();
let num_qubits = view.len();
Ok(CircuitData::from_standard_gates(
py,
num_qubits as u32,
get_ordered_swap(&view).iter().map(|(i, j)| {
(
StandardGate::SwapGate,
smallvec![],
smallvec![Qubit(*i as u32), Qubit(*j as u32)],
)
}),
Param::Float(0.0),
)
.expect("Something went wrong in Qiskit's Python realm"))
}

#[pymodule]
pub fn permutation(m: &Bound<PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(_validate_permutation, m)?)?;
m.add_function(wrap_pyfunction!(_inverse_pattern, m)?)?;
m.add_function(wrap_pyfunction!(_get_ordered_swap, m)?)?;
m.add_function(wrap_pyfunction!(_synth_permutation_basic, m)?)?;
Ok(())
}
14 changes: 2 additions & 12 deletions qiskit/synthesis/permutation/permutation_full.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

import numpy as np
from qiskit.circuit.quantumcircuit import QuantumCircuit
from qiskit._accelerate.permutation import _synth_permutation_basic
from .permutation_utils import (
_get_ordered_swap,
_inverse_pattern,
_pattern_to_cycles,
_decompose_cycles,
Expand All @@ -44,17 +44,7 @@ def synth_permutation_basic(pattern: list[int] | np.ndarray[int]) -> QuantumCirc
Returns:
The synthesized quantum circuit.
"""
# This is the very original Qiskit algorithm for synthesizing permutations.

num_qubits = len(pattern)
qc = QuantumCircuit(num_qubits)

swaps = _get_ordered_swap(pattern)

for swap in swaps:
qc.swap(swap[0], swap[1])

return qc
return QuantumCircuit._from_circuit_data(_synth_permutation_basic(pattern))


def synth_permutation_acg(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
Expand Down
4 changes: 4 additions & 0 deletions releasenotes/notes/oxidize-permbasic-be27578187ac472f.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
upgrade_synthesis:
- |
Port :func:`.synth_permutation_basic`, used to synthesize qubit permutations, to Rust.

0 comments on commit 794a612

Please sign in to comment.