Skip to content

Commit

Permalink
Merge 9daf3e4 into 23f79eb
Browse files Browse the repository at this point in the history
  • Loading branch information
purva-thakre committed Jul 15, 2021
2 parents 23f79eb + 9daf3e4 commit 9be54cf
Show file tree
Hide file tree
Showing 9 changed files with 517 additions and 2 deletions.
21 changes: 21 additions & 0 deletions doc/source/_apidoc/qutip_qip.decompose.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
qutip\_qip.decompose package
============================

Submodules
----------

qutip\_qip.decompose.single\_qubit\_gate module
-----------------------------------------------

.. automodule:: qutip_qip.decompose.single_qubit_gate
:members:
:undoc-members:
:show-inheritance:

Module contents
---------------

.. automodule:: qutip_qip.decompose
:members:
:undoc-members:
:show-inheritance:
9 changes: 9 additions & 0 deletions doc/source/_apidoc/qutip_qip.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Subpackages

qutip_qip.algorithms
qutip_qip.compiler
qutip_qip.decompose
qutip_qip.device
qutip_qip.operations
qutip_qip.transpiler
Expand Down Expand Up @@ -72,6 +73,14 @@ qutip\_qip.qubits module
:undoc-members:
:show-inheritance:

qutip\_qip.version module
-------------------------

.. automodule:: qutip_qip.version
:members:
:undoc-members:
:show-inheritance:

Module contents
---------------

Expand Down
29 changes: 28 additions & 1 deletion src/qutip_qip/circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
)
from .operations.gates import _gate_label
from qutip import basis, ket2dm, qeye
from qutip.qobj import Qobj
from qutip import Qobj
from qutip.measurement import measurement_statistics


Expand Down Expand Up @@ -2130,3 +2130,30 @@ def _apply_measurement(self, operation):
else:
raise NotImplementedError(
"mode {} is not available.".format(self.mode))

# For Decomposition functions
def decomposed_gates_to_circuit(decomposed_gate,num_qubits):
"""This function takes the input from a decomposition function and returns
a quantum circuit.
"""
# as decomposed_gate contains information about targets/control, there's no
# additional input of target here.
# In addition, there's no check if the gates are valid for number of qubits
# because this is done in a decomposition function before output.
if isinstance(decomposed_gate,tuple) == True:
q_circuit = QubitCircuit(num_qubits, reverse_states=False)
for i in decomposed_gate:
q_circuit.add_gate(i)
return(q_circuit)
else:
raise TypeError("Input is not a tuple of gates.")

def compute_unitary(quantum_circuit):
"""Evaluates all the gates in the quantum circuit.
"""
if isinstance(quantum_circuit, QubitCircuit) == True:
gate_list = quantum_circuit.propagators()
matrix_of_all_gates = gate_sequence_product(gate_list)
return(matrix_of_all_gates)
else:
raise TypeError("Input is not of type QubitCircuit.")
1 change: 1 addition & 0 deletions src/qutip_qip/decompose/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .single_qubit_gate import *
39 changes: 39 additions & 0 deletions src/qutip_qip/decompose/_utility.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import numpy as np
import cmath

from qutip import Qobj

class MethodError(Exception):
"""When invalid method is chosen, this error is raised.
"""
pass

class GateError(Exception):
"""When chosen method cannot be applied to the input gate, this error
is raised.
"""
pass


def check_gate(gate, num_qubits):
"""Verifies input is a valid quantum gate.
Parameters
----------
gate : :class:`qutip.Qobj`
The matrix that's supposed to be decomposed should be a Qobj.
num_qubits:
Number of qubits in the circuit.
Raises
------
TypeError
If the gate is not a Qobj.
ValueError
If the gate is not a unitary operator on qubits.
"""
if not isinstance(gate, Qobj):
raise TypeError("The input matrix is not a Qobj.")
if not gate.check_isunitary():
raise ValueError("Input is not unitary.")
if gate.dims != [[2] * num_qubits] * 2:
raise ValueError(f"Input is not a unitary on {num_qubits} qubits.")
Loading

0 comments on commit 9be54cf

Please sign in to comment.