quantax.optimizer.SPRING#
- class quantax.optimizer.SPRING#
Bases:
StochasticQNGDSPRING optimizer. This is a variant of SR with momentum.
The momentum makes large steps possible, so it is recommended to constrain the norm of the applied update in the training loop (see the note in
MARCH).- __init__(state: Variational, hamiltonian: Operator, imag_time: bool = True, solver: Callable[[...], Array] | None = None, file: str | Path | BinaryIO | None = None, mu: float = 0.9, clip: float | None = 5.0)#
Initialize the SPRING optimizer.
- Parameters:
state – Variational state to be optimized.
hamiltonian – The Hamiltonian for the evolution.
imag_time – Whether to use imaginary-time evolution.
solver – The numerical solver for the matrix inverse, default to
auto_shift_eig.file – The file with stored buffers of the optimizer.
mu – The momentum factor.
clip – Local-energy clipping passed to
EnergyGrad, default to 5.0. Set to None to disable.
- property VarE: Array | ndarray | bool | number | bool | int | float | complex | None#
Energy variance \(\left< (H - E)^2 \right>\) of the current step,
Nonewhen the gradient source doesn’t define it.
- property energy: Array | ndarray | bool | number | bool | int | float | complex | None#
Energy of the current step,
Nonewhen the gradient source doesn’t define it.
- get_Ebar(samples: Samples | Array) Array#
Compute \(\bar \epsilon\) of the gradient source for given samples.
- get_Obar(samples: Samples | Array) Array#
Calculate \(\bar O = \frac{1}{\sqrt{N_s}}(\frac{1}{\psi} \frac{\partial \psi}{\partial \theta} - \left< \frac{1}{\psi} \frac{\partial \psi}{\partial \theta} \right>)\) for given samples.
- get_step(samples: Samples | Array) Array#
Obtain the optimization step by solving the equation \(\bar O \dot \theta = \bar \epsilon\) for given samples.
- property hamiltonian: Operator | None#
The Hamiltonian for the evolution,
Nonewhen the gradient source doesn’t define it.
- solve(Obar: Array, Ebar: Array, buffers: dict) tuple[Array, dict]#
Generate the optimization step for given \(\bar O\) and \(\bar \epsilon\) by applying the updater strategy around
solve_equation.
- solve_equation(Obar: Array, Ebar: Array, **solver_kwargs) Array#
Solve the linear equation \(\bar O \dot \theta = \bar \epsilon\) for given \(\bar O\) and \(\bar \epsilon\). Real and imaginary parts are stacked for non-holomorphic states, and extra keyword arguments are forwarded to the numerical solver.
A
diag_preconditionerkeyword is handled here: if the solver declares it as an argument (e.g.lsmr), it is passed through; otherwise the right preconditioning is emulated by solving with \(\bar O / d\) and rescaling the output by \(1 / d\).
- property state: Variational#
Variational state to be optimized.