Skip to content

Commit b6bbca7

Browse files
authored
Merge pull request #237 from sadderdate/haise/dev
add strict order bewteen calibration and measz
2 parents 96ebd98 + bc90585 commit b6bbca7

File tree

2 files changed

+110
-11
lines changed

2 files changed

+110
-11
lines changed

tensorcircuit/circuit.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def __init__(
6767
self.calibrations = []
6868
self.calibration_invokes = []
6969
self.measz_invokes = []
70+
self._event_seq = 0
7071

7172
self.inputs = inputs
7273
self.mps_inputs = mps_inputs
@@ -136,18 +137,24 @@ def add_calibration(
136137
self.calibration_invokes.append({
137138
"name": builder.name,
138139
"parameters": parameters,
139-
"pos": len(self._qir)
140+
"pos": len(self._qir),
141+
"seq": self._record_event()
140142
})
141143

142144
def measz(self, *index: int) -> None:
143145
self.disable_openqasm()
144146
self.measz_invokes.append({
145147
"name": "measz",
146148
"index": index,
147-
"pos": len(self._qir)
149+
"pos": len(self._qir),
150+
"seq": self._record_event()
148151
})
149152
return
150153

154+
def _record_event(self):
155+
seq = self._event_seq
156+
self._event_seq += 1
157+
return seq
151158

152159
def to_tqasm(self, pragma: Optional[str]= None) -> str:
153160
qasm_lines = []
@@ -186,17 +193,27 @@ def to_tqasm(self, pragma: Optional[str]= None) -> str:
186193
pos = m.get("pos", len(self._qir))
187194
measz_by_pos[pos].append(m)
188195

189-
# 交错输出:在第 i 个门之前输出所有 pos == i 的校准
190-
for i, gate in enumerate(self._qir):
191-
for m in measz_by_pos.get(i, []):
192-
targets = ", ".join(f"q[{idx}]" for idx in m["index"])
193-
qasm_lines.append(f"MEASZ {targets};")
196+
events_by_pos = defaultdict(list)
194197

195-
for cal in cals_by_pos.get(i, []):
196-
# print(cal)
197-
pname = ", ".join(f"q[{x}]" for x in cal.get("parameters", []))
198-
qasm_lines.append(f"{cal['name']} {pname};")
198+
for pos, items in cals_by_pos.items():
199+
for cal in items:
200+
events_by_pos[pos].append(("cal", cal))
199201

202+
for pos, items in measz_by_pos.items():
203+
for m in items:
204+
events_by_pos[pos].append(("measz", m))
205+
206+
# 交错输出:在第 i 个门之前输出所有 pos == i 的校准
207+
for i, gate in enumerate(self._qir):
208+
events = sorted(events_by_pos.get(i, []), key=lambda item: item[1]["seq"])
209+
for event_type, event in events:
210+
if event_type == "measz":
211+
targets = ", ".join(f"q[{idx}]" for idx in event["index"])
212+
qasm_lines.append(f"MEASZ {targets};")
213+
elif event_type == "cal":
214+
pname = ", ".join(f"q[{x}]" for x in event.get("parameters", []))
215+
qasm_lines.append(f"{event['name']} {pname};")
216+
200217
# print(gate)
201218
gname = gate["name"]
202219
gname = gname.upper()

tests/06_test_pulse_measure_mix.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import sys
2+
import os
3+
import matplotlib.pyplot as plt
4+
5+
# Add the directory containing your module to Python's search path
6+
module_path = ".."
7+
sys.path.insert(0, module_path)
8+
9+
from tensorcircuit import Circuit, Param, gates, waveforms
10+
from tensorcircuit.cloud.apis import submit_task, get_device, set_provider, set_token, list_devices, list_properties
11+
import re
12+
13+
# from dotenv import load_dotenv
14+
# load_dotenv()
15+
16+
shots_const = 1000
17+
18+
print("✅ TEST FILE LOADED")
19+
set_token(os.getenv("TOKEN"))
20+
set_provider("tencent")
21+
ds = list_devices()
22+
print(ds)
23+
24+
25+
def gen_pulse_measure_mix_circuit(t):
26+
qc = Circuit(3)
27+
28+
qc.h(0)
29+
30+
qc.measz(0)
31+
32+
param0 = Param("a")
33+
34+
builder = qc.calibrate("basic_pulse_01", [param0])
35+
frame = builder.new_frame("drive_frame", param0)
36+
builder.play(frame, waveforms.CosineDrag(t, 0.2, 0.0, 0.0))
37+
38+
builder.build()
39+
40+
qc.add_calibration(builder, [1])
41+
42+
param1 = Param("a")
43+
builder1 = qc.calibrate("basic_pulse_02", [param1])
44+
frame1 = builder1.new_frame("drive_frame", param1)
45+
builder1.play(frame1, waveforms.CosineDrag(115.0, 0.2, 1.0, 0.0))
46+
builder1.play(frame1, waveforms.Flattop(115.0, 0.2, 0.0))
47+
builder1.play(frame1, waveforms.Sine(115.0, 0.2, 0.1, 0.1, 0.0))
48+
builder1.build()
49+
50+
qc.add_calibration(builder1, [2])
51+
52+
qc.measz(0)
53+
54+
qc.cnot(0, 1)
55+
56+
qc.i(2)
57+
qc.x(2)
58+
qc.measz(0)
59+
60+
print(qc.to_tqasm())
61+
62+
return qc
63+
64+
65+
def run_circuit(qc):
66+
device_name = "tianji_s2"
67+
d = get_device(device_name)
68+
t = submit_task(
69+
circuit=qc,
70+
shots=shots_const,
71+
device=d,
72+
enable_qos_gate_decomposition=False,
73+
enable_qos_qubit_mapping=False,
74+
)
75+
# print(qc.to_tqasm())
76+
# n = qc._nqubits
77+
rf = t.results()
78+
return rf
79+
80+
qc = gen_pulse_measure_mix_circuit(1.0)
81+
result = run_circuit(qc)
82+
print(result)

0 commit comments

Comments
 (0)