Source code for qwak_cupy.QuantumWalk
from __future__ import annotations
import warnings
import cupy as cp
import json
from utils.jsonTools import json_matrix_to_complex, complex_matrix_to_json
from qwak_cupy.Operator import Operator
from qwak_cupy.State import State
warnings.filterwarnings("ignore")
[docs]
class QuantumWalk:
def __init__(self, state: State, operator: Operator) -> None:
self._n = state.getDim()
self._initState = state
self._operator = operator
self._finalState = State(self._n)
[docs]
def buildWalk(self, initState: State = None,
operator: Operator = None) -> None:
if initState is not None:
self._initState = initState
if operator is not None:
self._operator = operator
self._finalState.setStateVec(
cp.matmul(
self._operator.getOperator(),
self._initState.getStateVec()))
[docs]
def resetWalk(self) -> None:
self._operator.resetOperator()
self._initState.resetState()
self._finalState.resetState()
[docs]
def setOperator(self, newOperator: Operator) -> None:
self._operator.setOperator(newOperator)
[docs]
def setWalk(self, newWalk: QuantumWalk) -> None:
self._initState.setState(newWalk.getInitState())
self._operator.setOperator(newWalk.getOperator())
self._finalState.setState(newWalk.getFinalState())
[docs]
def setFinalState(self, newFinalState: State) -> None:
self._finalState.setState(newFinalState)
[docs]
def searchNodeAmplitude(self, searchNode: int) -> complex:
return self._finalState.getStateVec()[searchNode][0]
[docs]
def transportEfficiency(self) -> float:
return 1 - cp.trace(self._finalState @ self._finalState.herm())
def __str__(self) -> str:
return f"{self._finalState.getStateVec()}"
def __repr__(self) -> str:
return f"N: {self._n}\n" \
f"Init State:\n\t {self._initState}\n" \
f"Operator:\n\t{self._operator}\n"\
f"Final State:\n\t{self._finalState}"