Optimizer#

Note

All the optimizers in eON do not use a line search to determine steepest descent!!

There are several other ways in which the eON implementations differ from a standard optimizer software suite[1] . Some prominent reasons are:

  • They are meant to be used with the Nudged Elastic Band which does not have well defined closed form energy surface

    • Especially in the global band optimization approach [OPT_STH08].

  • They are specialized for atomic systems

  • The optimizers only see the moving atoms, the frozen atoms are omitted before being passed to the optimizer

Configuration#

[Optimizer]
pydantic model eon.schema.OptimizerConfig[source]#

Show JSON schema
{
   "title": "OptimizerConfig",
   "type": "object",
   "properties": {
      "opt_method": {
         "default": "cg",
         "description": "The optimization method to use.",
         "enum": [
            "box",
            "cg",
            "qm",
            "lbfgs",
            "fire"
         ],
         "title": "Opt Method",
         "type": "string"
      },
      "convergence_metric": {
         "default": "norm",
         "description": "The metric to use to determine when an optimization is complete.",
         "enum": [
            "norm",
            "max_atom",
            "max_component"
         ],
         "title": "Convergence Metric",
         "type": "string"
      },
      "converged_force": {
         "default": 0.01,
         "description": "When the convergence_metric is smaller than this value (eV/A), the structure is considered minimized.",
         "title": "Converged Force",
         "type": "number"
      },
      "max_move": {
         "default": 0.2,
         "description": "Maximum distance that an atom may be moved in a single optimization step (Angstroms).",
         "title": "Max Move",
         "type": "number"
      },
      "time_step": {
         "default": 1.0,
         "description": "The dynamical timestep for the quickmin algorithm (fs).",
         "title": "Time Step",
         "type": "number"
      },
      "max_iterations": {
         "default": 1000,
         "description": "The maximum number of optimization iterations that will be performed.",
         "title": "Max Iterations",
         "type": "integer"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field converged_force: float = 0.01#

When the convergence_metric is smaller than this value (eV/A), the structure is considered minimized.

field convergence_metric: Literal['norm', 'max_atom', 'max_component'] = 'norm'#
Options:
  • norm: The norm of the entire force vector

  • max_atom: The maximum force on any non-frozen atom

  • max_component: The maximum force on any non-frozen degree of freedom

The metric to use to determine when an optimization is complete.

field max_iterations: int = 1000#

The maximum number of optimization iterations that will be performed.

field max_move: float = 0.2#

Maximum distance that an atom may be moved in a single optimization step (Angstroms).

field opt_method: Literal['box', 'cg', 'qm', 'lbfgs', 'fire'] = 'cg'#
Options:
  • box: Optimizes the atom positions and box using quickmin

  • cg: Conjugate gradient

  • qm: Quickmin

  • lbfgs: Limited Memory Broyden-Fletcher-Goldfarb-Shanno QuasiNewton optimizer

  • fire: Fast inertial relaxation engine

The optimization method to use.

field time_step: float = 1.0#

The dynamical timestep for the quickmin algorithm (fs).

Each of the optimizer methods have their own settings as well.

LBFGS#

[LBFGS]
pydantic model eon.schema.LBFGSConfig[source]#

Show JSON schema
{
   "title": "LBFGSConfig",
   "type": "object",
   "properties": {
      "lbfgs_memory": {
         "default": 5,
         "description": "Number of previous gradients and positions to store for the LBFGS method.",
         "title": "Lbfgs Memory",
         "type": "integer"
      },
      "lbfgs_inverse_curvature": {
         "default": 0.001,
         "description": "Initial inverse curvature value for LBFGS.",
         "title": "Lbfgs Inverse Curvature",
         "type": "number"
      },
      "lbfgs_max_inverse_curvature": {
         "default": 0.01,
         "description": "Maximum inverse curvature value for LBFGS.",
         "title": "Lbfgs Max Inverse Curvature",
         "type": "number"
      },
      "lbfgs_auto_scale": {
         "default": true,
         "description": "If true, auto-scale the inverse curvature in LBFGS.",
         "title": "Lbfgs Auto Scale",
         "type": "boolean"
      },
      "lbfgs_angle_reset": {
         "default": false,
         "description": "If true, reset the LBFGS angle.",
         "title": "Lbfgs Angle Reset",
         "type": "boolean"
      },
      "lbfgs_distance_reset": {
         "default": false,
         "description": "If true, reset the LBFGS distance.",
         "title": "Lbfgs Distance Reset",
         "type": "boolean"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field lbfgs_angle_reset: bool = False#

If true, reset the LBFGS angle.

field lbfgs_auto_scale: bool = True#

If true, auto-scale the inverse curvature in LBFGS.

field lbfgs_distance_reset: bool = False#

If true, reset the LBFGS distance.

field lbfgs_inverse_curvature: float = 0.001#

Initial inverse curvature value for LBFGS.

field lbfgs_max_inverse_curvature: float = 0.01#

Maximum inverse curvature value for LBFGS.

field lbfgs_memory: int = 5#

Number of previous gradients and positions to store for the LBFGS method.

QuickMin#

[QuickMin]
pydantic model eon.schema.QuickMinConfig[source]#

Show JSON schema
{
   "title": "QuickMinConfig",
   "type": "object",
   "properties": {
      "time_step": {
         "default": 1.0,
         "description": "Time step for QuickMin, in femtoseconds.",
         "title": "Time Step",
         "type": "number"
      },
      "qm_steepest_descent": {
         "default": false,
         "description": "If true, use the steepest descent method for QuickMin.",
         "title": "Qm Steepest Descent",
         "type": "boolean"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field qm_steepest_descent: bool = False#

If true, use the steepest descent method for QuickMin.

field time_step: float = 1.0#

Time step for QuickMin, in femtoseconds.

FIRE#

[FIRE]
pydantic model eon.schema.FIREConfig[source]#

Show JSON schema
{
   "title": "FIREConfig",
   "type": "object",
   "properties": {
      "time_step": {
         "default": 1.0,
         "description": "Time step for FIRE, in femtoseconds.",
         "title": "Time Step",
         "type": "number"
      },
      "time_step_max": {
         "default": 1.0,
         "description": "Maximum time step for FIRE, in femtoseconds.",
         "title": "Time Step Max",
         "type": "number"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field time_step: float = 1.0#

Time step for FIRE, in femtoseconds.

field time_step_max: float = 1.0#

Maximum time step for FIRE, in femtoseconds.

CG#

[CG]
pydantic model eon.schema.CGConfig[source]#

Show JSON schema
{
   "title": "CGConfig",
   "type": "object",
   "properties": {
      "cg_no_overshooting": {
         "default": false,
         "description": "If true, prevent overshooting in CG.",
         "title": "Cg No Overshooting",
         "type": "boolean"
      },
      "cg_knock_out_max_move": {
         "default": false,
         "description": "If true, limit the maximum move in CG.",
         "title": "Cg Knock Out Max Move",
         "type": "boolean"
      },
      "cg_line_search": {
         "default": false,
         "description": "If true, perform a line search in CG.",
         "title": "Cg Line Search",
         "type": "boolean"
      },
      "cg_line_converged": {
         "default": 0.0001,
         "description": "Convergence criterion for the line search in CG.",
         "title": "Cg Line Converged",
         "type": "number"
      },
      "cg_max_iter_before_reset": {
         "default": 20,
         "description": "Maximum number of iterations before reset in CG.",
         "title": "Cg Max Iter Before Reset",
         "type": "integer"
      },
      "cg_max_iter_line_search": {
         "default": 10,
         "description": "Maximum number of iterations for the line search in CG.",
         "title": "Cg Max Iter Line Search",
         "type": "integer"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field cg_knock_out_max_move: bool = False#

If true, limit the maximum move in CG.

field cg_line_converged: float = 0.0001#

Convergence criterion for the line search in CG.

If true, perform a line search in CG.

field cg_max_iter_before_reset: int = 20#

Maximum number of iterations before reset in CG.

Maximum number of iterations for the line search in CG.

field cg_no_overshooting: bool = False#

If true, prevent overshooting in CG.

SD#

[SD]
pydantic model eon.schema.SDConfig[source]#

Show JSON schema
{
   "title": "SDConfig",
   "type": "object",
   "properties": {
      "sd_alpha": {
         "default": 0.1,
         "description": "Alpha value for SD.",
         "title": "Sd Alpha",
         "type": "number"
      },
      "sd_twopoint": {
         "default": false,
         "description": "If true, use the two-point method in SD.",
         "title": "Sd Twopoint",
         "type": "boolean"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field sd_alpha: float = 0.1#

Alpha value for SD.

field sd_twopoint: bool = False#

If true, use the two-point method in SD.

References#

[OPT_STH08]

Daniel Sheppard, Rye Terrell, and Graeme Henkelman. Optimization methods for finding minimum energy paths. The Journal of Chemical Physics, 128(13):134106, April 2008. doi:10.1063/1.2841941.