Pure-Python/PyTorch FF-HEDM grain-determination + strain pipeline (drop-in replacement for ProcessGrains)
Project description
midas-process-grains
Pure-Python (PyTorch) replacement for FF_HEDM/src/ProcessGrains.c. Reads the
binary outputs of the upstream MIDAS pipeline (OrientPosFit.bin, Key.bin,
ProcessKey.bin, IndexBestFull.bin, FitBest.bin) and emits the canonical
Grains.csv / SpotMatrix.csv / GrainIDsKey.csv files.
Scope: bit-level parity with the C reference
The package has one shippable mode: c_parity, which mirrors
FF_HEDM/src/ProcessGrains.c exactly. The Stage 1 cluster-build, the Pass A
position+orientation dedup, the confidence cut, and the 47-column
Grains.csv / 12-column SpotMatrix.csv / GrainIDsKey.csv writers all
follow the C source line-for-line.
On the peakfit_hard reference dataset (357 k seeds → 22 k grains), the
Python output is bit-identical to the C output for every column except
the Kenesei strain tensor — see "Parity verdict" below.
Earlier experimental modes (legacy, paper_claim, spot_aware) shipped in
v0.1 internal builds are still present in the source tree but are not
exposed through the supported public surface. They will be removed in a
future cleanup.
CLI
midas-process-grains paramstest.txt 8 --mode c_parity --device cuda
The CLI reads paramstest.txt from the run directory, writes the three
output files into --out-dir (defaulting to the run directory), and exits.
Use --device cpu if you do not have a CUDA-capable GPU.
midas-process-grains paramstest.txt 8 \
--mode c_parity \
--device cuda \
--min-nr-spots 1 \
--out-dir ./output
--min-nr-spots matches the MinNrSpots parameter in paramstest.txt
(Stage 1 cluster-size cutoff). Default is 1, which keeps every cluster.
Library
from midas_process_grains.compute.c_parity_run import (
run_c_parity_pipeline_from_disk,
)
run_c_parity_pipeline_from_disk(
run_dir="/scratch/.../LayerNr_1",
out_dir="/scratch/.../LayerNr_1",
device="cuda", # or "cpu"
min_nr_spots=1,
)
For lower-level access (run only Stage 1, only Pass A, only the writers,
etc.) see midas_process_grains.compute.c_parity and
midas_process_grains.compute.c_parity_emit.
Parity verdict (peakfit_hard, 22 k grains)
| Column | Python vs C max abs diff |
|---|---|
GrainID, OM (9), X, Y, Z, lattice (6), DiffPos, DiffOme, DiffAngle, GrainRadius, Confidence, Fable strain (9), Eul0, Eul1, Eul2 |
0 (bit-identical) |
| Kenesei strain (9 components) | ≤ 35 µε (NLOPT vs SciPy lsq_linear solver convergence) |
RMSErrorStrain |
≤ 0.085 µε |
Cluster identity: 21,504 of 22,003 grains share the same rep_pos between
the C and Python runs. The remaining ~2 % is OMP atomic_test_and_set
non-determinism in the C source — running C on the same input twice produces
two outputs that disagree on 846 grains (3.8 %). Python and a current C
rerun agree at 99.58 % — closer than C agrees with itself across runs.
Performance
Wall time on a single peakfit_hard run (8-thread alleppey, NVIDIA H100 NVL):
| Pipeline | Wall | CPU time |
|---|---|---|
| C ProcessGrains, 8-thread OMP | 50 min | 396 min |
Python c_parity, CPU 8-thread torch |
119 s | 676 s |
Python c_parity, CUDA H100 |
113 s | 125 s |
Roughly 27× faster wall-clock and 190× less CPU on GPU. The biggest
wins are (a) Pass A's O(N) spatial-hash replacing C's O(N²) all-pairs,
(b) precomputing the misorientation graph for all spot-overlap candidates in
one batched torch call, and (c) batching all per-grain Kenesei solves into a
single torch.linalg.solve over a (B, 6, 6) stack.
Inputs
The pipeline reads the standard MIDAS run-directory layout:
<run_dir>/
paramstest.txt
hkls.csv
IDsHash.csv
SpotsToIndex.csv
InputAllExtraInfoFittingAll.csv
Output/
IndexBestFull.bin
FitBest.bin
Results/
OrientPosFit.bin
Key.bin
ProcessKey.bin
Outputs
<out_dir>/
Grains.csv # 47 columns, C ProcessGrains layout
GrainIDsKey.csv # one line per kept grain
SpotMatrix.csv # 12 columns, C ProcessGrains layout
Implementation notes
- Stage 1 (
FindInternalAnglesequivalent) does a recursive DFS over theProcessKey-defined spot-overlap candidate graph, filtered by misori <0.4°. The misorientation for every candidate edge is precomputed in one batched torch call before the DFS. - Pass A (
misori < 0.1° AND |Δpos| < 5 µmdedup) uses a 5 µm spatial hash on rep positions to limit pairs to those within the position threshold, then vectorised misori on the surviving pairs. Greedy outer-serial dedup matches C's order. - Confidence filter
OPF[26] >= 0.05(matches COPs[ri][22] < 0.05cut). - Strain — Fable-Beaudoin from refined lattice (closed form), Kenesei from
per-spot lstsq (
scipy.optimize.lsq_linearwith the same ±0.01 bounds C uses with NLOPT Nelder-Mead). Kenesei is solved in batch over all grains in a singletorch.linalg.solve(GTG + λI, GTb)call when running on GPU. - Euler angles use C's exact
OrientMat2Euleralgorithm with thesin_cos_to_angle(s, c) = acos(c) if s ≥ 0 else 2π − acos(c)helper. Output is in radians, matching C.
See the docstrings in compute/c_parity.py and compute/c_parity_emit.py
for the full algorithm spec, with line-number references back to the C
source.
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_process_grains-0.2.0.tar.gz.
File metadata
- Download URL: midas_process_grains-0.2.0.tar.gz
- Upload date:
- Size: 98.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05df502de79f5424feb90a6663bb3e12d6a96da482667ebcffb1303c24a07f9d
|
|
| MD5 |
61cc0686c851aea90ff4fc37b9551935
|
|
| BLAKE2b-256 |
8d321197bfab1915df2a1bea2475196908f5697f8f93965300d1ec30a415c5ec
|
Provenance
The following attestation bundles were made for midas_process_grains-0.2.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_process_grains-0.2.0.tar.gz -
Subject digest:
05df502de79f5424feb90a6663bb3e12d6a96da482667ebcffb1303c24a07f9d - Sigstore transparency entry: 1588757630
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@9c1c4a0a50d397d6579d56d2f0e34ec4875361df -
Branch / Tag:
refs/tags/midas-process-grains-v0.2.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@9c1c4a0a50d397d6579d56d2f0e34ec4875361df -
Trigger Event:
release
-
Statement type:
File details
Details for the file midas_process_grains-0.2.0-py3-none-any.whl.
File metadata
- Download URL: midas_process_grains-0.2.0-py3-none-any.whl
- Upload date:
- Size: 90.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 |
e6e8f2f56dbb212da92249c517a65ee5d26a293c01a04c7ffc8d3a55f8437c76
|
|
| MD5 |
0c333920e24f6f492bec430c57183f35
|
|
| BLAKE2b-256 |
9b83e22d22715f78a1519f50c07fe24f097e6dd8675a860638f50a2da107e36a
|
Provenance
The following attestation bundles were made for midas_process_grains-0.2.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_process_grains-0.2.0-py3-none-any.whl -
Subject digest:
e6e8f2f56dbb212da92249c517a65ee5d26a293c01a04c7ffc8d3a55f8437c76 - Sigstore transparency entry: 1588757660
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@9c1c4a0a50d397d6579d56d2f0e34ec4875361df -
Branch / Tag:
refs/tags/midas-process-grains-v0.2.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@9c1c4a0a50d397d6579d56d2f0e34ec4875361df -
Trigger Event:
release
-
Statement type: