Skip to content

Magnetic Diagnostics API#1916

Draft
dpanici wants to merge 27 commits intodp/B-pt-diagnosticfrom
dp/magnetic-diag-api
Draft

Magnetic Diagnostics API#1916
dpanici wants to merge 27 commits intodp/B-pt-diagnosticfrom
dp/magnetic-diag-api

Conversation

@dpanici
Copy link
Collaborator

@dpanici dpanici commented Sep 16, 2025

Adds new class AbstractDiagnostic which is a new base class for synthetic diagnostic objects.

  • AbstractDiagnostic realizations must

    • define the points at which they may require the total magnetic field (as determined by Bplasma + Bcoil if outside of the plasma
      • TODO: Might need a separate class for objects which need the INTERNAL magnetic field, but I actually think the current API would work as the internal magnetic field can be computed as like auxiliary data with the _compute_data method already in this
    • as well as implement a compute method for computing the signal they represent
    • implement a _compute method which takes in the magnetic field (or vector potential) at the points they require (for e.g. integration over a rogowski coil), as well as a dict of aux data
    • a _compute_data method for compiting this aux data from eq_params, field_params as well as its owndiag_params (here for example a RogowskiCoil computes its geometric information. A ThomsonScattering may here compute the intersection of the chord and the plasma, as another example)
    • may have DOFs to be optimized
      Current realizations: RogowskiCoilXXX for each coil type, PointBMeasurements for ptwise B measurements like magnetic probes.
  • DiagnosticSet objects are collections of AbstractDiagnostic realizations

    • mainly operating like MixedCoilSet for now, its job is to collect the diagnostics in one object,
    • collect and concatenate the points at which B is needed for them so that in MeasurementError it can be computed efficiently

TODO

  • How to easiest pass in target/bounds?
  • Maybe implement a DiagnosticSet that is like a CoilSet too?
  • have diagnostics have two eval_x attrs required, one for eval_B and other for eval_A and update MeasurementError to compute both A and B at these points
  • maybe move the computation of magnetic field to the DiagnosticSet, since some diagnostics may not need the coil field, for instance, if they are internal measurements
  • currently need _diagnostics to be a static attr to avoid JAX issues with MeasurementError but not sure why, maybe because we are using its method? but that should be fine I thought... so I dont think that is the issue
  • Add method of specifying correlated uncertainties (i.e. generalize W weight matrix from diagonally as it implicitly is now to arbitrary W) within a single diagnostic (like here within a single diagnostic objective)
    • for MeasurementError, allow weights to be a matrix and assume it to be the inverse of the covariance, and Cholesky factor it and make _scale method for this class using that factorization
  • merge this into Add point B measurement error objective #1436 so tests can run
  • Add flux loops from branch which has those implemented
    • make them and Rogowski from same parent class

Resolves #1783

@dpanici dpanici requested review from a team, YigitElma, ddudt, f0uriest, rahulgaur104 and unalmis and removed request for a team September 16, 2025 21:49
@dpanici dpanici marked this pull request as draft September 16, 2025 21:57
@github-actions
Copy link
Contributor

github-actions bot commented Sep 16, 2025

Memory benchmark result

|               Test Name                |      %Δ      |    Master (MB)     |      PR (MB)       |    Δ (MB)    |    Time PR (s)     |  Time Master (s)   |
| -------------------------------------- | ------------ | ------------------ | ------------------ | ------------ | ------------------ | ------------------ |
  test_objective_jac_w7x                 |    5.13 %    |     3.836e+03      |     4.033e+03      |    196.80    |       36.55        |       31.33        |
  test_proximal_jac_w7x_with_eq_update   |   -0.57 %    |     6.799e+03      |     6.760e+03      |    -38.56    |       161.42       |       159.80       |
  test_proximal_freeb_jac                |   -0.18 %    |     1.317e+04      |     1.315e+04      |    -24.30    |       78.62        |       78.32        |
  test_proximal_freeb_jac_blocked        |   -0.61 %    |     7.640e+03      |     7.593e+03      |    -46.61    |       67.77        |       69.78        |
  test_proximal_freeb_jac_batched        |   -0.06 %    |     7.599e+03      |     7.595e+03      |    -4.29     |       68.28        |       69.39        |
  test_proximal_jac_ripple               |   -1.73 %    |     7.619e+03      |     7.487e+03      |   -131.84    |       69.21        |       70.22        |
  test_proximal_jac_ripple_spline        |   -1.05 %    |     3.481e+03      |     3.444e+03      |    -36.45    |       70.70        |       73.12        |
  test_eq_solve                          |   -2.02 %    |     2.062e+03      |     2.021e+03      |    -41.73    |       124.94       |       125.97       |

For the memory plots, go to the summary of Memory Benchmarks workflow and download the artifact.

@dpanici dpanici changed the base branch from master to dp/B-pt-diagnostic September 16, 2025 22:45
Copy link
Member

@f0uriest f0uriest left a comment

Choose a reason for hiding this comment

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

Is there still a plan to have classes for different diagnostics? I didn't realize those would each be objectives. I thought it would be something like

class AbstractDiagonstic(ABC, Optimizeable?):
    def compute_measurement(self, eq, field):
        ...
    
    def _compute_from_B(self, B):
        ...
class RogowskiCoil(AbstractDiagnostic):
    ...

class MeasurementError(_Objective):

    def __init__(self, eq, field, diagnostic, target, weight):
        ...

    def compute(self, params):
        B = self.field.compute_magnetic_field(...)
        return self.diagnostic._compute_from_B(B)

I like the idea of separate classes for different diagnostics, independent from the Objective API for doing analysis etc. The diagnostic only knows about how to compute a synthetic measurement, but nothing about the expected value from experiment. The objective then couples the diagonstic class with the target/bounds/uncertainty from experiment to compute a residual/z score.

Another thing to consider is uncertainties. We can handle simple uncorrelated uncertainty with weight=1/uncertainty but often there are off diagonal terms in the covariance matrix that are important. This might require the Measurement objective to have special logic in compute_scaled_error etc.

At some point we may also want to consider optimizing the placement of diagnostics, this is something that a lot of experimentalists think about and could be a good use of DESC. So then AbstractDiagnostic would also inherit from Optimizeable


"""
super().build(use_jit=use_jit, verbose=verbose)
assert hasattr(self, "_all_eval_x_rpz"), (
Copy link
Member

Choose a reason for hiding this comment

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

_all_eval_x_rpz might be better as an abstract property/attribute itself?

Also, the variable name implies it but should document somewhere that x here is in R,phi,Z. And that the compute function should expect B in R,phi,Z basis as well

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I can do that, but it seems that that way does not explicitly require that the attributes themselves be set, only that the properties exist?

Like one still could instantiate a subclass with the property _all_eval_x_rpz but never fill it?

_compute_A_or_B_from_CurrentPotentialField,
)

self._compute_A_or_B_from_CurrentPotentialField = (
Copy link
Member

Choose a reason for hiding this comment

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

can't this just be a class method?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I can't import it without getting a circular import so I have to import it locally. I could do that as a class method I guess

@dpanici
Copy link
Collaborator Author

dpanici commented Sep 17, 2025

Is there still a plan to have classes for different diagnostics? I didn't realize those would each be objectives. I thought it would be something like

class AbstractDiagonstic(ABC, Optimizeable?):
    def compute_measurement(self, eq, field):
        ...
    
    def _compute_from_B(self, B):
        ...
class RogowskiCoil(AbstractDiagnostic):
    ...

class MeasurementError(_Objective):

    def __init__(self, eq, field, diagnostic, target, weight):
        ...

    def compute(self, params):
        B = self.field.compute_magnetic_field(...)
        return self.diagnostic._compute_from_B(B)

I like the idea of separate classes for different diagnostics, independent from the Objective API for doing analysis etc. The diagnostic only knows about how to compute a synthetic measurement, but nothing about the expected value from experiment. The objective then couples the diagonstic class with the target/bounds/uncertainty from experiment to compute a residual/z score.

Another thing to consider is uncertainties. We can handle simple uncorrelated uncertainty with weight=1/uncertainty but often there are off diagonal terms in the covariance matrix that are important. This might require the Measurement objective to have special logic in compute_scaled_error etc.

At some point we may also want to consider optimizing the placement of diagnostics, this is something that a lot of experimentalists think about and could be a good use of DESC. So then AbstractDiagnostic would also inherit from Optimizeable

These are all good points, I mainly shied away from the optmizable diagnostics part because it is gonna add a lot more hassle on my part and I just wanted to get something working for my project...

@f0uriest
Copy link
Member

Yeah, I'm definitely not saying we have to worry about optimizing sensor placement or dealing with full covariance matrices now, but I just want to make sure we give it a bit of thought so that we don't design ourselves into a corner that will require major API changes to add those features later.

I think broadly we could copy the API from MagneticField and Coil but sort of replace compute_magnetic_field(x) with compute_measurement(eq, field, ...)
We could also have them inherit from Optimizable but for now don't give them any optimizable DoFs, or add a diagnostic_fixed flag to the objectives that we hard code to True for now (similar to what we did for the boundary error objective before single stage)

For correlated uncertainty, if its only correlated within a single objective that could be handled by just allowing weight to be a matrix (ie cholesky factor of the inverse covariance, though again we don't need to deal with supporting this now since its effectively a backwards compatible change). If we want to allow for coupled uncertainty between different objectives that might be trickier so might be worth thinking it through.

@dpanici
Copy link
Collaborator Author

dpanici commented Oct 9, 2025

API Issues I am wrestling with currently:

  • if diagnostic positions are optimizable (or potentially optimizable), then the whole vectrization method I came up with in this PR won't work as is (as in this PR I in the build of MagneticDiagnostics assemble all the points I need to eval B at). I guess this could instead happen in the compute method of said super objective, and it would have to
    • take in the diag_params of each sub-diagnostic, which I also don't know how we will do right now since it is an arbitrary number, maybe like how I did it in Add ShareParameters Linear Objective #1320, but ti would also need to know about eq_params and field_params, then an arbitrary number of diag_params...
    • then also somehow know from each diag_params what optimizable DOF it needs to use to get the x positions it needs to evaluate B at (this is complex, as in this PR it would simply just be diag_params["R"] etc for the pointB measurement, but in future we want flux loops, which are themselves arbitrary coil types. I guess this could be alleviated if we also add diagnostics to the compute index (have loops diags subclass from coils, and add any new ones which dont have obvious analogs to subclass from like this pointBMeasurement one)

@f0uriest
Copy link
Member

f0uriest commented Oct 9, 2025

One possible idea would be to add something like a CoilSet but for diagnostics, like DiagnosticSet or something. And then the reconstruction objective requires a single DiagnosticSet rather than individual diagonstics? Then all the vectorization can be done there (similar to how CoilSet uses a more efficient way of computing the total field).

dpanici and others added 7 commits January 8, 2026 16:29
Co-authored-by: Yigit Gunsur Elmacioglu <102380275+YigitElma@users.noreply.github.com>
Updates the requirements on
[plotly](https://github.com/plotly/plotly.py) to permit the latest
version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/plotly/plotly.py/releases">plotly's
releases</a>.</em></p>
<blockquote>
<h2>v6.5.1</h2>
<h3>Fixed</h3>
<ul>
<li>Fix issue where Plotly Express ignored trace-specific color
sequences defined in templates via
<code>template.data.&lt;trace_type&gt;</code> [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5437">#5437</a>],
with thanks to <a
href="https://github.com/antonymilne"><code>@​antonymilne</code></a> for
the contribution!</li>
</ul>
<h3>Updated</h3>
<ul>
<li>Speed up <code>validate_gantt</code> function [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5386">#5386</a>],
with thanks to <a
href="https://github.com/misrasaurabh1"><code>@​misrasaurabh1</code></a>
for the contribution!</li>
<li>Update plotly.js from version 3.3.0 to version 3.3.1. See the
plotly.js <a
href="https://github.com/plotly/plotly.js/releases/tag/v3.3.1">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5456">#5456</a>].
Notable changes include:
<ul>
<li>Add support for arrays for the pie properties
<code>showlegend</code> and <code>legend</code>, so that these can be
configured per slice. [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7580">#7580</a>]</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/plotly/plotly.py/blob/main/CHANGELOG.md">plotly's
changelog</a>.</em></p>
<blockquote>
<h2>[6.5.1] - 2025-11-17</h2>
<h3>Fixed</h3>
<ul>
<li>Fix issue where Plotly Express ignored trace-specific color
sequences defined in templates via
<code>template.data.&lt;trace_type&gt;</code> [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5437">#5437</a>],
with thanks to <a
href="https://github.com/antonymilne"><code>@​antonymilne</code></a> for
the contribution!</li>
</ul>
<h3>Updated</h3>
<ul>
<li>Speed up <code>validate_gantt</code> function [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5386">#5386</a>],
with thanks to <a
href="https://github.com/misrasaurabh1"><code>@​misrasaurabh1</code></a>
for the contribution!</li>
<li>Update plotly.js from version 3.3.0 to version 3.3.1. See the
plotly.js <a
href="https://github.com/plotly/plotly.js/releases/tag/v3.3.1">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5456">#5456</a>].
Notable changes include:
<ul>
<li>Add support for arrays for the pie properties
<code>showlegend</code> and <code>legend</code>, so that these can be
configured per slice. [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7580">#7580</a>]</li>
</ul>
</li>
</ul>
<h2>[6.5.0] - 2025-11-17</h2>
<h3>Updated</h3>
<ul>
<li>Update plotly.js from version 3.2.0 to version 3.3.0. See the
plotly.js <a
href="https://github.com/plotly/plotly.js/releases/tag/v3.3.0">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5421">#5421</a>].
Notable changes include:
<ul>
<li>Add <code>hovertemplate</code> for <code>candlestick</code> and
<code>ohlc</code> traces [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7619">#7619</a>]</li>
</ul>
</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix bug where numpy datetime contained in Python list was converted
to integer [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5415">#5415</a>]</li>
</ul>
<h2>[6.4.0] - 2025-11-02</h2>
<h3>Updated</h3>
<ul>
<li>Update plotly.js from version 3.1.1 to version 3.2.0. See the
plotly.js <a href="https://github.com/plotly/plotly.js/releases">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5388">#5357</a>].
Notable changes include:
<ul>
<li>Add <code>hovertemplatefallback</code> and
<code>texttemplatefallback</code> attributes [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7577">#7577</a>]</li>
<li>Add &quot;SI extended&quot; formatting rule for tick exponents on
axis labels, allowing values to be displayed with extended SI prefixes
(e.g., femto, pico, atto) [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7249">#7249</a>]</li>
</ul>
</li>
</ul>
<h3>Deprecated</h3>
<ul>
<li>Deprecate <code>create_hexbin_mapbox</code> in favor of
<code>create_hexbin_map</code>, update related function calls [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5358">5358</a>],
with thanks to <a
href="https://github.com/ajlien"><code>@​ajlien</code></a> for the
contribution!</li>
</ul>
<h2>[6.3.1] - 2025-10-02</h2>
<h3>Updated</h3>
<ul>
<li>Update Plotly.js from version 3.1.0 to version 3.1.1. See the
Plotly.js <a href="https://github.com/plotly/plotly.js/releases">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5357">#5357</a>].
Notable changes include:
<ul>
<li>Fix issue preventing Scattergl plots with text elements from
rendering [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7563">plotly.js#7563</a>]</li>
</ul>
</li>
<li>Use native legends when converting from matplotlib [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5312">#5312</a>],
with thanks to <a
href="https://github.com/robertoffmoura"><code>@​robertoffmoura</code></a>
to the contribution!</li>
<li>Allow <code>shared_yaxes</code> to work with secondary axes [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5180">#5180</a>],
with thanks to <a href="https://github.com/gmjw"><code>@​gmjw</code></a>
for the contribution!</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix issue where width/height in plot layout were not respected
during Kaleido image export [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5325">#5325</a>]</li>
<li>Fix typo in default argument to <code>_ternary_contour.py</code> [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5315">#5315</a>],
with thanks to <a
href="https://github.com/Lexachoc"><code>@​Lexachoc</code></a> for the
contribution!</li>
<li>Fix incorrect <code>fig.show()</code> behavior when
<code>ipython</code> is installed [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5258">#5258</a>]</li>
</ul>
<h2>[6.3.0] - 2025-08-12</h2>
<h3>Updated</h3>
<ul>
<li>Updated Plotly.js from version 3.0.1 to version 3.1.0. See the
Plotly.js <a href="https://github.com/plotly/plotly.js/releases">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5318">#5318</a>]</li>
</ul>
<h3>Added</h3>
<ul>
<li>Exposed <code>plotly.io.get_chrome()</code> as a function which can
be called from within a Python script. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5282">#5282</a>]</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/plotly/plotly.py/commit/d2aa0449456de3a94e5bcbcbc1b89db266c7723a"><code>d2aa044</code></a>
Version changes for v6.5.1</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/f4236c224d4d17c626d63bdce5e84d38be848a60"><code>f4236c2</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5456">#5456</a>
from plotly/cam/update-plotly.js-v3.3.1</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/ca6e55e651cce8689d4310b1763bd404952e1ab1"><code>ca6e55e</code></a>
Update Jupyter support files</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/6f13fb057846dd19b413672966dc0eb897d19049"><code>6f13fb0</code></a>
Add missing lock file</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/6f94d9c0faa72a7a705a0fe65c7f3b8cd581f841"><code>6f94d9c</code></a>
Update plotly.js to v3.3.1 and associated files</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/f265d9bbfc30e34a8741eda6b8336336e1e9005e"><code>f265d9b</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5448">#5448</a>
from palmerusaf/update-contrib-docs</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/27b5bba440b357452a1436fbb8df36ffa03f6ac5"><code>27b5bba</code></a>
Update editable installs ref in CONTRIBUTING doc</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/fa4db1deccee6f363e016dca5c5fa506fb3ba96e"><code>fa4db1d</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5442">#5442</a>
from plotly/fix-docs-build-bug-2</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/a5f469a91aadd6f40f1cca1662fe661932f6abc9"><code>a5f469a</code></a>
update call to color_discrete_sequence with new call signature</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/adfdfcda31473709c10797cba7238ee73c3976aa"><code>adfdfcd</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5437">#5437</a>
from antonymilne/main</li>
<li>Additional commits viewable in <a
href="https://github.com/plotly/plotly.py/compare/v5.16.0...v6.5.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
….0 (#2057)

Updates the requirements on
[sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) to
permit the latest version.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst">sphinx-rtd-theme's
changelog</a>.</em></p>
<blockquote>
<h1>3.1.0</h1>
<ul>
<li>Added support for docutils 0.22</li>
<li>Added support for Sphinx 9.x</li>
</ul>
<p>.. _release-3.1.0rc2:</p>
<h1>3.1.0rc2</h1>
<ul>
<li>Added support for docutils 0.22</li>
</ul>
<p>.. _release-3.1.0rc1:</p>
<h1>3.1.0rc1</h1>
<ul>
<li>Added support for Sphinx 9.x</li>
</ul>
<p>.. _release-3.0.2:</p>
<h1>3.0.2</h1>
<ul>
<li>Show current translation when the flyout is attached</li>
<li>Fix JavaScript issue that didn't allow users to disable
selectors</li>
</ul>
<p>.. _release-3.0.1:</p>
<h1>3.0.1</h1>
<ul>
<li>Use black color for text in selectors.</li>
</ul>
<p>.. _release-3.0.0:</p>
<h1>3.0.0</h1>
<p>Final version.</p>
<p>.. _release-3.0.0rc4:</p>
<h1>3.0.0rc4</h1>
<h2>Fixes</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/795de79c8b311592f5863a25307d85924bf52164"><code>795de79</code></a>
Release 3.1.0 (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1676">#1676</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/66d0fdd910e142d058c20b474338051b0751f03c"><code>66d0fdd</code></a>
Add Python 3.14 to the test suite (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1668">#1668</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/fbe5e6004195a1e75654eface1884485c57eb68e"><code>fbe5e60</code></a>
3.1.0rc2 with support for docutils 0.22 (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1674">#1674</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/a76174c0bb0af755718f3cbdffbf97d19d0ac0ec"><code>a76174c</code></a>
Add support for docutils 0.22 (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1671">#1671</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/20733c3bcc60df8eda23512a0f3ccb2861486110"><code>20733c3</code></a>
Add support for Sphinx 9.0.0 (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1666">#1666</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/71aacd35048c8bc2ab646ed4e3e9af1075034387"><code>71aacd3</code></a>
Update Code of Conduct URL (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1664">#1664</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/5a263753d52c1628c88392fbf52c729f5a8e79b5"><code>5a26375</code></a>
Run tests and build docs with Sphinx 8.2 (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1640">#1640</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/8d4d394dad2d55cf9a4db880effac6aa5c7b12e6"><code>8d4d394</code></a>
Sidebar should not be floating on mobile (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1622">#1622</a>)</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/5f03347239fd22a241a5b609ddb2f964c8b429aa"><code>5f03347</code></a>
Release 3.0.2</li>
<li><a
href="https://github.com/readthedocs/sphinx_rtd_theme/commit/17c0685be9f7c032c454a6dd4110bfc3892b7e06"><code>17c0685</code></a>
Attached flyout: show the current translation (<a
href="https://redirect.github.com/readthedocs/sphinx_rtd_theme/issues/1629">#1629</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/readthedocs/sphinx_rtd_theme/compare/1.0.0...3.1.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yigit Gunsur Elmacioglu <102380275+YigitElma@users.noreply.github.com>
user function needs to return a 1d array of size dim_f, not a scalar

Co-authored-by: Daniel Dudt <33005725+ddudt@users.noreply.github.com>
Co-authored-by: Yigit Gunsur Elmacioglu <102380275+YigitElma@users.noreply.github.com>
Resolves #2055

---------

Co-authored-by: daniel-dudt <daniel.dudt@princetonstellarators.energy>
Co-authored-by: Yigit Gunsur Elmacioglu <102380275+YigitElma@users.noreply.github.com>
the `head -n -2` was incorrect (`-2` should just be `2`), the script was
silently failing locally for me (on macOS zsh) and causing it to not
actually detect any unmarked tests even if they were present.
Updates the requirements on
[plotly](https://github.com/plotly/plotly.py) to permit the latest
version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/plotly/plotly.py/releases">plotly's
releases</a>.</em></p>
<blockquote>
<h2>v6.5.2</h2>
<h3>Fixed</h3>
<ul>
<li>Fix issue where pie trace <code>legend</code>,
<code>showlegend</code> attributes don't accept array values [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5464">#5464</a>
and <a
href="https://redirect.github.com/plotly/plotly.py/pull/5465">#5465</a>],
with thanks to <a
href="https://github.com/my-tien"><code>@​my-tien</code></a> for the
contribution!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/plotly/plotly.py/blob/main/CHANGELOG.md">plotly's
changelog</a>.</em></p>
<blockquote>
<h2>[6.5.2] - 2026-01-14</h2>
<h3>Fixed</h3>
<ul>
<li>Fix issue where pie trace <code>legend</code>,
<code>showlegend</code> attributes don't accept array values [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5464">#5464</a>
and <a
href="https://redirect.github.com/plotly/plotly.py/pull/5465">#5465</a>],
with thanks to <a
href="https://github.com/my-tien"><code>@​my-tien</code></a> for the
contribution!</li>
</ul>
<h2>[6.5.1] - 2026-01-07</h2>
<h3>Fixed</h3>
<ul>
<li>Fix issue where Plotly Express ignored trace-specific color
sequences defined in templates via
<code>template.data.&lt;trace_type&gt;</code> [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5437">#5437</a>],
with thanks to <a
href="https://github.com/antonymilne"><code>@​antonymilne</code></a> for
the contribution!</li>
</ul>
<h3>Updated</h3>
<ul>
<li>Speed up <code>validate_gantt</code> function [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5386">#5386</a>],
with thanks to <a
href="https://github.com/misrasaurabh1"><code>@​misrasaurabh1</code></a>
for the contribution!</li>
<li>Update plotly.js from version 3.3.0 to version 3.3.1. See the
plotly.js <a
href="https://github.com/plotly/plotly.js/releases/tag/v3.3.1">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5456">#5456</a>].
Notable changes include:
<ul>
<li>Add support for arrays for the pie properties
<code>showlegend</code> and <code>legend</code>, so that these can be
configured per slice. [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7580">#7580</a>]</li>
</ul>
</li>
</ul>
<h2>[6.5.0] - 2025-11-17</h2>
<h3>Updated</h3>
<ul>
<li>Update plotly.js from version 3.2.0 to version 3.3.0. See the
plotly.js <a
href="https://github.com/plotly/plotly.js/releases/tag/v3.3.0">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5421">#5421</a>].
Notable changes include:
<ul>
<li>Add <code>hovertemplate</code> for <code>candlestick</code> and
<code>ohlc</code> traces [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7619">#7619</a>]</li>
</ul>
</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix bug where numpy datetime contained in Python list was converted
to integer [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5415">#5415</a>]</li>
</ul>
<h2>[6.4.0] - 2025-11-02</h2>
<h3>Updated</h3>
<ul>
<li>Update plotly.js from version 3.1.1 to version 3.2.0. See the
plotly.js <a href="https://github.com/plotly/plotly.js/releases">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5388">#5357</a>].
Notable changes include:
<ul>
<li>Add <code>hovertemplatefallback</code> and
<code>texttemplatefallback</code> attributes [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7577">#7577</a>]</li>
<li>Add &quot;SI extended&quot; formatting rule for tick exponents on
axis labels, allowing values to be displayed with extended SI prefixes
(e.g., femto, pico, atto) [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7249">#7249</a>]</li>
</ul>
</li>
</ul>
<h3>Deprecated</h3>
<ul>
<li>Deprecate <code>create_hexbin_mapbox</code> in favor of
<code>create_hexbin_map</code>, update related function calls [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5358">5358</a>],
with thanks to <a
href="https://github.com/ajlien"><code>@​ajlien</code></a> for the
contribution!</li>
</ul>
<h2>[6.3.1] - 2025-10-02</h2>
<h3>Updated</h3>
<ul>
<li>Update Plotly.js from version 3.1.0 to version 3.1.1. See the
Plotly.js <a href="https://github.com/plotly/plotly.js/releases">release
notes</a> for more information. [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5357">#5357</a>].
Notable changes include:
<ul>
<li>Fix issue preventing Scattergl plots with text elements from
rendering [<a
href="https://redirect.github.com/plotly/plotly.js/pull/7563">plotly.js#7563</a>]</li>
</ul>
</li>
<li>Use native legends when converting from matplotlib [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5312">#5312</a>],
with thanks to <a
href="https://github.com/robertoffmoura"><code>@​robertoffmoura</code></a>
to the contribution!</li>
<li>Allow <code>shared_yaxes</code> to work with secondary axes [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5180">#5180</a>],
with thanks to <a href="https://github.com/gmjw"><code>@​gmjw</code></a>
for the contribution!</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix issue where width/height in plot layout were not respected
during Kaleido image export [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5325">#5325</a>]</li>
<li>Fix typo in default argument to <code>_ternary_contour.py</code> [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5315">#5315</a>],
with thanks to <a
href="https://github.com/Lexachoc"><code>@​Lexachoc</code></a> for the
contribution!</li>
<li>Fix incorrect <code>fig.show()</code> behavior when
<code>ipython</code> is installed [<a
href="https://redirect.github.com/plotly/plotly.py/pull/5258">#5258</a>]</li>
</ul>
<h2>[6.3.0] - 2025-08-12</h2>
<h3>Updated</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/plotly/plotly.py/commit/36d8bf845054430b8867e02961b14fc908d789c4"><code>36d8bf8</code></a>
Version changes for v6.5.2</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/1f45fa57d9e748c051864a1d25fe1e4f3d451e3e"><code>1f45fa5</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5467">#5467</a>
from plotly/cam/update-graph-objs</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/7f57ccb94e42040e55357e85bb5d3b0b4a675469"><code>7f57ccb</code></a>
fix: Update graph_objs per recent bug fixes</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/3293f4db2a3cd10c9b2e03398e0890967a509c3b"><code>3293f4d</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5466">#5466</a>
from plotly/merge-doc-prod-to-main</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/61c9f6fdabd6dae72ec33310cc07127796e68c6d"><code>61c9f6f</code></a>
Merge branch 'main' into merge-doc-prod-to-main</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/dad25200d54c8713790c43d00b1aa88fecb451b6"><code>dad2520</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5465">#5465</a>
from my-tien/legend-arrayok</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/b5874286fded3309c2794ad7675f33b792bec8df"><code>b587428</code></a>
Merge branch 'main' into legend-arrayok</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/5a0440c178d2f59d7f993fae00a59d4c681157db"><code>5a0440c</code></a>
Merge pull request <a
href="https://redirect.github.com/plotly/plotly.py/issues/5464">#5464</a>
from plotly/cam/5463/handle-arrays-booleanvalidator</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/fff298cf973fbe82eb1cd0adf71084002d3fc2b2"><code>fff298c</code></a>
Simplify test</li>
<li><a
href="https://github.com/plotly/plotly.py/commit/cef18a9d95d22614e5e660ba6722645defaf7fe1"><code>cef18a9</code></a>
Separate test for coercion of geo1 to geo and legend1 to legend</li>
<li>Additional commits viewable in <a
href="https://github.com/plotly/plotly.py/compare/v5.16.0...v6.5.2">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Also removes the line that says " no tests collected". Found to be
necessary for me both locally on my mac and up on the cluster

Also note that the script silently will fail if there is an import error
that occurs when pytest is called, this can happen if there are any
warnings emitted e.g. if the jax-finnuft warning is emitted then the
script fails silently without actually collecting tests or checking if
any are unmarked. So if you know you are getting a warning upon opening
DESC, the check unmarked script is not working for you, just fyi
@dpanici
Copy link
Collaborator Author

dpanici commented Jan 29, 2026

Is there still a plan to have classes for different diagnostics? I didn't realize those would each be objectives. I thought it would be something like

class AbstractDiagonstic(ABC, Optimizeable?):
    def compute_measurement(self, eq, field):
        ...
    
    def _compute_from_B(self, B):
        ...
class RogowskiCoil(AbstractDiagnostic):
    ...

class MeasurementError(_Objective):

    def __init__(self, eq, field, diagnostic, target, weight):
        ...

    def compute(self, params):
        B = self.field.compute_magnetic_field(...)
        return self.diagnostic._compute_from_B(B)

I like the idea of separate classes for different diagnostics, independent from the Objective API for doing analysis etc. The diagnostic only knows about how to compute a synthetic measurement, but nothing about the expected value from experiment. The objective then couples the diagonstic class with the target/bounds/uncertainty from experiment to compute a residual/z score.
Another thing to consider is uncertainties. We can handle simple uncorrelated uncertainty with weight=1/uncertainty but often there are off diagonal terms in the covariance matrix that are important. This might require the Measurement objective to have special logic in compute_scaled_error etc.
At some point we may also want to consider optimizing the placement of diagnostics, this is something that a lot of experimentalists think about and could be a good use of DESC. So then AbstractDiagnostic would also inherit from Optimizeable

These are all good points, I mainly shied away from the optmizable diagnostics part because it is gonna add a lot more hassle on my part and I just wanted to get something working for my project...

Doing something like this might involve making many redundant classes just to have for example a RogowskiCoil for each curve type: RogowskiCoilFourierXYZ, RogowskiCoilSplineXYZ etc. I can not think of a way to have separate diagnostics which are also optimizable and avoid this

@dpanici
Copy link
Collaborator Author

dpanici commented Jan 30, 2026

For correlated measurements, we should be able to use most of our existing machinery if we just make a new objective called something like MeasurementError which takes in all of the diagnostics, and the passed-in weights can be either a single numpy array (corresponding to a diagonal covariance matrix, where the weights passed in are the inverse of the square root of the diagonal variances), or it can be a (positive def, symmetric) matrix W which is assumed to be the inverse of the (also positive def, symmetric) covariance matrix $\Omega$ i.e. $W = \Omega^-1$.

Since these are pos def symmetric, we can do Cholesky to factor
$$W = AA^T $$
and store that when we build the objective.

Then we can modify its compute_scaled (or maybe its _scale or whatever) to return
$A^T f$
so that the overall sum of squares in the compute_scalar becomes the generalized least squares problem
$\mathbf{f}^T W \mathbf{f} = \mathbf{f}^T AA^T \mathbf{f} $

where $\mathbf{f}$ is the measurement residual returned by the MeasurementError compute. This also should allow us to still use Gauss-Newton Hessian approximations like we do in lsq-exact

dpanici and others added 10 commits February 3, 2026 21:21
…es group (#2075)

Updates the requirements on
[psutil](https://github.com/giampaolo/psutil) to permit the latest
version.
Updates `psutil` to 7.2.2
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst">psutil's
changelog</a>.</em></p>
<blockquote>
<h1>7.2.2</h1>
<p>2026-01-28</p>
<p><strong>Enhancements</strong></p>
<ul>
<li>2705_: [Linux]: <code>Process.wait()</code>_ now uses
<code>pidfd_open()</code> + <code>poll()</code> for
waiting, resulting in no busy loop and faster response times. Requires
Linux &gt;= 5.3 and Python &gt;= 3.9. Falls back to traditional polling
if
unavailable.</li>
<li>2705_: [macOS], [BSD]: <code>Process.wait()</code>_ now uses
<code>kqueue()</code> for waiting,
resulting in no busy loop and faster response times.</li>
</ul>
<p><strong>Bug fixes</strong></p>
<ul>
<li>2701_, [macOS]: fix compilation error on macOS &lt; 10.7. (patch by
Sergey
Fedorov)</li>
<li>2707_, [macOS]: fix potential memory leaks in error paths of
<code>Process.memory_full_info()</code> and
<code>Process.threads()</code>.</li>
<li>2708_, [macOS]: Process.cmdline()<code>_ and
</code>Process.environ()<code>_ may fail with ``OSError: [Errno 0]
Undefined error`` (from ``sysctl(KERN_PROCARGS2)``). They now raise
</code>AccessDenied`_ instead.</li>
</ul>
<h1>7.2.1</h1>
<p>2025-12-29</p>
<p><strong>Bug fixes</strong></p>
<ul>
<li>2699_, [FreeBSD], [NetBSD]: <code>heap_info()</code>_ does not
detect small allocations
(&lt;= 1K). In order to fix that, we now flush internal jemalloc cache
before
fetching the metrics.</li>
</ul>
<h1>7.2.0</h1>
<p>2025-12-23</p>
<p><strong>Enhancements</strong></p>
<ul>
<li>1275_: new <code>heap_info()</code>_ and <code>heap_trim()</code>_
functions, providing direct
access to the platform's native C heap allocator (glibc, mimalloc,
libmalloc). Useful to create tools to detect memory leaks.</li>
<li>2403_, [Linux]: publish wheels for Linux musl.</li>
<li>2680_: unit tests are no longer installed / part of the
distribution. They
now live under <code>tests/</code> instead of
<code>psutil/tests</code>.</li>
</ul>
<p><strong>Bug fixes</strong></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/giampaolo/psutil/commit/9eea97dd6f1d16ea33f5144c8925f1ce7a0688e1"><code>9eea97d</code></a>
Pre-release</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/938ac647418f09e4e610b2c755741316713c5592"><code>938ac64</code></a>
Rm sphinxcontrib.googleanalytics; override layout.html</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/9dcbb7e60e650f0ab0cb52154b0a12c70f6a1e4c"><code>9dcbb7e</code></a>
Add sphinxcontrib-googleanalytics to requirements.txt</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/76eaf9ae0f2868569c14b46f4165310885a40a15"><code>76eaf9a</code></a>
Try to add google analytics to doc</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/de1cafa56f54e97ca557993155e76dd98877e136"><code>de1cafa</code></a>
Update doc mentioning Process.wait() internal details</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/bb30943b0336a16f28437ec549c15a8ad2830cca"><code>bb30943</code></a>
Refact can_use_pidfd_open() and can_use_kqueue()</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/a571717d6520d436273c8cb34ca871db4bfa508a"><code>a571717</code></a>
<a
href="https://redirect.github.com/giampaolo/psutil/issues/2708">#2708</a>,
macos / cmdline / environ; raise AD instead of OSError(0) (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2709">#2709</a>)</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/8b98c3effc20dcc4ed08c8f3d33e11ec0f5445b1"><code>8b98c3e</code></a>
Pre-release</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/700b7e6a4171ae7c775679217205f1d97568ae00"><code>700b7e6</code></a>
[macOS] fix potential leaks in error paths (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2707">#2707</a>)</li>
<li><a
href="https://github.com/giampaolo/psutil/commit/7cc7923a1479fb1d32bb25d3e78b465e2695fbf7"><code>7cc7923</code></a>
Windows / cmdline(): be more defensive in free()ing in case of
error</li>
<li>Additional commits viewable in <a
href="https://github.com/giampaolo/psutil/compare/release-0.1.0...release-7.2.2">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Keep tk window from opening when `desc.plotting` is imported.

Resolves #2077
Adds new input formats for objectives inheriting from
```_CoilObjective```. In particular,
 
- ```bounds```, ```target```, and ```weight``` can accept pytrees with
values for individual coils, provided the input is a prefix of the input
```CoilSet```. Weights can be zero, in which case the corresponding coil
is masked.
- The attribute ```_broadcast_input``` is required for coil objectives,
stating if they return a single value per-coil or per-grid node.




---------

Co-authored-by: Dario Panici <37969854+dpanici@users.noreply.github.com>
Co-authored-by: Yigit Gunsur Elmacioglu <102380275+YigitElma@users.noreply.github.com>
Co-authored-by: YigitElma <yigitelmacioglu@gmail.com>
…11.0 (#2083)

Updates the requirements on
[pytest-split](https://github.com/jerry-git/pytest-split) to permit the
latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jerry-git/pytest-split/releases">pytest-split's
releases</a>.</em></p>
<blockquote>
<h2>Release 0.11.0</h2>
<h2>[0.11.0] - 2026-02-03</h2>
<h3>Added</h3>
<ul>
<li>Support for pytest 9.x</li>
<li>Support for Python 3.14</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Migrated <code>poetry.dev-dependencies</code> to
<code>poetry.group.dev.dependencies</code></li>
</ul>
<h3>Removed</h3>
<ul>
<li>Support for Python 3.8 and 3.9 (end-of-life)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/jerry-git/pytest-split/blob/master/CHANGELOG.md">pytest-split's
changelog</a>.</em></p>
<blockquote>
<h2>[0.11.0] - 2026-02-03</h2>
<h3>Added</h3>
<ul>
<li>Support for pytest 9.x</li>
<li>Support for Python 3.14</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Migrated <code>poetry.dev-dependencies</code> to
<code>poetry.group.dev.dependencies</code></li>
</ul>
<h3>Removed</h3>
<ul>
<li>Support for Python 3.8 and 3.9 (end-of-life)</li>
</ul>
<h2>[0.10.0] - 2024-10-16</h2>
<h3>Added</h3>
<ul>
<li>Support for Python 3.13.</li>
</ul>
<h2>[0.9.0] - 2024-06-19</h2>
<h3>Changed</h3>
<ul>
<li>Cruft update to get up to date with the parent cookiecutter
template</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Support for Python 3.7</li>
</ul>
<h2>[0.8.2] - 2024-01-29</h2>
<h3>Added</h3>
<ul>
<li>Support for pytest 8.x</li>
<li>Python 3.12 to CI test matrix</li>
</ul>
<h2>[0.8.1] - 2023-04-12</h2>
<h3>Changed</h3>
<ul>
<li>Introduce Ruff</li>
<li>Fixed usage of <a
href="https://docs.pytest.org/en/latest/deprecations.html#configuring-hook-specs-impls-using-markers">deprecated
pytest API</a></li>
</ul>
<h3>Added</h3>
<ul>
<li>Python 3.11 to CI test matrix</li>
</ul>
<h2>[0.8.0] - 2022-04-22</h2>
<h3>Fixed</h3>
<ul>
<li>The <code>least_duration</code> algorithm should now split
deterministically regardless of starting test order.
This should fix the main problem when running with test-randomization
packages such as <code>pytest-randomly</code> or
<code>pytest-random-order</code>
See <a
href="https://redirect.github.com/jerry-git/pytest-split/issues/52">#52</a></li>
</ul>
<h2>[0.7.0] - 2022-03-13</h2>
<h3>Added</h3>
<ul>
<li>Support for pytest 7.x, see <a
href="https://redirect.github.com/jerry-git/pytest-split/pull/47">jerry-git/pytest-split#47</a></li>
</ul>
<h2>[0.6.0] - 2022-01-10</h2>
<h3>Added</h3>
<ul>
<li>PR template</li>
<li>Test against 3.10</li>
<li>Compatibility with IPython Notebooks</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/fb5d0c1aeaaa371e59dcb21de98a08cd6648b816"><code>fb5d0c1</code></a>
Release 0.11.0</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/95a01846a6af373d75611d34aea65eabf7b9ce97"><code>95a0184</code></a>
Merge pull request <a
href="https://redirect.github.com/jerry-git/pytest-split/issues/117">#117</a>
from jerry-git/remove-python-38-39-eol</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/533a763d592d52f54c5b3788066ba8f2de7e1f61"><code>533a763</code></a>
Remove support for Python 3.8 and 3.9 (end-of-life)</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/fd17549742c15b0bba2e1af2daa82c52535a2e60"><code>fd17549</code></a>
Merge pull request <a
href="https://redirect.github.com/jerry-git/pytest-split/issues/116">#116</a>
from jerry-git/add-python-3.14-support</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/43aaeb7147b0b4ca1bfe29d094d84949db451f96"><code>43aaeb7</code></a>
Add support for Python 3.14</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/6d1c496875b8856d95c71d1648647721629a2063"><code>6d1c496</code></a>
Add pytest 9 support and update Poetry configuration</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/8f9ea5688b0f790b675fed39774ba7b425ca51ba"><code>8f9ea56</code></a>
Merge pull request <a
href="https://redirect.github.com/jerry-git/pytest-split/issues/112">#112</a>
from olegrok/patch-1</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/8c68e9811eaeea5dbb23a3051f4682a6aab20d12"><code>8c68e98</code></a>
Allow to use pytest 9</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/fb9af7e0122c18a96a7c01ca734c4ab01027f8d9"><code>fb9af7e</code></a>
Merge pull request <a
href="https://redirect.github.com/jerry-git/pytest-split/issues/107">#107</a>
from dogukancagatay/fix-python-314-test-failure</li>
<li><a
href="https://github.com/jerry-git/pytest-split/commit/a8337b5a5458a7d4f376721a32c1c410103bedf9"><code>a8337b5</code></a>
Fix test failure in Python 3.14a</li>
<li>Additional commits viewable in <a
href="https://github.com/jerry-git/pytest-split/compare/0.8.2...0.11.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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.

API for MagneticDiagnostic Class

5 participants

Comments