From 483e9e6ce9fbb1440992e916ec743ce0eff0ab5a Mon Sep 17 00:00:00 2001 From: hachem Date: Sat, 12 Oct 2024 16:56:12 +0200 Subject: Simplify and start rework of gate application --- libpsi-core/src/core/circuit.rs | 16 ++++++++-------- libpsi-core/src/core/component.rs | 16 +++++++--------- libpsi-core/src/core/runtime.rs | 16 ++++++++-------- 3 files changed, 23 insertions(+), 25 deletions(-) (limited to 'libpsi-core/src/core') diff --git a/libpsi-core/src/core/circuit.rs b/libpsi-core/src/core/circuit.rs index 183c4a2..635066a 100644 --- a/libpsi-core/src/core/circuit.rs +++ b/libpsi-core/src/core/circuit.rs @@ -1,14 +1,14 @@ -use super::{ClassicalRegister, QuantumBit, QuantumGate}; +use super::{ClassicalRegister, QuantumGate, QuantumRegister}; #[derive(Clone)] pub struct QuantumCircuitInstruction { - pub target_indices: Vec, + pub target_bit: usize, pub control_indices: Vec, pub gate: QuantumGate, } pub struct QuantumCircuit { - quantum_bits: Vec, + quantum_register: QuantumRegister, classical_register: ClassicalRegister, instructions: Vec, } @@ -16,22 +16,22 @@ pub struct QuantumCircuit { impl QuantumCircuit { pub fn new(quantum_bit_count: usize, classical_bit_count: usize) -> QuantumCircuit { QuantumCircuit { - quantum_bits: vec![QuantumBit::state_0(); quantum_bit_count], + quantum_register: QuantumRegister::new(quantum_bit_count), classical_register: ClassicalRegister::new(classical_bit_count), instructions: Vec::new(), } } - pub fn apply(&mut self, gate: &QuantumGate, control_bits: &[usize], target_bits: &[usize]) { + pub fn apply(&mut self, gate: &QuantumGate, control_bits: &[usize], target_bit: usize) { self.instructions.push(QuantumCircuitInstruction { gate: gate.clone(), - target_indices: target_bits.to_vec(), + target_bit, control_indices: control_bits.to_vec(), }); } - pub fn get_quantum_bits(&self) -> Vec { - self.quantum_bits.clone() + pub fn get_quantum_register(&self) -> QuantumRegister { + self.quantum_register.clone() } pub fn get_classical_registers(&self) -> ClassicalRegister { diff --git a/libpsi-core/src/core/component.rs b/libpsi-core/src/core/component.rs index be5fbca..d2dc781 100644 --- a/libpsi-core/src/core/component.rs +++ b/libpsi-core/src/core/component.rs @@ -4,7 +4,8 @@ use crate::{complex, ColumnVector, Complex, Matrix, Vector, VectorMatrix}; use core::ops; pub type QuantumBit = ColumnVector>; -pub type QuantumGate = (&'static str, Matrix>); +pub type QuantumState = Matrix>; +pub type QuantumGate = (&'static str, QuantumState); #[macro_export] macro_rules! count { @@ -41,6 +42,7 @@ pub struct ClassicalRegister { bits: Vec, } +#[derive(Clone)] pub struct QuantumRegister { state: ColumnVector>, qubits: Vec, @@ -101,6 +103,10 @@ impl QuantumRegister { self.state = ColumnVector::from_matrix(&new_result); } + pub fn new(count: usize) -> QuantumRegister { + QuantumRegister::from(&mut vec![QuantumBit::state_0(); count]) + } + pub fn from(bits: &mut [QuantumBit]) -> QuantumRegister { let mut register = QuantumRegister { qubits: bits.to_vec(), @@ -111,10 +117,6 @@ impl QuantumRegister { register } - pub fn measure(&self, classical_register: &mut ClassicalRegister) { - classical_register.set_bits(self.qubits.iter().map(|qubit| qubit.measure()).collect()); - } - pub fn get_bits(&self) -> Vec { self.qubits.clone() } @@ -122,10 +124,6 @@ impl QuantumRegister { pub fn get_state(&self) -> ColumnVector> { self.state.clone() } - - pub fn apply(&self, gate: &QuantumGate) -> QuantumBit { - self.state.mul_matrix(&gate.1).unwrap() - } } impl ops::Index for QuantumRegister { diff --git a/libpsi-core/src/core/runtime.rs b/libpsi-core/src/core/runtime.rs index 0937f3c..19ac191 100644 --- a/libpsi-core/src/core/runtime.rs +++ b/libpsi-core/src/core/runtime.rs @@ -1,15 +1,15 @@ -use super::{ClassicalRegister, QuantumBit, QuantumCircuit}; +use super::{ClassicalRegister, QuantumCircuit, QuantumRegister}; #[allow(unused)] -pub struct ExecutationData { - pub quantum_states: Vec, +pub struct ExecutionData { + pub quantum_register: QuantumRegister, pub classical_states: ClassicalRegister, } -impl ExecutationData { - pub fn new(quantum_states: Vec, classical_states: ClassicalRegister) -> Self { - ExecutationData { - quantum_states, +impl ExecutionData { + pub fn new(quantum_register: QuantumRegister, classical_states: ClassicalRegister) -> Self { + ExecutionData { + quantum_register, classical_states, } } @@ -21,5 +21,5 @@ pub trait RuntimeBase { pub trait Runtime<'a, T: RuntimeBase = Self> { fn new(circuit: &'a QuantumCircuit) -> Self; - fn execute(&self, repeat: usize) -> Vec; + fn execute(&self, repeat: usize) -> Vec; } -- cgit v1.3