Linear Combination of Hamiltonian Simulations¶
English · 简体中文
Category C2 · Module
oracq.algorithms.qode.lchs· Stage V2
Overview¶
For the autonomous homogeneous equation \(u'=-Au\) with \(A=L+iH\) and \(L\succeq 0\) (\([L,H]=0\) not required), write the non-unitary evolution as a weighted integral of Hermitian evolutions (Theorem 1 of the original LCHS paper, arXiv:2303.01029; see also the differential equations chapter §4):
This implementation discretizes the integral with finitely many nodes \(\{k_j\}\) and complex weights \(\{w_j\}\) that already include the integration kernel, obtaining the finite sum \(\widetilde V=\sum_j w_j\,e^{-it(H+k_jL)}\), and then combines the Hamiltonian simulations of the branches with an LCU. The alignment with the generic interface \(u'=Gu\) is \(A=-G\) (done by the routing of linear_qode; see QODE problem and protocol).
Interface and input model¶
lchs_qode(model, time, *, plan=None, hamiltonian_function=taylor_hamiltonian)
QuadraturePlan(nodes, weights, kernel="user_supplied")
QuadraturePlan.cauchy(cutoff=2, spacing=1.0)
API entries: lchs_qode, QuadraturePlan
model:LinearODE(HermitianParts(L, H), initial), the input model is an ODE;parts.hermitianstores \(L\) andparts.hstores \(H\), and the initial state is an SP.plan: the nodes are finite real numbers, the weights are finite complex numbers that are not all zero, and the two are of equal length; thecauchyfactory generates nodes \(k=-J\cdot h,\dots,J\cdot h\) and weights \(w=h/[\pi(1+k^2)]\), with the kernel labeled"finite_cauchy".hamiltonian_function: a replaceable protocol(K, t) -> BlockEncoding, by defaulttaylor_hamiltonian(a non-unitary BE of the truncated Taylor series).time: a non-negative real number.
Returns a StateOracle (target/signal) with module attributes:
Attribute |
Meaning |
|---|---|
|
|
|
the normalization constant of the finite-sum LCU, $\sum_j |
|
the number of quadrature nodes |
|
the plan’s kernel name and the JSON node table |
|
|
|
|
Implementation notes¶
For each node construct \(K_j = H + k_j L\) (lcu([(1, parts.h), (k_j, parts.hermitian)]), where lcu drops zero-coefficient terms automatically and \(\alpha_{K_j}=\alpha_H+|k_j|\,\alpha_L\)), hand it to hamiltonian_function to obtain the BE of the approximate evolution \(E_j\) (which must keep the alpha), then combine \(\{(w_j, E_j)\}\) with lcu into \(\widetilde V\) and apply it to the initial state via apply_be_to_state. The register layout is inherited from the input oracles: the target width is the width of \(L/H\), and the signal is the concatenation of the LCU select bit and each branch’s signal bit. The success subspace is all signals zero; what is read out is the normalized direction \(\widetilde V|u_0\rangle/\alpha_V\). The physical amplitude still contains the initial-value norm, which the protocol does not recover automatically.
Applicability boundary: \(L\succeq 0\), autonomous, and homogeneous are all input declarations; remainder states explicitly that the finite sum carries no tail-integration guarantee — do not forcibly normalize the weights and still call it the same approximation operator. The time-dependent and inhomogeneous results of the original paper are not in the current interface. Before solving, operator_state_contract checks the capability contracts of the two BEs \(L\), \(H\) and of the initial state.
Validation approach¶
Category C2 (approximately continuous semantics; the acceptance criteria are in ../development/validation-plan.md §2): the acting operator must approximate the target continuous function within tolerance. tests/core/test_differential.py is positioned as a structure and open-input difference test (see its docstring); numerical cross-checks are currently borne by the input-model side. Three layers of evidence:
Structure: the lchs subtest of
tests/core/test_differential.py:DifferentialStructureTests.test_four_methods_keep_input_oracles— with abstract BE/SP inputs the open slots (input_A/input_b) are kept, thealgorithmattribute is correct, and the RIR round-trips through serialization.Numerical:
tests/core/test_sde.py:SolverContractTests.test_qode_problem_accepted_by_lchs— aQODEProblemon a 4-point OU grid (QuadraturePlan.cauchy(cutoff=0), Taylor degree 1) goes through the fullcheck/solvechain oflinear_qode("lchs"), with the output width and the dissipation-declaration pass-through correct and a serialization round trip.Binding: same-type registration and contract checks;
FokkerPlanckProblem.qode_problemis precisely a consumer of this protocol (see Fokker–Planck input model).
Known gaps and planned stages¶
A unified “analytically solvable ODE family” convergence benchmark is missing: a batch cross-check running the same analytically solvable problem through all ODE solvers has not been established; it is assigned to the stage V2 convergence-sweep framework, consistent with the lchs.py row of validation-coverage.md.
Numerical validation¶
Paper-grade numerical experiments are in tests/verification/verify_ode.py (the ode group; this file covers the parts of lchs.py and of the _dynamics.py assembly skeleton). All classical references are independent: a numpy per-branch truncated-Taylor sum for \(K_j=H+k_jL\), the exact solution from scipy.linalg.expm, analytic solutions (\(e^{-t}\), heat-equation Fourier eigenvalues), and sde.matrix_exponential, a pure-Python matrix exponential, cross-checking one another; the quantum programs run on the real backends reference, rir-pysparq, adapter-pysparq, and OriginIR-ext. Implementation error (quantum post-selected block vs independent simulation) and method error (finite quadrature + Taylor remainder vs the exact solution, marked pending in the library) are reported separately.
Experiment design: end-to-end cross-checks of five input-model classes for \(u'=-Au\), \(A=L+iH\) (all plans QuadraturePlan.cauchy(cutoff=2, spacing=1.0)): (1) a BE of the whole \(G=-I\) (analytic solution); (2) directly given Hermitian parts (a \(2\times2\) matrix with \([L,H]\neq0\), Pauli-expansion BE); (3) the diagonal spectral angle database \(A=\mathrm{diag}(1,\cos\pi/4)\), the same open RIR bound to a gate table and to a QRAM table; (4) the Fokker–Planck OU 4-point zero-flux discretized generator (Pauli expansion) through QODEProblem.solve (Boltzmann root-amplitude initial state); (5) a structured shifted-difference BE of the periodic 4-point heat equation. There is also a quadrature convergence scan (scalar \(L=I\), cutoff 2/8 quantum + a 2..32 classical-kernel trend line).
Key metrics:
Case |
Scale |
Paths |
Metric |
Value |
|---|---|---|---|---|
lchs-given-be-scalar-decay |
7 qubits |
four paths |
implementation error / method error |
1.2e-16 / 1.2e-2 |
lchs-given-parts-noncommuting |
15 qubits |
three paths |
implementation error / method error |
1.1e-16 / 7.3e-2 |
lchs-diagonal-spectral-gate / -qram |
2× programs |
reference |
implementation error (both) / gate-QRAM amplitude difference |
5.8e-17 / 0.0 |
lchs-fokker-planck-ou |
16 qubits |
reference, originir |
implementation error / method error / cross-check between classical references |
1.1e-16 / 7.9e-2 / 1.1e-16 |
lchs-heat-structured-stencil |
15 qubits |
reference, originir |
implementation error / method error / Fourier-expm cross-check |
1.7e-17 / 0.19 / 1.4e-17 |
lchs-quadrature-scan |
cutoff 2 / 8 |
reference |
implementation error |
5.6e-17 / 1.1e-16 |
lchs-quadrature-kernel-trend |
cutoff 2→32 |
classical kernel quadrature |
kernel quadrature error |
7.1e-2→3.7e-3 (including the oscillating tail) |
The success probability (all-signal-zero subspace) matches the classical value (deviation < 1e-16). The method error is the Cauchy quadrature remainder: the tails of the truncation \(K_{\max}\) and of the step size \(h\) show, respectively, an oscillating \(O(1/K_{\max})\) decay and an aliasing floor \(2e^{-(2\pi/h-\lambda t)}\); on deeply nested LCU programs the two pysparq implementations have a numerical floor of about 1e-7 on the junk branches (the physical blocks are unaffected; see the group report).
Reproduction:
PYTHONPATH=src /home/agony/projects/qcfd-dev/quantum-cfd-software/.venv/bin/python tests/verification/verify_ode.py
Artifacts: out/verification/ode.json (12 lchs-* cases in total).