Skip to content

Commit c31c1f0

Browse files
committed
WIP implementing noise_model client-sided, as well as unit tests. Broken right now.
1 parent ec9cbb8 commit c31c1f0

File tree

5 files changed

+101
-3
lines changed

5 files changed

+101
-3
lines changed

qiskit_scaleway/backends/aer/backend.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def _default_options(self):
7171
shots=1000,
7272
memory=False,
7373
seed_simulator=None,
74+
noise_model=None,
7475
method="automatic",
7576
precision="double",
7677
max_shot_size=None,

qiskit_scaleway/backends/base_job.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ def submit(self, session_id: str) -> None:
8989
),
9090
)
9191

92+
if options.get("noise_model"):
93+
options["noise_model"] = options["noise_model"].to_dict(True)
94+
9295
backend_data = QaaSJobBackendData(
9396
name=self.backend().name,
9497
version=self.backend().version,

tests/test_aer_multiple_circuits.py

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import os
15+
from typing import Literal
1516
import numpy as np
1617
import random
18+
import dotenv
1719

1820
from qiskit import QuantumCircuit
1921
from qiskit_scaleway import ScalewayProvider
2022

23+
dotenv.load_dotenv()
24+
2125

2226
def _random_qiskit_circuit(size: int) -> QuantumCircuit:
2327
num_qubits = size
@@ -47,13 +51,14 @@ def _random_qiskit_circuit(size: int) -> QuantumCircuit:
4751

4852

4953
def test_aer_multiple_circuits():
54+
5055
provider = ScalewayProvider(
5156
project_id=os.environ["QISKIT_SCALEWAY_PROJECT_ID"],
5257
secret_key=os.environ["QISKIT_SCALEWAY_SECRET_KEY"],
5358
url=os.getenv("QISKIT_SCALEWAY_API_URL"),
5459
)
5560

56-
backend = provider.get_backend("aer_simulation_pop_c16m128")
61+
backend = provider.get_backend(os.getenv("QISKIT_SCALEWAY_BACKEND_NAME", "aer_simulation_pop_c16m128"))
5762

5863
assert backend is not None
5964

@@ -86,3 +91,92 @@ def test_aer_multiple_circuits():
8691
assert result.success
8792
finally:
8893
backend.delete_session(session_id)
94+
95+
96+
def _get_noise_model():
97+
import qiskit_aer.noise as noise
98+
99+
# Error probabilities
100+
prob_1 = 0.001 # 1-qubit gate
101+
prob_2 = 0.01 # 2-qubit gate
102+
103+
# Depolarizing quantum errors
104+
error_1 = noise.depolarizing_error(prob_1, 1)
105+
error_2 = noise.depolarizing_error(prob_2, 2)
106+
107+
# Add errors to noise model
108+
noise_model = noise.NoiseModel()
109+
noise_model.add_all_qubit_quantum_error(error_1, ['rz', 'sx', 'x'])
110+
noise_model.add_all_qubit_quantum_error(error_2, ['cx'])
111+
112+
return noise_model
113+
114+
115+
def _bell_state_circuit():
116+
qc = QuantumCircuit(2, 2)
117+
qc.h(0)
118+
qc.cx(0, 1)
119+
qc.measure_all()
120+
return qc
121+
122+
123+
def _simple_one_state_circuit(init_state: Literal["0", "1"] = "0"):
124+
qc = QuantumCircuit(1, 1)
125+
if init_state == "1":
126+
qc.x(0)
127+
qc.measure_all()
128+
return qc
129+
130+
131+
def test_aer_with_noise_model():
132+
133+
provider = ScalewayProvider(
134+
project_id=os.environ["QISKIT_SCALEWAY_PROJECT_ID"],
135+
secret_key=os.environ["QISKIT_SCALEWAY_SECRET_KEY"],
136+
url=os.getenv("QISKIT_SCALEWAY_API_URL"),
137+
)
138+
139+
backend = provider.get_backend(os.getenv("QISKIT_SCALEWAY_BACKEND_NAME", "aer_simulation_pop_c16m128"))
140+
141+
assert backend is not None
142+
143+
session_id = backend.start_session(
144+
name="my-aer-session-autotest",
145+
deduplication_id=f"my-aer-session-autotest-{random.randint(1, 1000)}",
146+
max_duration="15m",
147+
)
148+
149+
assert session_id is not None
150+
151+
try:
152+
qc1 = _bell_state_circuit()
153+
qc2 = _simple_one_state_circuit('0')
154+
qc3 = _simple_one_state_circuit('1')
155+
156+
run_ideal_result = backend.run(
157+
[qc1, qc2, qc3],
158+
shots=1000,
159+
max_parallel_experiments=0,
160+
session_id=session_id,
161+
).result()
162+
163+
run_noisy_result = backend.run(
164+
[qc1, qc2, qc3],
165+
shots=1000,
166+
max_parallel_experiments=0,
167+
session_id=session_id,
168+
noise_model=_get_noise_model()
169+
).result()
170+
171+
ideal_results = run_ideal_result.results
172+
noisy_results = run_noisy_result.results
173+
174+
assert len(ideal_results) == len(noisy_results) == 3
175+
176+
for i, ideal_result in enumerate(ideal_results):
177+
assert len(ideal_result.data.counts) < len(noisy_results[i].data.counts)
178+
finally:
179+
backend.delete_session(session_id)
180+
181+
182+
{'GJS_DEBUG_TOPICS': 'JS ERROR;JS LOG', 'LANGUAGE': 'en', 'USER': 'smagdela', 'LC_TIME': 'fr_FR.UTF-8', 'FONTCONFIG_PATH': '/etc/fonts', 'GIO_MODULE_DIR': '/home/smagdela/snap/code/common/.cache/gio-modules', 'XDG_SESSION_TYPE': 'wayland', 'GTK_EXE_PREFIX_VSCODE_SNAP_ORIG': '', 'GDK_BACKEND_VSCODE_SNAP_ORIG': '', 'SHLVL': '2', 'LESS': '-R', 'HOME': '/home/smagdela', 'LOCPATH_VSCODE_SNAP_ORIG': '', 'OLDPWD': '/home/smagdela/Documents/qiskit-scaleway', 'DESKTOP_SESSION': 'ubuntu', 'GTK_PATH': '/snap/code/205/usr/lib/x86_64-linux-gnu/gtk-3.0', 'NVM_BIN': '/home/smagdela/.nvm/versions/node/v24.7.0/bin', 'LSCOLORS': 'Gxfxcxdxbxegedabagacad', 'NVM_INC': '/home/smagdela/.nvm/versions/node/v24.7.0/include/node', 'ZSH': '/home/smagdela/.oh-my-zsh', 'XDG_DATA_HOME_VSCODE_SNAP_ORIG': '', 'GTK_IM_MODULE_FILE': '/home/smagdela/snap/code/common/.cache/immodules/immodules.cache', 'GNOME_SHELL_SESSION_MODE': 'ubuntu', 'GTK_MODULES': 'gail:atk-bridge', 'GSETTINGS_SCHEMA_DIR_VSCODE_SNAP_ORIG': '', 'PAGER': 'less', 'LC_MONETARY': 'fr_FR.UTF-8', 'MANAGERPID': '4094', 'SYSTEMD_EXEC_PID': '4472', 'GSM_SKIP_SSH_AGENT_WORKAROUND': 'true', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1000/bus', 'GIT_TOKEN': 'P-FDofUbEdSBTpPkuUGxJG86MQp1OjJ6dgk.01.0z159r3sl', 'COLORTERM': 'truecolor', 'NVM_DIR': '/home/smagdela/.nvm', 'WAYLAND_DISPLAY': 'wayland-0', 'LOGNAME': 'smagdela', 'JOURNAL_STREAM': '9:33927', 'XDG_CONFIG_DIRS_VSCODE_SNAP_ORIG': '', 'MEMORY_PRESSURE_WATCH': '/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/session.slice/org.gnome.Shell@wayland.service/memory.pressure', 'XDG_SESSION_CLASS': 'user', 'XDG_DATA_DIRS_VSCODE_SNAP_ORIG': '/usr/local/share/:/usr/share/:/var/lib/snapd/desktop', 'USERNAME': 'smagdela', 'TERM': 'xterm-256color', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'PATH': '/home/smagdela/Documents/qiskit-scaleway/.venv/bin:/home/smagdela/.nvm/versions/node/v24.7.0/bin:/home/smagdela/.local/bin:/home/smagdela/.local/share/gnome-shell/extensions/ddterm@amezin.github.com/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/smagdela/.vscode/extensions/ms-python.debugpy-2025.10.0-linux-x64/bundled/scripts/noConfigScripts', 'SESSION_MANAGER': 'local/smagdela-ThinkPad-T14s-Gen-4:@/tmp/.ICE-unix/4411,unix/smagdela-ThinkPad-T14s-Gen-4:/tmp/.ICE-unix/4411', 'GTK_EXE_PREFIX': '/snap/code/205/usr', 'INVOCATION_ID': '74ca5276f26f49b8bff19734f8ce64fb', 'PAPERSIZE': 'a4', 'XDG_MENU_PREFIX': 'gnome-', 'LC_ADDRESS': 'fr_FR.UTF-8', 'GNOME_SETUP_DISPLAY': ':1', 'XDG_RUNTIME_DIR': '/run/user/1000', 'GIT_USER': 'smagdelaine', 'DISPLAY': ':0', 'LOCPATH': '/snap/code/205/usr/lib/locale', 'LANG': 'en_US.UTF-8', 'XDG_CURRENT_DESKTOP': 'Unity', 'LC_TELEPHONE': 'fr_FR.UTF-8', 'GIO_MODULE_DIR_VSCODE_SNAP_ORIG': '', 'XDG_DATA_HOME': '/home/smagdela/snap/code/205/.local/share', 'XMODIFIERS': '@im=ibus', 'XDG_SESSION_DESKTOP': 'ubuntu', 'XAUTHORITY': '/run/user/1000/.mutter-Xwaylandauth.P6OWC3', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:', 'SSH_AUTH_SOCK': '/run/user/1000/keyring/ssh', 'GSETTINGS_SCHEMA_DIR': '/home/smagdela/snap/code/205/.local/share/glib-2.0/schemas', 'SHELL': '/usr/bin/zsh', 'LC_NAME': 'fr_FR.UTF-8', 'QT_ACCESSIBILITY': '1', 'GDMSESSION': 'ubuntu', 'GTK_PATH_VSCODE_SNAP_ORIG': '', 'FONTCONFIG_FILE': '/etc/fonts/fonts.conf', 'GTK_IM_MODULE_FILE_VSCODE_SNAP_ORIG': '', 'LC_MEASUREMENT': 'fr_FR.UTF-8', 'GJS_DEBUG_OUTPUT': 'stderr', 'LC_IDENTIFICATION': 'fr_FR.UTF-8', 'QT_IM_MODULE': 'ibus', 'PWD': '/home/smagdela/Documents/qiskit-scaleway/tests', 'NVM_CD_FLAGS': '-q', 'XDG_DATA_DIRS': '/home/smagdela/snap/code/205/.local/share:/home/smagdela/snap/code/205:/snap/code/205/usr/share:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop', 'LC_NUMERIC': 'fr_FR.UTF-8', 'LC_PAPER': 'fr_FR.UTF-8', 'MEMORY_PRESSURE_WRITE': 'c29tZSAyMDAwMDAgMjAwMDAwMAA=', 'VTE_VERSION': '7800', 'CHROME_DESKTOP': 'code.desktop', 'ORIGINAL_XDG_CURRENT_DESKTOP': 'ubuntu:GNOME', 'GDK_BACKEND': 'x11', 'TERM_PROGRAM': 'vscode', 'TERM_PROGRAM_VERSION': '1.103.2', 'PYDEVD_DISABLE_FILE_VALIDATION': '1', 'VSCODE_DEBUGPY_ADAPTER_ENDPOINTS': '/home/smagdela/.vscode/extensions/ms-python.debugpy-2025.10.0-linux-x64/.noConfigDebugAdapterEndpoints/endpoint-6061cecf75d47dd9.txt', 'BUNDLED_DEBUGPY_PATH': '/home/smagdela/.vscode/extensions/ms-python.debugpy-2025.10.0-linux-x64/bundled/libs/debugpy', 'GIT_ASKPASS': '/snap/code/205/usr/share/code/resources/app/extensions/git/dist/askpass.sh', 'VSCODE_GIT_ASKPASS_NODE': '/snap/code/205/usr/share/code/code', 'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '', 'VSCODE_GIT_ASKPASS_MAIN': '/snap/code/205/usr/share/code/resources/app/extensions/git/dist/askpass-main.js', 'VSCODE_GIT_IPC_HANDLE': '/run/user/1000/vscode-git-2ba3223998.sock', 'VSCODE_INJECTION': '1', 'ZDOTDIR': '/home/smagdela', 'USER_ZDOTDIR': '/home/smagdela', 'VIRTUAL_ENV': '/home/smagdela/Documents/qiskit-scaleway/.venv', 'PS1': '(.venv) %(?:%{\x1b[01;32m%}%1{➜%} :%{\x1b[01;31m%}%1{➜%} ) %{\x1b[36m%}%c%{\x1b[00m%} $(git_prompt_info)', 'VIRTUAL_ENV_PROMPT': '(.venv) ', '_': '/home/smagdela/Documents/qiskit-scaleway/.venv/bin/pytest', 'PYTEST_VERSION': '8.4.2', 'QISKIT_IN_PARALLEL': 'FALSE', 'PYTEST_CURRENT_TEST': 'tests/test_aer_multiple_circuits.py::test_aer_multiple_circuits (call)', 'QISKIT_SCALEWAY_BACKEND_NAME': 'aer_simulation_local'}

tests/test_estimator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_estimator():
3232
url=os.getenv("QISKIT_SCALEWAY_API_URL"),
3333
)
3434

35-
backend = provider.get_backend("aer_simulation_pop_c16m128")
35+
backend = provider.get_backend(os.getenv("QISKIT_SCALEWAY_BACKEND_NAME", "aer_simulation_pop_c16m128"))
3636

3737
assert backend is not None
3838

tests/test_sampler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_sampler():
3030
url=os.getenv("QISKIT_SCALEWAY_API_URL"),
3131
)
3232

33-
backend = provider.get_backend("aer_simulation_pop_c16m128")
33+
backend = provider.get_backend(os.getenv("QISKIT_SCALEWAY_BACKEND_NAME", "aer_simulation_pop_c16m128"))
3434

3535
assert backend is not None
3636

0 commit comments

Comments
 (0)