@@ -65,6 +65,7 @@ class QubitizationWalkOperator(SpecializedSingleQubitControlledGate):
6565 select : SelectOracle
6666 prepare : PrepareOracle
6767 control_val : Optional [int ] = None
68+ uncompute : bool = False
6869
6970 def __attrs_post_init__ (self ):
7071 assert self .select .control_registers == self .reflect .control_registers
@@ -102,10 +103,15 @@ def decompose_from_registers(
102103 ** quregs : NDArray [cirq .Qid ], # type:ignore[type-var]
103104 ) -> Iterator [cirq .OP_TREE ]:
104105 select_reg = {reg .name : quregs [reg .name ] for reg in self .select .signature }
105- yield self .select .on_registers (** select_reg )
106106
107107 reflect_reg = {reg .name : quregs [reg .name ] for reg in self .reflect .signature }
108- yield self .reflect .on_registers (** reflect_reg )
108+ if self .uncompute :
109+ yield self .reflect .adjoint ().on_registers (** reflect_reg )
110+ yield self .select .adjoint ().on_registers (** select_reg )
111+
112+ else :
113+ yield self .select .on_registers (** select_reg )
114+ yield self .reflect .on_registers (** reflect_reg )
109115
110116 def get_single_qubit_controlled_bloq (self , control_val : int ) -> 'QubitizationWalkOperator' :
111117 assert self .control_val is None
@@ -122,6 +128,9 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.Circ
122128 wire_symbols += ['W' ] * (total_bits (self .signature ) - total_bits (self .control_registers ))
123129 return cirq .CircuitDiagramInfo (wire_symbols = wire_symbols )
124130
131+ def adjoint (self ) -> 'QubitizationWalkOperator' :
132+ return attrs .evolve (self , uncompute = not self .uncompute )
133+
125134
126135@bloq_example (generalizer = [cirq_to_bloqs , ignore_split_join , ignore_cliffords ])
127136def _walk_op () -> QubitizationWalkOperator :
0 commit comments