Skip to content

Commit 4d1a9fa

Browse files
committed
modify test with up-to-date change
1 parent 1ec1a48 commit 4d1a9fa

File tree

9 files changed

+55
-62
lines changed

9 files changed

+55
-62
lines changed

.github/workflows/functional_tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
fail-fast: false
1616
matrix:
17-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
17+
python-version: ["3.9", "3.10", "3.11", "3.12"]
1818

1919
steps:
2020
- uses: actions/checkout@v3

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,6 @@ max-acc-valid.pt
345345
model.pt
346346
.cursor/rules/*.mdc
347347

348+
.cursorignore
349+
.cursor/
350+
.github/copilot-instructions.md

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ opt_einsum
88
pathos>=0.2.7
99
pylatexenc>=2.10
1010
pyscf>=2.0.1
11-
qiskit>=0.39.0,<1.0.0
11+
qiskit==1.4.3
1212
recommonmark
13-
qiskit_ibm_runtime==0.20.0
14-
qiskit-aer==0.13.3
13+
qiskit_ibm_runtime
14+
qiskit-aer
1515

1616
scipy>=1.5.2
1717
setuptools>=52.0.0
@@ -21,4 +21,4 @@ torchdiffeq>=0.2.3
2121
torchpack>=0.3.0
2222
torchquantum>=0.1
2323
torchvision>=0.9.0.dev20210130
24-
tqdm>=4.56.0
24+
tqdm>=4.56.0

test/layers/test_nlocal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def compare_tq_to_qiskit(tq_circuit, qiskit_circuit, instance_info=""):
1717
for bit in qiskit_circuit.decompose():
1818
wires = []
1919
for qu in bit.qubits:
20-
wires.append(qu.index)
20+
wires.append(qu._index)
2121
qiskit_ops.append(
2222
{
2323
"name": bit.operation.name,

test/layers/test_rotgate.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import torchquantum as tq
22
import qiskit
3-
from qiskit import Aer, execute
3+
from qiskit_aer import Aer
4+
from qiskit import transpile
45

56
from torchquantum.util import (
67
switch_little_big_endian_matrix,
@@ -36,7 +37,8 @@ def test_rotgates():
3637

3738
# get the unitary from qiskit
3839
backend = Aer.get_backend("unitary_simulator")
39-
result = execute(qiskit_circuit, backend).result()
40+
qiskit_circuit = transpile(qiskit_circuit, backend)
41+
result = backend.run(qiskit_circuit).result()
4042
unitary_qiskit = result.get_unitary(qiskit_circuit)
4143

4244
# create tq circuit

test/measurement/test_eval_observable.py

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from qiskit import QuantumCircuit
2626
import numpy as np
2727
import random
28-
from qiskit.opflow import StateFn, X, Y, Z, I
28+
from qiskit.quantum_info import Statevector, SparsePauliOp
2929

3030
import torchquantum as tq
3131

@@ -35,14 +35,6 @@
3535

3636
import torch
3737

38-
pauli_str_op_dict = {
39-
"X": X,
40-
"Y": Y,
41-
"Z": Z,
42-
"I": I,
43-
}
44-
45-
4638
def test_expval_observable():
4739
# seed = 0
4840
# random.seed(seed)
@@ -63,18 +55,21 @@ def test_expval_observable():
6355
)[0].item()
6456

6557
qiskit_circ = op_history2qiskit(qdev.n_wires, qdev.op_history)
66-
operator = pauli_str_op_dict[obs[0]]
67-
for ob in obs[1:]:
68-
# note here the order is reversed because qiskit is in little endian
69-
operator = pauli_str_op_dict[ob] ^ operator
70-
psi = StateFn(qiskit_circ)
71-
psi_evaled = psi.eval()._primitive._data
58+
59+
# opflow was little-endian, SparsePauliOp is also little-endian.
60+
# TorchQuantum is big-endian.
61+
# So we need to reverse the observable string for qiskit.
62+
qiskit_observable_str = "".join(reversed(obs))
63+
operator = SparsePauliOp(qiskit_observable_str)
64+
65+
psi = Statevector.from_instruction(qiskit_circ)
66+
psi_evaled = psi.data
7267
state_tq = switch_little_big_endian_state(
7368
qdev.get_states_1d().detach().numpy()
7469
)[0]
7570
assert np.allclose(psi_evaled, state_tq, atol=1e-5)
7671

77-
expval_qiskit = (~psi @ operator @ psi).eval().real
72+
expval_qiskit = psi.expectation_value(operator).real
7873
# print(expval_tq, expval_qiskit)
7974
assert np.isclose(expval_tq, expval_qiskit, atol=1e-5)
8075
if (
@@ -91,35 +86,35 @@ def util0():
9186

9287
qc.x(0)
9388

94-
operator = Z ^ I
95-
psi = StateFn(qc)
96-
expectation_value = (~psi @ operator @ psi).eval()
89+
operator = SparsePauliOp("ZI")
90+
psi = Statevector(qc)
91+
expectation_value = psi.expectation_value(operator)
9792
print(expectation_value.real)
9893
# result: 1.0, means measurement result is 0, so Z is on qubit 1
9994

100-
operator = I ^ Z
101-
psi = StateFn(qc)
102-
expectation_value = (~psi @ operator @ psi).eval()
95+
operator = SparsePauliOp("IZ")
96+
psi = Statevector(qc)
97+
expectation_value = psi.expectation_value(operator)
10398
print(expectation_value.real)
10499
# result: -1.0 means measurement result is 1, so Z is on qubit 0
105100

106-
operator = I ^ I
107-
psi = StateFn(qc)
108-
expectation_value = (~psi @ operator @ psi).eval()
101+
operator = SparsePauliOp("II")
102+
psi = Statevector(qc)
103+
expectation_value = psi.expectation_value(operator)
109104
print(expectation_value.real)
110105

111-
operator = Z ^ Z
112-
psi = StateFn(qc)
113-
expectation_value = (~psi @ operator @ psi).eval()
106+
operator = SparsePauliOp("ZZ")
107+
psi = Statevector(qc)
108+
expectation_value = psi.expectation_value(operator)
114109
print(expectation_value.real)
115110

116111
qc = QuantumCircuit(3)
117112

118113
qc.x(0)
119114

120-
operator = I ^ I ^ Z
121-
psi = StateFn(qc)
122-
expectation_value = (~psi @ operator @ psi).eval()
115+
operator = SparsePauliOp("ZII")
116+
psi = Statevector(qc)
117+
expectation_value = psi.expectation_value(operator)
123118
print(expectation_value.real)
124119

125120

test/measurement/test_measure.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
import torchquantum as tq
2626

2727
from torchquantum.plugin import op_history2qiskit
28-
from qiskit import Aer, transpile
28+
from qiskit_aer import Aer
29+
from qiskit import transpile
2930
import numpy as np
3031

3132

test/plugin/test_qiskit_plugins.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from qiskit import QuantumCircuit
2626
import numpy as np
2727
import random
28-
from qiskit.opflow import StateFn, X, Y, Z, I
28+
from qiskit.quantum_info import Statevector, SparsePauliOp
2929

3030
import torchquantum as tq
3131

@@ -35,13 +35,6 @@
3535
import torch
3636
import pytest
3737

38-
pauli_str_op_dict = {
39-
"X": X,
40-
"Y": Y,
41-
"Z": Z,
42-
"I": I,
43-
}
44-
4538
@pytest.mark.skip
4639
def test_expval_observable():
4740
# seed = 0
@@ -63,18 +56,16 @@ def test_expval_observable():
6356
[qiskit_circ], "".join(obs), parallel=False
6457
)
6558

66-
operator = pauli_str_op_dict[obs[0]]
67-
for ob in obs[1:]:
68-
# note here the order is reversed because qiskit is in little endian
69-
operator = pauli_str_op_dict[ob] ^ operator
70-
psi = StateFn(qiskit_circ)
71-
psi_evaled = psi.eval()._primitive._data
59+
qiskit_observable_str = "".join(reversed(obs))
60+
operator = SparsePauliOp(qiskit_observable_str)
61+
psi = Statevector.from_instruction(qiskit_circ)
62+
psi_evaled = psi.data
7263
state_tq = switch_little_big_endian_state(
7364
qdev.get_states_1d().detach().numpy()
7465
)[0]
7566
assert np.allclose(psi_evaled, state_tq, atol=1e-5)
7667

77-
expval_qiskit = (~psi @ operator @ psi).eval().real
68+
expval_qiskit = psi.expectation_value(operator).real
7869
# print(expval_qiskit_processor, expval_qiskit)
7970
if (
8071
n_wires <= 3

torchquantum/plugin/qiskit/qiskit_processor.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@
3535
# Removed: from .my_job_monitor import my_job_monitor as job_monitor
3636
# Removed: from qiskit.providers.ibmq import IBMQ
3737
from qiskit_ibm_runtime import QiskitRuntimeService # Changed provider to runtime
38-
from qiskit_aer.primitives import SamplerV2 as AerSamplerV2 # Added
39-
from qiskit_ibm_runtime import SamplerV2 as RuntimeSamplerV2 # Changed provider to runtime
38+
# from qiskit_aer.primitives import SamplerV2 as AerSamplerV2 # Added
39+
from qiskit_aer.primitives import Sampler as AerSampler
40+
from qiskit_ibm_runtime import SamplerV2 as RuntimeSampler # Changed provider to runtime
4041
from qiskit.primitives.containers import PubResult # Added
4142
from qiskit.exceptions import QiskitError
4243
from .qiskit_plugin import (
@@ -183,8 +184,8 @@ def qiskit_init(self):
183184
try:
184185
self.service = QiskitRuntimeService(token=self.ibm_quantum_token, channel='ibm_quantum')
185186
self.backend = self.service.backend(self.backend_name)
186-
self.sampler = RuntimeSamplerV2(mode=self.backend)
187-
logger.info(f"Initialized QiskitRuntimeService and RuntimeSamplerV2 for backend: {self.backend_name}")
187+
self.sampler = RuntimeSampler(mode=self.backend)
188+
logger.info(f"Initialized QiskitRuntimeService and RuntimeSampler for backend: {self.backend_name}")
188189
except Exception as e:
189190
logger.error(f"Failed to initialize QiskitRuntimeService or get backend: {e}")
190191
raise
@@ -223,8 +224,8 @@ def qiskit_init(self):
223224
# Configure backend options for the sampler
224225
backend_opts = {"noise_model": self.noise_model} if self.noise_model else {}
225226
# Initialize Sampler with options
226-
self.sampler = AerSamplerV2(options={"backend_options": backend_opts}, seed=self.seed_simulator)
227-
logger.info(f"Initialized AerSamplerV2.{' With noise model.' if self.noise_model else ''}")
227+
self.sampler = AerSampler(options={"backend_options": backend_opts}, seed=self.seed_simulator)
228+
logger.info(f"Initialized AerSampler.{' With noise model.' if self.noise_model else ''}")
228229

229230
def set_layout(self, layout):
230231
self.initial_layout = layout
@@ -278,7 +279,7 @@ def process_ready_circs_get_counts(self, circs_all, parallel=True):
278279

279280
# Prepare run options
280281
run_options = {"shots": self.n_shots}
281-
if isinstance(self.sampler, AerSamplerV2):
282+
if isinstance(self.sampler, AerSampler):
282283
# Pass seed to constructor, not run options
283284
# run_options["seed"] = self.seed_simulator # Incorrect - seed is for constructor
284285
pass # Seed already set in constructor

0 commit comments

Comments
 (0)