aboutsummaryrefslogtreecommitdiff
path: root/libpsi-core/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'libpsi-core/src/core')
-rw-r--r--libpsi-core/src/core/circuit.rs25
-rw-r--r--libpsi-core/src/core/component.rs26
-rw-r--r--libpsi-core/src/core/runtime.rs4
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 {