Skip to content

Adding Chudley-Elliott Jump Diffusion Model - #246

Merged
henrikjacobsenfys merged 9 commits into
easyscience:developfrom
markbujehein:chudley-elliot-model
Oct 20, 2026
Merged

henrikjacobsenfys merged 9 commits into
easyscience:developfrom
markbujehein:chudley-elliot-model

Conversation

@markbujehein

@markbujehein markbujehein commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This is an implementation of the Chudley-Elliott Jump Diffusion Model. The model is described in old Mantid documentation and in literature1, and provides a physical model of jump diffusion different from existing ones.

What Changed

The implementation adds:

  • New model: ChudleyElliottJumpDiffusion class implementing the jump diffusion model by Chudley and Elliott2

    • $Q$-dependent HWHM, calculated from $\Gamma(Q) = \hbar / \tau \left( 1 - \frac{\sin(Q l)}{Q l} \right)$, in meV (if $\tau$ is in ps).
    • residence_time ($\tau$) parameter: relaxation time in picoseconds
    • jump_length ($l$) parameter: jump distance in angstroms (inverse units of $Q$)
    • Written using JumpTranslationalDiffusion as a template as the two are practically very similar (besides parameters and model).
  • Unit Tests:

    • Tests for JumpTranslationalDiffusion has been adapted to ChudleyElliottJumpDiffusion to cover equivalent sanity checks and edge cases, and thus TestChudleyElliottJumpDiffusion is also written by using TestJumpTranslationalDiffusion as a template.
    • Cross-checks on the use of np.sinc(x) vs. sc.sin(x) / x in the width calculation.
  • Configuration updates: I've followed CONTRIBUTING.md step-by-step which also introduced linting of the various files, such as pyproject.toml and pixi.toml. I've committed these as well as the changed would otherwise live in my working tree for ever; feel free to disregard these and tell me why I'm wrong!

Why

Addresses #46

Scope Label

[scope] enhancement: This PR adds a new diffusion model feature, requiring a minor version bump (major.MINOR.patch)

Implementation Notes

  • Linting corrected with pixi run fix.
  • All checks, tests and cov-tests, passed.

References

Footnotes

  1. Mantid 6.1.0 - Chudley-Elliot ↩

  2. C T Chudley and R J Elliott 1961 Proc. Phys. Soc. 77 353, doi:10.1088/0370-1328/77/2/319 ↩

@markbujehein

Copy link
Copy Markdown
Contributor Author

Btw: I tried adding a label properly, but think I don't have the permission to do so.

@rozyczko rozyczko added the [scope] enhancement Adds/improves features (major.MINOR.patch) label Oct 3, 2026
@henrikjacobsenfys henrikjacobsenfys added the [priority] medium Normal/default priority label Oct 5, 2026

@henrikjacobsenfys henrikjacobsenfys left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice, just want a few small changes here and there.

Also, you'll need to rebase to the new develop (and perhaps fix a formatting issue there, we'll look at it together)

When you are done please run pixi update

Comment thread src/easydynamics/sample_model/diffusion_model/chudley_elliott_jump_diffusion.py Outdated
Comment thread src/easydynamics/sample_model/diffusion_model/chudley_elliott_jump_diffusion.py Outdated
Comment thread src/easydynamics/sample_model/diffusion_model/chudley_elliott_jump_diffusion.py Outdated
Comment thread src/easydynamics/sample_model/diffusion_model/chudley_elliott_jump_diffusion.py Outdated
@codecov

codecov Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.18%. Comparing base (762b081) to head (7f2f8a5).
⚠️ Report is 6 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop     #246      +/-   ##
===========================================
+ Coverage    98.15%   98.18%   +0.02%     
===========================================
  Files           60       61       +1     
  Lines         6066     6162      +96     
  Branches      1022     1033      +11     
===========================================
+ Hits          5954     6050      +96     
  Misses          58       58              
  Partials        54       54              
Flag Coverage Δ
unittests 98.18% <100.00%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/easydynamics/__init__.py 100.00% <100.00%> (ø)
src/easydynamics/sample_model/__init__.py 100.00% <100.00%> (ø)
...ydynamics/sample_model/diffusion_model/__init__.py 100.00% <100.00%> (ø)
.../diffusion_model/chudley_elliott_jump_diffusion.py 100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread src/easydynamics/sample_model/diffusion_model/chudley_elliott_jump_diffusion.py Outdated
- Add Jump Translational and Chudley-Elliott sections to
  diffusion_model.ipynb, with subheaders for each model
