Chebyshev Oracle
Chebyshev Oracle
Use the magnitude of the Chebyshev polynomial (as a function eigenvalues) to get an estimate of how much the the corresponding residual will change, given a certain Chebyshev polynomial filter degree. I.e. For a desired change in the residuals, determine an approximate, optimal number of Chebyshev filter applications (the polynomial degree) to achieve the target residual.
Feature Ideas
3 criteria are implemented:
- Prevent Tn from blowing up
- Prevent residuals from changing by more than one order of magnitude per SCF step
- Absolute tolerance for the residuals
What typically happens is the relative criterion is application for the first N steps. Once the absolute residuals get ~ same order of magnitude as the tolerance, this criterion becomes applicable and the filter degree -> 1 very quickly. As such, larger degrees are used for the earlier SCF steps. Smaller degrees are used as one approaches convergence in the residuals.
For the relative criterion, the lowest eigenvalue of the batch tends to be predicted to change by an order of magnitude first i.e. T(lambda_1). It might be more efficient use the mean(T(lambda)) instead (needs testing), which should be fine assuming the spread of eigenvalues in a batch is not large. This could be the case on GPU (larger batches) or for semi/core states in all-electron calculations.
Empty State Padding
Some padding with empty states is required. These states will not converge, and their presence is to ensure convergence of states lower in energy. This is implemented by treating the last state block (for all k) as padding. This states are not considered in the convergence criteria, and the Chebyshev polynomial degree is always set to 1 for this block.
It is left to the user to determine how many states/empty states to ask for, which requires some knowledge of a) which states they want to converge and b) how block/batch will divide up the total number of states asked for.
Update
No state padding will be implemented in this MR
TODOs (First Pass)
-
Decide on implementation details w.r.t. padding and convergence criteria - Noting that my changes have changed reference values
-
Remove print statements -
Discuss how one might output useful info to either the terminal or an output file -
Discuss how the tests should be modified -
Discuss what the max filter degree should be, and whether this should be an input variable? - I guess so, but the default should often suffice