aboutsummaryrefslogtreecommitdiff
path: root/tester/custom_gates.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tester/custom_gates.rs')
-rw-r--r--tester/custom_gates.rs121
1 files changed, 121 insertions, 0 deletions
diff --git a/tester/custom_gates.rs b/tester/custom_gates.rs
new file mode 100644
index 0000000..ffe5c01
--- /dev/null
+++ b/tester/custom_gates.rs
@@ -0,0 +1,121 @@
+use crate::common::{benchmark_circuit, print_circuit, print_section, BenchmarkResult};
+use psi::{complex, matrix, CustomGate, CustomGateBuilder, QuantumCircuit};
+
+pub fn run_all(results: &mut Vec<BenchmarkResult>) {
+ println!("═══════════════════════════════════════════════════════════════");
+ println!(" CUSTOM GATES TESTS");
+ println!("═══════════════════════════════════════════════════════════════\n");
+
+ test_bell_gate(results);
+ test_swap_gate(results);
+ test_sqrt_x_gate(results);
+}
+
+pub fn test_bell_gate(results: &mut Vec<BenchmarkResult>) {
+ print_section("Custom Gate: Bell Pair Creator");
+
+ let bell_gate = CustomGateBuilder::new("BELL", 2).h(0).cnot(0, 1).build();
+ let gate_clone = bell_gate.clone();
+
+ let builder = move || {
+ let mut circuit = QuantumCircuit::new(4);
+ circuit
+ .apply_custom(gate_clone.clone(), &[0, 1])
+ .apply_custom(gate_clone.clone(), &[2, 3]);
+ circuit
+ };
+
+ let display_circuit = {
+ let mut circuit = QuantumCircuit::new(4);
+ circuit
+ .apply_custom(bell_gate.clone(), &[0, 1])
+ .apply_custom(bell_gate.clone(), &[2, 3]);
+ circuit
+ };
+ print_circuit(&display_circuit);
+ results.push(benchmark_circuit("Custom BELL (4 qubits)", builder));
+
+ let mut display = {
+ let mut circuit = QuantumCircuit::new(4);
+ circuit
+ .apply_custom(bell_gate.clone(), &[0, 1])
+ .apply_custom(bell_gate.clone(), &[2, 3]);
+ circuit
+ };
+ display.compute();
+ println!("{}\n", display);
+}
+
+pub fn test_swap_gate(results: &mut Vec<BenchmarkResult>) {
+ print_section("Custom Gate: Swap via CNOTs");
+
+ let swap_gate = CustomGateBuilder::new("MYSWAP", 2)
+ .cnot(0, 1)
+ .cnot(1, 0)
+ .cnot(0, 1)
+ .build();
+ let gate_clone = swap_gate.clone();
+
+ let builder = move || {
+ let mut circuit = QuantumCircuit::new(2);
+ circuit.x(0).apply_custom(gate_clone.clone(), &[0, 1]);
+ circuit
+ };
+
+ let display_circuit = {
+ let mut circuit = QuantumCircuit::new(2);
+ circuit.x(0).apply_custom(swap_gate.clone(), &[0, 1]);
+ circuit
+ };
+ print_circuit(&display_circuit);
+ results.push(benchmark_circuit("Custom SWAP (2 qubits)", builder));
+
+ let mut display = {
+ let mut circuit = QuantumCircuit::new(2);
+ circuit.x(0).apply_custom(swap_gate.clone(), &[0, 1]);
+ circuit
+ };
+ display.compute();
+ println!("{}\n", display);
+}
+
+pub fn test_sqrt_x_gate(results: &mut Vec<BenchmarkResult>) {
+ print_section("Custom Gate: Matrix-defined √X gate");
+
+ let sqrt_x_matrix = matrix!(
+ [complex!(0.5, 0.5), complex!(0.5, -0.5)];
+ [complex!(0.5, -0.5), complex!(0.5, 0.5)]
+ );
+ let sqrt_x = CustomGate::from_matrix("√X", sqrt_x_matrix);
+ let gate_clone = sqrt_x.clone();
+
+ let builder = move || {
+ let mut circuit = QuantumCircuit::new(1);
+ circuit
+ .apply_custom(gate_clone.clone(), &[0])
+ .apply_custom(gate_clone.clone(), &[0]);
+ circuit
+ };
+
+ let display_circuit = {
+ let mut circuit = QuantumCircuit::new(1);
+ circuit
+ .apply_custom(sqrt_x.clone(), &[0])
+ .apply_custom(sqrt_x.clone(), &[0]);
+ circuit
+ };
+ print_circuit(&display_circuit);
+ results.push(benchmark_circuit("√X gate (1 qubit)", builder));
+
+ let mut display = {
+ let mut circuit = QuantumCircuit::new(1);
+ circuit
+ .apply_custom(sqrt_x.clone(), &[0])
+ .apply_custom(sqrt_x.clone(), &[0]);
+ circuit
+ };
+ display.compute();
+ println!("{}", display);
+ println!("(Two √X gates should equal X, so |0⟩ becomes |1⟩)\n");
+}
+