qrisp.quantum_backtracking.QuantumBacktrackingTree.statevector#
- QuantumBacktrackingTree.statevector()[source]#
Returns a SymPy statevector object representing the state of the tree with decoded node labels.
- Returns:
- statesympy.Expr
A SymPy quantum state representing the statevector of the tree.
Examples
We create a QuantumBacktrackingTree with and investigate the action of the
quantum step diffuser
from qrisp import auto_uncompute, mcx, QuantumBool, QuantumFloat from qrisp.quantum_backtracking import QuantumBacktrackingTree @auto_uncompute def accept(tree): height_cond = (tree.h == 1) # The [0,1] node has height 1 path_cond = QuantumBool() mcx(list(tree.branch_qa)[1:], path_cond, ctrl_state="10") return path_cond & height_cond @auto_uncompute def reject(tree): height_cond = (tree.h == 2) # The [1] node has height 2 path_cond = QuantumBool() mcx(list(tree.branch_qa)[-1], path_cond, ctrl_state="1") return path_cond & height_cond
Create tree and initialize a node where neither accept nor reject are True.
>>> tree = QuantumBacktrackingTree(3, QuantumFloat(1, name = "branch_qf*"), accept, reject) >>> tree.init_node([0,0])
Evaluate statevector
>>> print(tree.statevector()) 1.0*|[0, 0]> >>> tree.qstep_diffuser(even = False) >>> print(tree.statevector()) -0.666660010814667*|[0, 0, 0]> - 0.666660010814667*|[0, 0, 1]> + 0.333330005407333*|[0, 0]>
We see that the
quantum step diffuser
moves the state to the children of the [0,0] node (ie. [0,0,0] and [0,0,1]).We now investigate how it behaves on nodes that are accepted/rejected:
Initiate a new tree
>>> tree = tree.copy() >>> tree.init_node([0,1]) >>> tree.qstep_diffuser(even = False) >>> tree.statevector() 1.0*|[0, 1]>
As expected, the accepted node is invariant.
To investigate the rejected node, we create another copy:
>>> tree = tree.copy() >>> tree.init_node([1]) >>> tree.qstep_diffuser(even = True) >>> tree.statevector() -1*|[1]>
As expected, the node has eigenvalue -1.
If you are unsure why these statevectors are eigenvector please check the paper.