aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpsi-tester/src/main.rs10
-rw-r--r--libpsi/src/core/component.rs39
-rw-r--r--libpsi/src/core/gates.rs0
-rw-r--r--libpsi/src/maths/vector.rs1
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>;