diff options
Diffstat (limited to 'libpsi/src/core/component.rs')
| -rw-r--r-- | libpsi/src/core/component.rs | 91 |
1 files changed, 76 insertions, 15 deletions
diff --git a/libpsi/src/core/component.rs b/libpsi/src/core/component.rs index 51e0551..331021f 100644 --- a/libpsi/src/core/component.rs +++ b/libpsi/src/core/component.rs @@ -1,14 +1,9 @@ -use crate::{ColumnVector, Complex, Matrix, VectorMatrix}; +use crate::{complex, ColumnVector, Complex, Matrix, Vector, VectorMatrix}; use std::ops; 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 { () => { 0 }; @@ -39,29 +34,81 @@ macro_rules! quantum_register { }; } +pub struct ClassicalRegister { + bits: Vec<i32>, +} + +pub struct QuantumRegister { + state: ColumnVector<Complex<f64>>, + qubits: Vec<QuantumBit>, +} + impl QuantumBit { - pub fn get_state(&self) -> i32 { - (self[1] != Complex::new(0.0, 0.0)) as i32 + pub fn measure(&self) -> i32 { + let alpha_abs = self[0].abs(); + let beta_abs = self[1].abs(); + + let alpha_norm = alpha_abs * alpha_abs; + let beta_norm = beta_abs * beta_abs; + + if alpha_norm > beta_norm { + 0 + } else { + 1 + } + } + + pub fn state_0() -> QuantumBit { + QuantumBit::new(vec![complex!(1.0, 0.0), complex!(0.0, 0.0)]) + } + + pub fn state_1() -> QuantumBit { + QuantumBit::new(vec![complex!(0.0, 0.0), complex!(1.0, 0.0)]) + } +} + +impl ClassicalRegister { + pub fn new(count: usize) -> ClassicalRegister { + ClassicalRegister { + bits: Vec::with_capacity(count), + } + } + + pub fn set_bits(&mut self, bits: Vec<i32>) { + self.bits = bits; } } impl 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(); + fn update(&mut self) { + let matrices: Vec<Matrix<Complex<f64>>> = + self.qubits.iter().map(|qubit| qubit.to_matrix()).collect(); + let mut new_result = matrices[0].clone(); for matrix in &matrices[1..] { - result = result.kronecker(matrix); + new_result = new_result.kronecker(matrix); } - QuantumRegister { + self.state = ColumnVector::from_matrix(&new_result); + } + + pub fn from(bits: &mut [QuantumBit]) -> QuantumRegister { + let mut register = QuantumRegister { qubits: bits.to_vec(), - state: ColumnVector::from_matrix(&result), - } + state: ColumnVector::new(vec![]), + }; + + register.update(); + register + } + + pub fn measure(&self, classical_register: &mut ClassicalRegister) { + classical_register.set_bits(self.qubits.iter().map(|qubit| qubit.measure()).collect()); } pub fn apply(&mut self, gate: &QuantumGate, index: usize) { let result: ColumnVector<Complex<f64>> = self.state.mul_matrix(gate).unwrap(); self.qubits[index] = result; + self.update(); } } @@ -78,3 +125,17 @@ impl ops::IndexMut<usize> for QuantumRegister { &mut self.qubits[index] } } + +impl ops::Index<usize> for ClassicalRegister { + type Output = i32; + + fn index(&self, index: usize) -> &Self::Output { + &self.bits[index] + } +} + +impl ops::IndexMut<usize> for ClassicalRegister { + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + &mut self.bits[index] + } +} |
