Litinski transform (based on Rustiq) #14753
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Implements the Litinski transform as a Qiskit transformation pass, as requested in #14657.
The input to the pass is a circuit with Clifford and single-qubit RZ-rotation gates, and the output is a circuit with multi-qubit Pauli rotations (implemented as
PauliEvolutionGate
gates) followed by Clifford gates. (Note that by returning the Clifford gates rather than the Clifford operator we preserve the global phase of the circuit).Currently the set of supported Clifford gates is
["cx", "cz", "h", "s", "sdg", "sx", "sxdg", "x", "y", "z"]
and the set of supported RZ-rotations is["t", "tdg", "rz"]
(we automatically convert T and Tdg gates to RZ-rotations, note that this changes the global phase of the circuit).Details and comments
This is a joint work with @Cryoris. The implementation calls Simon Martiel's Rustiq code, a package that is already used in Qiskit for synthesizing Pauli Evolution gates. In parallel, @ShellyGarion is working on a native Qiskit rust implementation of Pauli and Clifford classes (see #14677), that will allow to replace the call to Rustiq by a Qiskit-native implementation. The reason for this is that longer-term we need to be able to extend/adjust the implementation and it would be nice to have the flexibility to do this directly in Qiskit.
ToDo: