Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b6bbca7

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /