-
Notifications
You must be signed in to change notification settings - Fork 67
Add option to no pad idle qubits in scheduling passes #725
Add option to no pad idle qubits in scheduling passes #725
Conversation
This commit adds a new flag to the scheduling padding passes, schedule_idle_qubits, which is used to opt-in to scheduling idle qubits. By default these passes will only schedule qubits which are active. This is a change in behavior from before where the previous default is all qubits were scheduled. This was undesireable because it's adding uneceesary instructions to the job payload which will need to be processed which are effectively a no-op. The only real use case for adding delays to idle wires is visualization, so it's left as an option to re-enable the previous default. Fixes Qiskit#723 Co-authored-by: Thomas Alexander <thomas.a.alexander@ibm.com>
1eb804c
to
ba5e587
Compare
This is great, thank you! |
@@ -420,7 +437,7 @@ def _visit_control_flow_op(self, node: DAGNode) -> None: | |||
self._add_block_terminating_barrier(block_idx, t0, node) | |||
|
|||
# Only pad non-fast path nodes | |||
fast_path_node = node in self._fast_path_nodes | |||
fast_path_node = node in self._fast_path_nodes or not self._schedule_idle_qubits |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
only nitpicking here, perhaps rename fast_path_node
to skip_padding
or something like that, as there are two different conditions for that to happen
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On a second thought, I'm not sure we want to disable padding within the control flow here. As a result of this (and related changes at L163-169), this circuit will miss padding (and potentially DD) in the conditional block:
creg = ClassicalRegister(1)
qreg = QuantumRegister(3)
circ = QuantumCircuit(qreg,creg)
circ.sx(qreg[0])
circ.x(qreg[1])
circ.sx(qreg[2])
circ.barrier()
circ.measure(0,creg[0])
with circ.if_test((creg[0], 0)):
circ.x(qreg[1])
Whereas the expected behavior should be (reverting those changes):
I think qiskit-ibm-provider/qiskit_ibm_provider/transpiler/passes/scheduling/dynamical_decoupling.py Line 187 in 49390e0
schedule_idle_qubits argument for the parent constructor
|
Linked PR: mtreinish#1 |
Pad non-idle qubits in control flow blocks
* Update main 0.7.1 (#719) * Fix typing in `DAGCircuit.apply_operation_back` (#721) It is not valid typing (per the documentation) to pass `None` to `DAGCircuit.apply_operation_back` in either the `qargs` or `cargs` field, though this has been silently accepted previously to support mistaken code in the Terra schedulers, which this repository has inherited. * Update serialization for non-basic types (#715) * Update json.py * Update json.py * Added test for metadata serialization * added release notes * Moved test here from qiskit-ibm-runtime (#722) * Moved here from qiskit-ibm-runtime * Fixed imports * Removed code related to Schedule (#724) * Removed code related to Schedule, qubit_lo_freq, mea_lo_freq, schedule_los * black and lint * Returned lines in documentation that were removed by mistake * Fixed documentation * Put back range parameters * Removed auth parameter and migrate method (#727) * Removed auth parameter and migrate method * Updated documentation * black * Remove `qiskit-ibmq-provider` from `requirements-dev.txt` (#729) * Remove qiskit-ibmq-provider from requirements-dev.txt * Remove IBMQ * Breaking change in Qiskit 0.45 - Gate.duration setting (#732) * breaking change in Qiskit 0.45 * black * Bit.index is deprecated since Apr 2021 (#733) Co-authored-by: Kevin Tian <kevin.tian@ibm.com> * Update hms_to_seconds to support times greater than 1 day (#731) * Update hms_to_seconds * add reno * Add option to no pad idle qubits in scheduling passes (#725) * Add option to no pad idle qubits in scheduling passes This commit adds a new flag to the scheduling padding passes, schedule_idle_qubits, which is used to opt-in to scheduling idle qubits. By default these passes will only schedule qubits which are active. This is a change in behavior from before where the previous default is all qubits were scheduled. This was undesireable because it's adding uneceesary instructions to the job payload which will need to be processed which are effectively a no-op. The only real use case for adding delays to idle wires is visualization, so it's left as an option to re-enable the previous default. Fixes #723 Co-authored-by: Thomas Alexander <thomas.a.alexander@ibm.com> * Add missing inline type hint * Don't put barriers on idle qubits either * Fix formatting * Add schedule_idle_qubits to parent constructor * Reneable padding in control flow * Omit idle qubits in control flow * Run black --------- Co-authored-by: Thomas Alexander <thomas.a.alexander@ibm.com> Co-authored-by: Diego Ristè <10402430+dieris@users.noreply.github.com> Co-authored-by: Kevin Tian <kevin.tian@ibm.com> * Update test_jobs_filter (#738) * readjust test_convert_id_to_delay (#739) * readjust test_convert_id_to_delay * disable not-context-manager * duplicated entry * Exceptions should inherit from Terra where suitable (#741) * Changed inheritance of exception classes * Changed error type * Support method job.properties() (#742) * Implemented job.properties() method * release note * Updated documentation * Improved the tests --------- Co-authored-by: Kevin Tian <kevin.tian@ibm.com> * Use job creation date when returning backend properties in `job.properties()` (#746) * use job creation date in properties * add reno * remove datetime param * update test_job_backend_properties (#747) * Support shots as np.int64 (#744) * Fixed bug where shots defined as np.number * Added test * black * add reno --------- Co-authored-by: Kevin Tian <kevin.tian@ibm.com> * use qpy.load from terra (#751) * remove print statement in test (#752) * Prepare release 0.7.1 (#753) * Update main branch 0.7.2 (#754) * migrate pypi trusted publisher (#750) --------- Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: ItamarGoldman <51112651+ItamarGoldman@users.noreply.github.com> Co-authored-by: merav-aharoni <merav@il.ibm.com> Co-authored-by: Luciano Bello <bel@zurich.ibm.com> Co-authored-by: Matthew Treinish <mtreinish@kortar.org> Co-authored-by: Thomas Alexander <thomas.a.alexander@ibm.com> Co-authored-by: Diego Ristè <10402430+dieris@users.noreply.github.com>
Summary
This commit adds a new flag to the scheduling padding passes, schedule_idle_qubits, which is used to opt-in to scheduling idle qubits. By default these passes will only schedule qubits which are active. This is a change in behavior from before where the previous default is all qubits were scheduled. This was undesirable because it's adding unnecessary instructions to the job payload which will need to be processed which are effectively a no-op. The only real use case for adding delays to idle wires is visualization, so it's left as an option to re-enable the previous default.
Details and comments
Fixes #723