aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2024-09-28 23:58:13 +0200
committerhachem <im@hachem.wtf>2024-09-28 23:58:13 +0200
commit2770097e25e7fb5090efe0f85340f0c638f9dd71 (patch)
tree591323ea709e14c0b6d8e5d0c396d51b59db5659
parentce0a2aa7fe9fe3a6b638c39078c8b77ac912b860 (diff)
Prep for first CLI visualizer
-rw-r--r--libpsi-core/src/core/component.rs4
-rw-r--r--libpsi-core/src/core/gates.rs26
-rw-r--r--libpsi-core/src/core/runtime.rs4
-rw-r--r--libpsi-core/src/runtimes/basic_rt.rs12
-rw-r--r--libpsi-tester/src/main.rs37
-rw-r--r--libpsi-visualizer/Cargo.toml1
-rw-r--r--libpsi-visualizer/src/cli/horizontal_cli.rs26
-rw-r--r--libpsi-visualizer/src/cli/mod.rs2
-rw-r--r--libpsi-visualizer/src/lib.rs10
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);
+}