8.10.2. Optimization

The Optimization class is where the other components – Job Collection, Data Set, Parameter Interfaces and optimizer – come together. It is responsible for the selection, generation, execution and evaluation of new jobs for every new parameter set.

See also

Architecture Quick Reference for an overview

A Optimization instance will usually be initialized once every other component is defined:

>>> interface     = ReaxFFParameters('path/to/ffield.ff')
>>> jc            = JobCollection('path/to/jobcol.yml')
>>> training_set  = DataSet('path/to/data_set.yml')
>>> optimizer     = CMAOptimizer(popsize=15)
>>> optimization  = Optimization(jc, training_set, interface, optimizer)

Once initialized, the following will run a complete optimization:

>>> optimization.optimize()

After instantiation, a summary of all relevant settings can be printed with summary():

>>> optimization.summary()
Optimization() Instance Settings:
=================================
Workdir:                           opt
JobCollection size:                20
Interface:                         ReaxFFParameters
Active parameters:                 207
Optimizer:                         CMAOptimizer

Evaluators:
-----------
Name:                              training_set (_LossEvaluator)
Loss:                              SSE
Evaluation interval:              1

Data Set entries:                  20
Data Set jobs:                     20
Batch size:                        None

CPU cores:                         6
Use PIPE:                          True
---
===

8.10.2.1. Optimization Setup

The optimization can be further controlled by providing a number of optional keyword arguments to the Optimization instance. While the full list of arguments is documented in the API section below, the most relevant ones are presented here.

parallellevels

An instance of the ParallelLevels class describing how the optimization is to be parallelized.

constraints

Constraints additionally define the parameter search space by checking if every solution is consistent with the definition.

validation

Percentage of the training_set entries to be used for validation.

loss

The loss function to be used for this optimization instance.

batch_size

Instead of evaluating all properties in the training_set, evaluate a maximum of randomly picked batch_size entries per iteration.

8.10.2.2. Optimization API

class Optimization(job_collection: scm.params.core.jobcollection.JobCollection, data_sets: Union[scm.params.core.dataset.DataSet, Sequence[scm.params.core.dataset.DataSet]], parameter_interface: scm.params.parameterinterfaces.base.BaseParameters, optimizer: Optional[Union[scm.glompo.optimizers.baseoptimizer.BaseOptimizer, scm.glompo.opt_selectors.baseselector.BaseSelector]] = None, workdir: str = 'optimization', plams_workdir_path: Optional[str] = None, validation: Optional[float] = None, constraints: Optional[Sequence[scm.params.parameterinterfaces.base.Constraint]] = None, parallel: Optional[scm.params.common.parallellevels.ParallelLevels] = None, verbose: bool = True, skip_x0: bool = False, logger_every: Optional[Union[dict, int]] = None, loss: Union[scm.params.core.lossfunctions.Loss, Sequence[scm.params.core.lossfunctions.Loss]] = 'sse', batch_size: Optional[Union[int, Sequence[int]]] = None, use_pipe: Union[bool, Sequence[bool]] = True, data_set_names: Optional[Sequence[str]] = None, eval_every: Union[int, Sequence[int]] = 1, maxjobs: Union[None, Sequence[int]] = None, maxjobs_shuffle: Union[bool, Sequence[bool]] = False, resume_checkpoint: Optional[Union[str, pathlib.Path]] = None, **glompo_kwargs)

Brings ParAMS components together and allows for configuration of optimization manager.

For compatibility the signature remains the same.

For most parameters the meaning of the parameters remains the same, only those that have changed are documented below.

Parameters

optimizer

Accepts a single optimizer as normal, but now also accepts a GloMPO BaseSelector collection of optimizers if you would like to use more than one.

Note

The worker argument of the optimizers will be overwritten by the product of all values in parallel except for optimizations.

Important

Since multiple optimizers can be started in parallel the instance given to this argument will only be used as a template from which other instances will be made. This means the instance given here will not be used for optimization. Keep this in mind if you intend to retain a reference to the optimizer instance for later post-processing.

title

The working directory for this optimization. Once optimize() is called, will NOT switch to it. (see glompo_kwargs)

verbose

Active GloMPO’s logging progress feedback.

glompo_kwargs

GloMPO related arguments sent to GloMPOManager.setup().

The following extra keywords are allowed:

'scaler'

Extra keyword which specifies the type of scaling used by function. Defaults to a linear scaling of all parameters between 0 and 1 if none of the used optimizers requests a particular scaling. An error will be raised if there is a conflict between any combination of this keyword and those mandated by the optimizers.

The following keywords will be ignored if provided:

'opt_selector'

Constructed from optimizer.

'bounds'

Automatically extracted from parameter_interface.

'task'

It is constructed within this class from job_collection, data_set, parameter_interface.

'working_dir'

title will be used as this parameter.

'overwrite_existing'

No overwriting allowed according to ParAMS behavior. title will be incremented until a non-existent directory is found.

'max_jobs'

Will be calculated from parallel.

'backend'

Only 'threads' are allowed within ParAMS.

'is_log_detailed'

This must be True for the sake of ParAMS internals.

__init__(job_collection: scm.params.core.jobcollection.JobCollection, data_sets: Union[scm.params.core.dataset.DataSet, Sequence[scm.params.core.dataset.DataSet]], parameter_interface: scm.params.parameterinterfaces.base.BaseParameters, optimizer: Optional[Union[scm.glompo.optimizers.baseoptimizer.BaseOptimizer, scm.glompo.opt_selectors.baseselector.BaseSelector]] = None, workdir: str = 'optimization', plams_workdir_path: Optional[str] = None, validation: Optional[float] = None, constraints: Optional[Sequence[scm.params.parameterinterfaces.base.Constraint]] = None, parallel: Optional[scm.params.common.parallellevels.ParallelLevels] = None, verbose: bool = True, skip_x0: bool = False, logger_every: Optional[Union[dict, int]] = None, loss: Union[scm.params.core.lossfunctions.Loss, Sequence[scm.params.core.lossfunctions.Loss]] = 'sse', batch_size: Optional[Union[int, Sequence[int]]] = None, use_pipe: Union[bool, Sequence[bool]] = True, data_set_names: Optional[Sequence[str]] = None, eval_every: Union[int, Sequence[int]] = 1, maxjobs: Union[None, Sequence[int]] = None, maxjobs_shuffle: Union[bool, Sequence[bool]] = False, resume_checkpoint: Optional[Union[str, pathlib.Path]] = None, **glompo_kwargs)

Initialize self. See help(type(self)) for accurate signature.

classmethod read(input_text: Union[str, scm_libbase_internal.InputFile, pathlib.Path], **kwargs)scm.params.core.parameteroptimization.Optimization

Create and optimization instance by reading an AMS style input file.

optimize()scm.glompo.optimizers.baseoptimizer.MinimizeResult

Start the optimization given the initial parameters.

initial_eval()float

Evaluate x0 before the optimization.

Returns

float

Error value using parameters as loaded from the parameter interface.

Raises

ValueError

If fx is a non-finite value.

summary(file=None)

Prints a summary of the current instance

__str__()

Return str(self).

delete()

Remove the working directory from disk.

_relog_bests(task: scm.params.core.opt_components._Step)

Evaluate the saved best points for the points being restarted and the overall best and use them to prime new Loggers. This ensures the correct ‘best’ value is returned even if that evaluation does not appear in the ‘running_*.txt’ files.