- Name the models in the Diffusion model entry of the tutorials index
- Add the Chudley and Elliott (1961) reference and "See also the
  tutorials" to the ChudleyElliottJumpDiffusion docstring
- Remove the tutorials TODO (easyscience#273)
@markbujehein

Copy link
Copy Markdown
Contributor Author

@henrikjacobsenfys the missing tutorial has been added for ChudleyElliottJumpDiffusion (and JumpTranslationalDiffusion). I expect the remaining checks to fail by default because they break on PRs opened from a fork. This is also the case for core.

@henrikjacobsenfys

Copy link
Copy Markdown
Member

Thanks!

@henrikjacobsenfys
henrikjacobsenfys merged commit 2b9bcc8 into easyscience:develop Oct 20, 2026
17 of 20 checks passed
henrikjacobsenfys added a commit that referenced this pull request Oct 20, 2026
* update pixi (#266)

* Adding Chudley-Elliott Jump Diffusion Model (#246)

* Add ChudleyElliotJumpDiffusion model and corresponding tests

* Enhance ChudleyElliotJumpDiffusion model documentation and tests; all checks passed

* Fix: replace Chudley-Elliot with Chudley-Elliott (propegated from spelling mistake in Mantid documentation)

* Fix: Add missing ChudleyElliottJumpDiffusion to public API and module exports

* Fix: Improve test clarity and update unit handling in ChudleyElliottJumpDiffusion tests

* Fix: Implement minimum width for residence time in ChudleyElliottJumpDiffusion model and update tests

* Fix: Update error handling in ChudleyElliottJumpDiffusion model and improve test assertions

* chore: pixi update and linting

* Add jump diffusion tutorials and Chudley-Elliott citation

- Add Jump Translational and Chudley-Elliott sections to
  diffusion_model.ipynb, with subheaders for each model
- Name the models in the Diffusion model entry of the tutorials index
- Add the Chudley and Elliott (1961) reference and "See also the
  tutorials" to the ChudleyElliottJumpDiffusion docstring
- Remove the tutorials TODO (#273)

* Speed up StretchedExponential evaluation (#268)

* Speed up StretchedExponential quadrature 3-4x

Evaluate the exp-sinh quadrature in cache-sized blocks with in-place
temporaries, and drop nodes whose decaying exponent provably underflows
exp to exactly zero. Results are unchanged to rounding and stay bitwise
independent of block boundaries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Interpolate the StretchedExponential profile by default

Add an interpolate flag (default True) that evaluates G_beta from a
cached cubic-spline table of log(G / G(0)) on y = asinh(w / w_ref)
instead of running the quadrature at every energy. Tables are cached
per beta and grow on a fixed lattice, so fits stay smooth under
finite-difference Jacobian steps. Accuracy is ~1e-7 of the peak for all
beta; interpolate=False keeps the ~1e-11 quadrature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add example, run pixi update

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Allow plotting parameters against Q^2 (#271)

* Allow plotting parameters against Q^2

Analysis.plot_parameters and ParameterAnalysis.plot take an x_axis
argument ('Q' or 'Q^2'). The values at each Q are unchanged; only the
plotted coordinate is transformed, via the shared add_x_axis_coord
helper and its Q_AXIS_TRANSFORMS table, so further axes are one entry.

Closes #205

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show the Lorentzian width against Q^2 in tutorial 1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Align the data and residuals axes in plots with residuals (#270)

slicerplot_with_residuals drew the residuals in a second Matplotlib
figure below the main one. Each figure was tight_layout'ed on its own,
so the axes' left edges depended on each panel's y tick label and y
label widths and did not line up.

Draw both panels as two axes of one figure with a shared x axis, so
they are laid out together and share x limits, scale and zoom. figsize
now sizes the whole figure, and the residuals panel hides its log
buttons, since logX is shared and logY does not suit residuals.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: easyscience[bot] <2476259+easyscience[bot]@users.noreply.github.com>
Co-authored-by: Henrik Jacobsen <henrik.jacobsen.fys@gmail.com>
Co-authored-by: mark <191927387+markbujehein@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[priority] medium Normal/default priority [scope] enhancement Adds/improves features (major.MINOR.patch)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants