some docs

This commit is contained in:
Daniel Tsvetkov 2019-12-04 17:26:41 +01:00
parent 32ba69a3b2
commit e912506375

View File

@ -1,5 +1,6 @@
import numpy as np
# Raw matrixes to be used for initialization of qubits and gates
__0 = [[1],
[0]]
@ -40,10 +41,21 @@ _CNOT = [
class State(object):
"""Represents a quantum state"""
def __init__(self, matrix_state):
"""
Can be initialized with a matrix, e.g. for |0> this is [[0],[1]]
:param matrix_state: a matrix representing the quantum state
"""
self.matrix_state = np.array(matrix_state)
def __getitem__(self, item):
"""
Kind of hacky way to store a substate of an item for use in Gate operations
so that one can use state[0] and the encompassing operator can access this.
:param item:
:return:
"""
if item >= len(self):
raise IndexError
self.item = item
@ -70,9 +82,11 @@ def kron(_list):
class Gate(State):
def on(self, state):
"""
Applies
:param state: another state (e.g. H(q1) or a list of states (e.g. for CNOT([q1, q2]))
:return:
Applies a gate operation on a state.
If applying to a substate, use the index of the substate, e.g. `H.on(bell[0])` will apply the Hadamard gate
on the 0th qubit of the `bell` state.
:param state: another state (e.g. `H.on(q1)` or a list of states (e.g. for `CNOT.on([q1, q2])`)
:return: the state after the application of the Gate
"""
this_state = self.matrix_state
if type(state) == list:
@ -81,7 +95,8 @@ class Gate(State):
other_state = state.matrix_state
if this_state.shape[1] != other_state.shape[0]:
# The two arrays are different sizes
# Use the Kronicker product of Identity with the state.item
# Use the Kronicker product of Identity with the state.item where
# state.item is the substate
larger_side = max(this_state.shape[1], this_state.shape[0])
_list = [this_state if i == state.item else _I for i in range(larger_side)]
this_state = kron(_list)