Components
**********

Below is a brief introduction to the most important components of the
code to orient first-time users. GloMPO is implemented in a modular
way such that all decision criteria are customizable.

Note:

  If a module is not mentioned below, then its contents are probably
  not intended to be used directly by users.

"core"
   This module contains the most important GloMPO components:

   "manager.py"
      Contains "GloMPOManager" the primary point of entry into the
      code. The manager performs the optimization, accepts all
      settings, and produces all the output.

   "checkpointing.py"
      Contains "CheckpointingControl" which configures GloMPO's
      ability to save a snapshot of itself during an optimization from
      which it can resume later.

   "function.py"
      An API template for the optimization task from which it *may*,
      but *need not*, inherit.

   "optimizerlogger.py"
      Contains classes used to record optimizations in memory and save
      them to file. Users should not need to work with these classes
      directly.

"opt_selectors"
   Each file contains a different "BaseSelector" child-class. These
   objects decide which optimizer configuration to start from a list
   of options.

"optimizers"
   Each file contains a different "BaseOptimizer" child-class. These
   are implementations or wrappers around actual optimization
   algorithms.

"generators"
   Each file contains a different "BaseGenerator" child-class. These
   are algorithms which decide where optimizers are started within the
   search domain.

"exitconditions"
   Each file contains a different "BaseExitCondition" child-class.
   These are simple conditions which control GloMPO's overall
   termination conditions.

"stoppers"
   Each file contains a different "BaseStopper" child-class. These are
   termination conditions which, if satisfied, will get GloMPO to
   trigger an early termination of a particular optimizer.

"analysis"
   A module containing classes related to parameter sensitivity
   analysis.

   "hsic.py"
      Contains the class "HSIC" to compute new results and
      "HSICResult" to load previous ones.

   "kernels.py"
      Contains the kernels needed for the HSIC calculation. Users can
      use "BaseKernel" to implement their own kernels.

* Manager

  * "GloMPOManager"

    * "GloMPOManager.is_initialised"

    * "GloMPOManager.new_manager()"

    * "GloMPOManager.load_manager()"

    * "GloMPOManager.setup()"

    * "GloMPOManager.load_checkpoint()"

    * "GloMPOManager.start_manager()"

    * "GloMPOManager.checkpoint()"

    * "GloMPOManager.write_summary_file()"

* Optimizers

  * Optimizer Return Type

    * "MinimizeResult"

  * Abstract Base Optimizer

    * "BaseOptimizer"

  * Adaptive Rate Monte Carlo Optimizer

    * "ARMCOptimizer"

  * CMA-ES

    * "CMAOptimizer"

  * Nevergrad

    * "Nevergrad"

  * SciPy Optimize

    * "Scipy"

  * Grid-wise Evaluation 'Optimizer'

    * "SimpleGridOptimizer"

  * Random 'Optimizer'

    * "RandomOptimizer"

* Selectors

  * Abstract Base Selector

    * "BaseSelector"

  * Spawn Control

    * "BaseController"

    * "IterSpawnStop"

    * "NOptimizersSpawnStop"

  * Included Selectors

    * "ChainSelector"

    * "CycleSelector"

    * "RandomSelector"

* Generators

  * Abstract Base Generator

    * "BaseGenerator"

  * Simple Generators

    * "ExploitExploreGenerator"

    * "IncumbentGenerator"

    * "PerturbationGenerator"

    * "RandomGenerator"

    * "SinglePointGenerator"

* Exit Conditions

  * Abstract Base ExitCondition

    * "BaseExitCondition"

  * Combining Base ExitConditions

  * Included ExitConditions

    * "MaxOptimizersConverged"

    * "MaxOptimizersStarted"

    * "MaxOptimizersStopped"

    * "MaxTotalFunctionCalls"

    * "StopsAfterConvergence"

    * "TargetFunctionValue"

    * "TimeLimit"

* Stoppers

  * Abstract Base Stopper

    * "BaseStopper"

  * Combining Base Stoppers

  * Included Stoppers

    * "BestFunctionValueUnmoving"

    * "CurrentFunctionValueUnmoving"

    * "MaxFunctionCalls"

    * "MaxInteroptimizerDistance"

    * "MaxSequentialInvalidPoints"

    * "MinStepSize"

    * "OptimizerType"

    * "TimeAnnealing"

    * "ValidationWorsening"

    * "ValueAnnealing"

* Checkpointing

  * Checkpointing & Log Files

  * Checkpointing Control Settings

    * "CheckpointingControl"

* Sensitivity Analysis

  * HSIC

    * "HSIC"

  * HSIC Results

    * "HSICResult"

    * "HSICResultWithReweight"

  * Kernels

    * "BaseKernel"

    * "ConjunctiveGaussianKernel"

    * "GaussianKernel"

    * "LinearKernel"

    * "PolynomialKernel"

    * "ThresholdKernel"

* Extras

  * Named Tuples

    * "Bound"

    * "IterationResult"

    * "OptimizerCheckpoint"

    * "OptimizerPackage"

    * "ProcessPackage"

    * "Result"

  * Helpers

    * "BoundGroup"

    * "CheckpointingError"

    * "FlowList"

    * "LiteralWrapper"

    * "SplitOptimizerLogs"

    * "StopInterrupt"

    * "WorkInDirectory"

    * "__all__"

    * "amsinput()"

    * "amssettings()"

    * "bound_group_presenter()"

    * "deepsizeof()"

    * "distance()"

    * "flow_presenter()"

    * "generator_presenter()"

    * "glompo_colors()"

    * "infer_headers()"

    * "is_bounds_valid()"

    * "literal_presenter()"

    * "nested_string_formatting()"

    * "number_available_cores()"

    * "numpy_array_presenter()"

    * "numpy_dtype_presenter()"

    * "optimizer_selector_presenter()"

    * "present_memory()"

    * "rolling_min()"

    * "unknown_object_presenter()"

    * "unravel()"

  * Wrappers

    * "catch_user_interrupt()"

    * "decorate_all_methods()"

    * "needs_optional_package()"

    * "process_print_redirect()"
