bachelor_thesis/performance/generate_data_scaling_qbits.py

89 lines
2.9 KiB
Python

from collections import deque
import matplotlib.pyplot as plt
import numpy as np
import json
from random import shuffle
from pyqcs import State, H, X, S, CZ, M, list_to_circuit
from pyqcs.graph.state import GraphState
from pyqcs.util.random_circuits import random_circuit
from measure_circuit import execution_statistics, measure_all
def S_with_extra_arg(act, i):
return S(act)
def test_scaling_qbits(state_factory
, nstart
, nstop
, ngates_per_qbit
, ncircuits
, **kwargs):
trials = deque()
N = (nstop - nstart)
print()
for n, qbits in enumerate(range(nstart, nstop)):
print(f"generating test data... {int(n/N * 100)} %", end="\r", flush=True)
measurement_circuit = list_to_circuit([M(i) for i in range(qbits)])
circuits = [random_circuit(qbits, ngates_per_qbit * qbits, X, H, S_with_extra_arg, CZ)
| measurement_circuit
for _ in range(ncircuits)]
state = state_factory(qbits)
for circuit in circuits:
trials.append((qbits, circuit, state))
print("generating test data... done ")
print("randomizing tests...", end="", flush=True)
shuffle(trials)
print(" done")
results = measure_all(trials, **kwargs)
N, avg, std_dev = execution_statistics(results, scale={i:i for i in range(nstart, nstop)}, **kwargs)
nqbits = [[i] for i in sorted(results.keys())]
N = [[i] for i in N]
avg = [[i] for i in avg]
std_dev = [[i] for i in std_dev]
return np.hstack([nqbits, N, avg, std_dev])
if __name__ == "__main__":
nstart = 4
nstop = 16
ncircuits = 50
ngates_per_qbit = 100
seed = 0xdeadbeef
np.random.seed(seed)
results_naive = test_scaling_qbits(State.new_zero_state
, nstart
, nstop
, ngates_per_qbit
, ncircuits
, repeat=10)
np.random.seed(seed)
results_graph = test_scaling_qbits(GraphState.new_zero_state
, nstart
, nstop
, ngates_per_qbit
, ncircuits
, repeat=10)
np.savetxt("qbit_scaling_naive.csv", results_naive)
print("saved naive results to qbit_scaling_naive.csv")
np.savetxt("qbit_scaling_graph.csv", results_graph)
print("saved graph results to qbit_scaling_graph.csv")
meta = {"nstart": nstart
, "nstop": nstop
, "ncircuits": ncircuits
, "ngates_per_qbit": ngates_per_qbit
, "seed": seed}
with open("qbit_scaling_meta.json", "w") as fout:
json.dump(meta, fout)
print("saved meta data to qbit_scaling_meta.json")