Skip to content

Commit 140c68b

Browse files
committed
planted noisy kXOR algorithm
1 parent 542ffc5 commit 140c68b

Some content is hidden

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

57 files changed

+14287
-22
lines changed

dev_tools/autogenerate-bloqs-notebooks-v2.py

Lines changed: 72 additions & 0 deletions
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
@@ -106,6 +107,18 @@
106107
import qualtran.bloqs.factoring.ecc
107108
import qualtran.bloqs.factoring.mod_exp
108109
import qualtran.bloqs.hamiltonian_simulation.hamiltonian_simulation_by_gqsp
110+
import qualtran.bloqs.max_k_xor_sat
111+
import qualtran.bloqs.max_k_xor_sat.arithmetic
112+
import qualtran.bloqs.max_k_xor_sat.arithmetic.has_duplicates
113+
import qualtran.bloqs.max_k_xor_sat.arithmetic.sort_in_place
114+
import qualtran.bloqs.max_k_xor_sat.arithmetic.symmetric_difference
115+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian
116+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian
117+
import qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.walk_operator
118+
import qualtran.bloqs.max_k_xor_sat.guiding_state
119+
import qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding
120+
import qualtran.bloqs.max_k_xor_sat.load_kxor_instance
121+
import qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor
109122
import qualtran.bloqs.mcmt.and_bloq
110123
import qualtran.bloqs.mcmt.controlled_via_and
111124
import qualtran.bloqs.mcmt.ctrl_spec_and
@@ -710,6 +723,13 @@
710723
module=qualtran.bloqs.block_encoding.sparse_matrix,
711724
bloq_specs=[qualtran.bloqs.block_encoding.sparse_matrix._SPARSE_MATRIX_DOC],
712725
),
726+
NotebookSpecV2(
727+
title='Sparse Matrix (Hermitian)',
728+
module=qualtran.bloqs.block_encoding.sparse_matrix_hermitian,
729+
bloq_specs=[
730+
qualtran.bloqs.block_encoding.sparse_matrix_hermitian._SPARSE_MATRIX_HERMITIAN_DOC
731+
],
732+
),
713733
NotebookSpecV2(
714734
title='Chebyshev Polynomial',
715735
module=qualtran.bloqs.block_encoding.chebyshev_polynomial,
@@ -839,6 +859,57 @@
839859
],
840860
),
841861
]
862+
# --------------------------------------------------------------------------
863+
# ----- Quartic Speedups paper ------------------------------------------
864+
# --------------------------------------------------------------------------
865+
ALGO_QUARTIC_SPEEDUPS = [
866+
# ----- Preliminaries ------------------------------------------
867+
NotebookSpecV2(
868+
title='Guided (sparse) Hamiltonian Problem',
869+
module=qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian,
870+
bloq_specs=[
871+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_DOC,
872+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_PHASE_ESTIMATION_DOC,
873+
],
874+
),
875+
NotebookSpecV2(
876+
title='Arithmetic Primitives',
877+
module=qualtran.bloqs.max_k_xor_sat.arithmetic,
878+
bloq_specs=[
879+
qualtran.bloqs.max_k_xor_sat.arithmetic.sort_in_place._SORT_IN_PLACE_DOC,
880+
qualtran.bloqs.max_k_xor_sat.arithmetic.symmetric_difference._SYMMETRIC_DIFFERENCE_DOC,
881+
qualtran.bloqs.max_k_xor_sat.arithmetic.has_duplicates._HAS_DUPLICATES_DOC,
882+
],
883+
),
884+
# ----- Algorithm ------------------------------------------
885+
NotebookSpecV2(
886+
title='kXOR: Instance load Oracles',
887+
module=qualtran.bloqs.max_k_xor_sat.load_kxor_instance,
888+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.load_kxor_instance._LOAD_INSTANCE_DOC],
889+
),
890+
NotebookSpecV2(
891+
title='Noisy kXOR: Guiding State',
892+
module=qualtran.bloqs.max_k_xor_sat.guiding_state,
893+
bloq_specs=[
894+
qualtran.bloqs.max_k_xor_sat.guiding_state._SIMPLE_GUIDING_STATE_DOC,
895+
qualtran.bloqs.max_k_xor_sat.guiding_state._GUIDING_STATE_DOC,
896+
],
897+
),
898+
NotebookSpecV2(
899+
title='Noisy kXOR: Block-encoding the Kikuchi Matrix',
900+
module=qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding,
901+
bloq_specs=[
902+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_matrix._KIKUCHI_MATRIX_ENTRY_DOC,
903+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_list._KIKUCHI_NONZERO_INDEX_DOC,
904+
qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding._KIKUCHI_HAMILTONIAN_DOC,
905+
],
906+
),
907+
NotebookSpecV2(
908+
title='Algorithm: Planted Noise kXOR',
909+
module=qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor,
910+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor._PLANTED_NOISY_KXOR_DOC],
911+
),
912+
]
842913

843914
# --------------------------------------------------------------------------
844915
# ----- Concepts -------------------------------------------------------
@@ -865,6 +936,7 @@
865936
('Modular Arithmetic', MOD_ARITHMETIC),
866937
('Rotations', ROT_QFT_PE),
867938
('Block Encoding', BLOCK_ENCODING),
939+
('Paper: Quartic Quantum Speedups for Planted Inference', ALGO_QUARTIC_SPEEDUPS),
868940
('Other', OTHER),
869941
]
870942

docs/bloqs/index.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,21 @@ Bloqs Library
119119
block_encoding/phase.ipynb
120120
block_encoding/linear_combination.ipynb
121121
block_encoding/sparse_matrix.ipynb
122+
block_encoding/sparse_matrix_hermitian.ipynb
122123
block_encoding/chebyshev_polynomial.ipynb
123124
block_encoding/lcu_block_encoding.ipynb
124125

126+
.. toctree::
127+
:maxdepth: 2
128+
:caption: Paper: Quartic Quantum Speedups for Planted Inference:
129+
130+
max_k_xor_sat/guided_hamiltonian/guided_hamiltonian.ipynb
131+
max_k_xor_sat/arithmetic/arithmetic.ipynb
132+
max_k_xor_sat/load_kxor_instance.ipynb
133+
max_k_xor_sat/guiding_state.ipynb
134+
max_k_xor_sat/kikuchi_block_encoding.ipynb
135+
max_k_xor_sat/planted_noisy_kxor.ipynb
136+
125137
.. toctree::
126138
:maxdepth: 2
127139
:caption: Other:

qualtran/bloqs/arithmetic/sorting.py

Lines changed: 6 additions & 5 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 8 additions & 0 deletions
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)