From 1a9ef4a7f0cbd4ed848ccf0903ebbbd4fdab6adf Mon Sep 17 00:00:00 2001 From: hachem Date: Sun, 22 Sep 2024 13:07:30 +0200 Subject: First quantum calculation --- libpsi/src/core/component.rs | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'libpsi/src/core/component.rs') diff --git a/libpsi/src/core/component.rs b/libpsi/src/core/component.rs index bd18b52..51e0551 100644 --- a/libpsi/src/core/component.rs +++ b/libpsi/src/core/component.rs @@ -1,7 +1,13 @@ use crate::{ColumnVector, Complex, Matrix, VectorMatrix}; +use std::ops; -pub type QuantumRegister = ColumnVector>; pub type QuantumBit = ColumnVector>; +pub type QuantumGate = Matrix>; + +pub struct QuantumRegister { + state: ColumnVector>, + qubits: Vec, +} #[macro_export] macro_rules! count { @@ -27,8 +33,8 @@ macro_rules! quantum_register { ($($bit:expr),*) => { { const N: usize = count!($($bit),*); - let bits: [QuantumBit; N] = [$($bit),*]; - QuantumRegister::from(&bits) + let mut bits: [QuantumBit; N] = [$($bit),*]; + QuantumRegister::from(&mut bits) } }; } @@ -40,12 +46,35 @@ impl QuantumBit { } impl QuantumRegister { - pub fn from(bits: &[QuantumBit]) -> QuantumRegister { + pub fn from(bits: &mut [QuantumBit]) -> QuantumRegister { let matrices: Vec>> = bits.iter().map(|bit| bit.to_matrix()).collect(); let mut result = matrices[0].clone(); for matrix in &matrices[1..] { result = result.kronecker(matrix); } - ColumnVector::from_matrix(&result) + + QuantumRegister { + qubits: bits.to_vec(), + state: ColumnVector::from_matrix(&result), + } + } + + pub fn apply(&mut self, gate: &QuantumGate, index: usize) { + let result: ColumnVector> = self.state.mul_matrix(gate).unwrap(); + self.qubits[index] = result; + } +} + +impl ops::Index for QuantumRegister { + type Output = QuantumBit; + + fn index(&self, index: usize) -> &Self::Output { + &self.qubits[index] + } +} + +impl ops::IndexMut for QuantumRegister { + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + &mut self.qubits[index] } } -- cgit v1.3