From f3e9e420a71770d4be9c3230a5a651d3026f33ba Mon Sep 17 00:00:00 2001 From: Noa Aarts Date: Tue, 27 Jan 2026 17:05:03 +0100 Subject: [PATCH] more improvements --- flake.nix | 1 + src/__init__.py | 0 src/best_circuits.png | Bin 0 -> 22422 bytes src/ga_qas.py | 56 ++++++++++++++++++++++++++++------------- src/quantum_circuit.py | 18 ++++++------- 5 files changed, 48 insertions(+), 27 deletions(-) delete mode 100644 src/__init__.py create mode 100644 src/best_circuits.png diff --git a/flake.nix b/flake.nix index e359360..f90c706 100644 --- a/flake.nix +++ b/flake.nix @@ -43,6 +43,7 @@ ppkgs.tqdm ppkgs.qiskit ppkgs.qiskit-aer + ppkgs.matplotlib ])) ]; }; diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/best_circuits.png b/src/best_circuits.png new file mode 100644 index 0000000000000000000000000000000000000000..1183ddf78da430fb13b80dee5070b7f8188c3f61 GIT binary patch literal 22422 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 N;OXk;vd$@?2>>26X=DHZ literal 0 HcmV?d00001 diff --git a/src/ga_qas.py b/src/ga_qas.py index 9b4f262..e4b1d76 100755 --- a/src/ga_qas.py +++ b/src/ga_qas.py @@ -3,24 +3,22 @@ # "Genetic optimization of ansatz expressibility for enhanced variational quantum algorithm performance" import random -from quantum_circuit import ( - Gate, - GateType, - QuantumCircuit, - circ_from_layers, - sample_random_generator, -) + +import matplotlib.pyplot as plt + from qas_flow import Stream +from quantum_circuit import (Gate, GateType, QuantumCircuit, circ_from_layers, + sample_random_generator, single_typ) -DEPTH = 20 -QUBITS = 5 -GENERATIONS = 20 -GENERATION_SIZE = 20 -PARENT_AMOUNT = 5 -MUTATION_RATE = 0.1 +DEPTH: int = 6 +QUBITS: int = 6 +GENERATIONS: int = 40 +GENERATION_SIZE: int = 60 +PARENT_AMOUNT: int = 10 +MUTATION_RATE: float = 0.1 -gate_set = [ +gate_set: list[GateType] = [ GateType.H, GateType.RX, GateType.RY, @@ -30,8 +28,15 @@ gate_set = [ ] -def main(): - seed_rng = random.Random(1020381) +def plot_best_circuits(best_circuits: list[QuantumCircuit]) -> None: + fig, ax = plt.subplots() + + ax.plot([-circ.expressibility for circ in best_circuits]) + fig.savefig("best_circuits.png") + + +def main() -> None: + seed_rng: random.Random = random.Random(1020381) initial_population: list[QuantumCircuit] = ( Stream(sample_random_generator(random.Random(101020), QUBITS, DEPTH, gate_set)) .apply(lambda circ: print(circ)) @@ -49,6 +54,8 @@ def main(): main_rng = random.Random(2837175) + best_circuits: list[QuantumCircuit] = [] + for generation in range(GENERATIONS): print(f"starting generation {generation}") population.sort(key=lambda qc: qc.expressibility, reverse=True) @@ -68,22 +75,35 @@ def main(): if old_gate.single(): child_layers[layer_idx][gate_idx] = Gate( - main_rng.choice(gate_set), + main_rng.choice( + [gate for gate in gate_set if single_typ(gate)] + ), old_gate.qubits, old_gate.param_idx, ) else: child_layers[layer_idx][gate_idx] = Gate( old_gate.typ, - tuple(old_gate.qubits[::-1]), + (old_gate.qubits[1], old_gate.qubits[0]), old_gate.param_idx, ) child = circ_from_layers(child_layers, QUBITS) child.expressibility_estimate(2000, seed_rng.randint(1000, 1000000000)) offspring.append(child) + + offspring.sort(key=lambda qc: qc.expressibility, reverse=True) + if population[0].expressibility > offspring[0].expressibility: + print(f"best parent > best child") + best_circuits.append(population[0]) + else: + print(f"best child > best parent") + best_circuits.append(offspring[0]) population = offspring + plot_best_circuits(best_circuits) + plt.show() + if __name__ == "__main__": main() diff --git a/src/quantum_circuit.py b/src/quantum_circuit.py index e656ca8..f3d7e87 100644 --- a/src/quantum_circuit.py +++ b/src/quantum_circuit.py @@ -1,11 +1,12 @@ -from dataclasses import dataclass import math import random -from typing import override -import numpy as np +from dataclasses import dataclass from enum import IntEnum +from typing import override -from qiskit import QuantumCircuit as QiskitCircuit, transpile +import numpy as np +from qiskit import QuantumCircuit as QiskitCircuit +from qiskit import transpile from qiskit.circuit import ParameterVector, ParameterVectorElement from qiskit_aer import AerSimulator @@ -369,11 +370,10 @@ def sample_circuit_random( for loc in range(qubits): if loc in used_qubits: continue - gate_type = rng.choice( - gate_types - if loc + 1 < qubits - else [typ for typ in gate_types if single_typ(typ)] - ) + if loc + 1 < qubits: + gate_type = rng.choice(gate_types) + else: + gate_type = rng.choice([typ for typ in gate_types if single_typ(typ)]) match gate_type: case GateType.H: layer.append(Gate(gate_type, loc, params))