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.binis loaded asuint8(6 GB) by default. The orientation kernel only needs 0/1 values; the L-BFGS calibration paths requestfloat32explicitly. - 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
NumIterationsindependent 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 Cpwritebyte 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 toauto(CUDA if available).--fp32— float32 forward (faster on CUDA, less bit-stable than float64 — the package default).--screen-only— stop after Phase 1 and dumpscreen_cpu.csv(mirrorsMIDAS_SCREEN_ONLY=1in 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38f9940b414a0344e6116784f0d2c8e265885bcdb5c479fb88b630bdd94cc9e1
|
|
| MD5 |
ded8ae3245e50b0670129171a75bab20
|
|
| BLAKE2b-256 |
fa4bd86aceeefae84a391cbb9cdb4b4e6faef2d96ca19e0e470fcf00b7003496
|
Provenance
The following attestation bundles were made for midas_nf_fitorientation-0.3.0.tar.gz:
Publisher:
python-packages.yml on marinerhemant/MIDAS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
midas_nf_fitorientation-0.3.0.tar.gz -
Subject digest:
38f9940b414a0344e6116784f0d2c8e265885bcdb5c479fb88b630bdd94cc9e1 - Sigstore transparency entry: 1446591094
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@360096912e32ed91a9ac78f15b297ef248dc96de -
Branch / Tag:
refs/tags/midas-nf-fitorientation-v0.3.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@360096912e32ed91a9ac78f15b297ef248dc96de -
Trigger Event:
release
-
Statement type:
File details
Details for the file midas_nf_fitorientation-0.3.0-py3-none-any.whl.
File metadata
- Download URL: midas_nf_fitorientation-0.3.0-py3-none-any.whl
- Upload date:
- Size: 73.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98c12c0de8f11db67a83e81b166b2ca2ea508ab7a63d6ee5b1da27748a180c96
|
|
| MD5 |
7431aea2720f8e2fa47b3b4164ba4d45
|
|
| BLAKE2b-256 |
54f5fcb9e6b4bc191577267e65619fc41d8c700ec95fdfcf5aaf303ee7e73fa7
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
midas_nf_fitorientation-0.3.0-py3-none-any.whl -
Subject digest:
98c12c0de8f11db67a83e81b166b2ca2ea508ab7a63d6ee5b1da27748a180c96 - Sigstore transparency entry: 1446591176
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@360096912e32ed91a9ac78f15b297ef248dc96de -
Branch / Tag:
refs/tags/midas-nf-fitorientation-v0.3.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@360096912e32ed91a9ac78f15b297ef248dc96de -
Trigger Event:
release
-
Statement type: