Path: blob/main/qec101/Images/toric/solution3_button.py
1125 views
# reveal_cudaq.py1import ipywidgets as widgets2from IPython.display import display, Markdown3import runpy, tempfile, os45_NV_GREEN = "#76b900"67_CODE_pre = """\8L=3910stabilizers_z = [] # Plaquette stabilizers that flag Z errors11for row in range(L):12for col in range(L):13stabilizers_z.append(L*row + col+L**2) #left14stabilizers_z.append(L*row + col ) #top15stabilizers_z.append((L*row + (col+1)%L)+L**2) #right16stabilizers_z.append(L*((row + 1)%L) +col) #bottom171819stabilizers_x = [] # vertex stabilizers that flag X errors20for row in range(L):21for col in range(L):22stabilizers_x.append( (L*row + (col -1 )%L)) #left23stabilizers_x.append(L*((row-1)%L) + col + L**2) #top24stabilizers_x.append(L*row +col) #right25stabilizers_x.append(L*row +col + L**2 ) #bottom26"""2728# your example as a raw‐string29_CODE = """\30import cudaq31@cudaq.kernel32def toric(plaq: list[int], vert: list[int]):33data = cudaq.qvector(18)34anc = cudaq.qvector(18)353637for x in range(9):38h(anc[x])39for i in range(4):40x.ctrl(anc[x], data[plaq[4*x+i]])41h(anc[x])4243for x in range(9):44for i in range(4):45x.ctrl(data[vert[4*x+i]],anc[x+9])464748mz(anc)49reset(anc)5051#x(data[6],data[7],data[8]) # X1 L52#x(data[10],data[13],data[16]) # X2 L5354#z(data[12],data[13],data[14]) # Z1 L55#z(data[2],data[5],data[8]) # Z2 L5657d = mz(data)58596061cudaq.set_target('stim')6263results = cudaq.sample(toric,stabilizers_z, stabilizers_x,shots_count=1000)646566def count_summed_bits_at_indices(bit_dict, indices):6768zero_count = 069one_count = 07071for bitstring, count in bit_dict.items():72# Compute sum of bits at specified indices73bit_sum = sum(int(bitstring[i]) for i in indices) % 274# If bit_sum is 1, increment one_count; else increment zero_count75if bit_sum == 1:76one_count += count77else:78zero_count += count7980return zero_count, one_count81828384logical_x1 = [0,1,2] # L to R horizontal qubits85logical_x2 = [11,14,17] # T to B vertical qubits868788logical_z1 = [9,10,11] # L to R vertical qubits89logical_z2 = [1,4,7] # T to B horizontal qubits9091print("Result of measuring X1:")92print(count_summed_bits_at_indices(results, logical_x1))93print("Result of measuring X2:")94print(count_summed_bits_at_indices(results, logical_x2))9596print("Result of measuring Z1:")97print(count_summed_bits_at_indices(results, logical_z1))98print("Result of measuring Z2:")99print(count_summed_bits_at_indices(results, logical_z2))100"""101102def show_cudaq_solution():103"""104Returns a Reveal‐Answer widget that displays the CUDA‑Q code105and then runs it, showing its printed output.106"""107btn = widgets.Button(108description="Reveal Answer",109style={"button_color": _NV_GREEN, "font_weight": "bold"},110layout=widgets.Layout(width="180px")111)112out = widgets.Output()113114def _on_click(_):115out.clear_output()116with out:117# 1) show the source118display(Markdown("```python\n" + _CODE + "\n```"))119# 2) write to a temp .py file so inspect.getsource will succeed120fd, path = tempfile.mkstemp(suffix=".py")121with os.fdopen(fd, "w") as f:122f.write(_CODE_pre)123f.write(_CODE)124try:125# 3) execute that file as __main__126runpy.run_path(path, run_name="__main__")127finally:128os.remove(path)129130btn.on_click(_on_click)131return widgets.VBox([btn, out])132133134