diff options
Diffstat (limited to 'libpsi-core/src/core')
| -rw-r--r-- | libpsi-core/src/core/circuit.rs | 25 | ||||
| -rw-r--r-- | libpsi-core/src/core/component.rs | 26 | ||||
| -rw-r--r-- | libpsi-core/src/core/runtime.rs | 4 |
3 files changed, 41 insertions, 14 deletions
diff --git a/libpsi-core/src/core/circuit.rs b/libpsi-core/src/core/circuit.rs index 43f51d0..183c4a2 100644 --- a/libpsi-core/src/core/circuit.rs +++ b/libpsi-core/src/core/circuit.rs @@ -1,13 +1,12 @@ use super::{ClassicalRegister, QuantumBit, QuantumGate}; -#[allow(dead_code)] -struct QuantumCircuitInstruction { - target_indices: Vec<usize>, - control_indices: Vec<usize>, - gate: QuantumGate, +#[derive(Clone)] +pub struct QuantumCircuitInstruction { + pub target_indices: Vec<usize>, + pub control_indices: Vec<usize>, + pub gate: QuantumGate, } -#[allow(dead_code)] pub struct QuantumCircuit { quantum_bits: Vec<QuantumBit>, classical_register: ClassicalRegister, @@ -17,7 +16,7 @@ pub struct QuantumCircuit { impl QuantumCircuit { pub fn new(quantum_bit_count: usize, classical_bit_count: usize) -> QuantumCircuit { QuantumCircuit { - quantum_bits: Vec::with_capacity(quantum_bit_count), + quantum_bits: vec![QuantumBit::state_0(); quantum_bit_count], classical_register: ClassicalRegister::new(classical_bit_count), instructions: Vec::new(), } @@ -30,4 +29,16 @@ impl QuantumCircuit { control_indices: control_bits.to_vec(), }); } + + pub fn get_quantum_bits(&self) -> Vec<QuantumBit> { + self.quantum_bits.clone() + } + + pub fn get_classical_registers(&self) -> ClassicalRegister { + self.classical_register.clone() + } + + pub fn get_instructions(&self) -> Vec<QuantumCircuitInstruction> { + self.instructions.clone() + } } diff --git a/libpsi-core/src/core/component.rs b/libpsi-core/src/core/component.rs index 00462e5..09095ec 100644 --- a/libpsi-core/src/core/component.rs +++ b/libpsi-core/src/core/component.rs @@ -1,3 +1,5 @@ +use rand::Rng; + use crate::{complex, ColumnVector, Complex, Matrix, Vector, VectorMatrix}; use core::ops; @@ -34,6 +36,7 @@ macro_rules! quantum_register { }; } +#[derive(Clone)] pub struct ClassicalRegister { bits: Vec<i32>, } @@ -51,7 +54,10 @@ impl QuantumBit { let alpha_norm = alpha_abs * alpha_abs; let beta_norm = beta_abs * beta_abs; - if alpha_norm > beta_norm { + let mut rng = rand::thread_rng(); + let random_value = rng.gen_range(0.0..(alpha_norm as f32 + beta_norm as f32)); + + if random_value < alpha_norm as f32 { 0 } else { 1 @@ -77,6 +83,10 @@ impl ClassicalRegister { pub fn set_bits(&mut self, bits: Vec<i32>) { self.bits = bits; } + + pub fn get_bits(&self) -> Vec<i32> { + self.bits.clone() + } } impl QuantumRegister { @@ -105,10 +115,16 @@ impl QuantumRegister { 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(); + pub fn get_bits(&self) -> Vec<QuantumBit> { + self.qubits.clone() + } + + pub fn get_state(&self) -> ColumnVector<Complex<f64>> { + self.state.clone() + } + + pub fn apply(&self, gate: &QuantumGate) -> QuantumBit { + self.state.mul_matrix(gate).unwrap() } } diff --git a/libpsi-core/src/core/runtime.rs b/libpsi-core/src/core/runtime.rs index f699d54..5b0a45f 100644 --- a/libpsi-core/src/core/runtime.rs +++ b/libpsi-core/src/core/runtime.rs @@ -2,8 +2,8 @@ use super::{ClassicalRegister, QuantumBit, QuantumCircuit}; #[allow(unused)] pub struct ExecutationData { - quantum_states: Vec<QuantumBit>, - classical_states: ClassicalRegister, + pub quantum_states: Vec<QuantumBit>, + pub classical_states: ClassicalRegister, } impl ExecutationData { |
