Skip to content

Commit 1975b7d

Browse files
authored
Add explicit adjoint for qubitization walk operator (#937)
1 parent 2047148 commit 1975b7d

4 files changed

Lines changed: 33 additions & 3 deletions

File tree

qualtran/bloqs/hamiltonian_simulation/hamiltonian_simulation_by_gqsp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def build_composite_bloq(self, bb: 'BloqBuilder', **soqs: 'SoquetT') -> Dict[str
177177
bb.free(soq)
178178
else:
179179
for soq_element in soq:
180-
bb.free(cast(Soquet, soq))
180+
bb.free(cast(Soquet, soq_element))
181181

182182
return soqs
183183

qualtran/bloqs/hamiltonian_simulation/hamiltonian_simulation_by_gqsp_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,8 @@ def test_hamiltonian_simulation_by_gqsp(
9595
select_bitsize, target_bitsize, random_state=random_state
9696
)
9797
verify_hamiltonian_simulation_by_gqsp(W, H.matrix(), t=t, precision=precision)
98+
99+
100+
def test_hamiltonian_simulation_by_gqsp_t_complexity():
101+
hubbard_time_evolution_by_gqsp = _hubbard_time_evolution_by_gqsp.make()
102+
_ = hubbard_time_evolution_by_gqsp.t_complexity()

qualtran/bloqs/qubitization_walk_operator.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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])
127136
def _walk_op() -> QubitizationWalkOperator:

qualtran/bloqs/qubitization_walk_operator_test.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,22 @@ def test_qubitization_walk_operator(num_sites: int, eps: float):
9797
)
9898

9999

100+
def test_qubitization_walk_operator_adjoint():
101+
num_sites, eps = 4, 2e-1
102+
ham = get_1d_ising_hamiltonian(cirq.LineQubit.range(num_sites))
103+
walk = walk_operator_for_pauli_hamiltonian(ham, eps)
104+
walk_inv_tensor = walk.adjoint().tensor_contract()
105+
walk_adj_tensor = Adjoint(walk).tensor_contract()
106+
np.testing.assert_allclose(walk_inv_tensor, walk_adj_tensor)
107+
108+
109+
def test_t_complexity_for_controlled_and_adjoint():
110+
num_sites, eps = 4, 2e-1
111+
ham = get_1d_ising_hamiltonian(cirq.LineQubit.range(num_sites))
112+
walk = walk_operator_for_pauli_hamiltonian(ham, eps)
113+
assert walk.controlled().adjoint().t_complexity() == walk.adjoint().controlled().t_complexity()
114+
115+
100116
def test_qubitization_walk_operator_diagrams():
101117
num_sites, eps = 4, 1e-1
102118
walk = get_walk_operator_for_1d_ising_model(num_sites, eps)

0 commit comments

Comments
 (0)