diff options
| -rw-r--r-- | libpsi-core/src/core/component.rs | 4 | ||||
| -rw-r--r-- | libpsi-core/src/core/gates.rs | 26 | ||||
| -rw-r--r-- | libpsi-core/src/core/runtime.rs | 4 | ||||
| -rw-r--r-- | libpsi-core/src/runtimes/basic_rt.rs | 12 | ||||
| -rw-r--r-- | libpsi-tester/src/main.rs | 37 | ||||
| -rw-r--r-- | libpsi-visualizer/Cargo.toml | 1 | ||||
| -rw-r--r-- | libpsi-visualizer/src/cli/horizontal_cli.rs | 26 | ||||
| -rw-r--r-- | libpsi-visualizer/src/cli/mod.rs | 2 | ||||
| -rw-r--r-- | libpsi-visualizer/src/lib.rs | 10 |
9 files changed, 68 insertions, 54 deletions
diff --git a/libpsi-core/src/core/component.rs b/libpsi-core/src/core/component.rs index 09095ec..be5fbca 100644 --- a/libpsi-core/src/core/component.rs +++ b/libpsi-core/src/core/component.rs @@ -4,7 +4,7 @@ use crate::{complex, ColumnVector, Complex, Matrix, Vector, VectorMatrix}; use core::ops; pub type QuantumBit = ColumnVector<Complex<f64>>; -pub type QuantumGate = Matrix<Complex<f64>>; +pub type QuantumGate = (&'static str, Matrix<Complex<f64>>); #[macro_export] macro_rules! count { @@ -124,7 +124,7 @@ impl QuantumRegister { } pub fn apply(&self, gate: &QuantumGate) -> QuantumBit { - self.state.mul_matrix(gate).unwrap() + self.state.mul_matrix(&gate.1).unwrap() } } diff --git a/libpsi-core/src/core/gates.rs b/libpsi-core/src/core/gates.rs index e9077ad..094fec9 100644 --- a/libpsi-core/src/core/gates.rs +++ b/libpsi-core/src/core/gates.rs @@ -2,21 +2,21 @@ use crate::{complex, matrix, QuantumGate}; #[rustfmt::skip] lazy_static::lazy_static! { - pub static ref HADAMARD: QuantumGate = matrix!([complex!(1.0, 0.0), complex!( 1.0, 0.0)]; - [complex!(1.0, 0.0), complex!(-1.0, 0.0)]) * - complex!(1.0/2.0_f64.sqrt(), 0.0); + pub static ref HADAMARD: QuantumGate = ("H", matrix!([complex!(1.0, 0.0), complex!( 1.0, 0.0)]; + [complex!(1.0, 0.0), complex!(-1.0, 0.0)]) * + complex!(1.0/2.0_f64.sqrt(), 0.0)); - pub static ref PAULI_X: QuantumGate = matrix!([complex!(0.0, 0.0), complex!(1.0, 0.0)]; - [complex!(1.0, 0.0), complex!(0.0, 0.0)]); + pub static ref PAULI_X: QuantumGate = ("Pauli-X", matrix!([complex!(0.0, 0.0), complex!(1.0, 0.0)]; + [complex!(1.0, 0.0), complex!(0.0, 0.0)])); - pub static ref PAULI_Y: QuantumGate = matrix!([complex!(0.0, 0.0), complex!(0.0, -1.0)]; - [complex!(0.0, 1.0), complex!(0.0, 0.0)]); + pub static ref PAULI_Y: QuantumGate = ("Pauli-Y", matrix!([complex!(0.0, 0.0), complex!(0.0, -1.0)]; + [complex!(0.0, 1.0), complex!(0.0, 0.0)])); - pub static ref PAULI_Z: QuantumGate = matrix!([complex!(1.0, 0.0), complex!( 0.0, 0.0)]; - [complex!(0.0, 0.0), complex!(-1.0, 0.0)]); + pub static ref PAULI_Z: QuantumGate = ("Pauli-Z", matrix!([complex!(1.0, 0.0), complex!( 0.0, 0.0)]; + [complex!(0.0, 0.0), complex!(-1.0, 0.0)])); - pub static ref CNOT: QuantumGate = matrix!([complex!(1.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0)]; - [complex!(0.0, 0.0), complex!(1.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0)]; - [complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(1.0, 0.0)]; - [complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(1.0, 0.0), complex!(0.0, 0.0)]); + pub static ref CNOT: QuantumGate = ("CNOT", matrix!([complex!(1.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0)]; + [complex!(0.0, 0.0), complex!(1.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0)]; + [complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(1.0, 0.0)]; + [complex!(0.0, 0.0), complex!(0.0, 0.0), complex!(1.0, 0.0), complex!(0.0, 0.0)])); } diff --git a/libpsi-core/src/core/runtime.rs b/libpsi-core/src/core/runtime.rs index 5b0a45f..0937f3c 100644 --- a/libpsi-core/src/core/runtime.rs +++ b/libpsi-core/src/core/runtime.rs @@ -19,7 +19,7 @@ pub trait RuntimeBase { fn get_circuit(&self) -> &QuantumCircuit; } -pub trait Runtime<T: RuntimeBase = Self> { - fn new(circuit: QuantumCircuit) -> Self; +pub trait Runtime<'a, T: RuntimeBase = Self> { + fn new(circuit: &'a QuantumCircuit) -> Self; fn execute(&self, repeat: usize) -> Vec<ExecutationData>; } diff --git a/libpsi-core/src/runtimes/basic_rt.rs b/libpsi-core/src/runtimes/basic_rt.rs index ed16205..5cc1535 100644 --- a/libpsi-core/src/runtimes/basic_rt.rs +++ b/libpsi-core/src/runtimes/basic_rt.rs @@ -3,17 +3,17 @@ use crate::{ Runtime, RuntimeBase, Vector, }; -pub struct BasicRT { - circuit: QuantumCircuit, +pub struct BasicRT<'a> { + circuit: &'a QuantumCircuit, } -impl RuntimeBase for BasicRT { +impl<'a> RuntimeBase for BasicRT<'a> { fn get_circuit(&self) -> &QuantumCircuit { &self.circuit } } -impl BasicRT { +impl<'a> BasicRT<'a> { fn calculate_state(state: &ColumnVector<Complex<f64>>, n: usize) -> QuantumBit { let num_states = 1 << n; let half_states = num_states >> 1; @@ -52,8 +52,8 @@ impl BasicRT { } } -impl Runtime for BasicRT { - fn new(circuit: QuantumCircuit) -> BasicRT { +impl<'a> Runtime<'a> for BasicRT<'a> { + fn new(circuit: &'a QuantumCircuit) -> BasicRT { BasicRT { circuit } } diff --git a/libpsi-tester/src/main.rs b/libpsi-tester/src/main.rs index 180df98..7941935 100644 --- a/libpsi-tester/src/main.rs +++ b/libpsi-tester/src/main.rs @@ -1,37 +1,14 @@ use libpsi_core::*; - -fn count_qubit_states(measurements: &[Vec<i32>], num_qubits: usize) -> Vec<i32> { - let mut counts = vec![0; num_qubits * 2]; - for measurement in measurements { - for (i, &state) in measurement.iter().enumerate() { - if state == 0 { - counts[i] += 1; - } else { - counts[num_qubits + i] += 1; - } - } - } - counts -} +use libpsi_visualizer::*; fn main() { - let mut circuit = QuantumCircuit::new(1, 1); + let mut circuit = QuantumCircuit::new(2, 2); circuit.apply(&gates::HADAMARD, &[], &[0]); + circuit.apply(&gates::CNOT, &[0], &[1]); - let runtime = BasicRT::new(circuit); - let execution_count = 1024; - let executions = runtime.execute(execution_count); - - let mut measurements = Vec::new(); - for execution in executions { - let bits = execution.classical_states.get_bits(); - measurements.push(bits.clone()); - } + let visualizer = HorizontalCLIVisualizer::new(&circuit); + visualizer.render(); - let counts = count_qubit_states(&measurements, 1); - println!( - "{:.2} * |0> + {:.2} * |1>", - (counts[0] as f32) / execution_count as f32, - (counts[1] as f32) / execution_count as f32 - ); + let runtime = BasicRT::new(&circuit); + runtime.execute(1024); } diff --git a/libpsi-visualizer/Cargo.toml b/libpsi-visualizer/Cargo.toml index 04af6d6..ecc31a2 100644 --- a/libpsi-visualizer/Cargo.toml +++ b/libpsi-visualizer/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] +libpsi-core = { path = "../libpsi-core" }
\ No newline at end of file diff --git a/libpsi-visualizer/src/cli/horizontal_cli.rs b/libpsi-visualizer/src/cli/horizontal_cli.rs new file mode 100644 index 0000000..0a5bf8e --- /dev/null +++ b/libpsi-visualizer/src/cli/horizontal_cli.rs @@ -0,0 +1,26 @@ +use crate::Visualizer; +use libpsi_core::QuantumCircuit; + +pub struct HorizontalCLIVisualizer<'a> { + circuit: &'a QuantumCircuit, +} + +impl<'a> Visualizer<'a> for HorizontalCLIVisualizer<'a> { + fn new(circuit: &'a QuantumCircuit) -> HorizontalCLIVisualizer<'a> { + HorizontalCLIVisualizer { circuit } + } + + // NOTE(Hachem): This is a temporary function + fn render(&self) { + for instruction in self.circuit.get_instructions() { + print!("Applied {} on ", &instruction.gate.0); + for bit_index in instruction.control_indices { + print!("q{} ", bit_index); + } + for bit_index in instruction.target_indices { + print!("q{} ", bit_index); + } + println!(); + } + } +} diff --git a/libpsi-visualizer/src/cli/mod.rs b/libpsi-visualizer/src/cli/mod.rs new file mode 100644 index 0000000..fe10249 --- /dev/null +++ b/libpsi-visualizer/src/cli/mod.rs @@ -0,0 +1,2 @@ +pub mod horizontal_cli; +pub use horizontal_cli::*; diff --git a/libpsi-visualizer/src/lib.rs b/libpsi-visualizer/src/lib.rs index 9fc645f..72bb588 100644 --- a/libpsi-visualizer/src/lib.rs +++ b/libpsi-visualizer/src/lib.rs @@ -1 +1,9 @@ -pub struct Visualizer; +use libpsi_core::*; + +pub mod cli; +pub use cli::*; + +pub trait Visualizer<'a> { + fn new(circuit: &'a QuantumCircuit) -> Self; + fn render(&self); +} |
