Update qiskit-ibm-provider to 0.7.1 (#202)

This was generated by running the script `updateApiDocs.ts`. No changes
were made.

Co-authored-by: abbycross <across@us.ibm.com>
This commit is contained in:
Eric Arellano 2023-10-19 08:30:35 -04:00 committed by GitHub
parent 2e2ffa4fb1
commit 4252c56a91
17 changed files with 270 additions and 106 deletions

View File

@ -1,6 +1,6 @@
{
"title": "Qiskit IBM Provider",
"subtitle": "v0.6.3",
"subtitle": "v0.7.1",
"children": [
{
"title": "qiskit_ibm_provider",
@ -57,6 +57,10 @@
"title": "qiskit_ibm_provider.jupyter",
"url": "/api/qiskit-ibm-provider/ibm_jupyter"
},
{
"title": "Session",
"url": "/api/qiskit-ibm-provider/qiskit_ibm_provider.Session"
},
{
"title": "qiskit_ibm_provider.job",
"children": [

View File

@ -49,6 +49,7 @@ logging.getLogger('qiskit_ibm_provider').setLevel(logging.WARNING)
| [`IBMProvider`](qiskit_ibm_provider.IBMProvider "qiskit_ibm_provider.IBMProvider")(\[token, url, name, instance, ...]) | Provides access to the IBM Quantum services available to an account. |
| [`IBMBackend`](qiskit_ibm_provider.IBMBackend "qiskit_ibm_provider.IBMBackend")(configuration, provider, api\_client) | Backend class interfacing with an IBM Quantum device. |
| [`IBMBackendService`](qiskit_ibm_provider.IBMBackendService "qiskit_ibm_provider.IBMBackendService")(provider, hgp) | Backend namespace for an IBM Quantum account. |
| [`Session`](qiskit_ibm_provider.Session "qiskit_ibm_provider.Session")(\[max\_time]) | Class for creating a flexible Qiskit Runtime session. |
## Exceptions

View File

@ -14,7 +14,7 @@ python_api_name: qiskit_ibm_provider.IBMBackend
Backend class interfacing with an IBM Quantum device.
You can run experiments on a backend using the [`run()`](qiskit_ibm_provider.IBMBackend#run "qiskit_ibm_provider.IBMBackend.run") method. The [`run()`](qiskit_ibm_provider.IBMBackend#run "qiskit_ibm_provider.IBMBackend.run") method takes one or more `QuantumCircuit` and returns an `IBMJob` instance that represents the submitted job. Each job has a unique job ID, which can later be used to retrieve the job. An example of this flow:
You can run experiments on a backend using the [`run()`](qiskit_ibm_provider.IBMBackend#run "qiskit_ibm_provider.IBMBackend.run") method. The [`run()`](qiskit_ibm_provider.IBMBackend#run "qiskit_ibm_provider.IBMBackend.run") method takes one or more [`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)") and returns an `IBMJob` instance that represents the submitted job. Each job has a unique job ID, which can later be used to retrieve the job. An example of this flow:
```python
from qiskit import transpile
@ -34,7 +34,7 @@ retrieved_job = provider.backend.retrieve_job(job.job_id())
* You should not instantiate the `IBMBackend` class directly. Instead, use the methods provided by an [`IBMProvider`](qiskit_ibm_provider.IBMProvider "qiskit_ibm_provider.IBMProvider") instance to retrieve and handle backends.
</Admonition>
Other methods return information about the backend. For example, the [`status()`](qiskit_ibm_provider.IBMBackend#status "qiskit_ibm_provider.IBMBackend.status") method returns a `BackendStatus` instance. The instance contains the `operational` and `pending_jobs` attributes, which state whether the backend is operational and also the number of jobs in the server queue for the backend, respectively:
Other methods return information about the backend. For example, the [`status()`](qiskit_ibm_provider.IBMBackend#status "qiskit_ibm_provider.IBMBackend.status") method returns a [`BackendStatus`](/api/qiskit/qiskit.providers.models.BackendStatus.html#qiskit.providers.models.BackendStatus "(in Qiskit v0.44)") instance. The instance contains the `operational` and `pending_jobs` attributes, which state whether the backend is operational and also the number of jobs in the server queue for the backend, respectively:
```python
status = backend.status()
@ -50,7 +50,7 @@ jobs_in_queue = status.pending_jobs
* num\_qubits: number of qubits.
* target: A `qiskit.transpiler.Target` object for the backend.
* target: A [`qiskit.transpiler.Target`](/api/qiskit/qiskit.transpiler.Target.html#qiskit.transpiler.Target "(in Qiskit v0.44)") object for the backend.
* basis\_gates: list of basis gates names on the backend.
@ -144,7 +144,7 @@ IBMBackend constructor.
**Parameters**
* **configuration** (`Union`\[`QasmBackendConfiguration`, `PulseBackendConfiguration`]) Backend configuration.
* **configuration** (`Union`\[[`QasmBackendConfiguration`](/api/qiskit/qiskit.providers.models.QasmBackendConfiguration.html#qiskit.providers.models.QasmBackendConfiguration "(in Qiskit v0.44)"), [`PulseBackendConfiguration`](/api/qiskit/qiskit.providers.models.PulseBackendConfiguration.html#qiskit.providers.models.PulseBackendConfiguration "(in Qiskit v0.44)")]) Backend configuration.
* **provider** ([`IBMProvider`](qiskit_ibm_provider.IBMProvider "qiskit_ibm_provider.ibm_provider.IBMProvider")) IBM Quantum account provider.
* **api\_client** (`AccountClient`) IBM Quantum client used to communicate with the server.
@ -154,7 +154,7 @@ IBMBackend constructor.
### coupling\_map
Return the `CouplingMap` object
Return the [`CouplingMap`](/api/qiskit/qiskit.transpiler.CouplingMap.html#qiskit.transpiler.CouplingMap "(in Qiskit v0.44)") object
<span id="ibmbackend-dt" />
@ -198,13 +198,13 @@ Return the system time resolution of output signals :returns: The output signal
### instruction\_durations
Return the `InstructionDurations` object.
Return the [`InstructionDurations`](/api/qiskit/qiskit.transpiler.InstructionDurations.html#qiskit.transpiler.InstructionDurations "(in Qiskit v0.44)") object.
<span id="ibmbackend-instruction-schedule-map" />
### instruction\_schedule\_map
Return the `InstructionScheduleMap` for the instructions defined in this backends target.
Return the [`InstructionScheduleMap`](/api/qiskit/qiskit.pulse.InstructionScheduleMap.html#qiskit.pulse.InstructionScheduleMap "(in Qiskit v0.44)") for the instructions defined in this backends target.
<span id="ibmbackend-instructions" />
@ -218,7 +218,7 @@ A list of Instruction tuples on the backend of the form `(instruction, (qubits)`
**Return type**
`List`\[`Tuple`\[`Instruction`, `Tuple`\[`int`]]]
`List`\[`Tuple`\[[`Instruction`](/api/qiskit/qiskit.circuit.Instruction.html#qiskit.circuit.Instruction "(in Qiskit v0.44)"), `Tuple`\[`int`]]]
<span id="ibmbackend-max-circuits" />
@ -280,11 +280,11 @@ A list of instruction names that the backend supports.
`List[Instruction]`
A list of `Instruction` instances that the backend supports.
A list of [`Instruction`](/api/qiskit/qiskit.circuit.Instruction.html#qiskit.circuit.Instruction "(in Qiskit v0.44)") instances that the backend supports.
**Return type**
`List`\[`Instruction`]
`List`\[[`Instruction`](/api/qiskit/qiskit.circuit.Instruction.html#qiskit.circuit.Instruction "(in Qiskit v0.44)")]
<span id="ibmbackend-options" />
@ -308,6 +308,20 @@ the Provider responsible for the backend.
Provider
<span id="ibmbackend-session" />
### session
<span id="qiskit_ibm_provider.IBMBackend.session" />
`Session`
Return session
**Return type**
[`Session`](qiskit_ibm_provider.Session "qiskit_ibm_provider.session.Session")
<span id="ibmbackend-target" />
### target
@ -316,7 +330,7 @@ Provider
`Target`
A `qiskit.transpiler.Target` object for the backend. :rtype: `Target` :returns: Target
A [`qiskit.transpiler.Target`](/api/qiskit/qiskit.transpiler.Target.html#qiskit.transpiler.Target "(in Qiskit v0.44)") object for the backend. :rtype: [`Target`](/api/qiskit/qiskit.transpiler.Target.html#qiskit.transpiler.Target "(in Qiskit v0.44)") :returns: Target
<span id="ibmbackend-version" />
@ -346,6 +360,20 @@ The Qubit measurement acquisition line.
AcquireChannel
<span id="ibmbackend-cancel-session" />
### cancel\_session
<span id="qiskit_ibm_provider.IBMBackend.cancel_session" />
`IBMBackend.cancel_session()`
Cancel session. All pending jobs will be cancelled.
**Return type**
`None`
<span id="ibmbackend-configuration" />
### configuration
@ -362,7 +390,7 @@ The schema for backend configuration can be found in [Qiskit/ibm-quantum-schemas
**Return type**
`Union`\[`QasmBackendConfiguration`, `PulseBackendConfiguration`]
`Union`\[[`QasmBackendConfiguration`](/api/qiskit/qiskit.providers.models.QasmBackendConfiguration.html#qiskit.providers.models.QasmBackendConfiguration "(in Qiskit v0.44)"), [`PulseBackendConfiguration`](/api/qiskit/qiskit.providers.models.PulseBackendConfiguration.html#qiskit.providers.models.PulseBackendConfiguration "(in Qiskit v0.44)")]
**Returns**
@ -410,7 +438,7 @@ The schema for default pulse configuration can be found in [Qiskit/ibm-quantum-s
**Return type**
`Optional`\[`PulseDefaults`]
`Optional`\[[`PulseDefaults`](/api/qiskit/qiskit.providers.models.PulseDefaults.html#qiskit.providers.models.PulseDefaults "(in Qiskit v0.44)")]
**Returns**
@ -440,7 +468,7 @@ DriveChannel
<span id="qiskit_ibm_provider.IBMBackend.get_translation_stage_plugin" />
`IBMBackend.get_translation_stage_plugin()`
`classmethod IBMBackend.get_translation_stage_plugin()`
Return the default translation stage plugin name for IBM backends.
@ -466,6 +494,20 @@ The Qubit measurement stimulus line
MeasureChannel
<span id="ibmbackend-open-session" />
### open\_session
<span id="qiskit_ibm_provider.IBMBackend.open_session" />
`IBMBackend.open_session(max_time=None)`
Open session
**Return type**
[`Session`](qiskit_ibm_provider.Session "qiskit_ibm_provider.session.Session")
<span id="ibmbackend-properties" />
### properties
@ -483,11 +525,11 @@ The schema for backend properties can be found in [Qiskit/ibm-quantum-schemas](h
**Parameters**
* **refresh** (`bool`) If `True`, re-query the server for the backend properties. Otherwise, return a cached version.
* **datetime** (`Optional`\[`datetime`]) By specifying datetime, this function returns an instance of the `BackendProperties` whose timestamp is closest to, but older than, the specified datetime.
* **datetime** (`Optional`\[`datetime`]) By specifying datetime, this function returns an instance of the [`BackendProperties`](/api/qiskit/qiskit.providers.models.BackendProperties.html#qiskit.providers.models.BackendProperties "(in Qiskit v0.44)") whose timestamp is closest to, but older than, the specified datetime.
**Return type**
`Optional`\[`BackendProperties`]
`Optional`\[[`BackendProperties`](/api/qiskit/qiskit.providers.models.BackendProperties.html#qiskit.providers.models.BackendProperties "(in Qiskit v0.44)")]
**Returns**
@ -531,19 +573,19 @@ qubit\_properties
<span id="qiskit_ibm_provider.IBMBackend.run" />
`IBMBackend.run(circuits, dynamic=None, job_tags=None, init_circuit=None, init_num_resets=None, header=None, shots=None, memory=None, qubit_lo_freq=None, meas_lo_freq=None, schedule_los=None, meas_level=None, meas_return=None, rep_delay=None, init_qubits=None, use_measure_esp=None, noise_model=None, seed_simulator=None, **run_config)`
`IBMBackend.run(circuits, dynamic=None, job_tags=None, init_circuit=None, init_num_resets=None, header=None, shots=None, memory=None, meas_level=None, meas_return=None, rep_delay=None, init_qubits=None, use_measure_esp=None, noise_model=None, seed_simulator=None, **run_config)`
Run on the backend. If a keyword specified here is also present in the `options` attribute/object, the value specified here will be used for this run.
**Parameters**
* **circuits** (`Union`\[`QuantumCircuit`, `Schedule`, `str`, `List`\[`Union`\[`QuantumCircuit`, `Schedule`, `str`]]]) An individual or a list of `QuantumCircuit`. `Schedule` is no longer supported. Use `pulse gates` instead. See [tutorial](https://qiskit.org/documentation/tutorials/circuits_advanced/05_pulse_gates.html) on how to use pulse gates.
* **circuits** (`Union`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)"), `str`, `List`\[`Union`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)"), `str`]]]) An individual or a list of `QuantumCircuit`.
* **dynamic** (`Optional`\[`bool`]) Whether the circuit is dynamic (uses in-circuit conditionals)
* **job\_tags** (`Optional`\[`List`\[`str`]]) Tags to be assigned to the job. The tags can subsequently be used as a filter in the `jobs()` function call.
* **init\_circuit** (`Optional`\[`QuantumCircuit`]) A quantum circuit to execute for initializing qubits before each circuit. If specified, `init_num_resets` is ignored. Applicable only if `dynamic=True` is specified.
* **init\_circuit** (`Optional`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)")]) A quantum circuit to execute for initializing qubits before each circuit. If specified, `init_num_resets` is ignored. Applicable only if `dynamic=True` is specified.
* **init\_num\_resets** (`Optional`\[`int`]) The number of qubit resets to insert before each circuit execution.
@ -557,12 +599,6 @@ Run on the backend. If a keyword specified here is also present in the `options`
* **memory** (`Optional`\[`bool`]) If `True`, per-shot measurement bitstrings are returned as well (provided the backend supports it). For OpenPulse jobs, only measurement level 2 supports this option.
* **qubit\_lo\_freq** (`Optional`\[`List`\[`int`]]) List of default qubit LO frequencies in Hz. Will be overridden by `schedule_los` if set.
* **meas\_lo\_freq** (`Optional`\[`List`\[`int`]]) List of default measurement LO frequencies in Hz. Will be overridden by `schedule_los` if set.
* **schedule\_los** (`Union`\[`List`\[`Union`\[`Dict`\[`PulseChannel`, `float`], `LoConfig`]], `Dict`\[`PulseChannel`, `float`], `LoConfig`, `None`]) Experiment LO configurations, frequencies are given in Hz.
* **meas\_level** (`Union`\[`int`, `MeasLevel`, `None`])
Level of the measurement output for pulse experiments. See [OpenPulse specification](https://arxiv.org/pdf/1809.03452.pdf) for details:
@ -639,12 +675,12 @@ This method is used to update the options of a backend. If you need to change an
Return the backend status.
<Admonition title="Note" type="note">
If the returned `BackendStatus` instance has `operational=True` but `status_msg="internal"`, then the backend is accepting jobs but not processing them.
If the returned [`BackendStatus`](/api/qiskit/qiskit.providers.models.BackendStatus.html#qiskit.providers.models.BackendStatus "(in Qiskit v0.44)") instance has `operational=True` but `status_msg="internal"`, then the backend is accepting jobs but not processing them.
</Admonition>
**Return type**
`BackendStatus`
[`BackendStatus`](/api/qiskit/qiskit.providers.models.BackendStatus.html#qiskit.providers.models.BackendStatus "(in Qiskit v0.44)")
**Returns**
@ -662,5 +698,5 @@ The status of the backend.
`IBMBackend.target_history(datetime=None)`
A `qiskit.transpiler.Target` object for the backend. :rtype: `Target` :returns: Target with properties found on datetime
A [`qiskit.transpiler.Target`](/api/qiskit/qiskit.transpiler.Target.html#qiskit.transpiler.Target "(in Qiskit v0.44)") object for the backend. :rtype: [`Target`](/api/qiskit/qiskit.transpiler.Target.html#qiskit.transpiler.Target "(in Qiskit v0.44)") :returns: Target with properties found on datetime

View File

@ -118,7 +118,7 @@ Retrieve jobs that match the given filters and paginate the results if desired.
* **limit** (`Optional`\[`int`]) Number of jobs to retrieve. `None` means no limit. Note that the number of sub-jobs within a composite job count towards the limit.
* **skip** (`int`) Starting index for the job retrieval.
* **backend\_name** (`Optional`\[`str`]) Name of the backend to retrieve jobs from.
* **status** (`Union`\[`Literal`\[pending, completed], `List`\[`Union`\[`JobStatus`, `str`]], `JobStatus`, `str`, `None`]) Filter jobs with either “pending” or “completed” status. You can also specify by
* **status** (`Union`\[`Literal`\[pending, completed], `List`\[`Union`\[[`JobStatus`](/api/qiskit/qiskit.providers.JobStatus.html#qiskit.providers.JobStatus "(in Qiskit v0.44)"), `str`]], [`JobStatus`](/api/qiskit/qiskit.providers.JobStatus.html#qiskit.providers.JobStatus "(in Qiskit v0.44)"), `str`, `None`]) Filter jobs with either “pending” or “completed” status. You can also specify by
* **example** (*exact status. For*) or status=\[“RUNNING”, “ERROR”].
* **status="RUNNING"** (*status=JobStatus.RUNNING or*) or status=\[“RUNNING”, “ERROR”].
* **start\_datetime** (`Optional`\[`datetime`]) Filter by the given start date, in local time. This is used to find jobs whose creation dates are after (greater than or equal to) this local date/time.
@ -126,7 +126,7 @@ Retrieve jobs that match the given filters and paginate the results if desired.
* **job\_tags** (`Optional`\[`List`\[`str`]]) Filter by tags assigned to jobs. Matched jobs are associated with all tags.
* **descending** (`bool`) If `True`, return the jobs in descending order of the job creation date (i.e. newest first) until the limit is reached.
* **instance** (`Optional`\[`str`]) The provider in the hub/group/project format.
* **legacy** (`bool`) If `True`, only retrieve jobs run from the deprecated `qiskit-ibmq-provider`.
* **legacy** (`bool`) If `True`, only retrieve jobs run from the archived `qiskit-ibmq-provider`.
* **Otherwise**
* **qiskit-ibm-provider.** (*only retrieve jobs run from*)

View File

@ -78,6 +78,8 @@ The [`get_backend()`](qiskit_ibm_provider.IBMProvider#get_backend "qiskit_ibm_pr
simulator_backend = provider.get_backend('ibmq_qasm_simulator')
```
IBMBackends are uniquely identified by their name. If you invoke [`get_backend()`](qiskit_ibm_provider.IBMProvider#get_backend "qiskit_ibm_provider.IBMProvider.get_backend") twice, you will get the same IBMBackend instance, and any previously updated options will be reset to the default values.
It is also possible to use the `backend` attribute to reference a backend. As an example, to retrieve the same backend from the example above:
```python

View File

@ -0,0 +1,109 @@
---
title: Session
description: API reference for qiskit_ibm_provider.Session
in_page_toc_min_heading_level: 1
python_api_type: class
python_api_name: qiskit_ibm_provider.Session
---
# Session
<span id="qiskit_ibm_provider.Session" />
`Session(max_time=None)`
Class for creating a flexible Qiskit Runtime session.
A Qiskit Runtime `session` allows you to group a collection of iterative calls to the quantum computer. A session is started when the first job within the session is started. Subsequent jobs within the session are prioritized by the scheduler. Data used within a session, such as transpiled circuits, is also cached to avoid unnecessary overhead.
You can open a Qiskit Runtime session using this `Session` class and submit one or more jobs.
For example:
```python
from qiskit.test.reference_circuits import ReferenceCircuits
from qiskit_ibm_provider import IBMProvider
circ = ReferenceCircuits.bell()
backend = IBMProvider().get_backend("ibmq_qasm_simulator")
backend.open_session()
job = backend.run(circ)
print(f"Job ID: {job.job_id()}")
print(f"Result: {job.result()}")
# Close the session only if all jobs are finished and
# you don't need to run more in the session.
backend.cancel_session()
```
Session can also be used as a context manager:
```python
with backend.open_session() as session:
job = backend.run(ReferenceCircuits.bell())
assert job.job_id() == session.session_id
```
Session constructor.
**Parameters**
**max\_time** (`Union`\[`int`, `str`, `None`]) (EXPERIMENTAL setting, can break between releases without warning) Maximum amount of time, a runtime session can be open before being forcibly closed. Can be specified as seconds (int) or a string like “2h 30m 40s”. This value must be in between 300 seconds and the [system imposed maximum](https://qiskit.org/documentation/partners/qiskit_ibm_runtime/faqs/max_execution_time.html).
**Raises**
**ValueError** If an input value is invalid.
## Attributes
<span id="session-active" />
### active
<span id="qiskit_ibm_provider.Session.active" />
`bool`
Return the status of the session.
**Return type**
`bool`
**Returns**
True if the session is active, False otherwise.
<span id="session-session-id" />
### session\_id
<span id="qiskit_ibm_provider.Session.session_id" />
`str`
Return the session ID.
**Return type**
`str`
**Returns**
Session ID. None until a job runs in the session.
## Methods
<span id="session-cancel" />
### cancel
<span id="qiskit_ibm_provider.Session.cancel" />
`Session.cancel()`
Set the session.\_active status to False
**Return type**
`None`

View File

@ -10,13 +10,13 @@ python_api_name: qiskit_ibm_provider.job.IBMCircuitJob
<span id="qiskit_ibm_provider.job.IBMCircuitJob" />
`IBMCircuitJob(backend, api_client, job_id, creation_date=None, status=None, runtime_client=None, kind=None, name=None, time_per_step=None, result=None, error=None, tags=None, run_mode=None, client_info=None, **kwargs)`
`IBMCircuitJob(backend, api_client, job_id, creation_date=None, status=None, runtime_client=None, kind=None, name=None, time_per_step=None, result=None, error=None, session_id=None, tags=None, run_mode=None, client_info=None, **kwargs)`
Representation of a job that executes on an IBM Quantum backend.
The job may be executed on a simulator or a real device. A new `IBMCircuitJob` instance is returned when you call `IBMBackend.run()` to submit a job to a particular backend.
If the job is successfully submitted, you can inspect the jobs status by calling [`status()`](qiskit_ibm_provider.job.IBMCircuitJob#status "qiskit_ibm_provider.job.IBMCircuitJob.status"). Job status can be one of the `JobStatus` members. For example:
If the job is successfully submitted, you can inspect the jobs status by calling [`status()`](qiskit_ibm_provider.job.IBMCircuitJob#status "qiskit_ibm_provider.job.IBMCircuitJob.status"). Job status can be one of the [`JobStatus`](/api/qiskit/qiskit.providers.JobStatus.html#qiskit.providers.JobStatus "(in Qiskit v0.44)") members. For example:
```python
from qiskit.providers.jobstatus import JobStatus
@ -131,7 +131,7 @@ Return the backend where this job was executed.
**Return type**
`Backend`
[`Backend`](/api/qiskit/qiskit.providers.Backend.html#qiskit.providers.Backend "(in Qiskit v0.44)")
<span id="ibmcircuitjob-backend-options" />
@ -202,15 +202,15 @@ Return whether the job has been cancelled.
`IBMCircuitJob.circuits()`
Return the circuits or pulse schedules for this job.
Return the circuits for this job.
**Return type**
`List`\[`Union`\[`QuantumCircuit`, `Schedule`]]
`List`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)")]
**Returns**
The circuits or pulse schedules for this job. An empty list is returned if the circuits cannot be retrieved (for example, if the job uses an old format that is no longer supported).
The circuits or for this job. An empty list is returned if the circuits cannot be retrieved (for example, if the job uses an old format that is no longer supported).
<span id="ibmcircuitjob-creation-date" />
@ -336,17 +336,21 @@ Job name or `None` if no name was assigned to this job.
<span id="qiskit_ibm_provider.job.IBMCircuitJob.properties" />
`IBMCircuitJob.properties()`
`IBMCircuitJob.properties(refresh=False)`
Return the backend properties for this job.
**Parameters**
**refresh** (`bool`) If `True`, re-query the server for the backend properties. Otherwise, return a cached version.
**Return type**
`Optional`\[`BackendProperties`]
`Optional`\[[`BackendProperties`](/api/qiskit/qiskit.providers.models.BackendProperties.html#qiskit.providers.models.BackendProperties "(in Qiskit v0.44)")]
**Returns**
The backend properties used for this job, or `None` if properties are not available.
The backend properties used for this job, at the time the job was run, or `None` if properties are not available.
<span id="ibmcircuitjob-queue-info" />
@ -435,7 +439,7 @@ Return the result of the job.
</Admonition>
<Admonition title="Note" type="note">
When partial=True, this method will attempt to retrieve partial results of failed jobs. In this case, precaution should be taken when accessing individual experiments, as doing so might cause an exception. The `success` attribute of the returned `Result` instance can be used to verify whether it contains partial results.
When partial=True, this method will attempt to retrieve partial results of failed jobs. In this case, precaution should be taken when accessing individual experiments, as doing so might cause an exception. The `success` attribute of the returned [`Result`](/api/qiskit/qiskit.result.Result.html#qiskit.result.Result "(in Qiskit v0.44)") instance can be used to verify whether it contains partial results.
For example, if one of the experiments in the job failed, trying to get the counts of the unsuccessful experiment would raise an exception since there are no counts to return:
@ -456,7 +460,7 @@ If the job failed, you can use [`error_message()`](qiskit_ibm_provider.job.IBMCi
**Return type**
`Result`
[`Result`](/api/qiskit/qiskit.result.Result.html#qiskit.result.Result "(in Qiskit v0.44)")
**Returns**
@ -520,7 +524,7 @@ Query the server for the latest job status.
**Return type**
`JobStatus`
[`JobStatus`](/api/qiskit/qiskit.providers.JobStatus.html#qiskit.providers.JobStatus "(in Qiskit v0.44)")
**Returns**

View File

@ -35,7 +35,7 @@ IBMCompositeJob constructor.
* **job\_id** (`Optional`\[`str`]) Job ID.
* **creation\_date** (`Optional`\[`datetime`]) Job creation date.
* **jobs** (`Optional`\[`List`\[[`IBMCircuitJob`](qiskit_ibm_provider.job.IBMCircuitJob "qiskit_ibm_provider.job.ibm_circuit_job.IBMCircuitJob")]]) A list of sub-jobs.
* **circuits\_list** (`Optional`\[`List`\[`Union`\[`List`\[`QuantumCircuit`], `List`\[`Schedule`]]]]) Circuits for this job.
* **circuits\_list** (`Optional`\[`List`\[`List`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)")]]]) Circuits for this job.
* **run\_config** (`Optional`\[`Dict`]) Runtime configuration for this job.
* **name** (`Optional`\[`str`]) Job name.
* **tags** (`Optional`\[`List`\[`str`]]) Job tags.
@ -89,7 +89,7 @@ Return the backend where this job was executed.
**Return type**
`Backend`
[`Backend`](/api/qiskit/qiskit.providers.Backend.html#qiskit.providers.Backend "(in Qiskit v0.44)")
<span id="ibmcompositejob-backend-options" />
@ -173,15 +173,15 @@ Return whether the job has been cancelled.
`IBMCompositeJob.circuits()`
Return the circuits or pulse schedules for this job.
Return the circuits for this job.
**Return type**
`List`\[`Union`\[`QuantumCircuit`, `Schedule`]]
`List`\[[`QuantumCircuit`](/api/qiskit/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit "(in Qiskit v0.44)")]
**Returns**
The circuits or pulse schedules for this job.
The circuits for this job.
<span id="ibmcompositejob-creation-date" />
@ -333,17 +333,23 @@ Job name or `None` if no name was assigned to this job.
<span id="qiskit_ibm_provider.job.IBMCompositeJob.properties" />
`IBMCompositeJob.properties()`
`IBMCompositeJob.properties(refresh=False)`
Return the backend properties for this job.
> #### Args:
>
> #### refresh: If `True`, re-query the server for the backend properties.
>
> Otherwise, return a cached version.
<Admonition title="Note" type="note">
This method blocks until all sub-jobs are submitted.
</Admonition>
**Return type**
`Union`\[`List`\[`BackendProperties`], `BackendProperties`, `None`]
`Union`\[`List`\[[`BackendProperties`](/api/qiskit/qiskit.providers.models.BackendProperties.html#qiskit.providers.models.BackendProperties "(in Qiskit v0.44)")], [`BackendProperties`](/api/qiskit/qiskit.providers.models.BackendProperties.html#qiskit.providers.models.BackendProperties "(in Qiskit v0.44)"), `None`]
**Returns**
@ -488,7 +494,7 @@ Return the result of the job.
</Admonition>
<Admonition title="Note" type="note">
When partial=True, this method will attempt to retrieve partial results of failed jobs. In this case, precaution should be taken when accessing individual experiments, as doing so might cause an exception. The `success` attribute of the returned `Result` instance can be used to verify whether it contains partial results.
When partial=True, this method will attempt to retrieve partial results of failed jobs. In this case, precaution should be taken when accessing individual experiments, as doing so might cause an exception. The `success` attribute of the returned [`Result`](/api/qiskit/qiskit.result.Result.html#qiskit.result.Result "(in Qiskit v0.44)") instance can be used to verify whether it contains partial results.
For example, if one of the circuits in the job failed, trying to get the counts of the unsuccessful circuit would raise an exception since there are no counts to return:
@ -511,7 +517,7 @@ If the job failed, you can use [`error_message()`](qiskit_ibm_provider.job.IBMCo
**Return type**
`Result`
[`Result`](/api/qiskit/qiskit.result.Result.html#qiskit.result.Result "(in Qiskit v0.44)")
**Returns**
@ -593,7 +599,7 @@ Query the server for the latest job status.
**Return type**
`JobStatus`
[`JobStatus`](/api/qiskit/qiskit.providers.JobStatus.html#qiskit.providers.JobStatus "(in Qiskit v0.44)")
**Returns**

View File

@ -20,11 +20,11 @@ Return the least busy available backend for those that have a `pending_jobs` in
**Parameters**
**backends** (`List`\[`Backend`]) The backends to choose from.
**backends** (`List`\[[`Backend`](/api/qiskit/qiskit.providers.Backend.html#qiskit.providers.Backend "(in Qiskit v0.44)")]) The backends to choose from.
**Return type**
`Backend`
[`Backend`](/api/qiskit/qiskit.providers.Backend.html#qiskit.providers.Backend "(in Qiskit v0.44)")
**Returns**

View File

@ -32,7 +32,7 @@ Scheduler for dynamic circuit backends.
**Parameters**
**durations** (`InstructionDurations`) Durations of instructions to be used in scheduling.
**durations** ([`InstructionDurations`](/api/qiskit/qiskit.transpiler.InstructionDurations.html#qiskit.transpiler.InstructionDurations "(in Qiskit v0.44)")) Durations of instructions to be used in scheduling.
## Attributes
@ -97,7 +97,7 @@ Return the name of the pass.
`ALAPScheduleAnalysis.run(dag)`
Run the ASAPSchedule pass on dag. :type dag: `DAGCircuit` :param dag: DAG to schedule. :type dag: DAGCircuit
Run the ASAPSchedule pass on dag. :type dag: [`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)") :param dag: DAG to schedule. :type dag: DAGCircuit
**Raises**

View File

@ -32,7 +32,7 @@ Scheduler for dynamic circuit backends.
**Parameters**
**durations** (`InstructionDurations`) Durations of instructions to be used in scheduling.
**durations** ([`InstructionDurations`](/api/qiskit/qiskit.transpiler.InstructionDurations.html#qiskit.transpiler.InstructionDurations "(in Qiskit v0.44)")) Durations of instructions to be used in scheduling.
## Attributes
@ -97,7 +97,7 @@ Return the name of the pass.
`ASAPScheduleAnalysis.run(dag)`
Run the ALAPSchedule pass on dag. :type dag: `DAGCircuit` :param dag: DAG to schedule. :type dag: DAGCircuit
Run the ALAPSchedule pass on dag. :type dag: [`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)") :param dag: DAG to schedule. :type dag: DAGCircuit
**Raises**
@ -106,7 +106,7 @@ Run the ALAPSchedule pass on dag. :type dag: `DAGCircuit` :param dag: DAG to sch
**Return type**
`DAGCircuit`
[`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)")
**Returns**

View File

@ -10,7 +10,7 @@ python_api_name: qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadde
<span id="qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadder" />
`BlockBasePadder`
`BlockBasePadder(schedule_idle_qubits=False)`
The base class of padding pass.
@ -92,7 +92,7 @@ Run the padding pass on `dag`.
**Parameters**
**dag** (`DAGCircuit`) DAG to be checked.
**dag** ([`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)")) DAG to be checked.
**Returns**

View File

@ -48,7 +48,7 @@ Construct an `InstructionDurations` object from the backend.
**Parameters**
**backend** (`Backend`) backend from which durations (gate lengths) and dt are extracted.
**backend** ([`Backend`](/api/qiskit/qiskit.providers.Backend.html#qiskit.providers.Backend "(in Qiskit v0.44)")) backend from which durations (gate lengths) and dt are extracted.
**Returns**
@ -80,7 +80,7 @@ Some instructions may have a parameter dependent duration.
**Parameters**
* **inst** (*str | qiskit.circuit.Instruction*) An instruction or its name to be queried.
* **inst** (*str |* [*qiskit.circuit.Instruction*](/api/qiskit/qiskit.circuit.Instruction.html#qiskit.circuit.Instruction "(in Qiskit v0.44)")) An instruction or its name to be queried.
* **qubits** (*int | list\[int] | Qubit | list\[Qubit] | list\[int | Qubit]*) Qubits or its indices that the instruction acts on.
* **unit** (*str*) The unit of duration to be returned. It must be s or dt.
* **parameters** (*list\[float] | None*) The value of the parameters of the desired instruction.
@ -127,7 +127,7 @@ Update self with inst\_durations (inst\_durations overwrite self). Overrides the
**Parameters**
* **inst\_durations** (`Union`\[`List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `Optional`\[`Iterable`\[`float`]], `str`]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `Optional`\[`Iterable`\[`float`]]]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `str`]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`]], `InstructionDurations`, `None`]) Instruction durations to be merged into self (overwriting self).
* **inst\_durations** (`Union`\[`List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `Optional`\[`Iterable`\[`float`]], `str`]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `Optional`\[`Iterable`\[`float`]]]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`, `str`]], `List`\[`Tuple`\[`str`, `Optional`\[`Iterable`\[`int`]], `float`]], [`InstructionDurations`](/api/qiskit/qiskit.transpiler.InstructionDurations.html#qiskit.transpiler.InstructionDurations "(in Qiskit v0.44)"), `None`]) Instruction durations to be merged into self (overwriting self).
* **dt** (`Optional`\[`float`]) Sampling duration in seconds of the target backend.
**Returns**

View File

@ -10,7 +10,7 @@ python_api_name: qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay
<span id="qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay" />
`PadDelay(fill_very_end=True)`
`PadDelay(fill_very_end=True, schedule_idle_qubits=False)`
Padding idle time with Delay instructions.
@ -34,7 +34,8 @@ Create new padding delay pass.
**Parameters**
**fill\_very\_end** (`bool`) Set `True` to fill the end of circuit with delay.
* **fill\_very\_end** (`bool`) Set `True` to fill the end of circuit with delay.
* **schedule\_idle\_qubits** (`bool`) Set to true if youd like a delay inserted on idle qubits. This is useful for timeline visualizations, but may cause issues for execution on large backends.
## Attributes
@ -103,7 +104,7 @@ Run the padding pass on `dag`.
**Parameters**
**dag** (`DAGCircuit`) DAG to be checked.
**dag** ([`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)")) DAG to be checked.
**Returns**

View File

@ -10,7 +10,7 @@ python_api_name: qiskit_ibm_provider.transpiler.passes.scheduling.PadDynamicalDe
<span id="qiskit_ibm_provider.transpiler.passes.scheduling.PadDynamicalDecoupling" />
`PadDynamicalDecoupling(durations, dd_sequences, qubits=None, spacings=None, skip_reset_qubits=True, pulse_alignment=16, extra_slack_distribution='middle', sequence_min_length_ratios=None, insert_multiple_cycles=False, coupling_map=None, alt_spacings=None)`
`PadDynamicalDecoupling(durations, dd_sequences, qubits=None, spacings=None, skip_reset_qubits=True, pulse_alignment=16, extra_slack_distribution='middle', sequence_min_length_ratios=None, insert_multiple_cycles=False, coupling_map=None, alt_spacings=None, schedule_idle_qubits=False)`
Dynamical decoupling insertion pass for IBM dynamic circuit backends.
@ -137,9 +137,9 @@ Dynamical decoupling initializer.
**Parameters**
* **durations** (`InstructionDurations`) Durations of instructions to be used in scheduling.
* **durations** ([`InstructionDurations`](/api/qiskit/qiskit.transpiler.InstructionDurations.html#qiskit.transpiler.InstructionDurations "(in Qiskit v0.44)")) Durations of instructions to be used in scheduling.
* **dd\_sequences** (`Union`\[`List`\[`Gate`], `List`\[`List`\[`Gate`]]]) Sequence of gates to apply in idle spots. Alternatively a list of gate sequences may be supplied that will preferentially be inserted if there is a delay of sufficient duration. This may be tuned by the optionally supplied `sequence_min_length_ratios`.
* **dd\_sequences** (`Union`\[`List`\[[`Gate`](/api/qiskit/qiskit.circuit.Gate.html#qiskit.circuit.Gate "(in Qiskit v0.44)")], `List`\[`List`\[[`Gate`](/api/qiskit/qiskit.circuit.Gate.html#qiskit.circuit.Gate "(in Qiskit v0.44)")]]]) Sequence of gates to apply in idle spots. Alternatively a list of gate sequences may be supplied that will preferentially be inserted if there is a delay of sufficient duration. This may be tuned by the optionally supplied `sequence_min_length_ratios`.
* **qubits** (`Optional`\[`List`\[`int`]]) Physical qubits on which to apply DD. If None, all qubits will undergo DD (when possible).
@ -160,10 +160,12 @@ Dynamical decoupling initializer.
* **insert\_multiple\_cycles** (`bool`) If the available duration exceeds 2\*sequence\_min\_length\_ratio\*duration(dd\_sequence) enable the insertion of multiple rounds of the dynamical decoupling sequence in that delay.
* **coupling\_map** (`Optional`\[`CouplingMap`]) directed graph representing the coupling map for the device. Specifying a coupling map partitions the device into subcircuits, in order to apply DD sequences with different pulse spacings within each. Currently support 2 subcircuits.
* **coupling\_map** (`Optional`\[[`CouplingMap`](/api/qiskit/qiskit.transpiler.CouplingMap.html#qiskit.transpiler.CouplingMap "(in Qiskit v0.44)")]) directed graph representing the coupling map for the device. Specifying a coupling map partitions the device into subcircuits, in order to apply DD sequences with different pulse spacings within each. Currently support 2 subcircuits.
* **alt\_spacings** (`Union`\[`List`\[`List`\[`float`]], `List`\[`float`], `None`]) A list of lists of spacings between the DD gates, for the second subcircuit, as determined by the coupling map. If None, a balanced spacing that is staggered with respect to the first subcircuit will be used \[d, d, d, …, d, d, 0].
* **schedule\_idle\_qubits** (`bool`) Set to true if youd like a delay inserted on idle qubits. This is useful for timeline visualizations, but may cause issues for execution on large backends.
**Raises**
* **TranspilerError** When invalid DD sequence is specified.
@ -237,7 +239,7 @@ Run the padding pass on `dag`.
**Parameters**
**dag** (`DAGCircuit`) DAG to be checked.
**dag** ([`DAGCircuit`](/api/qiskit/qiskit.dagcircuit.DAGCircuit.html#qiskit.dagcircuit.DAGCircuit "(in Qiskit v0.44)")) DAG to be checked.
**Returns**

View File

@ -21,14 +21,14 @@ python_api_name: qiskit_ibm_provider.transpiler.passes.scheduling
A collection of scheduling passes for working with IBM Quantums next-generation backends that support advanced “dynamic circuit” capabilities. Ie., circuits with support for classical control-flow/feedback based off of measurement results.
<Admonition title="Warning" type="caution">
You should not mix these scheduling passes with Qiskits builtin scheduling passes as they will negatively interact with the scheduling routines for dynamic circuits. This includes setting `scheduling_method` in `transpile`.
You should not mix these scheduling passes with Qiskits builtin scheduling passes as they will negatively interact with the scheduling routines for dynamic circuits. This includes setting `scheduling_method` in [`transpile()`](/api/qiskit/compiler.html#qiskit.compiler.transpile "(in Qiskit v0.44)") or [`generate_preset_pass_manager()`](/api/qiskit/transpiler_preset.html#qiskit.transpiler.preset_passmanagers.generate_preset_pass_manager "(in Qiskit v0.44)").
</Admonition>
Below we demonstrate how to schedule and pad a teleportation circuit with delays for a dynamic circuit backends execution model:
```python
from qiskit import transpile
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.transpiler.passmanager import PassManager
from qiskit_ibm_provider.transpiler.passes.scheduling import DynamicCircuitInstructionDurations
@ -46,8 +46,10 @@ backend.configuration().basis_gates.append("if_else")
# Use this duration class to get appropriate durations for dynamic
# circuit backend scheduling
durations = DynamicCircuitInstructionDurations.from_backend(backend)
# Generate the main Qiskit transpile passes.
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
# Configure the as-late-as-possible scheduling pass
pm = PassManager([ALAPScheduleAnalysis(durations), PadDelay()])
pm.scheduling = PassManager([ALAPScheduleAnalysis(durations), PadDelay()])
qr = QuantumRegister(3)
crz = ClassicalRegister(1, name="crz")
@ -68,9 +70,7 @@ with teleport.if_test((crx, 1)):
teleport.x(qr[2])
teleport.measure(qr[2], result)
teleport = transpile(teleport, backend)
# Transpile.
scheduled_teleport = pm.run(teleport)
scheduled_teleport.draw(output="mpl")
@ -88,7 +88,8 @@ from qiskit_ibm_provider.transpiler.passes.scheduling import PadDynamicalDecoupl
dd_sequence = [XGate(), XGate()]
pm = PassManager(
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence),
@ -102,6 +103,8 @@ dd_teleport.draw(output="mpl")
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_1\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_1_0.png)
When compiling a circuit with Qiskit, it is more efficient and more robust to perform all the transformations in a single transpilation. This has been done above by extending Qiskits preset pass managers. For example, Qiskits [`transpile()`](/api/qiskit/compiler.html#qiskit.compiler.transpile "(in Qiskit v0.44)") function internally builds its pass set by using [`generate_preset_pass_manager()`](/api/qiskit/transpiler_preset.html#qiskit.transpiler.preset_passmanagers.generate_preset_pass_manager "(in Qiskit v0.44)"). This returns instances of [`StagedPassManager`](/api/qiskit/qiskit.transpiler.StagedPassManager.html#qiskit.transpiler.StagedPassManager "(in Qiskit v0.44)"), which can be extended.
<span id="scheduling-old-format-c-if-conditioned-gates" />
### Scheduling old format `c_if` conditioned gates
@ -116,37 +119,33 @@ qc_c_if.draw(output="mpl")
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_2\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_2_0.png)
The [`IBMBackend`](qiskit_ibm_provider.IBMBackend "qiskit_ibm_provider.IBMBackend") configures a translation plugin `IBMTranslationPlugin` to automatically apply transformations and optimizations for IBM hardware backends when invoking `transpile()`. This will automatically convert all old style `c_if` conditioned gates to new-style control-flow.
The [`IBMBackend`](qiskit_ibm_provider.IBMBackend "qiskit_ibm_provider.IBMBackend") configures a translation plugin `IBMTranslationPlugin` to automatically apply transformations and optimizations for IBM hardware backends when invoking [`transpile()`](/api/qiskit/compiler.html#qiskit.compiler.transpile "(in Qiskit v0.44)"). This will automatically convert all old style `c_if` conditioned gates to new-style control-flow. We may then schedule the transpiled circuit without further modification.
```python
# Temporary workaround for mock backends. For real backends this is not required.
backend.get_translation_stage_plugin = lambda: "ibm_dynamic_circuits"
qc_c_if_transpiled = transpile(qc_c_if, backend)
```
We may then schedule the transpiled circuit without further modification.
```python
pm = PassManager(
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence),
]
)
qc_if_dd = pm.run(qc_c_if_transpiled)
qc_if_dd = pm.run(qc_c_if, backend)
qc_if_dd.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_4\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_4_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_3\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_3_0.png)
If you are not using the transpiler plugin stages to work around this please manually run the pass `qiskit.transpiler.passes.ConvertConditionsToIfOps` prior to your scheduling pass.
If you are not using the transpiler plugin stages to work around this please manually run the pass [`qiskit.transpiler.passes.ConvertConditionsToIfOps`](/api/qiskit/qiskit.transpiler.passes.ConvertConditionsToIfOps.html#qiskit.transpiler.passes.ConvertConditionsToIfOps "(in Qiskit v0.44)") prior to your scheduling pass.
```python
from qiskit.transpiler.passes import ConvertConditionsToIfOps
pm = PassManager(
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
[
ConvertConditionsToIfOps(),
ALAPScheduleAnalysis(durations),
@ -158,7 +157,7 @@ qc_if_dd = pm.run(qc_c_if)
qc_if_dd.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_5\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_5_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_4\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_4_0.png)
<span id="exploiting-ibm-backend-s-local-parallel-fast-path" />
@ -181,7 +180,7 @@ with qc.if_test((1, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_6\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_6_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_5\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_5_0.png)
The circuit below will not use the fast-path as the conditional gate is on a different qubit than the measurement qubit.
@ -194,7 +193,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_7\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_7_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_6\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_6_0.png)
Similarly, the circuit below contains gates on multiple qubits and will not be performed using the fast-path.
@ -208,7 +207,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_8\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_8_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_7\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_7_0.png)
A fast-path block may contain multiple gates as long as they are on the fast-path qubit. If there are multiple fast-path blocks being performed in parallel each block will be padded out to the duration of the longest block.
@ -226,7 +225,7 @@ with qc.if_test((1, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_9\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_9_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_8\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_8_0.png)
This behavior is also applied to the else condition of a fast-path eligible branch.
@ -243,7 +242,7 @@ with else_:
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_10\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_10_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_9\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_9_0.png)
If a single measurement result is used with several conditional blocks, if there is a fast-path eligible block it will be applied followed by the non-fast-path blocks which will execute with the standard higher latency conditional branch.
@ -261,7 +260,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_11\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_11_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_10\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_10_0.png)
If you wish to prevent the usage of the fast-path you may insert a barrier between the measurement and the conditional branch.
@ -276,7 +275,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_12\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_12_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_11\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_11_0.png)
Conditional measurements are not eligible for the fast-path.
@ -290,7 +289,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_13\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_13_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_12\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_12_0.png)
Similarly nested control-flow is not eligible.
@ -306,7 +305,7 @@ with qc.if_test((0, 1)):
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_14\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_14_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_13\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_13_0.png)
The scheduler is aware of the fast-path behavior and will not insert delays on idle qubits in blocks that satisfy the fast-path conditions so as to avoid preventing the backend compiler from performing the necessary optimizations to utilize the fast-path. If there are fast-path blocks that will be performed in parallel they currently *will not* be padded out by the scheduler to ensure they are of the same duration in Qiskit
@ -340,7 +339,7 @@ qc_dd = pm.run(qc)
qc_dd.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_15\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_15_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_14\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_14_0.png)
<Admonition title="Note" type="note">
If there are qubits that are *not* involved in a fast-path decision it is not currently possible to use them in a fast-path branch in parallel with the fast-path qubits resulting from a measurement. This will be revised in the future as we further improve these capabilities.
@ -364,7 +363,7 @@ qc_dd.draw(output="mpl")
qc.draw(output="mpl")
```
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_16\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_16_0.png)
![../\_images/qiskit\_ibm\_provider.transpiler.passes.scheduling\_15\_0.png](/images/api/qiskit-ibm-provider/qiskit_ibm_provider.transpiler.passes.scheduling_15_0.png)
</Admonition>
<span id="scheduling-dynamical-decoupling" />
@ -373,10 +372,10 @@ qc_dd.draw(output="mpl")
| | |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [`BlockBasePadder`](qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadder "qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadder")() | The base class of padding pass. |
| [`BlockBasePadder`](qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadder "qiskit_ibm_provider.transpiler.passes.scheduling.BlockBasePadder")(\[schedule\_idle\_qubits]) | The base class of padding pass. |
| [`ALAPScheduleAnalysis`](qiskit_ibm_provider.transpiler.passes.scheduling.ALAPScheduleAnalysis "qiskit_ibm_provider.transpiler.passes.scheduling.ALAPScheduleAnalysis")(durations) | Dynamic circuits as-late-as-possible (ALAP) scheduling analysis pass. |
| [`ASAPScheduleAnalysis`](qiskit_ibm_provider.transpiler.passes.scheduling.ASAPScheduleAnalysis "qiskit_ibm_provider.transpiler.passes.scheduling.ASAPScheduleAnalysis")(durations) | Dynamic circuits as-soon-as-possible (ASAP) scheduling analysis pass. |
| [`DynamicCircuitInstructionDurations`](qiskit_ibm_provider.transpiler.passes.scheduling.DynamicCircuitInstructionDurations "qiskit_ibm_provider.transpiler.passes.scheduling.DynamicCircuitInstructionDurations")(\[...]) | For dynamic circuits the IBM Qiskit backend currently reports instruction durations that differ compared with those required for the legacy Qobj-based path. |
| [`PadDelay`](qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay "qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay")(\[fill\_very\_end]) | Padding idle time with Delay instructions. |
| [`PadDelay`](qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay "qiskit_ibm_provider.transpiler.passes.scheduling.PadDelay")(\[fill\_very\_end, schedule\_idle\_qubits]) | Padding idle time with Delay instructions. |
| [`PadDynamicalDecoupling`](qiskit_ibm_provider.transpiler.passes.scheduling.PadDynamicalDecoupling "qiskit_ibm_provider.transpiler.passes.scheduling.PadDynamicalDecoupling")(durations, dd\_sequences) | Dynamical decoupling insertion pass for IBM dynamic circuit backends. |

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB