Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
66ecf25
Add backend converter script from Matthew
HuangJunye Feb 9, 2022
9a9ef3e
FakeBackendV2, FakeQasmBeckendV2, FakeJakartaV2 in progress
HuangJunye Feb 9, 2022
61069f1
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Feb 9, 2022
6046706
Temporary fix for circular import
HuangJunye Feb 10, 2022
667d039
First try of implementing FakeJakartaV2 based on FakeQasmBackendV2/Fa…
HuangJunye Feb 10, 2022
c04bf29
Implement FakeQasmBackend methods into FakeBackendV2
HuangJunye Feb 14, 2022
fa7ebd9
Implement FakePulseBackend methods into FakeBackendV2
HuangJunye Feb 14, 2022
619e5de
Import missing PulseDefaults and adjust _get_conf_from_json method po…
HuangJunye Feb 14, 2022
df20b0f
Adjust _get_config_from_dict method position
HuangJunye Feb 14, 2022
9480d76
Fix target property
HuangJunye Feb 14, 2022
b1c422e
Fix _default_options method
HuangJunye Feb 14, 2022
d75e3c0
Add FakeProviderV2 for V2 fake backends
HuangJunye Feb 14, 2022
d48bf0a
Remove FakeQasmBackendV2 class
HuangJunye Feb 15, 2022
77dd9e2
Copy run method from FakeBackendV1
HuangJunye Feb 15, 2022
806cdd3
change configuration to self._configuration
HuangJunye Feb 17, 2022
2438935
Update backend_converter.py
HuangJunye Feb 18, 2022
eec4a49
@rathishcholarajan Use BackendConfiguration, BackendProperties and P…
HuangJunye Feb 18, 2022
12ed0a4
Add dtm
HuangJunye Feb 18, 2022
842a18a
Add qubit properties
HuangJunye Feb 18, 2022
1b73006
Add drive, measure and acquire channels.
HuangJunye Feb 22, 2022
f75c24e
Fix test_fake_backends
HuangJunye Feb 22, 2022
ccc5a9f
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Feb 22, 2022
ba29e4e
Fix ConfigurableFakeBackend circular import problem
HuangJunye Feb 22, 2022
7fddb5e
Fix configurable_backend circular import problem
HuangJunye Feb 22, 2022
774caf9
FakeAlmadenV2
HuangJunye Feb 23, 2022
896b93a
FakeArmonkV2
HuangJunye Feb 23, 2022
fbf9007
FakeAthensV2
HuangJunye Feb 23, 2022
8cef341
FakeBelemV2
HuangJunye Feb 23, 2022
fafe038
FakeBoeblingenV2
HuangJunye Feb 23, 2022
19bf018
Add fake backends (except rueschlikon, tenerife and tokyo)
HuangJunye Feb 24, 2022
b5aa3a0
import fake v2 backends in __init__.py
HuangJunye Feb 24, 2022
18d2074
add fake backends to mock.backend.__init__ and fake provider
HuangJunye Feb 24, 2022
62aeb08
Fix typos
HuangJunye Feb 24, 2022
0d781e5
Add defs files to manila, poughkeepsie, rome and santiago
HuangJunye Feb 24, 2022
a02abb9
Fix FakeCambridgeV2
HuangJunye Feb 24, 2022
ccf6a55
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Feb 24, 2022
ac3c237
Add Hanoi and Kolkata to FakeProviderV2
HuangJunye Feb 28, 2022
59ceb3e
Handle no pulse backends in V2
HuangJunye Feb 28, 2022
fd31f13
Fix getting qubit properties from properties bug
HuangJunye Mar 1, 2022
4a35e5d
Fix _parse_inst_map for BackendV2 with no pulse support
HuangJunye Mar 2, 2022
61609e6
Revert "Update backend_converter.py"
HuangJunye Mar 3, 2022
3a2421a
Revert " @rathishcholarajan Use BackendConfiguration, BackendProperti…
HuangJunye Mar 3, 2022
a5d4462
Use dicts instead of conf, props, defs objects
HuangJunye Mar 3, 2022
023b459
remove channels
HuangJunye Mar 3, 2022
8571e84
add type hints
HuangJunye Mar 3, 2022
54cead1
Use dict.get instead of brackets
HuangJunye Mar 3, 2022
a814fa7
clean up backend_converter.py
HuangJunye Mar 3, 2022
72df114
construct target using defs files if it exist
HuangJunye Mar 3, 2022
fcedd6b
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 4, 2022
f01e8db
Fix typo in target.acquire_alignment
HuangJunye Mar 4, 2022
fa4f142
Handle BackendV2 in transpiler._parse_inst_map
HuangJunye Mar 4, 2022
2127b34
Comment out backends in fake provider and Aer run method for testing
HuangJunye Mar 4, 2022
e80abda
undo typo fix for target.acquire_alignment
HuangJunye Mar 7, 2022
6e7875f
Revert "Comment out backends in fake provider and Aer run method for …
HuangJunye Mar 7, 2022
2fe67a2
Copy NoiseModel.from_backend() method from Aer
HuangJunye Mar 7, 2022
a29d58e
modify NoiseModel.from_backend method to support V2 backend
HuangJunye Mar 7, 2022
8927092
Build V2 backend noise model from self._props_dict
HuangJunye Mar 7, 2022
308d22a
black reformatting
HuangJunye Mar 8, 2022
58c69dd
Move V2 backend code to above V1 and Legacy
HuangJunye Mar 8, 2022
a5585ff
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 8, 2022
9ed2016
Clean up FakeBackendV2 for testing
HuangJunye Mar 8, 2022
754d12b
Merge branch 'add-v2-mocked-backend-7391' of https://github.com/Huang…
HuangJunye Mar 8, 2022
33a53a6
Order FakeBackendV2 to match BackendV2
HuangJunye Mar 8, 2022
b4107c7
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 10, 2022
ab22b2b
Merge branch 'add-v2-mocked-backend-7391' of https://github.com/Huang…
HuangJunye Mar 10, 2022
474e529
Uncomment out fake backends from fake provider v1 and fake legacy pro…
HuangJunye Mar 10, 2022
8bab11e
Remove unused imports
HuangJunye Mar 11, 2022
0d1ddcd
Remove FakeTokyoV2 import
HuangJunye Mar 11, 2022
2d45c2b
Remove warnings for missing conf, props and defs files
HuangJunye Mar 11, 2022
a11f462
Remove lazy loading of target
HuangJunye Mar 11, 2022
9c68b8a
Remove lazy loading of qubit properties
HuangJunye Mar 11, 2022
b4747fa
Remove deprecation warning for standard_gates option in noise model
HuangJunye Mar 11, 2022
21e567e
linting for fake_backend.py
HuangJunye Mar 11, 2022
f077a6a
linting for backend_converter.py
HuangJunye Mar 11, 2022
735c6d3
fix `Redefining name 'warnings' from outer scope` error
HuangJunye Mar 14, 2022
90036fb
lint: rename qubit_props_dict_from_props_dict
HuangJunye Mar 14, 2022
29a7386
Raise error for pulse simulation
HuangJunye Mar 14, 2022
6047a5d
remove warnings flag
HuangJunye Mar 15, 2022
6cdaecd
Move V2 to in front of V1
HuangJunye Mar 15, 2022
87fb07b
revert changes in transpiler._parse_inst_map
HuangJunye Mar 15, 2022
3a04830
remove warnings flag
HuangJunye Mar 15, 2022
9d23877
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 15, 2022
7d027c8
fix 'no-else-raise' error
HuangJunye Mar 16, 2022
8551086
Add docstring to FakeBackendV2
HuangJunye Mar 16, 2022
48ca29f
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 16, 2022
50c12ac
rename `kwargs` to `options` in .run method
HuangJunye Mar 16, 2022
be27c4d
Update qiskit/test/mock/fake_backend.py
HuangJunye Mar 17, 2022
a418755
Update qiskit/test/mock/fake_backend.py
HuangJunye Mar 17, 2022
a749dda
Update qiskit/test/mock/fake_backend.py
HuangJunye Mar 17, 2022
68fef20
rearrange raising error for pulse job
HuangJunye Mar 17, 2022
164c889
Merge branch 'add-v2-mocked-backend-7391' of https://github.com/Huang…
HuangJunye Mar 17, 2022
bbf53f2
Add a TODO comment for removing PulseDefaults
HuangJunye Mar 17, 2022
965452f
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 17, 2022
764bb05
fix typo
HuangJunye Mar 17, 2022
dcb8a55
black reformat
HuangJunye Mar 17, 2022
67abfcc
Add release note.
HuangJunye Mar 17, 2022
90c8520
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 21, 2022
ce51f51
Fix no else raise error
HuangJunye Mar 29, 2022
caab6ea
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 29, 2022
8f4cb20
Add blank new line in release note
HuangJunye Mar 29, 2022
4838fbe
black formatting
HuangJunye Mar 29, 2022
40e6aa0
fix release note missing black tick
HuangJunye Mar 29, 2022
7800472
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 30, 2022
b5d6144
Rename FakeProviderV2 to FakeProviderForBackendV2
HuangJunye Mar 30, 2022
62402c3
Re-export FakeProviderForBackendV2 to qiskit.providers.fake_provider
HuangJunye Mar 30, 2022
088c128
Merge branch 'main' into add-v2-mocked-backend-7391
HuangJunye Mar 30, 2022
ed0417a
black reformatting
HuangJunye Mar 30, 2022
032c530
Merge branch 'add-v2-mocked-backend-7391' of https://github.com/Huang…
HuangJunye Mar 30, 2022
f94452d
Merge branch 'main' into add-v2-mocked-backend-7391
mergify[bot] Mar 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion qiskit/test/mock/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
The mock devices are mainly for testing the compiler.
"""

from .fake_provider import FakeProvider, FakeLegacyProvider
from .fake_provider import FakeProvider, FakeLegacyProvider, FakeProviderV2
from .fake_provider import FakeProviderFactory
from .fake_backend import FakeBackend, FakeLegacyBackend
from .fake_backend_v2 import FakeBackendV2, FakeBackend5QV2
Expand Down
2 changes: 1 addition & 1 deletion qiskit/test/mock/backends/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from .essex import FakeEssex
from .guadalupe import FakeGuadalupe
from .hanoi import FakeHanoi
from .jakarta import FakeJakarta
from .jakarta import FakeJakarta, FakeJakartaV2
from .johannesburg import FakeJohannesburg
from .kolkata import FakeKolkata
from .lagos import FakeLagos
Expand Down
2 changes: 1 addition & 1 deletion qiskit/test/mock/backends/jakarta/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@

"""Mock jakarta backend"""

from .fake_jakarta import FakeJakarta
from .fake_jakarta import FakeJakarta, FakeJakartaV2
10 changes: 9 additions & 1 deletion qiskit/test/mock/backends/jakarta/fake_jakarta.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"""

