diff options
| -rw-r--r-- | libpsi-tester/src/main.rs | 10 | ||||
| -rw-r--r-- | libpsi/src/core/component.rs | 39 | ||||
| -rw-r--r-- | libpsi/src/core/gates.rs | 0 | ||||
| -rw-r--r-- | libpsi/src/maths/vector.rs | 1 |
4 files changed, 41 insertions, 9 deletions
diff --git a/libpsi-tester/src/main.rs b/libpsi-tester/src/main.rs index 4aaa92d..5ecc2f0 100644 --- a/libpsi-tester/src/main.rs +++ b/libpsi-tester/src/main.rs @@ -1,8 +1,10 @@ use libpsi::*; fn main() { - let bit_1 = qubit![(1.0, 2.0), (1.0, 2.0)]; - let bit_2 = qubit![(1.0, 2.0), (1.0, 2.0)]; - let register: QuantumRegister = quantum_register![bit_1, bit_2]; - println!("{}", register); + let mut register = quantum_register![qubit![(1.0, 0.0), (0.0, 0.0)]]; + let hadamard = matrix!([Complex::one(), Complex::one()]; [Complex::one(), -Complex::one()]) + .scale(complex!(1.0 / f64::sqrt(2.0), 0.0)); + println!("Before:\n{}", register[0]); + register.apply(&hadamard, 0); + println!("\nAfter H Gate:\n{}", register[0]); } 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<Complex<f64>>; pub type QuantumBit = ColumnVector<Complex<f64>>; +pub type QuantumGate = Matrix<Complex<f64>>; + +pub struct QuantumRegister { + state: ColumnVector<Complex<f64>>, + qubits: Vec<QuantumBit>, +} #[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<Matrix<Complex<f64>>> = 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<Complex<f64>> = self.state.mul_matrix(gate).unwrap(); + self.qubits[index] = result; + } +} + +impl ops::Index<usize> for QuantumRegister { + type Output = QuantumBit; + + fn index(&self, index: usize) -> &Self::Output { + &self.qubits[index] + } +} + +impl ops::IndexMut<usize> for QuantumRegister { + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + &mut self.qubits[index] } } diff --git a/libpsi/src/core/gates.rs b/libpsi/src/core/gates.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libpsi/src/core/gates.rs diff --git a/libpsi/src/maths/vector.rs b/libpsi/src/maths/vector.rs index 0c13e4c..243061d 100644 --- a/libpsi/src/maths/vector.rs +++ b/libpsi/src/maths/vector.rs @@ -43,6 +43,7 @@ pub trait VectorMatrix<T: Float> { fn to_matrix(&self) -> Matrix<T>; } +#[derive(Clone)] pub struct VectorImpl<T: Float, const ROWS: usize, const COLS: usize>(Vec<T>); pub type RowVector<T> = VectorImpl<T, 1, 0>; pub type ColumnVector<T> = VectorImpl<T, 0, 1>; |
