Skip to content
This repository has been archived by the owner on Jul 24, 2024. It is now read-only.

Commit

Permalink
Merge 5cc1f5b into b51a86e
Browse files Browse the repository at this point in the history
  • Loading branch information
rathishcholarajan committed Apr 22, 2022
2 parents b51a86e + 5cc1f5b commit 9581a6a
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 39 deletions.
27 changes: 0 additions & 27 deletions qiskit_ibm_provider/ibm_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,11 @@
IBMBackendApiError,
IBMBackendApiProtocolError,
)
from .ibm_qubit_properties import IBMQubitProperties
from .job import IBMJob, IBMCircuitJob, IBMCompositeJob
from .utils import validate_job_tags
from .utils.backend import convert_reservation_data
from .utils.backend_converter import (
convert_to_target,
qubit_props_dict_from_props,
)
from .utils.converters import local_to_utc
from .utils.json_decoder import defaults_from_server_data, properties_from_server_data
Expand Down Expand Up @@ -214,7 +212,6 @@ def __init__(
self._api_client = api_client
self._configuration = configuration
self._properties = None
self._qubit_properties: Dict[int, IBMQubitProperties] = None
self._defaults = None
self._target = None
self._max_circuits = configuration.max_experiments
Expand Down Expand Up @@ -345,30 +342,6 @@ def target(self) -> Target:
self._convert_to_target()
return self._target

def qubit_properties(
self, qubit: Union[int, List[int]]
) -> Union[IBMQubitProperties, List[IBMQubitProperties]]:
"""Return IBMQubitProperties for a given qubit.
Args:
qubit: The qubit to get the
:class:`~qiskit_ibm_provider.IBMQubitProperties` object for. This can
be a single integer for 1 qubit or a list of qubits and a list
of :class:`~qiskit_ibm_provider.IBMQubitProperties` objects will be
returned in the same order
Returns:
IBMQubitProperties or a list of IBMQubitProperties
"""
self._get_properties()
if not self._qubit_properties:
self._qubit_properties = qubit_props_dict_from_props(self._properties)
if isinstance(qubit, int): # type: ignore[unreachable]
return self._qubit_properties.get(qubit)
if isinstance(qubit, List):
return [self._qubit_properties.get(q) for q in qubit]
return None

def run(
self,
circuits: Union[
Expand Down
29 changes: 18 additions & 11 deletions qiskit_ibm_provider/utils/backend_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

"""Converters for migration from IBM Quantum BackendV1 to BackendV2."""

from typing import Any, Dict
from typing import Any, Dict, List

from qiskit.transpiler.target import Target, InstructionProperties
from qiskit.utils.units import apply_prefix
Expand Down Expand Up @@ -47,9 +47,13 @@ def convert_to_target(
"reset": Reset(),
}
custom_gates = {}
target = Target(num_qubits=configuration.n_qubits)
target = None
# Parse from properties if it exsits
if properties is not None:
qubit_properties = qubit_props_list_from_props(properties=properties)
target = Target(
num_qubits=configuration.n_qubits, qubit_properties=qubit_properties
)
# Parse instructions
gates: Dict[str, Any] = {}
for gate in properties.gates:
Expand Down Expand Up @@ -86,6 +90,7 @@ def convert_to_target(
target.add_instruction(Measure(), measure_props)
# Parse from configuration because properties doesn't exist
else:
target = Target(num_qubits=configuration.n_qubits)
for gate in configuration.gates:
name = gate.name
gate_props = (
Expand Down Expand Up @@ -129,13 +134,13 @@ def convert_to_target(
return target


def qubit_props_dict_from_props(
def qubit_props_list_from_props(
properties: BackendProperties,
) -> Dict[int, IBMQubitProperties]:
) -> List[IBMQubitProperties]:
"""Uses BackendProperties to construct
and return IBMQubitProperties class.
and return a list of IBMQubitProperties.
"""
qubit_props = {}
qubit_props: List[IBMQubitProperties] = []
for qubit, _ in enumerate(properties.qubits):
t_1 = properties.t1(qubit) * 1e-6 # microseconds to seconds
t_2 = properties.t2(qubit) * 1e-6 # microseconds to seconds
Expand All @@ -146,10 +151,12 @@ def qubit_props_dict_from_props(
) # GHz to Hz
except Exception: # pylint: disable=broad-except
anharmonicity = None
qubit_props[qubit] = IBMQubitProperties( # type: ignore[no-untyped-call]
t1=t_1,
t2=t_2,
frequency=frequency,
anharmonicity=anharmonicity,
qubit_props.append(
IBMQubitProperties( # type: ignore[no-untyped-call]
t1=t_1,
t2=t_2,
frequency=frequency,
anharmonicity=anharmonicity,
)
)
return qubit_props
17 changes: 16 additions & 1 deletion test/integration/test_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from qiskit.test.reference_circuits import ReferenceCircuits

from qiskit_ibm_provider import IBMBackend, IBMProvider
from qiskit_ibm_provider.ibm_qubit_properties import IBMQubitProperties
from ..decorators import (
IntegrationTestDependencies,
integration_test_setup,
Expand All @@ -35,7 +36,7 @@ class TestIBMBackend(IBMTestCase):
"""Test ibm_backend module."""

@classmethod
@integration_test_setup_with_backend(simulator=False)
@integration_test_setup_with_backend(simulator=False, min_num_qubits=2)
def setUpClass(
cls, backend: IBMBackend, dependencies: IntegrationTestDependencies
) -> None:
Expand All @@ -54,6 +55,20 @@ def test_backend_properties(self):
"""Check the properties of calibration of a real chip."""
self.assertIsNotNone(self.backend.properties())

def test_backend_fetch_one_qubit_property(self):
"""Check retrieving properties of qubit 0"""
qubit_properties = self.backend.qubit_properties(0)
self.assertIsInstance(qubit_properties, IBMQubitProperties)

def test_backend_fetch_all_qubit_properties(self):
"""Check retrieving properties of all qubits"""
num_qubits = self.backend.num_qubits
qubits = list(range(num_qubits))
qubit_properties = self.backend.qubit_properties(qubits)
self.assertEqual(len(qubit_properties), num_qubits)
for i in qubits:
self.assertIsInstance(qubit_properties[i], IBMQubitProperties)

def test_backend_job_limit(self):
"""Check the backend job limits of a real backend."""
job_limit = self.backend.job_limit()
Expand Down

0 comments on commit 9581a6a

Please sign in to comment.