-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pauli measurement #5311
Closed
Closed
Pauli measurement #5311
Changes from 57 commits
Commits
Show all changes
65 commits
Select commit
Hold shift + click to select a range
d82d83c
add initial attempt at measurements
quantumjim da54a10
Merge pull request #1 from quantumjim/quantumjim-patch-1
quantumjim 8cb8e7a
make x and y measurements work
quantumjim a86e538
implement BasisTransformationMeasurement
Cryoris 9bf7a85
Merge pull request #2 from Cryoris/generalized-measurement
quantumjim 3c7ed38
move to PauliMeasure, inherit from Measure
Cryoris 7f86aa1
fix `measure_z` -> `measure`
Cryoris 9cafdfc
wrap z measure as well for safety
Cryoris 7caa860
Merge pull request #3 from Cryoris/generalized-measurement
quantumjim e3576b3
Merge branch 'master' into master
quantumjim 4ab06b7
Merge branch 'master' into generalized-measurement
Cryoris 1689c29
implement chris' suggestions
Cryoris 80d78aa
remove unused import
Cryoris 6d46013
more efficient pre/post rotation
Cryoris e2cecac
add comments on post rotation
Cryoris dcbaecf
add multi-measure capability
Cryoris 7cbc815
Merge branch 'master' into generalized-measurement
Cryoris c8bb9b8
Merge pull request #4 from Cryoris/generalized-measurement
quantumjim c1584ce
Merge branch 'master' into master
quantumjim bfe68a9
Merge branch 'master' into master
quantumjim 61ce727
fix post-rotation
quantumjim 3c9609e
Merge branch 'master' into master
quantumjim d42ba56
rename PauliMeasure to MeasurePauli
quantumjim 02a38ec
Merge branch 'master' into master
quantumjim 5cde967
Merge branch 'master' into master
quantumjim 712fcc0
Merge branch 'master' of github.com:quantumjim/qiskit-terra into paul…
Cryoris 7c5ace0
add visualization for single measurement
Cryoris 2b8afc3
add tests on circuit
Cryoris ead9d5a
add MPL drawing
Cryoris 97aa500
fix deprecated import
Cryoris 8b34961
fix basis color
Cryoris 67b42bf
fix broadcast to mpl
Cryoris 8c4f9c3
fix comments
Cryoris 7290ca6
Merge branch 'master' into pauli-measure
Cryoris 294694d
Merge pull request #5 from Cryoris/pauli-measure
quantumjim d253930
Merge branch 'master' into master
quantumjim 5292f48
Merge branch 'master' into master
Cryoris 3cce379
Merge PR 4024
yaelbh e31c090
Merge branch 'master' into 'meas_pauli'
yaelbh 4f94f47
Pauli measurement as instruction parameters
yaelbh 899a29e
changed name of pauli measure instruction
yaelbh be935d4
typo
yaelbh 67046dc
changed again instruction name, from pauli_measure to measure_pauli
yaelbh 0cc5513
take into account measure_pauli when there are conditionals
yaelbh 2848059
do not make controlled gate with pauli_measure
yaelbh 90b4976
a small fix
yaelbh c856bf9
added measure_pauli to the list of directives in dagdependency
yaelbh 3d582ce
Merge branch 'master' into meas_pauli
yaelbh 1226047
Merge branch 'master' into meas_pauli
yaelbh 2ee6c91
allow mesure_pauli to measure multiple qubits
yaelbh c299483
pycodestyle
yaelbh c865d2c
lint
yaelbh a710a27
bug fix in tests
yaelbh c339189
more lint
yaelbh fbb40e4
Merge branch 'master' into meas_pauli
yaelbh 3fe4cb0
Merge branch 'master' into meas_pauli
yaelbh 62b5365
empty commit to rerun CI
yaelbh e730e11
Merge branch 'master' into meas_pauli
yaelbh 1969ae8
fixing lint disable
yaelbh f298d0d
lint
yaelbh 35675d6
black
yaelbh 4c02392
fix to a valid color style
yaelbh e7a2449
lint disable cyclic import
yaelbh 9e75ab4
black
yaelbh f12f97b
Merge branch 'main' into meas_pauli
1ucian0 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -11,19 +11,21 @@ | |||||
# that they have been altered from the originals. | ||||||
|
||||||
""" | ||||||
Quantum measurement in the computational basis. | ||||||
Quantum measurement | ||||||
""" | ||||||
from qiskit.circuit import QuantumRegister, ClassicalRegister | ||||||
from qiskit.circuit.instruction import Instruction | ||||||
from qiskit.circuit.quantumcircuit import QuantumCircuit | ||||||
from qiskit.circuit.exceptions import CircuitError | ||||||
|
||||||
|
||||||
class Measure(Instruction): | ||||||
"""Quantum measurement in the computational basis.""" | ||||||
"""Quantum measurement""" | ||||||
|
||||||
def __init__(self): | ||||||
# pylint: disable=dangerous-default-value | ||||||
def __init__(self, name='measure', num_qubits=1, num_clbits=1, params=[]): | ||||||
"""Create new measurement instruction.""" | ||||||
super().__init__("measure", 1, 1, []) | ||||||
super().__init__(name, num_qubits, num_clbits, params=params) | ||||||
|
||||||
def broadcast_arguments(self, qargs, cargs): | ||||||
qarg = qargs[0] | ||||||
|
@@ -57,3 +59,80 @@ def measure(self, qubit, cbit): | |||||
|
||||||
|
||||||
QuantumCircuit.measure = measure | ||||||
|
||||||
|
||||||
class MeasurePauli(Measure): | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See https://github.com/Qiskit/qiskit-terra/pull/5311/files#r810538319
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Strong +1. MeasurePauli should not be a subclass of Measure. |
||||||
"""Perform a measurement with preceding basis change operations.""" | ||||||
|
||||||
def __init__(self, basis, num_qubits, num_clbits): | ||||||
"""Create a new basis transformation measurement. | ||||||
|
||||||
Args: | ||||||
basis (str): The target measurement basis, | ||||||
consists of the characters 'X', 'Y', and 'Z'. | ||||||
num_qubits (integer): number of qubits to measure. | ||||||
num_clbits (integer): number of classical bits. | ||||||
|
||||||
Raises: | ||||||
ValueError: If an unsupported basis is specified, | ||||||
or in case of mismatch between the number of qubits, | ||||||
classical bits, and basis length. | ||||||
""" | ||||||
|
||||||
params = [] | ||||||
for qubit_basis in basis.upper(): | ||||||
if qubit_basis not in ['X', 'Y', 'Z']: | ||||||
raise ValueError('Unsupported measurement basis, choose either of X, Y, or Z.') | ||||||
params.append(qubit_basis) | ||||||
|
||||||
if num_qubits != num_clbits or num_qubits != len(basis): | ||||||
raise ValueError('Mismatch between the number of qubits, \ | ||||||
classical bits, and basis length.') | ||||||
|
||||||
super().__init__('measure_pauli', num_qubits, num_clbits, params) | ||||||
|
||||||
def broadcast_arguments(self, qargs, cargs): | ||||||
yield [qarg[0] for qarg in qargs], \ | ||||||
[carg[0] for carg in cargs] | ||||||
|
||||||
def _define(self): | ||||||
definition = [] | ||||||
q = QuantumRegister(self.num_qubits, 'q') | ||||||
c = ClassicalRegister(self.num_clbits, 'c') | ||||||
|
||||||
# pylint: disable=cyclic-import | ||||||
from .library import HGate, SGate, SdgGate | ||||||
|
||||||
for i, qubit_basis in enumerate(self.params): | ||||||
if qubit_basis == 'X': | ||||||
pre_rotation = post_rotation = [HGate()] | ||||||
elif qubit_basis == 'Y': | ||||||
# since measure and S commute, S and Sdg cancel each other | ||||||
pre_rotation = [SdgGate(), HGate()] | ||||||
post_rotation = [HGate(), SGate()] | ||||||
else: # Z | ||||||
pre_rotation = post_rotation = [] | ||||||
|
||||||
# switch to the measurement basis | ||||||
for gate in pre_rotation: | ||||||
definition += [(gate, [q[i]], [])] | ||||||
|
||||||
# measure | ||||||
definition += [(Measure(), [q[i]], [c[i]])] | ||||||
|
||||||
# apply inverse basis transformation for correct post-measurement state | ||||||
for gate in post_rotation: | ||||||
definition += [(gate, [q[i]], [])] | ||||||
|
||||||
qc = QuantumCircuit(q, c) | ||||||
qc._data = definition | ||||||
self.definition = qc | ||||||
|
||||||
|
||||||
def measure_pauli(self, basis, qubits, clbits): | ||||||
"""Measure in the the Pauli X, Y, or Z basis.""" | ||||||
return self.append(MeasurePauli(basis, len(qubits), len(clbits)), | ||||||
qubits, clbits) | ||||||
|
||||||
|
||||||
QuantumCircuit.measure_pauli = measure_pauli |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
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.
I would leave this file as it is and move
measure_pauli
to its own file.