From 20beefd1ed61c13d59be5fc0c89b30e25b4f9c2c Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Tue, 10 Feb 2026 14:36:10 -0800 Subject: [PATCH] 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