Samabe1109's picture
download
raw
3.73 kB
"""Generate synthetic quantum syndrome data for training."""
import numpy as np
import json
from pathlib import Path
def generate_surface_code_syndrome(distance=5, error_rate=0.05, num_samples=1000):
"""
Generate syndrome data for a dxd surface code.
Returns:
syndromes: (num_samples, distance, distance, 2) array
Channel 0: X syndrome (star stabilizers)
Channel 1: Z syndrome (plaquette stabilizers)
errors: (num_samples, distance, distance, 2) array
Ground truth error locations
"""
syndromes = np.zeros((num_samples, distance, distance, 2), dtype=np.float32)
errors = np.zeros((num_samples, distance, distance, 2), dtype=np.float32)
for s in range(num_samples):
# Random X and Z errors on data qubits
x_errors = np.random.random((distance, distance)) < error_rate
z_errors = np.random.random((distance, distance)) < error_rate
errors[s, :, :, 0] = x_errors.astype(np.float32)
errors[s, :, :, 1] = z_errors.astype(np.float32)
# Compute X syndrome (star stabilizers measure Z errors)
for i in range(distance):
for j in range(distance):
# Star stabilizer at (i,j) checks Z errors on 4 neighboring qubits
z_synd = 0
for di, dj in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
ni, nj = i + di, j + dj
if 0 <= ni < distance and 0 <= nj < distance:
z_synd ^= int(z_errors[ni, nj])
syndromes[s, i, j, 0] = z_synd
# Compute Z syndrome (plaquette stabilizers measure X errors)
for i in range(distance - 1):
for j in range(distance - 1):
# Plaquette stabilizer at (i,j) checks X errors on 4 qubits
x_synd = 0
for di, dj in [(0, 0), (0, 1), (1, 0), (1, 1)]:
x_synd ^= int(x_errors[i + di, j + dj])
syndromes[s, i, j, 1] = x_synd
return syndromes, errors
def generate_dataset(distances=[5, 7, 9], error_rates=[0.01, 0.03, 0.05, 0.08],
samples_per_config=5000, output_dir="data"):
"""Generate full training dataset."""
Path(output_dir).mkdir(exist_ok=True)
all_syndromes = []
all_errors = []
all_metadata = []
for d in distances:
for p in error_rates:
print(f"Generating d={d}, p={p}...")
synd, errs = generate_surface_code_syndrome(d, p, samples_per_config)
all_syndromes.append(synd)
all_errors.append(errs)
all_metadata.extend([{"distance": d, "error_rate": p}] * samples_per_config)
# Pad to max distance
max_d = max(distances)
padded_syndromes = []
padded_errors = []
for synd, errs in zip(all_syndromes, all_errors):
d = synd.shape[1]
if d < max_d:
# Pad with zeros
pad = ((0, 0), (0, max_d - d), (0, max_d - d), (0, 0))
synd = np.pad(synd, pad, mode='constant')
errs = np.pad(errs, pad, mode='constant')
padded_syndromes.append(synd)
padded_errors.append(errs)
syndromes = np.concatenate(padded_syndromes, axis=0)
errors = np.concatenate(padded_errors, axis=0)
# Save
np.save(f"{output_dir}/syndromes.npy", syndromes)
np.save(f"{output_dir}/errors.npy", errors)
with open(f"{output_dir}/metadata.json", "w") as f:
json.dump(all_metadata, f)
print(f"Dataset saved: {len(syndromes)} samples, shape={syndromes.shape}")
return syndromes, errors, all_metadata
if __name__ == "__main__":
generate_dataset()

Xet Storage Details

Size:
3.73 kB
·
Xet hash:
04eac3fdc1006fa27466b30f24c8685b931842be3b6e1710f6c42aeef13b80bf

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.