diff options
Diffstat (limited to 'libpsi/src/core')
| -rw-r--r-- | libpsi/src/core/component.rs | 51 | ||||
| -rw-r--r-- | libpsi/src/core/mod.rs | 1 |
2 files changed, 52 insertions, 0 deletions
diff --git a/libpsi/src/core/component.rs b/libpsi/src/core/component.rs new file mode 100644 index 0000000..bd18b52 --- /dev/null +++ b/libpsi/src/core/component.rs @@ -0,0 +1,51 @@ +use crate::{ColumnVector, Complex, Matrix, VectorMatrix}; + +pub type QuantumRegister = ColumnVector<Complex<f64>>; +pub type QuantumBit = ColumnVector<Complex<f64>>; + +#[macro_export] +macro_rules! count { + () => { 0 }; + ($head:expr $(,$tail:expr)*) => { 1 + count!($( $tail ),*) }; +} + +#[macro_export] +macro_rules! qubit { + ($(($re:expr, $im:expr)),*) => { + { + let mut vector = Vec::new(); + $( + vector.push(complex!($re, $im)); + )* + QuantumBit::new(vector) + } + }; +} + +#[macro_export] +macro_rules! quantum_register { + ($($bit:expr),*) => { + { + const N: usize = count!($($bit),*); + let bits: [QuantumBit; N] = [$($bit),*]; + QuantumRegister::from(&bits) + } + }; +} + +impl QuantumBit { + pub fn get_state(&self) -> i32 { + (self[1] != Complex::new(0.0, 0.0)) as i32 + } +} + +impl QuantumRegister { + pub fn from(bits: &[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) + } +} diff --git a/libpsi/src/core/mod.rs b/libpsi/src/core/mod.rs new file mode 100644 index 0000000..9cea807 --- /dev/null +++ b/libpsi/src/core/mod.rs @@ -0,0 +1 @@ +pub mod component; |
