Skip to content

Commit 04bbfa9

Browse files
committed
planted noisy kXOR algorithm
1 parent fbb031b commit 04bbfa9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+14302
-20
lines changed

dev_tools/autogenerate-bloqs-notebooks-v2.py

+72
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import qualtran.bloqs.block_encoding.phase
7373
import qualtran.bloqs.block_encoding.product
7474
import qualtran.bloqs.block_encoding.sparse_matrix
75+
import qualtran.bloqs.block_encoding.sparse_matrix_hermitian
7576
import qualtran.bloqs.block_encoding.tensor_product
7677
import qualtran.bloqs.block_encoding.unitary
7778
import qualtran.bloqs.bookkeeping
@@ -111,6 +112,18 @@
111112
import qualtran.bloqs.gf_arithmetic.gf2_multiplication
112113
import qualtran.bloqs.gf_arithmetic.gf2_square
113114
import qualtran.bloqs.hamiltonian_simulation.hamiltonian_simulation_by_gqsp
115+
import qualtran.bloqs.max_k_xor_sat
116+
import qualtran.bloqs.max_k_xor_sat.arithmetic
117+
import qualtran.bloqs.max_k_xor_sat.arithmetic.has_duplicates
118+
import qualtran.bloqs.max_k_xor_sat.arithmetic.sort_in_place
119+
import qualtran.bloqs.max_k_xor_sat.arithmetic.symmetric_difference
120+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian
121+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian
122+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.walk_operator
123+
import qualtran.bloqs.max_k_xor_sat.guiding_state
124+
import qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding
125+
import qualtran.bloqs.max_k_xor_sat.load_kxor_instance
126+
import qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor
114127
import qualtran.bloqs.mcmt.and_bloq
115128
import qualtran.bloqs.mcmt.controlled_via_and
116129
import qualtran.bloqs.mcmt.ctrl_spec_and
@@ -746,6 +759,13 @@
746759
module=qualtran.bloqs.block_encoding.sparse_matrix,
747760
bloq_specs=[qualtran.bloqs.block_encoding.sparse_matrix._SPARSE_MATRIX_DOC],
748761
),
762+
NotebookSpecV2(
763+
title='Sparse Matrix (Hermitian)',
764+
module=qualtran.bloqs.block_encoding.sparse_matrix_hermitian,
765+
bloq_specs=[
766+
qualtran.bloqs.block_encoding.sparse_matrix_hermitian._SPARSE_MATRIX_HERMITIAN_DOC
767+
],
768+
),
749769
NotebookSpecV2(
750770
title='Chebyshev Polynomial',
751771
module=qualtran.bloqs.block_encoding.chebyshev_polynomial,
@@ -875,6 +895,57 @@
875895
],
876896
),
877897
]
898+
# --------------------------------------------------------------------------
899+
# ----- Quartic Speedups paper ------------------------------------------
900+
# --------------------------------------------------------------------------
901+
ALGO_QUARTIC_SPEEDUPS = [
902+
# ----- Preliminaries ------------------------------------------
903+
NotebookSpecV2(
904+
title='Guided (sparse) Hamiltonian Problem',
905+
module=qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian,
906+
bloq_specs=[
907+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_DOC,
908+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_PHASE_ESTIMATION_DOC,
909+
],
910+
),
911+
NotebookSpecV2(
912+
title='Arithmetic Primitives',
913+
module=qualtran.bloqs.max_k_xor_sat.arithmetic,
914+
bloq_specs=[
915+
qualtran.bloqs.max_k_xor_sat.arithmetic.sort_in_place._SORT_IN_PLACE_DOC,
916+
qualtran.bloqs.max_k_xor_sat.arithmetic.symmetric_difference._SYMMETRIC_DIFFERENCE_DOC,
917+
qualtran.bloqs.max_k_xor_sat.arithmetic.has_duplicates._HAS_DUPLICATES_DOC,
918+
],
919+
),
920+
# ----- Algorithm ------------------------------------------
921+
NotebookSpecV2(
922+
title='kXOR: Instance load Oracles',
923+
module=qualtran.bloqs.max_k_xor_sat.load_kxor_instance,
924+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.load_kxor_instance._LOAD_INSTANCE_DOC],
925+
),
926+
NotebookSpecV2(
927+
title='Noisy kXOR: Guiding State',
928+
module=qualtran.bloqs.max_k_xor_sat.guiding_state,
929+
bloq_specs=[
930+
qualtran.bloqs.max_k_xor_sat.guiding_state._SIMPLE_GUIDING_STATE_DOC,
931+
qualtran.bloqs.max_k_xor_sat.guiding_state._GUIDING_STATE_DOC,
932+
],
933+
),
934+
NotebookSpecV2(
935+
title='Noisy kXOR: Block-encoding the Kikuchi Matrix',
936+
module=qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding,
937+
bloq_specs=[
938+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_matrix._KIKUCHI_MATRIX_ENTRY_DOC,
939+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_list._KIKUCHI_NONZERO_INDEX_DOC,
940+
qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding._KIKUCHI_HAMILTONIAN_DOC,
941+
],
942+
),
943+
NotebookSpecV2(
944+
title='Algorithm: Planted Noise kXOR',
945+
module=qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor,
946+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor._PLANTED_NOISY_KXOR_DOC],
947+
),
948+
]
878949

879950
# --------------------------------------------------------------------------
880951
# ----- Concepts -------------------------------------------------------
@@ -902,6 +973,7 @@
902973
('GF Arithmetic', GF_ARITHMETIC),
903974
('Rotations', ROT_QFT_PE),
904975
('Block Encoding', BLOCK_ENCODING),
976+
('Paper: Quartic Quantum Speedups for Planted Inference', ALGO_QUARTIC_SPEEDUPS),
905977
('Other', OTHER),
906978
]
907979

docs/bloqs/index.rst

+12
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,21 @@ Bloqs Library
129129
block_encoding/phase.ipynb
130130
block_encoding/linear_combination.ipynb
131131
block_encoding/sparse_matrix.ipynb
132+
block_encoding/sparse_matrix_hermitian.ipynb
132133
block_encoding/chebyshev_polynomial.ipynb
133134
block_encoding/lcu_block_encoding.ipynb
134135

136+
.. toctree::
137+
:maxdepth: 2
138+
:caption: Paper: Quartic Quantum Speedups for Planted Inference:
139+
140+
max_k_xor_sat/guided_hamiltonian/guided_hamiltonian.ipynb
141+
max_k_xor_sat/arithmetic/arithmetic.ipynb
142+
max_k_xor_sat/load_kxor_instance.ipynb
143+
max_k_xor_sat/guiding_state.ipynb
144+
max_k_xor_sat/kikuchi_block_encoding.ipynb
145+
max_k_xor_sat/planted_noisy_kxor.ipynb
146+
135147
.. toctree::
136148
:maxdepth: 2
137149
:caption: Other:

qualtran/bloqs/arithmetic/sorting.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
bloq_example,
2424
BloqBuilder,
2525
BloqDocSpec,
26+
DecomposeNotImplementedError,
2627
DecomposeTypeError,
2728
QBit,
2829
QUInt,
@@ -222,8 +223,6 @@ def __attrs_post_init__(self):
222223
k = self.half_length
223224
if not is_symbolic(k):
224225
assert k >= 1, "length of input lists must be positive"
225-
# TODO(#1090) support non-power-of-two input lengths
226-
assert (k & (k - 1)) == 0, "length of input lists must be a power of 2"
227226

228227
@cached_property
229228
def signature(self) -> 'Signature':
@@ -249,14 +248,16 @@ def is_symbolic(self):
249248
def build_composite_bloq(
250249
self, bb: 'BloqBuilder', xs: 'SoquetT', ys: 'SoquetT'
251250
) -> dict[str, 'SoquetT']:
252-
if is_symbolic(self.half_length):
251+
k = self.half_length
252+
if is_symbolic(k):
253253
raise DecomposeTypeError(f"Cannot decompose symbolic {self=}")
254+
if (k & (k - 1)) == 0:
255+
# TODO(#1090) support non-power-of-two input lengths
256+
raise DecomposeNotImplementedError("length of input lists must be a power of 2")
254257

255258
assert isinstance(xs, np.ndarray)
256259
assert isinstance(ys, np.ndarray)
257260

258-
k = self.half_length
259-
260261
first_round_junk = []
261262
for i in range(k):
262263
xs[i], ys[k - 1 - i], anc = bb.add(Comparator(self.bitsize), a=xs[i], b=ys[k - 1 - i])

qualtran/bloqs/basic_gates/x_basis.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,14 @@ def my_tensors(
227227

228228
def get_ctrl_system(self, ctrl_spec: 'CtrlSpec') -> Tuple['Bloq', 'AddControlledT']:
229229
from qualtran.bloqs.basic_gates import CNOT, Toffoli
230+
from qualtran.bloqs.mcmt import ControlledViaAnd
230231

231232
if ctrl_spec == CtrlSpec():
232233
bloq: 'Bloq' = CNOT()
233234
elif ctrl_spec == CtrlSpec(cvs=(1, 1)):
234235
bloq = Toffoli()
235236
else:
236-
return super().get_ctrl_system(ctrl_spec)
237+
return ControlledViaAnd.make_ctrl_system(self, ctrl_spec)
237238

238239
def add_controlled(
239240
bb: 'BloqBuilder', ctrl_soqs: Sequence['SoquetT'], in_soqs: Dict[str, 'SoquetT']

qualtran/bloqs/block_encoding/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@
2323
from qualtran.bloqs.block_encoding.phase import Phase
2424
from qualtran.bloqs.block_encoding.product import Product
2525
from qualtran.bloqs.block_encoding.sparse_matrix import SparseMatrix
26+
from qualtran.bloqs.block_encoding.sparse_matrix_hermitian import SparseMatrixHermitian
2627
from qualtran.bloqs.block_encoding.tensor_product import TensorProduct
2728
from qualtran.bloqs.block_encoding.unitary import Unitary

qualtran/bloqs/block_encoding/block_encoding_base.py

+8
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,14 @@ def ancilla_bitsize(self) -> SymbolicInt:
8484
def resource_bitsize(self) -> SymbolicInt:
8585
"""The number of resource qubits not counted in ancillas."""
8686

87+
@property
88+
def ctrl_bitsize(self) -> SymbolicInt:
89+
"""The number of control qubits, useful to define optimized custom controlled circuits.
90+
91+
Usually either 0 or 1, as all other control cases can be reduced to 1.
92+
"""
93+
return 0
94+
8795
@property
8896
@abc.abstractmethod
8997
def epsilon(self) -> SymbolicFloat:

0 commit comments

Comments
 (0)