Skip to content

Commit 5c7159a

Browse files
committed
Add StateVecRs as a fallback for "state-vector" in Python PECOS.
1 parent 9a3403e commit 5c7159a

File tree

4 files changed

+75
-26
lines changed

4 files changed

+75
-26
lines changed

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.13

python/pecos-rslib/src/pecos_rslib/rsstate_vec.py

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ def run_gate(
8686
elif "angle" in params and "angles" not in params:
8787
params["angles"] = (params["angle"],)
8888

89+
# Convert list to tuple if needed (for Rust bindings compatibility)
90+
if isinstance(location, list):
91+
location = tuple(location)
92+
8993
if symbol in self.bindings:
9094
results = self.bindings[symbol](self, location, **params)
9195
else:
@@ -151,19 +155,45 @@ def run_circuit(
151155
"F4": lambda sim, q, **params: sim._sim.run_1q_gate("F4", q, params),
152156
"F4dg": lambda sim, q, **params: sim._sim.run_1q_gate("F4dg", q, params),
153157
"II": lambda sim, qs, **params: None,
154-
"CX": lambda sim, qs, **params: sim._sim.run_2q_gate("CX", qs, params),
155-
"CNOT": lambda sim, qs, **params: sim._sim.run_2q_gate("CX", qs, params),
156-
"CY": lambda sim, qs, **params: sim._sim.run_2q_gate("CY", qs, params),
157-
"CZ": lambda sim, qs, **params: sim._sim.run_2q_gate("CZ", qs, params),
158-
"SXX": lambda sim, qs, **params: sim._sim.run_2q_gate("SXX", qs, params),
159-
"SXXdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SXXdg", qs, params),
160-
"SYY": lambda sim, qs, **params: sim._sim.run_2q_gate("SYY", qs, params),
161-
"SYYdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SYYdg", qs, params),
162-
"SZZ": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZ", qs, params),
163-
"SZZdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZdg", qs, params),
164-
"SWAP": lambda sim, qs, **params: sim._sim.run_2q_gate("SWAP", qs, params),
165-
"G": lambda sim, qs, **params: sim._sim.run_2q_gate("G2", qs, params),
166-
"G2": lambda sim, qs, **params: sim._sim.run_2q_gate("G2", qs, params),
158+
"CX": lambda sim, qs, **params: sim._sim.run_2q_gate(
159+
"CX", tuple(qs) if isinstance(qs, list) else qs, params
160+
),
161+
"CNOT": lambda sim, qs, **params: sim._sim.run_2q_gate(
162+
"CX", tuple(qs) if isinstance(qs, list) else qs, params
163+
),
164+
"CY": lambda sim, qs, **params: sim._sim.run_2q_gate(
165+
"CY", tuple(qs) if isinstance(qs, list) else qs, params
166+
),
167+
"CZ": lambda sim, qs, **params: sim._sim.run_2q_gate(
168+
"CZ", tuple(qs) if isinstance(qs, list) else qs, params
169+
),
170+
"SXX": lambda sim, qs, **params: sim._sim.run_2q_gate(
171+
"SXX", tuple(qs) if isinstance(qs, list) else qs, params
172+
),
173+
"SXXdg": lambda sim, qs, **params: sim._sim.run_2q_gate(
174+
"SXXdg", tuple(qs) if isinstance(qs, list) else qs, params
175+
),
176+
"SYY": lambda sim, qs, **params: sim._sim.run_2q_gate(
177+
"SYY", tuple(qs) if isinstance(qs, list) else qs, params
178+
),
179+
"SYYdg": lambda sim, qs, **params: sim._sim.run_2q_gate(
180+
"SYYdg", tuple(qs) if isinstance(qs, list) else qs, params
181+
),
182+
"SZZ": lambda sim, qs, **params: sim._sim.run_2q_gate(
183+
"SZZ", tuple(qs) if isinstance(qs, list) else qs, params
184+
),
185+
"SZZdg": lambda sim, qs, **params: sim._sim.run_2q_gate(
186+
"SZZdg", tuple(qs) if isinstance(qs, list) else qs, params
187+
),
188+
"SWAP": lambda sim, qs, **params: sim._sim.run_2q_gate(
189+
"SWAP", tuple(qs) if isinstance(qs, list) else qs, params
190+
),
191+
"G": lambda sim, qs, **params: sim._sim.run_2q_gate(
192+
"G2", tuple(qs) if isinstance(qs, list) else qs, params
193+
),
194+
"G2": lambda sim, qs, **params: sim._sim.run_2q_gate(
195+
"G2", tuple(qs) if isinstance(qs, list) else qs, params
196+
),
167197
"MZ": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params),
168198
"MX": lambda sim, q, **params: sim._sim.run_1q_gate("MX", q, params),
169199
"MY": lambda sim, q, **params: sim._sim.run_1q_gate("MY", q, params),
@@ -203,16 +233,28 @@ def run_circuit(
203233
"F2d": lambda sim, q, **params: sim._sim.run_1q_gate("F2dg", q, params),
204234
"F3d": lambda sim, q, **params: sim._sim.run_1q_gate("F3dg", q, params),
205235
"F4d": lambda sim, q, **params: sim._sim.run_1q_gate("F4dg", q, params),
206-
"SqrtXX": lambda sim, qs, **params: sim._sim.run_2q_gate("SXX", qs, params),
207-
"SqrtYY": lambda sim, qs, **params: sim._sim.run_2q_gate("SYY", qs, params),
208-
"SqrtZZ": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZ", qs, params),
236+
"SqrtXX": lambda sim, qs, **params: sim._sim.run_2q_gate(
237+
"SXX", tuple(qs) if isinstance(qs, list) else qs, params
238+
),
239+
"SqrtYY": lambda sim, qs, **params: sim._sim.run_2q_gate(
240+
"SYY", tuple(qs) if isinstance(qs, list) else qs, params
241+
),
242+
"SqrtZZ": lambda sim, qs, **params: sim._sim.run_2q_gate(
243+
"SZZ", tuple(qs) if isinstance(qs, list) else qs, params
244+
),
209245
"Measure": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params),
210246
"measure Z": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params),
211247
# "MZForced": lambda sim, q, **params: sim._sim.run_1q_gate("MZForced", q, params),
212248
# "PZForced": lambda sim, q, **params: sim._sim.run_1q_gate("PZForced", q, params),
213-
"SqrtXXd": lambda sim, qs, **params: sim._sim.run_2q_gate("SXXdg", qs, params),
214-
"SqrtYYd": lambda sim, qs, **params: sim._sim.run_2q_gate("SYYdg", qs, params),
215-
"SqrtZZd": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZdg", qs, params),
249+
"SqrtXXd": lambda sim, qs, **params: sim._sim.run_2q_gate(
250+
"SXXdg", tuple(qs) if isinstance(qs, list) else qs, params
251+
),
252+
"SqrtYYd": lambda sim, qs, **params: sim._sim.run_2q_gate(
253+
"SYYdg", tuple(qs) if isinstance(qs, list) else qs, params
254+
),
255+
"SqrtZZd": lambda sim, qs, **params: sim._sim.run_2q_gate(
256+
"SZZdg", tuple(qs) if isinstance(qs, list) else qs, params
257+
),
216258
"SqrtX": lambda sim, q, **params: sim._sim.run_1q_gate("SX", q, params),
217259
"SqrtXd": lambda sim, q, **params: sim._sim.run_1q_gate("SXdg", q, params),
218260
"SqrtY": lambda sim, q, **params: sim._sim.run_1q_gate("SY", q, params),
@@ -243,27 +285,27 @@ def run_circuit(
243285
"Tdg": lambda sim, q, **params: sim._sim.run_1q_gate("Tdg", q, params),
244286
"RXX": lambda sim, qs, **params: sim._sim.run_2q_gate(
245287
"RXX",
246-
qs,
288+
tuple(qs) if isinstance(qs, list) else qs,
247289
{"angle": params["angles"][0]} if "angles" in params else {"angle": 0},
248290
),
249291
"RYY": lambda sim, qs, **params: sim._sim.run_2q_gate(
250292
"RYY",
251-
qs,
293+
tuple(qs) if isinstance(qs, list) else qs,
252294
{"angle": params["angles"][0]} if "angles" in params else {"angle": 0},
253295
),
254296
"RZZ": lambda sim, qs, **params: sim._sim.run_2q_gate(
255297
"RZZ",
256-
qs,
298+
tuple(qs) if isinstance(qs, list) else qs,
257299
{"angle": params["angles"][0]} if "angles" in params else {"angle": 0},
258300
),
259301
"RZZRYYRXX": lambda sim, qs, **params: sim._sim.run_2q_gate(
260302
"RZZRYYRXX",
261-
qs,
303+
tuple(qs) if isinstance(qs, list) else qs,
262304
{"angles": params["angles"]} if "angles" in params else {"angles": [0, 0, 0]},
263305
),
264306
"R2XXYYZZ": lambda sim, qs, **params: sim._sim.run_2q_gate(
265307
"RZZRYYRXX",
266-
qs,
308+
tuple(qs) if isinstance(qs, list) else qs,
267309
{"angles": params["angles"]} if "angles" in params else {"angles": [0, 0, 0]},
268310
),
269311
}

python/quantum-pecos/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ all = [
7878
"quantum-pecos[wasm-all]",
7979
"quantum-pecos[visualization]",
8080
]
81-
# The following only work for some environments/Python verions:
81+
# The following only work for some environments/Python versions:
8282
qulacs = [ # State-vector sims using Qulacs
8383
"qulacs>=0.6.4", # Package not currently compatible with Python 3.13
8484
]

python/quantum-pecos/src/pecos/simulators/quantum_simulator.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from __future__ import annotations
1313

14+
from pecos.simulators import StateVecRs
1415
from pecos.simulators.sparsesim.state import SparseSim
1516

1617
try:
@@ -54,7 +55,12 @@ def init(self, num_qubits: int):
5455
if isinstance(self.backend, str):
5556
if self.backend == "stabilizer":
5657
self.state = SparseSim
57-
elif self.backend in ("state-vector", "ProjectQSim"):
58+
elif self.backend in "state-vector":
59+
if Qulacs is not None:
60+
self.state = Qulacs
61+
else:
62+
self.state = StateVecRs
63+
elif "ProjectQSim":
5864
self.state = ProjectQSim
5965
elif self.backend in {"MPS", "mps"}:
6066
self.state = MPS

0 commit comments

Comments
 (0)