Skip to main content

Differentiable NF-HEDM orientation and calibration fitter (drop-in replacement for FitOrientationOMP, FitOrientationParameters, FitOrientationParametersMultiPoint)

Project description

midas-nf-fitorientation

Differentiable, drop-in replacement for the three NF-HEDM orientation and calibration C executables in MIDAS:

C executable Python equivalent Console script
FitOrientationOMP fit_orientation_run midas-nf-fit-orientation
FitOrientationParameters fit_parameters_run midas-nf-fit-parameters
FitOrientationParametersMultiPoint fit_multipoint_run midas-nf-fit-multipoint

Built on top of midas-diffract, so the forward model is the same one validated to pixel-exact agreement against the C simulators. Orientation refinement uses a vectorised PyTorch Nelder-Mead running every (voxel × winner) fit problem in one batched forward call per NM iteration; calibration refinement (in fit_parameters and fit_multipoint) uses L-BFGS over the soft Gaussian-splat surrogate because Nelder-Mead scales poorly past ~10 DoF.

What changed vs. the C codes

  • Orientation optimiser: NLopt Nelder-Mead → vectorised PyTorch Nelder-Mead (midas_nf_fitorientation.torch_nm). Same hard FracOverlap objective the C uses, but every (voxel, winner) fit is batched into one forward call per NM iteration. Converged simplices are trimmed out of the active set on the fly so each successive iteration is cheaper. ~22× faster than per-winner scipy NM on H100; bit-equivalent answers modulo NM convergence noise.
  • Calibration optimiser (joint orientation + geometry refinement in fit_parameters / fit_multipoint): NLopt LN_NELDERMEAD → PyTorch L-BFGS over a soft Gaussian-splat surrogate with tanh-reparameterised bounds. NM is the wrong tool past ~10 DoF; L-BFGS scales well, at the cost of optimising a slightly smoothed basin floor.
  • Obs volume storage: the 24 GB SpotsInfo.bin is loaded as uint8 (6 GB) by default. The orientation kernel only needs 0/1 values; the L-BFGS calibration paths request float32 explicitly.
  • Bounds: each refined parameter (Eulers, tilts, Lsd, ΔLsd, BC, optionally wedge) is reparameterised as x = x0 + tol * tanh(u), so L-BFGS sees an unbounded variable but the physical parameter cannot leave its tolerance box.
  • Tikhonov regularisation (opt-in, layered on top of tanh): a quadratic prior on the calibration block, useful in the multi-point joint fit where you want to drift only when many voxels' worth of evidence agree.
  • Wedge refinement (opt-in, paramfile key RefineWedge 1): not available in the C code; the model accepts wedge as a calibration DoF.
  • Multi-start global search for the multi-point joint fit: the C code's NM→CRS2→NM ladder is replaced with NumIterations independent L-BFGS attempts, each seeded with a Gaussian perturbation of the previous best within the tanh box. CRS2's true global behaviour is lost; for well-seeded calibration the multi-start gives the same answer in practice.
  • Output files (MicFileBinary, MicFileBinary.AllMatches) match the C pwrite byte layout exactly.

Installation

From the repository root:

pip install ./packages/midas_diffract
pip install ./packages/midas_nf_fitorientation

PyTorch ≥ 2.0 is required; CUDA / MPS is auto-detected.

CLI usage

The argument signatures mirror the C executables, so existing wrapper scripts swap binaries without changes:

midas-nf-fit-orientation  params.txt blockNr nBlocks nCPUs [--device cuda] [--fp32] [--screen-only]
midas-nf-fit-parameters   params.txt rowNr   [nCPUs]      [--device cuda] [--fp32]
midas-nf-fit-multipoint   params.txt         [nCPUs]      [--device cuda] [--fp32]

