Skip to content

Commit 47a2a52

Browse files
Merge branch 'main' into fix_rust_definition
2 parents 752e04c + 4521122 commit 47a2a52

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2473
-990
lines changed

Cargo.lock

+84
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ license = "Apache-2.0"
1515
# Each crate can add on specific features freely as it inherits.
1616
[workspace.dependencies]
1717
bytemuck = "1.21"
18+
bitfield-struct = "0.9.3"
1819
indexmap.version = "2.7.1"
1920
hashbrown.version = "0.14.5"
2021
num-bigint = "0.4"
2122
num-complex = "0.4"
23+
nalgebra = "0.33"
2224
ndarray = "0.15"
2325
numpy = "0.23"
2426
smallvec = "1.13"

crates/accelerate/src/barrier_before_final_measurement.rs

+13-40
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use rustworkx_core::petgraph::stable_graph::NodeIndex;
1616

1717
use qiskit_circuit::circuit_instruction::ExtraInstructionAttributes;
1818
use qiskit_circuit::dag_circuit::{DAGCircuit, NodeType};
19-
use qiskit_circuit::imports::BARRIER;
20-
use qiskit_circuit::operations::{Operation, PyInstruction};
19+
use qiskit_circuit::operations::{Operation, StandardInstruction};
2120
use qiskit_circuit::packed_instruction::{PackedInstruction, PackedOperation};
2221
use qiskit_circuit::Qubit;
2322

@@ -65,45 +64,19 @@ pub fn barrier_before_final_measurements(
6564
res
6665
})
6766
.collect();
68-
let new_barrier = BARRIER
69-
.get_bound(py)
70-
.call1((dag.num_qubits(), label.as_deref()))?;
71-
72-
let new_barrier_py_inst = PyInstruction {
73-
qubits: dag.num_qubits() as u32,
74-
clbits: 0,
75-
params: 0,
76-
op_name: "barrier".to_string(),
77-
control_flow: false,
78-
#[cfg(feature = "cache_pygates")]
79-
instruction: new_barrier.clone().unbind(),
80-
#[cfg(not(feature = "cache_pygates"))]
81-
instruction: new_barrier.unbind(),
82-
};
8367
let qargs: Vec<Qubit> = (0..dag.num_qubits() as u32).map(Qubit).collect();
84-
#[cfg(feature = "cache_pygates")]
85-
{
86-
dag.apply_operation_back(
87-
py,
88-
PackedOperation::from_instruction(Box::new(new_barrier_py_inst)),
89-
qargs.as_slice(),
90-
&[],
91-
None,
92-
ExtraInstructionAttributes::new(label, None, None, None),
93-
Some(new_barrier.unbind()),
94-
)?;
95-
}
96-
#[cfg(not(feature = "cache_pygates"))]
97-
{
98-
dag.apply_operation_back(
99-
py,
100-
PackedOperation::from_instruction(Box::new(new_barrier_py_inst)),
101-
qargs.as_slice(),
102-
&[],
103-
None,
104-
ExtraInstructionAttributes::new(label, None, None, None),
105-
)?;
106-
}
68+
dag.apply_operation_back(
69+
py,
70+
PackedOperation::from_standard_instruction(StandardInstruction::Barrier(
71+
dag.num_qubits() as u32
72+
)),
73+
qargs.as_slice(),
74+
&[],
75+
None,
76+
ExtraInstructionAttributes::new(label, None, None, None),
77+
#[cfg(feature = "cache_pygates")]
78+
None,
79+
)?;
10780
for inst in final_packed_ops {
10881
dag.push_back(py, inst)?;
10982
}

crates/accelerate/src/circuit_library/multi_local.rs

+7-16
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use qiskit_circuit::packed_instruction::PackedOperation;
1919
use smallvec::{smallvec, SmallVec};
2020

2121
use qiskit_circuit::circuit_data::CircuitData;
22-
use qiskit_circuit::operations::{Param, PyInstruction};
23-
use qiskit_circuit::{imports, Clbit, Qubit};
22+
use qiskit_circuit::operations::{Param, StandardInstruction};
23+
use qiskit_circuit::{Clbit, Qubit};
2424

2525
use itertools::izip;
2626

@@ -193,7 +193,7 @@ pub fn n_local(
193193

194194
// This struct can be used to yield barrier if insert_barriers is true, otherwise
195195
// it returns an empty iterator. For conveniently injecting barriers in-between operations.
196-
let maybe_barrier = MaybeBarrier::new(py, num_qubits, insert_barriers)?;
196+
let maybe_barrier = MaybeBarrier::new(num_qubits, insert_barriers)?;
197197

198198
let packed_insts = (0..reps).flat_map(|layer| {
199199
rotation_layer(
@@ -280,23 +280,14 @@ struct MaybeBarrier {
280280
}
281281

282282
impl MaybeBarrier {
283-
fn new(py: Python, num_qubits: u32, insert_barriers: bool) -> PyResult<Self> {
283+
fn new(num_qubits: u32, insert_barriers: bool) -> PyResult<Self> {
284284
if !insert_barriers {
285285
Ok(Self { barrier: None })
286286
} else {
287-
let barrier_cls = imports::BARRIER.get_bound(py);
288-
let py_barrier = barrier_cls.call1((num_qubits,))?;
289-
let py_inst = PyInstruction {
290-
qubits: num_qubits,
291-
clbits: 0,
292-
params: 0,
293-
op_name: "barrier".to_string(),
294-
control_flow: false,
295-
instruction: py_barrier.into(),
296-
};
297-
298287
let inst = (
299-
py_inst.into(),
288+
PackedOperation::from_standard_instruction(StandardInstruction::Barrier(
289+
num_qubits,
290+
)),
300291
smallvec![],
301292
(0..num_qubits).map(Qubit).collect(),
302293
vec![] as Vec<Clbit>,

crates/accelerate/src/circuit_library/pauli_evolution.rs

+11-24
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
use pyo3::prelude::*;
1414
use pyo3::types::{PyList, PyString, PyTuple};
1515
use qiskit_circuit::circuit_data::CircuitData;
16-
use qiskit_circuit::operations::{multiply_param, radd_param, Param, PyInstruction, StandardGate};
16+
use qiskit_circuit::operations;
17+
use qiskit_circuit::operations::{multiply_param, radd_param, Param, StandardGate};
1718
use qiskit_circuit::packed_instruction::PackedOperation;
18-
use qiskit_circuit::{imports, Clbit, Qubit};
19+
use qiskit_circuit::{Clbit, Qubit};
1920
use smallvec::{smallvec, SmallVec};
2021

2122
// custom types for a more readable code
@@ -248,7 +249,14 @@ pub fn py_pauli_evolution(
248249
indices.push(tuple.get_item(1)?.extract::<Vec<u32>>()?)
249250
}
250251

251-
let barrier = get_barrier(py, num_qubits as u32);
252+
let barrier = (
253+
PackedOperation::from_standard_instruction(operations::StandardInstruction::Barrier(
254+
num_qubits as u32,
255+
)),
256+
smallvec![],
257+
(0..num_qubits as u32).map(Qubit).collect(),
258+
vec![],
259+
);
252260

253261
let evos = paulis.iter().enumerate().zip(indices).zip(times).flat_map(
254262
|(((i, pauli), qubits), time)| {
@@ -328,24 +336,3 @@ fn cx_fountain(
328336
)
329337
}))
330338
}
331-
332-
fn get_barrier(py: Python, num_qubits: u32) -> Instruction {
333-
let barrier_cls = imports::BARRIER.get_bound(py);
334-
let barrier = barrier_cls
335-
.call1((num_qubits,))
336-
.expect("Could not create Barrier Python-side");
337-
let barrier_inst = PyInstruction {
338-
qubits: num_qubits,
339-
clbits: 0,
340-
params: 0,
341-
op_name: "barrier".to_string(),
342-
control_flow: false,
343-
instruction: barrier.into(),
344-
};
345-
(
346-
barrier_inst.into(),
347-
smallvec![],
348-
(0..num_qubits).map(Qubit).collect(),
349-
vec![],
350-
)
351-
}

crates/accelerate/src/circuit_library/pauli_feature_map.rs

+11-24
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ use pyo3::prelude::*;
1414
use pyo3::types::PySequence;
1515
use pyo3::types::PyString;
1616
use qiskit_circuit::circuit_data::CircuitData;
17-
use qiskit_circuit::imports;
18-
use qiskit_circuit::operations::PyInstruction;
19-
use qiskit_circuit::operations::{add_param, multiply_param, multiply_params, Param, StandardGate};
17+
use qiskit_circuit::operations::{
18+
add_param, multiply_param, multiply_params, Param, StandardGate, StandardInstruction,
19+
};
2020
use qiskit_circuit::packed_instruction::PackedOperation;
2121
use qiskit_circuit::{Clbit, Qubit};
2222
use smallvec::{smallvec, SmallVec};
@@ -78,7 +78,14 @@ pub fn pauli_feature_map(
7878

7979
// construct a Barrier object Python side to (possibly) add to the circuit
8080
let packed_barrier = if insert_barriers {
81-
Some(_get_barrier(py, feature_dimension)?)
81+
Some((
82+
PackedOperation::from_standard_instruction(StandardInstruction::Barrier(
83+
feature_dimension,
84+
)),
85+
smallvec![],
86+
(0..feature_dimension).map(Qubit).collect(),
87+
vec![] as Vec<Clbit>,
88+
))
8289
} else {
8390
None
8491
};
@@ -244,23 +251,3 @@ fn _get_paulis(
244251
},
245252
)
246253
}
247-
248-
/// Get a barrier object from Python space.
249-
fn _get_barrier(py: Python, feature_dimension: u32) -> PyResult<Instruction> {
250-
let barrier_cls = imports::BARRIER.get_bound(py);
251-
let barrier = barrier_cls.call1((feature_dimension,))?;
252-
let barrier_inst = PyInstruction {
253-
qubits: feature_dimension,
254-
clbits: 0,
255-
params: 0,
256-
op_name: "barrier".to_string(),
257-
control_flow: false,
258-
instruction: barrier.into(),
259-
};
260-
Ok((
261-
barrier_inst.into(),
262-
smallvec![],
263-
(0..feature_dimension).map(Qubit).collect(),
264-
vec![] as Vec<Clbit>,
265-
))
266-
}

0 commit comments

Comments
 (0)