Skip to content

Optimize ELBO computation for normal prior#11

Open
xiki-tempula wants to merge 2 commits into
DingGroup:mainfrom
xiki-tempula:feat_prior
Open

Optimize ELBO computation for normal prior#11
xiki-tempula wants to merge 2 commits into
DingGroup:mainfrom
xiki-tempula:feat_prior

Conversation

@xiki-tempula

@xiki-tempula xiki-tempula commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR significantly improves the performance of BayesMBAR when using prior='normal' by:

  • Adding configurable elbo_samples with intelligent auto-determination
  • Implementing early stopping for hyperparameter optimization
  • Pre-computing constant terms to avoid redundant computation
  • Adding input validation with clear error messages

Motivation

When running BayesMBAR with prior='normal' on large datasets (e.g., 48 states, 240K configurations), the original implementation was extremely slow or ran out of memory due to:

  1. Hardcoded 1024 ELBO samples per optimization step
  2. Fixed 10,000 optimization steps with no early stopping
  3. Repeated computation of log(num_conf) on every likelihood evaluation

Changes

New Parameters

Parameter Default Description
elbo_samples "auto" Number of samples for ELBO estimation. Auto-determines based on problem size, or accepts a positive integer.
early_stopping_patience 100 Stops optimization after N steps without improvement
early_stopping_tol 1e-4 Minimum improvement threshold to reset patience counter

Auto elbo_samples Determination

The auto-determination uses heuristics based on:

  • Problem dimensionality: scales with √(m-1) for m states
  • Dataset size: reduces samples for large datasets (>50K configs) since each evaluation is more informative
  • Bounded to [32, 256] for practical limits

Example auto-determined values:

States Configs Auto Value
10 5,000 36
48 24,000 92
48 240,000 54
100 500,000 79

Performance Impact

Optimization Speedup
Reduced ELBO samples ~10-20x per step
Early stopping ~2-10x (stops when converged)
Pre-computed constants ~1.1x

Testing

Added new tests:

  • test_auto_elbo_samples_scaling: Verifies scaling behavior and bounds
  • test_elbo_samples_validation: Verifies input validation and error messages
  • test_BayesMBAR_uniform_prior_accuracy: Quick accuracy check

All tests pass in ~12 seconds.

Usage

from bayesmbar import BayesMBAR

# Auto-determined (recommended)
mbar = BayesMBAR(
    energy, num_conf,
    prior='normal', mean='linear',
    state_cv=state_cv,
    elbo_samples='auto',  # Default - auto-determined
)

# Or explicit value
mbar = BayesMBAR(
    energy, num_conf,
    prior='normal', mean='linear', 
    state_cv=state_cv,
    elbo_samples=64,
    early_stopping_patience=50,
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant