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

Add dynamical decoupling pass#367

Merged
kt474 merged 73 commits into
Qiskit:mainfrom
taalexander:add-dynamical-decoupling-pass
Aug 24, 2022
Merged

Add dynamical decoupling pass#367
kt474 merged 73 commits into
Qiskit:mainfrom
taalexander:add-dynamical-decoupling-pass

Conversation

@taalexander
Copy link
Copy Markdown
Contributor

Summary

This PR adds a dynamical decoupling pass for IBM dynamical circuit backends. It is based on the contents of #365 and should only be merged after.

Details and comments

@coveralls
Copy link
Copy Markdown

coveralls commented Jul 7, 2022

Pull Request Test Coverage Report for Build 2837041673

  • 322 of 339 (94.99%) changed or added relevant lines in 7 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage increased (+3.6%) to 36.844%

Changes Missing Coverage Covered Lines Changed/Added Lines %
qiskit_ibm_provider/transpiler/passes/scheduling/block_base_padder.py 93 96 96.88%
qiskit_ibm_provider/transpiler/passes/scheduling/scheduler.py 92 95 96.84%
qiskit_ibm_provider/transpiler/passes/scheduling/dynamical_decoupling.py 112 123 91.06%
Totals Coverage Status
Change from base Build 2799611551: 3.6%
Covered Lines: 2169
Relevant Lines: 5887

💛 - Coveralls

dd_sequence: Sequence of gates to apply in idle spots.
qubits: Physical qubits on which to apply DD.
If None, all qubits will undergo DD (when possible).
spacing: A list of spacings between the DD gates.
Copy link
Copy Markdown

@reza-j reza-j Jul 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need spacing between DD gates? I'm wondering if the DD gates still adds to identity if there are delays between them?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is sort of the definition of DD where you take a long delay and break it up into some different chunks. those chunks are the spacing here. They are identity for circuit transformation purposes.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, Ali! :)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# (3) Construct DD sequence with delays
num_elements = max(len(self._dd_sequence), len(taus))
idle_after = t_start
for dd_ind in range(num_elements):
Copy link
Copy Markdown

@reza-j reza-j Jul 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, we insert DD gates interleaved with delays (i.e., taus), right? Is there a scenario where len(self._dd_sequence)>len(taus), and we insert two DD gates with no delay in between? Do we need to check for that scenario and raise an error?

Copy link
Copy Markdown
Contributor Author

@taalexander taalexander Aug 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see the condition below if dd_ind < len(taus) and if dd_ind < len(self._dd_sequence): which effectively perform this error handling.

Comment on lines +188 to +202
# Check if DD sequence is identity
if num_pulses != 1:
if num_pulses % 2 != 0:
raise TranspilerError(
"DD sequence must contain an even number of gates (or 1)."
)
noop = np.eye(2)
for gate in self._dd_sequence:
noop = noop.dot(gate.to_matrix())
if not matrix_equal(noop, IGate().to_matrix(), ignore_phase=True):
raise TranspilerError(
"The DD sequence does not make an identity operation."
)
self._sequence_phase = np.angle(noop[0][0])
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, we multiply the DD gates to see if they add to identity. How about the delays we add in between the DD gates? Don't we need to multiply them as well?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The delay operation is the identity if we're in the frame of the qubits.

@taalexander taalexander force-pushed the add-dynamical-decoupling-pass branch from f53474a to 065b71d Compare August 11, 2022 02:49
@taalexander taalexander requested review from ajavadia and reza-j August 11, 2022 02:49
@kt474 kt474 merged commit 3a2a7f2 into Qiskit:main Aug 24, 2022
@mtreinish
Copy link
Copy Markdown
Member

Just a heads up related to this we're adding a backend interface for backend's to specify custom compilation stages: Qiskit/qiskit#8648 this is probably a good fit for this pass. Once that is released we should update dynamic circuits backends to add the hook point so that by default transpile() will always run this DD pass for the scheduling stage when targeting the backend.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants