PDE Solver Framework
unitarylab.library.equation provides equation solvers based on Schrödingerization: a discretized non-unitary evolution is embedded in a higher-dimensional Schrödinger-type evolution, then solved using a classical matrix exponential, a Trotter circuit, or a block-encoding circuit.
This page covers the public low-level interfaces and 20 configuration-driven algorithms in examples. For a first run, use the default classical configuration to validate equation parameters and outputs before switching to a Trotter or block method.
Workflow
setup.json / dict / JSON string
│
▼
parse_equation()
│
├── Equation and equation parameters
├── BoundaryCondition
├── InitialCondition
├── DiscreteFormat
├── Preprocessing
└── SolutionMethod
│
▼
Finite differences and Schrödingerization
│
├── classical: matrix-exponential reference implementation
├── trotter: construct and execute a Trotter circuit
└── block: construct and execute a block-encoding circuit
│
▼
Result dictionary + solution plot + circuit diagram + logsThe framework is organized into four layers:
equation/
├── differential_operator/ # Classical, Trotter, and block-encoded difference operators
├── equation_parser/ # Equation, boundary, initial, discretization, and solver parsing
├── schrodingerization/ # Classical and Trotter Schrödingerization
└── examples/ # 20 configuration-driven equation algorithmsPublic interfaces
The following nine names are exported directly from unitarylab.library.equation:
| Interface | Purpose |
|---|---|
CDiff | Construct a classical finite-difference operator |
TDiff | Construct a finite-difference operator for Trotter evolution |
ClassicalOperator | Differential operator in classical matrix form |
TrotterOperator | Differential operator in Trotter-circuit form |
parse_equation() | Parse a dictionary or JSON string into an Equation |
Equation | Aggregate equation, boundary, initial, discretization, preprocessing, and solver configuration |
schro_trotter() | Run Trotterized Schrödingerization |
initial_schro_fp() | Construct the warped-phase initial-state function for the auxiliary register |
schro_classical() | Compute a classical reference solution using a matrix exponential |
from unitarylab.library.equation import (
CDiff,
TDiff,
ClassicalOperator,
TrotterOperator,
parse_equation,
Equation,
schro_trotter,
initial_schro_fp,
schro_classical,
)Most users should start with an algorithm class in examples. Call the low-level interfaces directly when assembling a discretized operator or Schrödingerization workflow.
Quick start: one-dimensional heat equation
HeatEquationAlgorithm reads setup.json from its own example directory by default. The default selects the classical method and does not require a quantum simulation backend:
from unitarylab.library.equation.examples import HeatEquationAlgorithm
solver = HeatEquationAlgorithm()
result = solver.run(params=None, algo_dir="results/pde-heat")
print(result["status"])
print(result["message"])
print(result["grid"])
print(result["x"][:5])
print(result["u"][:5])
print(result["plot"])
print(result["circuit"])The result typically contains:
| Field | Description |
|---|---|
status | Execution status; "ok" on success |
message | Description of the equation and method result |
grid | Discretization information, including grid-point count and step size |
x, u | Spatial coordinates and numerical solution; 2D problems usually also include y |
plot | Solution-plot format and file path |
circuit | List of generated circuit-diagram paths; the classical method also creates a template circuit diagram |
run() writes result files. Depending on the execution path, algo_dir can contain algorithm.log, algorithm_error.log, solution SVGs, and circuit diagrams. If omitted, the default directory is:
<current working directory>/results/equation/equation_heatPass algo_dir explicitly when output location must be fixed.
Configuration structure
params may be None, a parsed dictionary, or an equivalent JSON string. If it is None, the algorithm reads setup.json from its example directory.
{
"request_id": "optional request identifier",
"params": [
{
"equation": {},
"boundary_condition": [],
"initial_condition": [],
"discrete_format": [],
"preprocessing": []
},
{
"type": "solutionMethod_classical",
"par_fix": [],
"par_func": []
}
]
}params[0]describes the equation and selects boundary conditions, initial conditions, discretization, and preprocessing throughtypefields.params[1]selects the solution method, for examplesolutionMethod_classical,solutionMethod_trotter, orsolutionMethod_block.par_fixstores scalar parameters such asL,T,nx,na,R,p,order, anddt.par_funcstores function expressions such as initial values and source terms.parse_equation()assembles the configuration into anEquationand attachesboundary,initial,discrete,preprocessing, andsolver.
The selected method must be declared by both the algorithm and its setup.json. An undeclared method name causes a configuration or execution error.
Solution methods
| Method | Behavior | Backend parameters |
|---|---|---|
classical | Computes a reference solution with a classical matrix exponential and generates a result plot and template circuit diagram | Does not use backend, device, or dtype |
trotter | Constructs a difference operator and Trotter circuit, then executes it with a simulation backend | Configurable only for algorithms whose signature supports these parameters |
block | Constructs and executes a block-encoding circuit for Schrödingerization | Configurable only for algorithms whose signature supports these parameters |
Not every example supports Trotter or block methods. A method can be selected only if it appears in that example’s method_list.
Built-in algorithms
| Example directory / algorithm class | Problem | Supported methods | Backend parameters |
|---|---|---|---|
equation_heat / HeatEquationAlgorithm | 1D heat equation | classical, trotter, block | Supported |
equation_heat2d / Heat2dEquationAlgorithm | 2D heat equation | classical, trotter | Supported |
equation_heatVariableCoefficient / HeatVariableCoefficientEquationAlgorithm | 1D variable-coefficient heat equation | classical, block | Not supported |
equation_backHeat / backHeatEquationAlgorithm | 1D backward heat equation | classical, trotter, block | Supported |
equation_backHeat2d / backHeat2dEquationAlgorithm | 2D backward heat equation | classical, trotter | Supported |
equation_advection / AdvectionEquationAlgorithm | 1D advection equation | classical, trotter | Supported |
equation_burgers / BurgersEquationAlgorithm | 1D Burgers equation | classical, trotter | Supported |
equation_burgers2d / Burgers2DEquationAlgorithm | 2D Burgers equation | classical, trotter | Supported |
equation_elasticWave / ElasticWaveEquationAlgorithm | 1D elastic wave equation | classical, trotter | Supported |
equation_elasticWave2d / ElasticWave2DEquationAlgorithm | 2D elastic wave equation | classical | Not supported |
equation_general / GeneralLinearEquationAlgorithm | General 1D linear equation | classical, trotter, block | Supported |
equation_traffic / TrafficFlowEquationAlgorithm | 1D traffic-flow equation | classical, trotter | Supported |
equation_blackScholes / BlackScholesEquationAlgorithm | 1D Black–Scholes equation | classical, trotter, block | Supported |
equation_Helmholtz / HelmholtzEquationAlgorithm | 1D Helmholtz equation | classical | Not supported |
equation_OUprocess / OUProcessEquationAlgorithm | Ornstein–Uhlenbeck process | classical | Not supported |
equation_SchrABC / SchrABCEquationAlgorithm | 2D Schrödinger equation with absorbing boundary conditions | classical | Not supported |
equation_hamiltonjacobi / HamiltonJacobiEquationAlgorithm | 1D Hamilton–Jacobi equation | classical | Not supported |
equation_maxwell / MaxwellEquationAlgorithm | 1D Maxwell equation | classical | Not supported |
equation_multiElliptic / MultiEllipticEquationAlgorithm | 1D multiscale elliptic equation | classical | Not supported |
equation_multiTransport / MultiTransportEquationAlgorithm | 1D multiscale transport equation | classical | Not supported |
“Backend parameters supported” means run() accepts backend="torch", device="cpu", and dtype=np.complex128. Eleven examples support these three parameters; the other nine accept only params and algo_dir. Do not pass backend parameters to every algorithm, or unsupported signatures raise TypeError.
Algorithm classes can also be imported from their specific submodules:
from unitarylab.library.equation.examples.equation_heat import HeatEquationAlgorithm
from unitarylab.library.equation.examples.equation_maxwell import MaxwellEquationAlgorithmReturn-value differences
All 20 example result dictionaries contain status, message, grid, plot, and circuit. Physical-value fields depend on the problem:
| Problem type | Common fields |
|---|---|
| 1D scalar equation | x, u |
| 2D scalar equation | x, y, u |
| Maxwell | x, E, B |
| 1D elastic wave | x, v, sigma |
| 2D elastic wave | x, y, v1, v2, s11, s12, s22 |
| OU process | t, y_expli, y_int |
| Multiscale elliptic | x, u_list |
| Multiscale transport | x, Ujj, Urr |
Read fields according to the selected algorithm; do not assume every result contains result["u"].
Scale and recommendations
- For examples using
nx, it is the number of qubits in the spatial register; the spatial grid size is approximately . nais the number of qubits in the Schrödingerization auxiliary register; the auxiliary discretization size is approximately .- Increasing
nxandnacan substantially increase matrix, state, and circuit resources; they do not represent ordinary linearly sized grid-point counts. - First validate the equation, boundary, initial condition, and output directory with the example’s default classical configuration.
- Before switching to Trotter or block, check the algorithm table and start with smaller
nxandnavalues. - For quantum methods, pass
backend,device, anddtypeonly when accepted by the algorithm’s signature. - Set a separate
algo_dirfor long-running or batched jobs to avoid output files overwriting one another.