Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def X(qubit: QubitDesignator) -> Gate:
"""Produces the X ("NOT") gate::
X = [[0, 1],
[1, 0]]
This gate is a single qubit X-gate.
:param qubit: The qubit apply the gate to.
:returns: A Gate object.
"""
return Gate(name="X", params=[], qubits=[unpack_qubit(qubit)])
def CPHASE01(angle: ParameterDesignator, control: QubitDesignator, target: QubitDesignator) -> Gate:
"""Produces a controlled-phase gate that phases the ``|01>`` state::
CPHASE01(phi) = diag([1.0, exp(1j * phi), 1.0, 1.0])
This gate applies to two qubit arguments to produce the variant of the controlled phase
instruction that affects the state 01.
:param angle: The input phase angle to apply when q1 is in the ``|1>`` state and q2 is in
the ``|0>`` state.
:param control: Qubit 1.
:param target: Qubit 2.
:returns: A Gate object.
"""
qubits = [unpack_qubit(q) for q in (control, target)]
return Gate(name="CPHASE01", params=[angle], qubits=qubits)
def CNOT(control: QubitDesignator, target: QubitDesignator) -> Gate:
"""Produces a controlled-NOT (controlled-X) gate::
CNOT = [[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 1, 0]]
This gate applies to two qubit arguments to produce the controlled-not gate instruction.
:param control: The control qubit.
:param target: The target qubit. The target qubit has an X-gate applied to it if the control
qubit is in the ``|1>`` state.
:returns: A Gate object.
"""
return Gate(name="CNOT", params=[], qubits=[unpack_qubit(q) for q in (control, target)])
:param ISA isa: The instruction set architecture for a QPU.
:return: A sequence of Gate objects encapsulating all gates compatible with the ISA.
:rtype: Sequence[Gate]
"""
gates = []
for q in isa.qubits:
if q.dead:
# TODO: dead qubits may in the future lead to some implicit re-indexing
continue
if q.type in ["Xhalves"]:
gates.extend([
Gate("I", [], [unpack_qubit(q.id)]),
Gate("RX", [np.pi / 2], [unpack_qubit(q.id)]),
Gate("RX", [-np.pi / 2], [unpack_qubit(q.id)]),
Gate("RX", [np.pi], [unpack_qubit(q.id)]),
Gate("RX", [-np.pi], [unpack_qubit(q.id)]),
Gate("RZ", [THETA], [unpack_qubit(q.id)]),
])
else: # pragma no coverage
raise ValueError("Unknown qubit type: {}".format(q.type))
for e in isa.edges:
if e.dead:
continue
targets = [unpack_qubit(t) for t in e.targets]
if e.type in ["CZ", "ISWAP"]:
gates.append(Gate(e.type, [], targets))
gates.append(Gate(e.type, [], targets[::-1]))
elif e.type in ["CPHASE"]:
gates.append(Gate(e.type, [THETA], targets))
gates.append(Gate(e.type, [THETA], targets[::-1]))
else: # pragma no coverage
def T(qubit: QubitDesignator) -> Gate:
"""Produces the T gate::
T = [[1, 0],
[0, exp(1j * pi / 4)]]
This gate is a single qubit T-gate. It is the same as RZ(pi/4).
:param qubit: The qubit apply the gate to.
:returns: A Gate object.
"""
return Gate(name="T", params=[], qubits=[unpack_qubit(qubit)])
def SWAP(q1: QubitDesignator, q2: QubitDesignator) -> Gate:
"""Produces a SWAP gate which swaps the state of two qubits::
SWAP = [[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 1, 0, 0],
[0, 0, 0, 1]]
:param q1: Qubit 1.
:param q2: Qubit 2.
:returns: A Gate object.
"""
return Gate(name="SWAP", params=[], qubits=[unpack_qubit(q) for q in (q1, q2)])
def RESET(qubit_index: Optional[QubitDesignator] = None) -> Union[Reset, ResetQubit]:
"""
Reset all qubits or just one specific qubit.
:param qubit_index: The qubit to reset.
This can be a qubit's index, a Qubit, or a QubitPlaceholder.
If None, reset all qubits.
:returns: A Reset or ResetQubit Quil AST expression corresponding to a global or targeted
reset, respectively.
"""
if qubit_index is not None:
return ResetQubit(unpack_qubit(qubit_index))
else:
return Reset()
def I(qubit: QubitDesignator) -> Gate:
"""Produces the I identity gate::
I = [1, 0]
[0, 1]
This gate is a single qubit identity gate.
Note that this gate is different that the NOP instruction as noise channels
are typically still applied during the duration of identity gates. Identities will
also block parallelization like any other gate.
:param qubit: The qubit apply the gate to.
:returns: A Gate object.
"""
return Gate(name="I", params=[], qubits=[unpack_qubit(qubit)])
def RZ(angle: ParameterDesignator, qubit: QubitDesignator) -> Gate:
"""Produces the RZ gate::
RZ(phi) = [[cos(phi / 2) - 1j * sin(phi / 2), 0]
[0, cos(phi / 2) + 1j * sin(phi / 2)]]
This gate is a single qubit Z-rotation.
:param angle: The angle to rotate around the z-axis on the bloch sphere.
:param qubit: The qubit apply the gate to.
:returns: A Gate object.
"""
return Gate(name="RZ", params=[angle], qubits=[unpack_qubit(qubit)])
"""Produces a controlled-Z gate::
CZ = [[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, -1]]
This gate applies to two qubit arguments to produce the controlled-Z gate instruction.
:param control: The control qubit.
:param target: The target qubit. The target qubit has an Z-gate applied to it if the control
qubit is in the excited state.
:returns: A Gate object.
"""
return Gate(name="CZ", params=[], qubits=[unpack_qubit(q) for q in (control, target)])