gproptim
    • eOn Saddle point finding on potential energy surfaces
    • rgpot Universal RPC potential interface
/

Tutorial

  • Tutorial: GP-Accelerated Saddle Point Search
  • Tutorial: Fortran Interop
  • MPI-Parallel Saddle Point Search

How-to

  • How to: Use the T-Process for Robust GP Regression
  • How to: Run GP-NEB with OIE Acquisition
  • How-to: Use the C API from Fortran

Guide

  • Installation
  • EESSI overlay vs. the default pixi environment
  • Usage
  • Performance Optimisation
  • RPC and Serialization

Reference

  • Contributing
    • Performance Development Guidelines
  • Changelog

Python API

  • API Reference
    • gpr_optim

C++ API

  • C++ API Reference
    • Global Namespace
      • namespace atmd
        • class atmd::AtomicDimer
      • namespace aux
        • struct aux::AtomSignature
        • struct aux::InverseDistanceCache
        • class aux::AuxiliaryFunctionality
        • class aux::Distance
        • class aux::Gradient
        • class aux::ProblemSetUp
      • namespace ceres
      • namespace dimer
        • class dimer::Dimer
      • namespace fmin
      • namespace funcmin
        • class funcmin::ADAM
        • class funcmin::Ceres
        • template class funcmin::GprCostFunction
        • class funcmin::SCG
      • namespace gpr
      • namespace gpr
      • namespace gpr
      • namespace gpr
      • namespace gpr
        • namespace gpr::coord
        • namespace gpr::field
        • namespace gpr::io
        • namespace gpr::laplace
        • namespace gpr::linalg
        • namespace gpr::neb
        • namespace gpr::optim
        • namespace gpr::potentials
        • namespace gpr::priors
        • namespace gpr::sfc
        • namespace gpr::tests
        • enum gpr::HyperparameterOptimizationMode
        • enum gpr::ScgCurvatureMode
        • enum gpr::UncertaintyMode
        • struct gpr::ARDSearchResult
        • struct gpr::AdamOptimizationSettings
        • struct gpr::AtomsConfiguration
        • struct gpr::AtomsPositionAndType
        • struct gpr::BMAPrediction
        • struct gpr::CeresOptimizationSettings
        • template struct gpr::Derivatives
        • struct gpr::EnergyAndGradient
        • struct gpr::EnergySurfaceOutputInfo
        • struct gpr::GPRSetup
        • struct gpr::INLAPrediction
        • struct gpr::Indices2D
        • struct gpr::InputParameters
        • struct gpr::IterationsLimits
        • template struct gpr::KeyValuePair
        • struct gpr::LBFGSInfo
        • struct gpr::NoiseSearchResult
        • struct gpr::Observation
        • struct gpr::OptimizerCommonSettings
        • template struct gpr::Pair
        • struct gpr::ScgOptimizationSettings
        • struct gpr::SexpatLocalOracleScope
        • struct gpr::StopCriteriaForDimer
        • struct gpr::StructuredPermutation
        • struct gpr::TransitionParameters
        • template struct gpr::Triplet
        • class gpr::ARDGridSearch
        • class gpr::BayesianModelAveraging
        • class gpr::ConstantCF
        • class gpr::FactorizedLikelihood
        • class gpr::GaussianProcessRegression
        • class gpr::InverseDistanceDescriptor
        • class gpr::LaplaceINLA
        • class gpr::LikGaussian
        • class gpr::NoiseGridSearch
        • class gpr::ObservationLikelihood
        • class gpr::PriorBase
        • class gpr::PriorGaussian
        • class gpr::PriorLogNormal
        • class gpr::PriorLogUnif
        • class gpr::PriorSqrtt
        • class gpr::PriorT
        • class gpr::PriorUnif
        • class gpr::RFFModel
        • class gpr::RandomFourierFeatures
        • class gpr::SexpatCF
        • class gpr::StudentTProcessRegression
        • class gpr::TrustRadius
      • namespace laplace
      • namespace linalg
      • namespace math
        • class math::DistributionFunctions
        • class math::MatrixProperties
      • namespace pot
        • class pot::PotentialWrapper
      • namespace std
      • enum ConvergenceNormType
      • enum DebugLevels
      • enum DimerAlgorithm
      • enum Directions
      • enum DistanceMetricType
      • enum FrozenAndMovingAtoms
      • enum OptimizationAlgorithms
      • enum OptionsForGradCalculation
      • enum Potentials
      • enum gpr_acquisition_t
      • enum gpr_conv_norm_t
      • enum gpr_model_type_t
      • enum gpr_neb_mode_t
      • enum gpr_optim_alg_t
      • enum gpr_uncertainty_mode_t
      • struct gpr_atoms_config_t
      • struct gpr_atoms_s
      • struct gpr_dimer_config_t
      • struct gpr_lj_params_t
      • struct gpr_minimize_config_t
      • struct gpr_model_config_t
      • struct gpr_model_s
      • struct gpr_neb_config_t
      • struct gpr_neb_s

