Source code for mimiqcircuits.operations.reset

#
# Copyright © 2022-2024 University of Strasbourg. All Rights Reserved.
# Copyright © 2032-2024 QPerfect. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from mimiqcircuits.operations.krauschannel import krauschannel
import mimiqcircuits as mc


def _check_normaliz_length(normaliz, expected_length):
    if len(normaliz) != expected_length:
        raise ValueError(f"normaliz must be a list of length {expected_length}.")


[docs] class Reset(krauschannel): """Reset operation. Quantum operation that resets the status of one qubit to the :math:`\\ket{0}` state. .. warning:: This operation is non-reversible. Examples: Adding Reset operation to the Circuit (The args can be: range, list, tuple, set or int) >>> from mimiqcircuits import * >>> c= Circuit() >>> c.push(Reset(), 0) 1-qubit circuit with 1 instructions: └── Reset @ q[0] <BLANKLINE> >>> from mimiqcircuits import * >>> c= Circuit() >>> c.push(Reset(),(0,1,2)) 3-qubit circuit with 3 instructions: ├── Reset @ q[0] ├── Reset @ q[1] └── Reset @ q[2] <BLANKLINE> .. seealso:: :class:`ResetX`, :class:`ResetY`, :class:`ResetZ` - Variants of the Reset operation along different axes. """ _name = "Reset" _num_qubits = 1 _num_bits = 0 _qregsizes = [1]
[docs] def inverse(self): raise TypeError("Reset is not inversible")
[docs] def power(self, pwr): raise TypeError("Reset^p is not defined.")
[docs] def control(self, num_qubits): raise TypeError("Controlled Reset is not defined.")
[docs] def iswrapper(self): return False
def _matrix(self): raise AttributeError("Reset has no attribute 'matrix'.") def __str__(self): return f"{self._name}"
[docs] def asciiwidth(self, qubits, bits, zvars): return 5
[docs] def krausoperators(self, normaliz=None): if normaliz is None: normaliz = [1, 1] _check_normaliz_length(normaliz, 2) return [mc.Projector0(1 / normaliz[0]), mc.SigmaMinus(1 / normaliz[1])]
def __str__(self): return self._name
[docs] class ResetX(krauschannel): """ResetX operation. This operation is performed by applying a Hadamard gate (H) to the qubit, which transforms the qubit from the computational basis (:math:`\\ket{0}` or :math:`\\ket{1}`) to the superposition basis (:math:`\\ket{+}` or :math:`\\ket{-}`). After applying the Hadamard gate, a standard Reset operation is performed, resetting the qubit to the :math:`\\ket{0}` state. Finally, another Hadamard gate is applied to convert the :math:`\\ket{0}` state back into the :math:`\\ket{+}` state. .. warning:: This operation is non-reversible. Examples: >>> from mimiqcircuits import * >>> c= Circuit() >>> c.push(ResetX(), 0) 1-qubit circuit with 1 instructions: └── ResetX @ q[0] <BLANKLINE> >>> c.decompose() 1-qubit circuit with 3 instructions: ├── H @ q[0] ├── Reset @ q[0] └── H @ q[0] <BLANKLINE> .. seealso:: :class:`Reset`, :class:`ResetY`, :class:`ResetZ` - Variants of the Reset operation along different axes. """ _name = "ResetX" _num_qubits = 1 _num_bits = 0 _num_zvars = 0 _qregsizes = [1]
[docs] def inverse(self): raise TypeError("ResetX is not inversible")
[docs] def power(self, pwr): raise TypeError("ResetX^p is not defined.")
[docs] def control(self, num_qubits): raise TypeError("Controlled ResetX is not defined.")
[docs] def iswrapper(self): return False
def _matrix(self): raise AttributeError("ResetX has no attribute 'matrix'.") def __str__(self): return self._name def _decompose(self, circ: mc.Circuit, qtargets, bits=None, zvars=None): q = qtargets[0] circ.push(mc.GateH(), q) circ.push(Reset(), q) circ.push(mc.GateH(), q) return circ
[docs] class ResetY(krauschannel): """ResetY operation. The `ResetY` operation works by first rotating the qubit's state so that the Y-axis aligns with the Z-axis, applying a standard reset (which resets the qubit to the :math:`\\ket{0}` state), and then rotating the qubit back to its original basis. .. warning:: This operation is non-reversible. Examples: >>> from mimiqcircuits import * >>> c = Circuit() >>> c.push(ResetY(), 0) 1-qubit circuit with 1 instructions: └── ResetY @ q[0] <BLANKLINE> >>> c.decompose() 1-qubit circuit with 3 instructions: ├── HYZ @ q[0] ├── Reset @ q[0] └── HYZ @ q[0] <BLANKLINE> .. seealso:: :class:`Reset`, :class:`ResetX`, :class:`ResetZ` - Variants of the Reset operation along different axes. """ _name = "ResetY" _num_qubits = 1 _num_bits = 0 _qregsizes = [1]
[docs] def inverse(self): raise TypeError("ResetY is not inversible")
[docs] def power(self, pwr): raise TypeError("ResetY^p is not defined.")
[docs] def control(self, num_qubits): raise TypeError("Controlled ResetY is not defined.")
[docs] def iswrapper(self): return False
def _matrix(self): raise AttributeError("ResetY has no attribute 'matrix'.") def __str__(self): return self._name def _decompose(self, circ: mc.Circuit, qtargets, bits=None, zvars=None): q = qtargets[0] circ.push(mc.GateHYZ(), q) circ.push(Reset(), q) circ.push(mc.GateHYZ(), q) return circ
[docs] class ResetZ(krauschannel): """ResetZ operation. Quantum operation that resets the status of one qubit to the :math:`\\ket{0}` state along the Z-axis. This operation is an alias of the :class:`Reset` operation. .. warning:: This operation is non-reversible. Examples: >>> from mimiqcircuits import * >>> c= Circuit() >>> c.push(ResetZ(), 0) 1-qubit circuit with 1 instructions: └── Reset @ q[0] <BLANKLINE> >>> c.decompose() 1-qubit circuit with 1 instructions: └── Reset @ q[0] <BLANKLINE> .. seealso:: :class:`Reset`, :class:`ResetX`, :class:`ResetY` - Variants of the Reset operation along different axes. """ def __new__(self): return Reset()
# export operations __all__ = ["Reset", "ResetX", "ResetY", "ResetZ"]