From aa45d6eaabe42a1e3b42bb57acbe48fc76b5f29d Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Tue, 10 Feb 2026 14:36:10 -0800 Subject: [PATCH 1/3] Support Helios in Quantinuum target and backends --- .../quantum/qiskit/backends/quantinuum.py | 22 ++++++++++++++++--- .../azure/quantum/target/quantinuum.py | 12 ++++++++-- azure-quantum/requirements-qsharp.txt | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py b/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py index a08d67945..d7950055c 100644 --- a/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py +++ b/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py @@ -63,6 +63,8 @@ def _get_n_qubits(name): name = name.lower() if ".h2-" in name: return 56 + if ".helios-" in name: + return 98 warnings.warn( UserWarning(f"Number of qubits not known for target {name}. Defaulting to 20.")) return 20 @@ -101,12 +103,18 @@ def _azure_config(self) -> Dict[str, str]: def _get_n_qubits(self, name): return _get_n_qubits(name) + def _get_default_target_profile(self, name): + if ".h2-" in name: + return TargetProfile.Adaptive_RI + else: + return TargetProfile.Adaptive_RIF class QuantinuumSyntaxCheckerQirBackend(QuantinuumQirBackendBase): backend_names = ( # Note: Target names on the same line are equivalent. "quantinuum.sim.h2-1sc", - "quantinuum.sim.h2-2sc" + "quantinuum.sim.h2-2sc", + "quantinuum.sim.helios-1sc", ) def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): @@ -137,6 +145,8 @@ def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): logger.info( "Initializing %sSyntaxCheckerQirBackend", self._provider_name ) + if "target_profile" not in kwargs: + kwargs["target_profile"] = self._get_default_target_profile(name) super().__init__(configuration=configuration, provider=provider, **kwargs) @@ -144,7 +154,8 @@ class QuantinuumEmulatorQirBackend(QuantinuumQirBackendBase): backend_names = ( # Note: Target names on the same line are equivalent. "quantinuum.sim.h2-1e", - "quantinuum.sim.h2-2e" + "quantinuum.sim.h2-2e", + "quantinuum.sim.helios-1e", ) def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): @@ -175,6 +186,8 @@ def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): logger.info( "Initializing %sEmulatorQirBackend", self._provider_name ) + if "target_profile" not in kwargs: + kwargs["target_profile"] = self._get_default_target_profile(name) super().__init__(configuration=configuration, provider=provider, **kwargs) @@ -182,7 +195,8 @@ class QuantinuumQPUQirBackend(QuantinuumQirBackendBase): backend_names = ( # Note: Target names on the same line are equivalent. "quantinuum.qpu.h2-1", - "quantinuum.qpu.h2-2" + "quantinuum.qpu.h2-2", + "quantinuum.qpu.helios-1", ) def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): @@ -211,6 +225,8 @@ def __init__(self, name: str, provider: "AzureQuantumProvider", **kwargs): kwargs.pop("configuration", default_config) ) logger.info("Initializing %sQPUQirBackend", self._provider_name) + if "target_profile" not in kwargs: + kwargs["target_profile"] = self._get_default_target_profile(name) super().__init__(configuration=configuration, provider=provider, **kwargs) diff --git a/azure-quantum/azure/quantum/target/quantinuum.py b/azure-quantum/azure/quantum/target/quantinuum.py index 9be7b46e0..d3419d413 100644 --- a/azure-quantum/azure/quantum/target/quantinuum.py +++ b/azure-quantum/azure/quantum/target/quantinuum.py @@ -2,7 +2,7 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. ## -from typing import Any, Dict, Union +from typing import Any, Dict, Union, Optional from warnings import warn from azure.quantum.job.job import Job @@ -20,6 +20,9 @@ class Quantinuum(Target): "quantinuum.qpu.h2-2", "quantinuum.sim.h2-2sc", "quantinuum.sim.h2-2e", + "quantinuum.qpu.helios-1", + "quantinuum.sim.helios-1sc", + "quantinuum.sim.helios-1e", ) _SHOTS_PARAM_NAME = "shots" @@ -34,12 +37,17 @@ def __init__( provider_id: str = "quantinuum", content_type: str = "application/qasm", encoding: str = "", - target_profile: Union[str, "TargetProfile"] = "Adaptive_RI", + target_profile: Optional[Union[str, "TargetProfile"]] = None, **kwargs ): if capability: msg = "The 'capability' parameter is not used for the Quantinuum target." warn(msg, DeprecationWarning) + if target_profile is None: + if ".h2-" in name: + target_profile = "Adaptive_RI" + else: + target_profile = "Adaptive_RIF" super().__init__( workspace=workspace, name=name, diff --git a/azure-quantum/requirements-qsharp.txt b/azure-quantum/requirements-qsharp.txt index ae0190598..bd2cf2777 100644 --- a/azure-quantum/requirements-qsharp.txt +++ b/azure-quantum/requirements-qsharp.txt @@ -1 +1 @@ -qsharp>=1.0.33,<2.0 \ No newline at end of file +qsharp>=1.26.0,<2.0 \ No newline at end of file From fddb543a10b4af798f3b499729a4d294666d4965 Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Mon, 23 Feb 2026 09:41:56 -0800 Subject: [PATCH 2/3] revert version requirement change --- azure-quantum/requirements-qsharp.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-quantum/requirements-qsharp.txt b/azure-quantum/requirements-qsharp.txt index bd2cf2777..ae0190598 100644 --- a/azure-quantum/requirements-qsharp.txt +++ b/azure-quantum/requirements-qsharp.txt @@ -1 +1 @@ -qsharp>=1.26.0,<2.0 \ No newline at end of file +qsharp>=1.0.33,<2.0 \ No newline at end of file From c56e2c996bf32377b8c78f3847c56e788eb10d2f Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Mon, 23 Feb 2026 11:24:01 -0800 Subject: [PATCH 3/3] Shim `Options` for Quantinuum for backward compatibility --- .../azure/quantum/qiskit/backends/quantinuum.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py b/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py index d7950055c..c70d2825f 100644 --- a/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py +++ b/azure-quantum/azure/quantum/qiskit/backends/quantinuum.py @@ -84,12 +84,19 @@ def __init__( @classmethod def _default_options(cls) -> Options: - return Options( + opt = Options( **{ cls._SHOTS_PARAM_NAME: _DEFAULT_SHOTS_COUNT }, target_profile=TargetProfile.Adaptive_RI, ) + # Duplicate the options into a dict under "data" for compatibility with Qiskit 1.0, which expects this field + opt.__setattr__("data", {}) + for key in opt: + opt.data[key] = getattr(opt, key) + # Likewise, map "update_config" to "update_options" for compatibility with Qiskit 1.0 + opt.__setattr__("update_config", lambda **kwargs: opt.update_options(**kwargs)) + return opt def _azure_config(self) -> Dict[str, str]: config = super()._azure_config()