On this page

  • 1 Finding a Transition State on the Muller-Brown Surface
    • 1.1 What you will learn
    • 1.2 Prerequisites
    • 1.3 Step 1: Define the potential
    • 1.4 Step 2: Set up parameters
    • 1.5 Step 3: Create initial observations
    • 1.6 Step 4: Set up atomic configuration
    • 1.7 Step 5: Run the dimer search
    • 1.8 Step 6: Interpret results
    • 1.9 Next steps
gpr_optim 0 0
Edit this page
  1. gproptim /
  2. Tutorial: GP-Accelerated Saddle Point Search
View Source Open in ChatGPT Open in Claude

Tutorial: GP-Accelerated Saddle Point Search¶

Contents

  • Tutorial: GP-Accelerated Saddle Point Search

    • 1 Finding a Transition State on the Muller-Brown Surface

      • 1.1 What you will learn

      • 1.2 Prerequisites

      • 1.3 Step 1: Define the potential

      • 1.4 Step 2: Set up parameters

      • 1.5 Step 3: Create initial observations

      • 1.6 Step 4: Set up atomic configuration

      • 1.7 Step 5: Run the dimer search

      • 1.8 Step 6: Interpret results

      • 1.9 Next steps

1 Finding a Transition State on the Muller-Brown Surface¶

This tutorial walks through a complete GP-accelerated saddle point search using gpr_optim. We find the transition state between two minima on the Muller-Brown potential, a standard 2D benchmark surface.

1.1 What you will learn¶

  • How to set up a GP dimer search from Python

  • How the GP surrogate reduces oracle (energy/force) calls

  • How to interpret the results

1.2 Prerequisites¶

pip install gpr_optim ase

1.3 Step 1: Define the potential¶

The Muller-Brown surface has three minima and two saddle points:

import numpy as np
from gpr_optim import (
    ase_potential, run_dimer, preset_parameters,
    AtomsConfiguration, Observation, PotentialWrapper,
    atoms_config_from_ase,
)

# Use the built-in Muller-Brown potential as an ASE calculator
# (In practice, replace with VASP, CP2K, or any ASE calculator)
from ase import Atoms
from ase.calculators.emt import EMT

# For this tutorial, we wrap a simple 2-atom system
atoms = Atoms("Cu2", positions=[[0, 0, 0], [2.5, 0, 0]])
atoms.calc = EMT()
pot_fn = ase_potential(atoms)

1.4 Step 2: Set up parameters¶

# Start from the "fast" preset (fewer iterations, loose convergence)
params = preset_parameters("fast")

# Override key parameters for this system
params["dimer_sep"] = 0.01        # dimer separation
params["T_dimer"] = 0.05          # force convergence threshold
params["method_rot"] = "LBFGS_alg"
params["method_trans"] = "LBFGS_alg"
params["param_trans"] = np.array([0.1, 0.2])
params["cell_dimensions"] = np.zeros(9)

1.5 Step 3: Create initial observations¶

# Initial midpoint observation
init_mid = Observation()
init_mid.R = np.array([[0, 0, 0, 2.5, 0, 0]], dtype=np.float64)
init_mid.E = np.array([[atoms.get_potential_energy()]], dtype=np.float64)
init_mid.G = np.array([[-atoms.get_forces().flatten()]], dtype=np.float64)

# Initial observation set (can be empty)
init_obs = Observation()
init_obs.clear()

# Initial dimer orientation
orient = np.array([[0, 0, 1, 0, 0, -1]], dtype=np.float64)
orient /= np.linalg.norm(orient)

1.6 Step 4: Set up atomic configuration¶

atoms_config = atoms_config_from_ase(atoms)

1.7 Step 5: Run the dimer search¶

dimer = run_dimer(params, init_obs, init_mid, orient, atoms_config, pot_fn)

print(f"Converged: {dimer.get_total_force_calls()} force calls")
print(f"Final energy: {dimer.get_final_energy():.4f}")
print(f"GPR surrogate calls: {dimer.get_total_gpr_force_calls()}")
print(f"Iterations: {dimer.get_iterations()}")

1.8 Step 6: Interpret results¶

The key metric is the ratio of GPR surrogate calls to true force calls. A ratio > 5 means the GP saved significant computation. For expensive DFT calculations, this translates directly to wall-time savings.

1.9 Next steps¶

  • Use preset_parameters("accurate") for tighter convergence

  • Try the T-process for robustness: see How to use the T-process

  • Run GP-NEB for minimum energy paths: see How to run GP-NEB

Previous
Home
Next
Tutorial: Fortran Interop

2022--present, gproptim developers

Made with Sphinx and Shibuya theme.