|
|
|
"""Working Guppy Grover implementation""" |
|
from guppylang import guppy |
|
from guppylang.std.builtins import result |
|
from guppylang.std.quantum import qubit, h, x, cz, cx, measure |
|
import math |
|
import json |
|
|
|
@guppy |
|
def grover_n2_simple() -> None: |
|
"""Grover for n=2, marking |11⟩ with single iteration""" |
|
|
|
q0 = qubit() |
|
q1 = qubit() |
|
|
|
|
|
h(q0) |
|
h(q1) |
|
|
|
|
|
cz(q0, q1) |
|
|
|
|
|
h(q0) |
|
h(q1) |
|
x(q0) |
|
x(q1) |
|
|
|
|
|
h(q1) |
|
cx(q0, q1) |
|
h(q1) |
|
|
|
x(q0) |
|
x(q1) |
|
h(q0) |
|
h(q1) |
|
|
|
|
|
m0 = measure(q0) |
|
m1 = measure(q1) |
|
|
|
|
|
r0 = 1 if m0 else 0 |
|
r1 = 1 if m1 else 0 |
|
|
|
result("q0", r0) |
|
result("q1", r1) |
|
|
|
def run_experiment(shots=1000): |
|
"""Run Grover experiment and analyze results""" |
|
print(f"\nRunning Guppy/Selene Grover (n=2, marking |11⟩)...") |
|
|
|
|
|
sim = grover_n2_simple.emulator(n_qubits=2) |
|
sim = sim.with_shots(shots) |
|
results = sim.run() |
|
|
|
|
|
outcomes = {"00": 0, "01": 0, "10": 0, "11": 0} |
|
|
|
for shot in results.results: |
|
q0_val = None |
|
q1_val = None |
|
|
|
for entry in shot.entries: |
|
if entry[0] == 'q0': |
|
q0_val = entry[1] |
|
elif entry[0] == 'q1': |
|
q1_val = entry[1] |
|
|
|
if q0_val is not None and q1_val is not None: |
|
outcome = f"{q0_val}{q1_val}" |
|
outcomes[outcome] = outcomes.get(outcome, 0) + 1 |
|
|
|
|
|
probs = {k: v/shots for k, v in outcomes.items()} |
|
|
|
return probs, outcomes |
|
|
|
def main(): |
|
print("="*60) |
|
print("GUPPY/SELENE QUANTUM EMULATOR - GROVER'S ALGORITHM") |
|
print("="*60) |
|
|
|
|
|
for shots in [100, 1000, 4000]: |
|
probs, counts = run_experiment(shots) |
|
|
|
print(f"\nShots: {shots}") |
|
print("-" * 30) |
|
for state, prob in sorted(probs.items()): |
|
bar = "█" * int(prob * 20) |
|
marked = "⭐" if state == "11" else "" |
|
print(f"|{state}⟩: {prob:.3f} [{bar:<20}] {marked}") |
|
|
|
success_rate = probs.get("11", 0) |
|
print(f"\nSuccess rate: {success_rate:.1%}") |
|
|
|
|
|
print("\n" + "="*60) |
|
print("FINAL HIGH-PRECISION RUN (10000 shots)") |
|
print("="*60) |
|
|
|
probs, counts = run_experiment(10000) |
|
|
|
results = { |
|
"backend": "guppy/selene", |
|
"n_qubits": 2, |
|
"marked_state": "11", |
|
"k_iterations": 1, |
|
"shots": 10000, |
|
"probabilities": probs, |
|
"success_rate": probs.get("11", 0), |
|
"theoretical_success": 1.0 |
|
} |
|
|
|
print(f"\nFinal Results:") |
|
print(json.dumps(results, indent=2)) |
|
|
|
|
|
with open("quantum/guppy/results/guppy_grover_final.json", "w") as f: |
|
json.dump(results, f, indent=2) |
|
|
|
print(f"\n✅ Results saved to quantum/guppy/results/guppy_grover_final.json") |
|
|
|
|
|
print(f"\n📊 Performance Analysis:") |
|
print(f" Theoretical success rate: 100.0%") |
|
print(f" Achieved success rate: {results['success_rate']:.1%}") |
|
print(f" Difference: {abs(1.0 - results['success_rate']):.1%}") |
|
|
|
if __name__ == "__main__": |
|
main() |