Skip to content

Commit 2c3153c

Browse files
committed
Planted Noisy kXOR
1 parent 64acb52 commit 2c3153c

File tree

61 files changed

+14204
-28
lines changed

Some content is hidden

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

61 files changed

+14204
-28
lines changed

Diff for: 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
@@ -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
@@ -699,6 +712,13 @@
699712
module=qualtran.bloqs.block_encoding.sparse_matrix,
700713
bloq_specs=[qualtran.bloqs.block_encoding.sparse_matrix._SPARSE_MATRIX_DOC],
701714
),
715+
NotebookSpecV2(
716+
title='Sparse Matrix (Hermitian)',
717+
module=qualtran.bloqs.block_encoding.sparse_matrix_hermitian,
718+
bloq_specs=[
719+
qualtran.bloqs.block_encoding.sparse_matrix_hermitian._SPARSE_MATRIX_HERMITIAN_DOC
720+
],
721+
),
702722
NotebookSpecV2(
703723
title='Chebyshev Polynomial',
704724
module=qualtran.bloqs.block_encoding.chebyshev_polynomial,
@@ -828,6 +848,57 @@
828848
],
829849
),
830850
]
851+
# --------------------------------------------------------------------------
852+
# ----- Quartic Speedups paper ------------------------------------------
853+
# --------------------------------------------------------------------------
854+
ALGO_QUARTIC_SPEEDUPS = [
855+
# ----- Preliminaries ------------------------------------------
856+
NotebookSpecV2(
857+
title='Guided (sparse) Hamiltonian Problem',
858+
module=qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian,
859+
bloq_specs=[
860+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_DOC,
861+
qualtran.bloqs.max_k_xor_sat.guided_hamiltonian.guided_hamiltonian._GUIDED_HAMILTONIAN_PHASE_ESTIMATION_DOC,
862+
],
863+
),
864+
NotebookSpecV2(
865+
title='Arithmetic Primitives',
866+
module=qualtran.bloqs.max_k_xor_sat.arithmetic,
867+
bloq_specs=[
868+
qualtran.bloqs.max_k_xor_sat.arithmetic.sort_in_place._SORT_IN_PLACE_DOC,
869+
qualtran.bloqs.max_k_xor_sat.arithmetic.symmetric_difference._SYMMETRIC_DIFFERENCE_DOC,
870+
qualtran.bloqs.max_k_xor_sat.arithmetic.has_duplicates._HAS_DUPLICATES_DOC,
871+
],
872+
),
873+
# ----- Algorithm ------------------------------------------
874+
NotebookSpecV2(
875+
title='kXOR: Instance load Oracles',
876+
module=qualtran.bloqs.max_k_xor_sat.load_kxor_instance,
877+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.load_kxor_instance._LOAD_INSTANCE_DOC],
878+
),
879+
NotebookSpecV2(
880+
title='Noisy kXOR: Guiding State',
881+
module=qualtran.bloqs.max_k_xor_sat.guiding_state,
882+
bloq_specs=[
883+
qualtran.bloqs.max_k_xor_sat.guiding_state._SIMPLE_GUIDING_STATE_DOC,
884+
qualtran.bloqs.max_k_xor_sat.guiding_state._GUIDING_STATE_DOC,
885+
],
886+
),
887+
NotebookSpecV2(
888+
title='Noisy kXOR: Block-encoding the Kikuchi Matrix',
889+
module=qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding,
890+
bloq_specs=[
891+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_matrix._KIKUCHI_MATRIX_ENTRY_DOC,
892+
qualtran.bloqs.max_k_xor_sat.kikuchi_adjacency_list._KIKUCHI_NONZERO_INDEX_DOC,
893+
qualtran.bloqs.max_k_xor_sat.kikuchi_block_encoding._KIKUCHI_HAMILTONIAN_DOC,
894+
],
895+
),
896+
NotebookSpecV2(
897+
title='Algorithm: Planted Noise kXOR',
898+
module=qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor,
899+
bloq_specs=[qualtran.bloqs.max_k_xor_sat.planted_noisy_kxor._PLANTED_NOISY_KXOR_DOC],
900+
),
901+
]
831902

832903
# --------------------------------------------------------------------------
833904
# ----- Concepts -------------------------------------------------------
@@ -854,6 +925,7 @@
854925
('Modular Arithmetic', MOD_ARITHMETIC),
855926
('Rotations', ROT_QFT_PE),
856927
('Block Encoding', BLOCK_ENCODING),
928+
('Paper: Quartic Quantum Speedups for Planted Inference', ALGO_QUARTIC_SPEEDUPS),
857929
('Other', OTHER),
858930
]
859931

Diff for: docs/bloqs/index.rst

+12
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,21 @@ Bloqs Library
118118
block_encoding/phase.ipynb
119119
block_encoding/linear_combination.ipynb
120120
block_encoding/sparse_matrix.ipynb
121+
block_encoding/sparse_matrix_hermitian.ipynb
121122
block_encoding/chebyshev_polynomial.ipynb
122123
block_encoding/lcu_block_encoding.ipynb
123124

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

Diff for: qualtran/_infra/gate_with_registers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,9 @@ def __pow__(self, power: int) -> 'GateWithRegisters':
371371
return Power(bloq, abs(power))
372372
raise NotImplementedError(f"{self} does not implemented __pow__ for {power=}.")
373373

374+
@classmethod
374375
def _get_ctrl_spec(
375-
self,
376+
cls,
376377
num_controls: Union[Optional[int], 'CtrlSpec'] = None,
377378
control_values=None,
378379
control_qid_shape: Optional[Tuple[int, ...]] = None,

Diff for: 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,
@@ -225,8 +226,6 @@ def __attrs_post_init__(self):
225226
k = self.half_length
226227
if not is_symbolic(k):
227228
assert k >= 1, "length of input lists must be positive"
228-
# TODO(#1090) support non-power-of-two input lengths
229-
assert (k & (k - 1)) == 0, "length of input lists must be a power of 2"
230229

231230
@cached_property
232231
def signature(self) -> 'Signature':
@@ -252,14 +251,16 @@ def is_symbolic(self):
252251
def build_composite_bloq(
253252
self, bb: 'BloqBuilder', xs: 'SoquetT', ys: 'SoquetT'
254253
) -> dict[str, 'SoquetT']:
255-
if is_symbolic(self.half_length):
254+
k = self.half_length
255+
if is_symbolic(k):
256256
raise DecomposeTypeError(f"Cannot decompose symbolic {self=}")
257+
if (k & (k - 1)) == 0:
258+
# TODO(#1090) support non-power-of-two input lengths
259+
raise DecomposeNotImplementedError("length of input lists must be a power of 2")
257260

258261
assert isinstance(xs, np.ndarray)
259262
assert isinstance(ys, np.ndarray)
260263

261-
k = self.half_length
262-
263264
first_round_junk = []
264265
for i in range(k):
265266
xs[i], ys[k - 1 - i], anc = bb.add(Comparator(self.bitsize), a=xs[i], b=ys[k - 1 - i])

Diff for: 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']

Diff for: 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

Diff for: qualtran/bloqs/block_encoding/block_encoding_base.py

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

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

0 commit comments

Comments
 (0)