Usage

Python Bindings

Atomic Dimer

The primary entry point is the AtomicDimer class, which performs GPR-accelerated transition state searches.

import numpy as np
from gpr_optim import AtomicDimer, validate_parameters, default_parameters

params = default_parameters()
validate_parameters(params)

dimer = AtomicDimer()

Standalone Gaussian Process

For standalone GP usage (training and prediction without the dimer), use GaussianProcessRegression directly:

from gpr_optim import (
    GaussianProcessRegression,
    default_gpr_parameters,
    validate_parameters,
    Observation,
    AtomsConfiguration,
    initialize_atoms_configuration,
)

# Set up atoms configuration
n_atoms = 2
atom_types = np.ones(n_atoms, dtype=np.int32)
positions = np.random.randn(1, 3 * n_atoms)
atoms_config = initialize_atoms_configuration(positions, atom_types)

# Set up observations
obs = Observation()
obs.R = positions  # (n_obs, 3*n_atoms)
obs.E = np.array([[0.5]])  # (n_obs, 1)
obs.G = np.random.randn(1, 3 * n_atoms)  # (n_obs, 3*n_atoms)

# Configure and train
params = default_gpr_parameters()
validate_parameters(params)

gpr = GaussianProcessRegression()
gpr.initialize(params, atoms_config)
gpr.set_hyperparameters(obs, atoms_config)
gpr.optimize(obs)

# Predict
query = Observation()
query.R = np.random.randn(1, 3 * n_atoms)
gpr.calculate_potential(query)  # fills query.E and query.G

Observation Layout

Observations use row-major matrices where rows = number of observations:

Field

Shape

Description

R

(n_obs, 3 * n_moving)

Coordinates of moving atoms

E

(n_obs, 1)

Energies

G

(n_obs, 3 * n_moving)

Gradients (not forces)

C++ API

See the Doxygen API reference for full C++ documentation.