Common flags (parsed after the positional args):

  • --device {auto,cpu,cuda} — defaults to auto (CUDA if available).
  • --fp32 — float32 forward (faster on CUDA, less bit-stable than float64 — the package default).
  • --screen-only — stop after Phase 1 and dump screen_cpu.csv (mirrors MIDAS_SCREEN_ONLY=1 in the C code).
  • --verbose — chatty progress.
  • --lbfgs-max-iter N, --lbfgs-max-outer N — L-BFGS step limits.

Python API

import midas_nf_fitorientation as fit

# Replaces FitOrientationOMP
fit.fit_orientation_run(
    paramfile="params.txt", block_nr=0, n_blocks=1, n_cpus=8,
    device="cuda", verbose=True,
)

# Replaces FitOrientationParameters (single-voxel calibration)
result = fit.fit_parameters_run(
    paramfile="params.txt", voxel_idx=42, n_cpus=4, verbose=True,
)
print(result["Lsd"], result["tilts"], result["frac_overlap"])

# Replaces FitOrientationParametersMultiPoint (joint multi-voxel)
result = fit.fit_multipoint_run(paramfile="params.txt", n_cpus=8)

Paramfile keys

Every key consumed by the C executables is recognised, plus a small set of new keys. See midas_nf_fitorientation/params.py for the full schema. The new keys:

Key Default Purpose
RefineWedge 1 off Add wedge to the calibration DoF set
WedgeTol 0.05 0.05° Tanh-box width for wedge
TikhonovCalibration 1.0 0 Global λ for the calibration prior; 0 disables
TikhonovSigmaLsd 100.0 100 µm Prior σ for Lsd
TikhonovSigmaTilts 0.05 0.05° Prior σ for tilts
TikhonovSigmaBC 1.0 1 px Prior σ for beam centres
TikhonovSigmaWedge 0.05 0.05° Prior σ for wedge
GaussianSplatSigmaPx 1.5 auto Override the auto-σ for the soft-overlap kernel

NumIterations (existing) controls the number of multi-start trials in fit_multipoint. Default 1 (single L-BFGS run); set to ≥ 8 for true multi-start.

Status

v0.1 is alpha. The forward path is validated against midas-diffract (pixel-exact vs. the C simulators); the fit drivers have unit-test coverage at the module level. End-to-end agreement against the C MicFileBinary on a real reconstruction dataset is the next milestone.

Licence

BSD-3-Clause.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

midas_nf_fitorientation-0.3.0.tar.gz (83.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

midas_nf_fitorientation-0.3.0-py3-none-any.whl (73.7 kB view details)

Uploaded Python 3

File details

Details for the file midas_nf_fitorientation-0.3.0.tar.gz.

File metadata

  • Download URL: midas_nf_fitorientation-0.3.0.tar.gz
  • Upload date:
  • Size: 83.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for midas_nf_fitorientation-0.3.0.tar.gz
Algorithm Hash digest
SHA256 38f9940b414a0344e6116784f0d2c8e265885bcdb5c479fb88b630bdd94cc9e1
MD5 ded8ae3245e50b0670129171a75bab20
BLAKE2b-256 fa4bd86aceeefae84a391cbb9cdb4b4e6faef2d96ca19e0e470fcf00b7003496

See more details on using hashes here.

Provenance

The following attestation bundles were made for midas_nf_fitorientation-0.3.0.tar.gz:

Publisher: python-packages.yml on marinerhemant/MIDAS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file midas_nf_fitorientation-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for midas_nf_fitorientation-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 98c12c0de8f11db67a83e81b166b2ca2ea508ab7a63d6ee5b1da27748a180c96
MD5 7431aea2720f8e2fa47b3b4164ba4d45
BLAKE2b-256 54f5fcb9e6b4bc191577267e65619fc41d8c700ec95fdfcf5aaf303ee7e73fa7

See more details on using hashes here.

Provenance

The following attestation bundles were made for midas_nf_fitorientation-0.3.0-py3-none-any.whl:

Publisher: python-packages.yml on marinerhemant/MIDAS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page