sisl.mixing.DIISMixer

class sisl.mixing.DIISMixer(weight=0.1, history=2, metric=None)

Bases: BaseHistoryWeightMixer

Direct inversion of the iterative subspace (DIIS mixing)

This mixing method (also known as Pulay mixing) estimates the next trial function given a set of previously inputs and derivatives of those inputs.

Its implementation is general in the sense that one can manually define which values are used for the subspace. I.e. generally the subspace metric is calculated using:

\[\begin{split}\delta_i &= F_i^{\mathrm{out}} - F_i^{\mathrm{in}} \\ m_{ij} &= \langle \delta_i | \delta_j\rangle\end{split}\]

And then the mixing coefficients is calculated using the regular method for a matrix \(\mathbf m\). Generally the metric is calculated using \(\delta\), however, by calling the object with an optional 3rd argument, the metric will use that argument instead of \(\delta\) but still use \(\delta\) when extrapolating the coefficients. This may be useful for testing various metrics based on alternate values.

Alternatively one can pass a metric argument that can pre-process the \(\delta\) variable.

Parameters
  • weight (float, optional) – weight used for the derivative of the functional. The mixer will use a weight of \(1-w\) for the old value

  • history (int or History, optional) – how many history steps it will use in the estimation of the new functional

  • metric (callable, optional) – the metric used for the two values, defaults to lambda a, b: a.ravel().conj().dot(b.ravel).real

Methods

coefficients()

Calculate coefficients of the Lagrangian

mix(coefficients)

Calculate a new variable \(f'\) using history and input coefficients

set_history(history)

Replace the current history in the mixer with a new one

set_weight(weight)

Set a new weight for this mixer

solve_lagrange()

Calculate the coefficients according to Pulay's method, return everything + Lagrange multiplier

history

History object tracked by this mixer

weight

This mixers mixing weight, the weight is the fractional contribution of the derivative

__call__(f, df, delta=None, append=True)[source]

Append data to the history (omitting None values)!

Return type

TypeVar(T)

__init__(weight=0.1, history=2, metric=None)[source]
coefficients()[source]

Calculate coefficients of the Lagrangian

Return type

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

property history: History

History object tracked by this mixer

mix(coefficients)[source]

Calculate a new variable \(f'\) using history and input coefficients

Parameters

coefficients (numpy.ndarray) – coefficients used for extrapolation

Return type

Any

set_history(history)

Replace the current history in the mixer with a new one

Parameters

history (Union[int, History]) – if an int a new History object will be created with that number of history elements Otherwise the object will be directly attached to the mixer.

Return type

None

set_weight(weight)

Set a new weight for this mixer

Parameters

weight (float) – the new weight for this mixer, it must be bigger than 0

solve_lagrange()[source]

Calculate the coefficients according to Pulay’s method, return everything + Lagrange multiplier

Return type

Tuple[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]], ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]]

property weight: Union[float, int]

This mixers mixing weight, the weight is the fractional contribution of the derivative