quantax.optimizer.StochasticQNGD#
- class quantax.optimizer.StochasticQNGD#
Bases:
QNGDStochastic quantum natural gradient descent.
The key function of the class is
get_step, which provides the update of parameters by solving the quantum natural gradient descent equation \(\bar O \dot \theta = \bar \epsilon\), in which \(\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>)\) and \(\bar \epsilon\) is estimated on the samples by the gradient source.- __init__(state: Variational, grad: EnergyGrad | OverlapGrad, imag_time: bool = True, solver: Callable[[...], Array] | None = None, updater: Updater | None = None, file: str | Path | BinaryIO | None = None)#
- Parameters:
state – Variational state to be optimized.
grad – The gradient source defining \(\bar \epsilon\), e.g.
EnergyGradorOverlapGrad.imag_time – Whether to use imaginary-time evolution.
solver – The numerical solver for the matrix inverse, default to
auto_shift_eig.updater – The update strategy applied around the equation solve, default to
PlainUpdater.file – The file with stored buffers of the optimizer.
- 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_Ebar(samples: Samples | Array) Array#
Compute \(\bar \epsilon\) of the gradient source 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 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.
- property hamiltonian: Operator | None#
The Hamiltonian for the evolution,
Nonewhen the gradient source doesn’t define it.
- property holomorphic: bool#
Whether the state is holomorphic.
- property imag_time: bool#
Whether to use imaginary-time evolution.
- save(file: str | Path | BinaryIO) None#
Save the optimizer buffers to a file.
- 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.