import os
from qiskit.test.mock import fake_pulse_backend
from qiskit.test.mock import fake_pulse_backend, fake_backend


class FakeJakarta(fake_pulse_backend.FakePulseBackend):
Expand All @@ -26,3 +26,11 @@ class FakeJakarta(fake_pulse_backend.FakePulseBackend):
props_filename = "props_jakarta.json"
defs_filename = "defs_jakarta.json"
backend_name = "fake_jakarta"

class FakeJakartaV2(fake_backend.FakeBackendV2):
"""A fake 7 qubit V2 backend."""
dirname = os.path.dirname(__file__)
conf_filename = "conf_jakarta.json"
props_filename = "props_jakarta.json"
defs_filename = "defs_jakarta.json"
backend_name = "fake_jakarta_v2"
229 changes: 227 additions & 2 deletions qiskit/test/mock/fake_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,35 @@

import uuid
import warnings
import json
import os

from typing import Iterable, List, Union

from qiskit import circuit
from qiskit.providers.models import BackendProperties
from qiskit.providers import BackendV1, BaseBackend
from qiskit.providers.models import BackendProperties, PulseBackendConfiguration, PulseDefaults
from qiskit.providers import BackendV1, BackendV2, BaseBackend, QubitProperties
from qiskit.providers.options import Options
from qiskit import pulse
from qiskit.pulse.channels import (
AcquireChannel,
ControlChannel,
DriveChannel,
MeasureChannel,
)
from qiskit.circuit.parameter import Parameter
from qiskit.transpiler import Target, InstructionProperties
from qiskit.exceptions import QiskitError
from qiskit.test.mock import fake_job
from qiskit.test.mock.utils.json_decoder import (
decode_backend_configuration,
decode_backend_properties,
decode_pulse_defaults
)
from qiskit.test.mock.utils.backend_converter import (
convert_to_target,
qubit_props_dict_from_props
)
from qiskit.utils import optionals as _optionals
from qiskit.providers import basicaer

Expand Down Expand Up @@ -256,3 +278,206 @@ def run_job():
out_job = fake_job.FakeLegacyJob(self, job_id, run_job)
out_job.submit()
return out_job

class FakeBackendV2(BackendV2):
"""This is a dummy bakend just for resting purposes. the FakeBackendV2 builds on top of the BackendV2 base class."""

def __init__(self):
self._configuration = self._get_conf_from_json()
super().__init__(
provider=None,
name=self._configuration.backend_name,
description=self._configuration.description,
online_date=self._configuration.online_date,
backend_version=self._configuration.backend_version
)
self._properties = None
self._qubit_properties = None
self._defaults = None
self._target = None

def properties(self):
"""Returns a snapshot of device properties"""
if not self._properties:
self._set_props_from_json()
return self._properties

def defaults(self):
"""Returns a snapshot of device defaults"""
if not self._defaults:
self._set_defaults_from_json()
return self._defaults

def _get_conf_from_json(self):
if not self.conf_filename:
raise QiskitError("No configuration file has been defined")
conf = self._load_json(self.conf_filename)
decode_backend_configuration(conf)
configuration = self._get_config_from_dict(conf)
configuration.backend_name = self.backend_name
return configuration

def _get_config_from_dict(self, conf):
return PulseBackendConfiguration.from_dict(conf)

def _set_props_from_json(self):
if not self.props_filename:
raise QiskitError("No properties file has been defined")
props = self._load_json(self.props_filename)
decode_backend_properties(props)
self._properties = BackendProperties.from_dict(props)

def _set_defaults_from_json(self):
if not self.props_filename:
raise QiskitError("No properties file has been defined")
defs = self._load_json(self.defs_filename)
decode_pulse_defaults(defs)
self._defaults = PulseDefaults.from_dict(defs)

def _load_json(self, filename):
with open(os.path.join(self.dirname, filename)) as f_json:
the_json = json.load(f_json)
return the_json

@property
def dtm(self) -> float:
"""Return the system time resolution of output signals
Returns:
dtm: The output signal timestep in seconds.
"""
return self._configuration.dtm

@property
def meas_map(self) -> List[List[int]]:
"""Return the grouping of measurements which are multiplexed
This is required to be implemented if the backend supports Pulse
scheduling.
Returns:
meas_map: The grouping of measurements which are multiplexed
"""
return self._configuration.meas_map

def qubit_properties(
self, qubit: Union[int, List[int]]
) -> Union[QubitProperties, List[QubitProperties]]:
"""Return QubitProperties for a given qubit.
Args:
qubit: The qubit to get the
:class:`~qiskit.provider.QubitProperties` object for. This can
be a single integer for 1 qubit or a list of qubits and a list
of :class:`~qiskit.provider.QubitProperties` objects will be
returned in the same order
"""
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

@property
def target(self) -> Target:
self._convert_to_target()
return self._target

def _convert_to_target(self) -> None:
"""Converts backend configuration, properties and defaults to Target object"""
if not self._target:
self._target = convert_to_target(
configuration=self._configuration,
properties=self._properties,
defaults=self._defaults,
)

@property
def max_circuits(self):
return None

@classmethod
def _default_options(cls):
if _optionals.HAS_AER:
from qiskit.providers import aer

return aer.QasmSimulator._default_options()
else:
return basicaer.QasmSimulatorPy._default_options()

def run(self, run_input, **kwargs):
"""Main job in simulator"""
circuits = run_input
pulse_job = None
if isinstance(circuits, (pulse.Schedule, pulse.ScheduleBlock)):
pulse_job = True
elif isinstance(circuits, circuit.QuantumCircuit):
pulse_job = False
elif isinstance(circuits, list):
if circuits:
if all(isinstance(x, (pulse.Schedule, pulse.ScheduleBlock)) for x in circuits):
pulse_job = True
elif all(isinstance(x, circuit.QuantumCircuit) for x in circuits):
pulse_job = False
if pulse_job is None:
raise QiskitError(
"Invalid input object %s, must be either a "
"QuantumCircuit, Schedule, or a list of either" % circuits
)
if _optionals.HAS_AER:
from qiskit.providers import aer

if pulse_job:
from qiskit.providers.aer.pulse import PulseSystemModel

system_model = PulseSystemModel.from_backend(self)
sim = aer.Aer.get_backend("pulse_simulator")
job = sim.run(circuits, system_model=system_model, **kwargs)
else:
sim = aer.Aer.get_backend("qasm_simulator")
if self.properties():
from qiskit.providers.aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(self, warnings=False)
job = sim.run(circuits, noise_model=noise_model, **kwargs)
else:
job = sim.run(circuits, **kwargs)
else:
if pulse_job:
raise QiskitError("Unable to run pulse schedules without qiskit-aer installed")
warnings.warn("Aer not found using BasicAer and no noise", RuntimeWarning)
sim = basicaer.BasicAer.get_backend("qasm_simulator")
job = sim.run(circuits, **kwargs)
return job

def drive_channel(self, qubit: int) -> DriveChannel:
"""Return the drive channel for the given qubit.
Returns:
DriveChannel: The Qubit drive channel
"""
return self._configuration.drive(qubit=qubit)

def measure_channel(self, qubit: int) -> MeasureChannel:
"""Return the measure stimulus channel for the given qubit.
Returns:
MeasureChannel: The Qubit measurement stimulus line
"""
return self._configuration.measure(qubit=qubit)

def acquire_channel(self, qubit: int) -> AcquireChannel:
"""Return the acquisition channel for the given qubit.
Returns:
AcquireChannel: The Qubit measurement acquisition line.
"""
return self._configuration.acquire(qubit=qubit)

def control_channel(self, qubits: Iterable[int]) -> List[ControlChannel]:
"""Return the secondary drive channel for the given qubit
This is typically utilized for controlling multiqubit interactions.
This channel is derived from other channels.
Args:
qubits: Tuple or list of qubits of the form
``(control_qubit, target_qubit)``.
Returns:
List[ControlChannel]: The Qubit measurement acquisition line.
"""
return self._configuration.control(qubits=qubits)

70 changes: 70 additions & 0 deletions qiskit/test/mock/fake_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,73 @@ def __init__(self):
]

super().__init__()

class FakeProviderV2(ProviderV1):
"""Dummy provider just for testing purposes.

Only filtering backends by name is implemented.
This class contains fake V2 backends
"""

def get_backend(self, name=None, **kwargs):
backend = self._backends[0]
if name:
filtered_backends = [backend for backend in self._backends if backend.name() == name]
if not filtered_backends:
raise QiskitBackendNotFoundError()

backend = filtered_backends[0]

return backend

def backends(self, name=None, **kwargs):
return self._backends

def __init__(self):
self._backends = [
# FakeAlmaden(),
# FakeArmonk(),
# FakeAthens(),
# FakeBelem(),
# FakeBoeblingen(),
# FakeBogota(),
# FakeBrooklyn(),
# FakeBurlington(),
# FakeCambridge(),
# FakeCambridgeAlternativeBasis(),
# FakeCasablanca(),
# FakeEssex(),
# FakeGuadalupe(),
FakeJakartaV2(),
# FakeJohannesburg(),
# FakeLagos(),
# FakeLima(),
# FakeLondon(),
# FakeManila(),
# FakeManhattan(),
# FakeMelbourne(),
# FakeMontreal(),
# FakeMumbai(),
# FakeOpenPulse2Q(),
# FakeOpenPulse3Q(),
# FakeOurense(),
# FakeParis(),
# FakePoughkeepsie(),
# FakeQasmSimulator(),
# FakeQuito(),
# FakeRochester(),
# FakeRome(),
# FakeRueschlikon(),
# FakeSantiago(),
# FakeSingapore(),
# FakeSydney(),
# FakeTenerife(),
# FakeTokyo(),
# FakeToronto(),
# FakeValencia(),
# FakeVigo(),
# FakeYorktown(),
]

super().__init__()

2 changes: 1 addition & 1 deletion qiskit/test/mock/fake_qasm_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import os

from qiskit.providers.models import BackendProperties, QasmBackendConfiguration
from qiskit.test.mock.fake_backend import FakeBackend, FakeLegacyBackend
from qiskit.test.mock.fake_backend import FakeBackend, FakeBackendV2, FakeLegacyBackend
from qiskit.test.mock.utils.json_decoder import (
decode_backend_configuration,
decode_backend_properties,
Expand Down
2 changes: 1 addition & 1 deletion qiskit/test/mock/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
Utils for test backends.
"""

from .configurable_backend import ConfigurableFakeBackend
# from .configurable_backend import ConfigurableFakeBackend
Comment thread
HuangJunye marked this conversation as resolved.
Outdated
Loading