About this map
Sections
What this is
Quantum algorithms are not written from scratch. They are assembled from a small number of reusable steps, and almost every published method is a different route through the same handful of them.
This is a map of those routes. Circles are the things an algorithm can be holding. Lines are the steps that carry you from one to the next. A method is a path across.
Nothing here is generated. Every line was read out of a paper and checked against it.
How to read it
- Something you can hold — a state, a matrix, a circuit, an answer.
- The same, in the middle of a step you have opened.
- A step. Someone has published a way through it.
- A step whose way through has not been pinned to one method.
- A step nothing published fills yet.
- A step you have opened. What is drawn inside it is how it was done.
- There is a record in the repository for this one.
How to move around
- Two fingers move the map. Pinch to zoom, or hold ctrl and scroll.
- Click a step to open it in place — everything else stays where it is.
- Click a name to read the full record without leaving the map.
- Arrow keys move, plus and minus zoom, zero puts it back.
What a line is claiming
A solid line means a paper puts those two steps together and we have the citation. A long-dashed line means the route is recorded but no single method has been named for that step. A short-dashed line means nothing published fills it — the step is real, the way through is not written yet.
A count after a step's name — ×T/h, ×O(κ) — means the route walks that step that many times rather than once. It is the source's own symbol, and the card says what it stands for and what one turn costs. A step with no count is a step no source we read said is repeated, which is not the same as one taken once.
A line drawn nested under another, on the soft shaded band behind it, is a narrower version of the line above it: the same construction, re-analysed or re-tuned, filling the same step. It is why two lines can draw the identical interior and still be two entries. Lines outside the band are alternatives to their neighbours, not versions of them.
The map does not hide the gaps. An empty step is drawn as an empty step.
What is not here yet
The map covers the algorithm literature. The repository covers circuits and primitives. They overlap less than you would expect, and where a method has no record we say so on its page rather than leaving the space blank.
Where something named here does have a record, its name links straight to it.
Method
Interpolate slowly to the problem Hamiltonian
Build a time-dependent Hamiltonian H(t) that starts at an initial Hamiltonian whose ground state is trivial to prepare and ends at the final Hamiltonian encoding the problem, interpolate between them over a time T, and let the state track the instantaneous ground state along the whole path. The adiabatic theorem proves this works whenever the gap above the ground state never closes and T is long enough — and the same paper states, in the same breath, that outside a few symmetric special cases it cannot say how long that is.
Open the full recordFills the slot: Search a cost Hamiltonian for the assignment it minimises
The Hamiltonian is built directly from the instance: , "where each depends only on clause and acts only on the bits in " (§1). The initial Hamiltonian's ground state must be one "that is easy to construct" (Abstract), and the interpolation must stay slow enough over the whole path: the adiabatic theorem's guarantee needs the gap "strictly greater than zero for all " (§2.1). The paper states this is the typical case rather than something proved for every instance: "typically is not zero" (§2.6).
An Ising or QUBO operator, diagonal in the computational basis, whose extremal eigenvector encodes the problem's solution — given, for QAOA, as a sum of clause terms over bits and clauses; given, for adiabatic evolution, as the final Hamiltonian of an interpolation whose starting point has an easily-constructed ground state. Neither method is told how the operator was built, or by which encoding.
Cost Hamiltonian, diagonal in the computational basis → Assignment, with the objective value it achievesinterpolate H(t) between H_B and H_P, tracking the instantaneous ground state
The Hamiltonian is built directly from the problem: for an -bit instance , , "where each depends only on clause and acts only on the bits in " (§1, Eq. 1.2), and "the Hamiltonian that governs the system's evolution is constructed directly from the clauses of the formula" (§6). For the satisfiability construction the two endpoints are , built per-bit and weighted by each bit's clause degree so that "its ground state is easy to construct" (§2.4, Eq. 2.22), and , whose ground state "encodes the satisfying assignment" (Abstract). The path is (Eq. 2.23), equivalently for (Eq. 2.24). Starting at the ground state of and evolving under (Eq. 2.1), the adiabatic theorem says that "if the gap between the two lowest levels, , is strictly greater than zero for all ", then the overlap with the target ground state approaches 1 as (Eq. 2.6). Writing (Eq. 2.7), "a closer look at the adiabatic theorem tells us that taking " — where is the largest matrix element of between the two lowest instantaneous eigenstates over the whole path (rendered here from Eq. 2.9 for legibility) — can make the final overlap "arbitrarily close to 1" (Eq. 2.10). assumption: the guarantee needs nonzero over the whole interval, and the paper is explicit that this is the typical case rather than a proved one — "typically is not zero" (§2.6) — so a degenerate or closing gap sits outside what Eq. (2.6) certifies. Measuring in the computational basis returns the assignment. assumption: how large needs to be is not bounded in general — "the time required depends on the minimum energy difference between the two lowest states of the interpolating Hamiltonian. We are unable to estimate this gap in general" (Abstract; restated at §1, "we are unable to estimate the required running time in general", and at §6, "though we are unable to determine, in general, the required running time"). Three special symmetric cases are proved polynomial, and the paper's own reading of that result is modest: "even though these cases are easily seen to be classically solvable in polynomial time, our algorithm operates in an entirely different way from the classical one, and these examples may provide a small bit of evidence that our algorithm may run quickly on other, more interesting cases" (§6). Realised as a gate-model circuit, "the number of factors in the product is proportional to times a polynomial in " (§5), so a bound on circuit cost is exactly as available as a bound on itself — which is to say, not available in general.
assumption
A bit string read off the computational basis — the assignment — together with the objective value it achieves, or, for the adiabatic route, the stated promise that this string is (with fidelity approaching 1, for a long enough evolution time) the true minimiser. Neither route returns an energy with an error bar; both return a string.
None found yet.
given an n-bit satisfiability formula C_1 AND C_2 AND ... AND C_M (Eq. 1.1)
H_B, built per-bit and weighted by each bit's clause degree (Eq. 2.22)
H_P, whose ground state encodes the satisfying assignment
H(t) = (1 - t/T) * H_B + (t/T) * H_P for t in [0, T] (Eq. 2.23)
# equivalently H~(s) = (1-s)*H_B + s*H_P, s = t/T in [0,1] (Eq. 2.24)
prepare |psi(0)> = ground state of H(0) = H_B # easy, by construction
evolve |psi(t)> under i * d/dt |psi(t)> = H(t) |psi(t)>, t: 0 -> T (Eq. 2.1)
g_min = min over s in [0,1] of ( E_1(s) - E_0(s) ) (Eq. 2.7)
# adiabatic theorem: if the gap is > 0 for every s in [0,1], then for
# T much greater than E / g_min^2, |psi(T)> is close to the ground state of H_P
# (E is the largest matrix element of dH~/ds between the two lowest
# instantaneous eigenstates, over the whole path -- Eq. 2.9)
measure |psi(T)> in the computational basis -> the assignment z
# "The time required depends on the minimum energy difference between the two
# lowest states of the interpolating Hamiltonian. We are unable to estimate
# this gap in general." -- for three special symmetric cases the paper proves T
# is polynomial in n; those cases are also classically easy, so the authors call
# them only "a small bit of evidence" the method may run fast on harder cases"The time required depends on the minimum energy difference between the two lowest states of the interpolating Hamiltonian. We are unable to estimate this gap in general" (Abstract). Where the gap can be bounded, the theorem gives (§2.1, rendered from Eqs. 2.8–2.9 for legibility); the paper proves this for "special symmetric cases of the satisfiability problem", every one of which is "easily seen to be classically solvable in polynomial time" by other means, offered only as "a small bit of evidence" about harder cases (§6). Realised as a gate-model circuit, cost tracks directly: "the number of factors in the product is proportional to times a polynomial in " (§5) — so wherever is unbounded, so is this.
None found yet.
None found yet.
QuTiP's `mesolve`-based adiabatic-sweep tutorial (Lecture 8)
About
QuTiP's own tutorial repository (qutip/qutip-tutorials) ships a notebook titled "Lecture 8 - Adiabatic sweep" (by J. R. Johansson), at tutorials-v5/lectures/Lecture-8-Adiabatic-quantum-computing.md, which states the same interpolation this record's theory describes and warns, in its own words, that "if the Hamiltonian is transformed from to too quickly, the system will get excited from the ground state [and] the adiabatic computing algorithm fails." No paper accompanies the notebook, so it is recorded here as a code artefact rather than a literature source.
Methods
Builds on spins, whose ground state is the trivially-prepared computational basis state `psi0`, and `H1` as a chain of nearest-neighbour couplings with independently random , , per bond (not diagonal in the computational basis, so this demonstrates the general adiabatic-sweep mechanism rather than interpolating toward a combinatorial-optimization cost operator built from clauses, as this record's own SAT example does). It packages the linear schedule pairing `H0` with a weight that decays from 1 to 0 and `H1` with a weight that grows from 0 to 1 as a `QobjEvo`, then calls `mesolve(h_t, psi0, taulist, [], e_ops=process_rho, args=args)`. Passing an empty list as the fourth (`c_ops`) argument keeps the evolution unitary: `mesolve`'s own docstring states "In the absence of collapse operators the system is evolved according to the unitary evolution of the Hamiltonian" and "When no collapse operator are given ... it will defer to sesolve." At every timestep the callback `process_rho` diagonalises the instantaneous Hamiltonian with `H.eigenstates(eigvals=M)` and records the overlap of the evolving state with each of the lowest eigenstates -- the same instantaneous-eigenbasis tracking this record's Eq. 2.6-2.7 describe -- then plots it as an energy-spectrum figure with occupation probability encoded in line width, rather than returning a computed number.
Data
None external: `h`, `Jx`, `Jy`, `Jz` are drawn fresh on every run from `np.random.rand`, so the instance is synthetic and re-randomised each execution rather than loaded from a fixed dataset or file.
Code
qutip/qutip-tutorials, tutorials-v5/lectures/Lecture-8-Adiabatic-quantum-computing.md (jupytext-linked to the notebook of the same name), at commit 97d7d09baaa926c6604bb75e4f139c7bea74ee5e. Calls `qutip.QobjEvo` and `qutip.mesolve`, and `Qobj.eigenstates`. Checked against qutip/qutip's current default branch: `QobjEvo` is defined in qutip/core/cy/qobjevo.pyx, re-exported to qutip.core's own top level by qutip/core/__init__.py's `from .cy.qobjevo import *`, and re-exported again to qutip's own top level by qutip/__init__.py's `from .core import *` -- matching the tutorial's own `from qutip import (QobjEvo, ...)` import; `mesolve` is defined in qutip/solver/mesolve.py.
Results
No specific numeric result is recorded here: the instance is randomised on every run, and the markdown source carries no saved output cells, so no fixed `taumax`, fidelity, or gap value is stated anywhere in it -- only the code that produces the spectrum and occupation-probability plot. The evolution itself runs on QuTiP's own in-process ODE integrator (`mesolve` deferring to `sesolve`); no external quantum hardware or third-party simulator backend is invoked.
qore's `ASP` (Adiabatic State Preparation) class, applied to open-pit-mine scheduling
- Quantum Computation by Adiabatic Evolution
Edward Farhi, Jeffrey Goldstone, Sam Gutmann, Michael Sipser · 2000
About
qore (HaoTy/qore on GitHub, BSD-3-Clause) is a small, one-day-pushed (March 2022) project whose setup.py names its author as "Q Ore Team" and describes it as "Q Ore leverages quantum power to speedup open pit mining algorithms", linking to `https://github.com/cs210/IBM-QC-Open-Pit-Mining/` -- `cs210` is Stanford's CS210 course organization on GitHub, whose own org profile names it "CS210 Software Project Experience" and gives its location as "Stanford, CA", though the linked `cs210/IBM-QC-Open-Pit-Mining` repository itself no longer exists (404) and no sponsorship relationship is stated anywhere fetched this session. It ships qore/algorithms/asp.py, whose module docstring reads "The Adiabatic State Preparation algorithm. See https://arxiv.org/pdf/quant-ph/0001106.pdf", the same paper this record cites, and the identical sentence is repeated as the docstring of the class `ASP(MinimumEigensolver)` it defines.
Methods
`ASP._set_default_initial_operator` builds the initial Hamiltonian and `_set_default_initial_state` builds its ground state via `(Minus ^ self.num_qubits).to_circuit()`. `_construct_circuit` then Trotterizes the interpolation across `nsteps` steps using the midpoint rule , appending per step one `circuit.hamiltonian(operator, xi*evol_time/nsteps, qubits)` gate for the caller-supplied problem Hamiltonian and one `circuit.hamiltonian(initial_operator, (1-xi)*evol_time/nsteps, qubits)` gate for -- a per-step split-operator realisation of , this record's own Eq. 2.23. The problem operator is whatever `operator` is passed into `compute_minimum_eigenvalue(operator, aux_operators)`, docstringed there as "The problem Hamiltonian `H_P`."
Data
scripts/run_asp.py supplies from qore.model.mine.Mine, whose `gen_Hp` method is docstringed "Generate the profit Hamiltonian " and is built from a block-value grid written directly in the script -- a hard-coded 2-row-by-3-column array of values (including one infeasible block marked `inf`), overwritten before use by a second 3-row-by-5-column array in the same script -- not loaded from any external dataset. `run_asp.py` calls `qmine.solve(asp, False, False)`, so `Mine.solve`'s `penalty` argument is `False`; inside `solve`, the operator handed to `algorithm.compute_minimum_eigenvalue` is `self.gen_Hamiltonian(penalty)`, and with `penalty = False` that method's `if penalty:` branch -- the one that would return `-Hp + penalty*Hs` -- is skipped, so it instead returns `self.gen_projected_Hamiltonian()`. That method does not add a weighted `Hs` term to `Hp` at all: it uses `Hs` only to build a 0/1 diagonal projector onto the computational-basis states where `Hs`'s smoothness constraint evaluates to zero (`state_fn = (-self.Hs @ (Plus^n)).reduce().eval().to_dict_fn()`, keeping the indices where the resulting amplitude is near zero), then returns `(p_op @ -self.Hp @ p_op).reduce().to_matrix_op()`, a projection of `Hp` onto that hard-constraint subspace rather than a penalty-weighted sum of the two. `Hp` and `Hs` are still passed separately as `aux_operators` alongside this projected operator (`algorithm.compute_minimum_eigenvalue(self.gen_Hamiltonian(penalty), [self.Hp, self.Hs])`); for `algorithm = ASP(...)`, it is this projected operator that becomes `self._operator` and is what `_construct_circuit` interpolates toward as .
Code
HaoTy/qore, commit 2d866615bb05c5b8a5d6f6c7a2c1ca1008e7851b: qore/algorithms/asp.py (class `ASP`, methods `_construct_circuit`, `_set_default_initial_operator`, `_set_default_initial_state`, `compute_minimum_eigenvalue`) and qore/model/mine.py (class `Mine`, methods `gen_Hp`, `gen_Hamiltonian`, `gen_projected_Hamiltonian`, `solve`), driven by scripts/run_asp.py. The code targets the pre-1.0 Qiskit API pinned in setup.py (`qiskit>=0.25`) -- `qiskit.opflow`, `qiskit.algorithms.MinimumEigensolver`, `qiskit.providers.aer.QasmSimulator` -- modules current Qiskit has since removed or relocated (a search of today's Qiskit/qiskit repository for a `QuantumCircuit.hamiltonian` method the way this code calls it finds none), so this entry reports the repository's own code as written, not a claim that it runs against a current Qiskit install.
Results
run_asp.py constructs `ASP(evol_time=10, nsteps=20, quantum_instance=QasmSimulator())` and calls `qmine.solve(asp, False, False)`, printing the returned `MiningProblemResult`. This record did not execute the script, so no specific bitstring or profit value from that run is stated here -- only that the script targets Qiskit's `QasmSimulator`, a classical statevector/qasm simulator backend, not any named quantum hardware.
- Quantum Computation by Adiabatic Evolution
Quantum adiabatic evolution · Qiskit
From the repository — run, not written up from a paper · native
About
An optimization pattern that slowly deforms an easy ground state into the ground state of a problem Hamiltonian.
Methods
None found yet.
Data
None found yet.
Code
Qiskit
Results
Two-qubit interpolation checked by construction · schedule, parity, and final-energy invariants recorded
- Quantum adiabatic evolution
An optimization pattern that slowly deforms an easy ground state into the ground state of a problem Hamiltonian.
References
- Quantum Computation by Adiabatic Evolution
Edward Farhi, Jeffrey Goldstone, Sam Gutmann, Michael Sipser · 2000
Where the routes meet
11 problems nothing else needs — the places a reader arrives. Open a line to see what is recorded inside it, or click its name to go there.
15 lines have something recorded inside that you have not opened.
Of the routes that have been taken apart, 15 are built entirely from named slots, 15 hand off part of the work and finish the rest themselves, and 20 are one undivided act. None of the three is a defect; they are different things to reuse.
Every line on this figure, in words
The lines on this figure
Solve a nonlinear ODE dy/dt = F(y)
- Embed a nonlinear system into a linear one — opens into 6 · a way across — click it to open it here
- Solve a linear ODE du/dt = A(t)u + b(t) — opens into 9 · a way across — click it to open it here
- Choose a time discretization or propagator approximation → Quantum linear solve — open
- Choose a time discretization or propagator approximation — opens into 6 · a way across — click it to open it here
- Quantum linear solve — open · opened: what was inside is drawn in its place
- HHL: eigenvalue inversion by phase estimation
- QSVT matrix inversion — opens into 3 · a way across — click it to open it here
- Chebyshev LCU inversion
- Discrete adiabatic inversion — opens into 3 · a way across — click it to open it here
- Eigenstate filtering inversion — opens into 3 · a way across — click it to open it here
- Simulate Hamiltonian evolution → Estimate an observable — open
- Simulate Hamiltonian evolution — opens into 3 · a way across — click it to open it here
- Estimate an observable — opens into 4 · a way across — click it to open it here
Estimate an excited-state energy
- Variational quantum deflation — opens into 3 · a way across — click it to open it here
- Subspace-search variational eigensolver — opens into 3 · a way across — click it to open it here
- Quantum subspace expansion
- Quantum equation of motion
- Folded-spectrum variational eigensolver — opens into 3 · a way across — click it to open it here
- Penalty-constrained variational eigensolver — opens into 3 · a way across — click it to open it here
- Multistate contracted variational eigensolver — opens into 3 · a way across — click it to open it here
Every step you can open
1 of these have an object recorded in the middle; the rest open into the methods that fill them.
- Solve a nonlinear ODE dy/dt = F(y)
- Replace a spatial domain with a finite grid
- Discretize a PDE into one linear system
- Embed a nonlinear system into a linear one
- Solve a linear ODE du/dt = A(t)u + b(t)
- Recast a non-Hermitian generator as Hamiltonian evolution
- Choose a time discretization or propagator approximation
- Quantum linear solve
- Matrix function
- QSP phase factors
- Polynomial approximation
- Block-encode a matrix
- Prepare an input state
- Amplify a success branch
- Simulate Hamiltonian evolution
- Estimate an observable
- Compile a circuit to a specific device
- Satisfy the hardware connectivity constraint
- Approximate a continuous rotation in a discrete gate set
- Recover a noiseless expectation value by post-processing
- Build logical qubits at a target logical error rate
- Estimate a Hamiltonian's ground-state energy
- Choose a parameterised trial state
- Minimise the objective over the parameters
- Estimate an excited-state energy
- Measure what the machine can actually do
- Recover the period of a periodic function
- Estimate the eigenphase of a unitary
- Find the item a check accepts
- Walk a graph to the vertex you want
- Search a cost Hamiltonian for the assignment it minimises
What is on this map, counted
What is here, counted
147 nodes — 31 slots and 116 methods.
76 of the 147 link to a record in the Atlas, between them naming 89 records. The rest name papers and nothing else: this graph describes work the catalogue has not got yet, and the nodes with no record are the list of what a corpus pass has to go and read.
0 slots have no method recorded, and 32 methods have not been taken apart. Both are shown as what they are rather than left blank.
Every claim here rests on a source. This graph cites 140 papers; they and the 172 the Atlas cites alone are registered in one place, with what each reports and everywhere it is cited from. Papers