===========
Features
--------
- It adds odd parity support to HEOM's fermionic solver (2261, by Gerardo Jose Suarez)
- Create `SMESolver.run_from_experiment`, which allows to run stochastic evolution from know noise or measurements. (2318)
- Add types hints. (2327, 2473)
- Weighted trajectories in trajectory solvers (enables improved sampling for nm_mcsolve) (2369, by Paul Menczel)
- Updated `qutip.core.metrics.dnorm` to have an efficient speedup when finding the difference of two unitaries. We use a result on page 18 of
D. Aharonov, A. Kitaev, and N. Nisan, (1998). (2416, by owenagnel)
- Allow mixed initial conditions for mcsolve and nm_mcsolve. (2437, by Paul Menczel)
- Add support for `jit` and `grad` in qutip.core.metrics (2461, by Rochisha Agarwal)
- Allow merging results from stochastic solvers. (2474)
- Support measurement statistics for `jax` and `jaxdia` dtypes (2493, by Rochisha Agarwal)
- Enable mcsolve with jax.grad using numpy_backend (2499, by Rochisha Agarwal)
- Add propagator method to steadystate (2508)
- Introduces the qutip.core.environment module, which contains classes that characterize bosonic and fermionic thermal environments. (2534, by Gerardo Jose Suarez)
- Implements a `einsum` function for Qobj dimensions (Evaluates the Einstein summation convention on the operands.) (2545, by Franco Mayo)
- Wave function calculations have been sped up with a Cython implementation.
It optimizes the update method of the HarmonicOscillatorWaveFunction class in distribution.py. (2553, by Matheus Gomes Cordeiro)
- Speed up `kraus_to_super` by adding a `sparse` option. (2569, by Sola85)
Bug Fixes
---------
- Fix a dimension problem for the argument color of Bloch.add_states
Clean-up of the code in Bloch.add_state
Add Bloch.add_arc and Bloch.add_line in the guide on Bloch class (2445, by PositroniumJS)
- Fix HTMLProgressBar display (2475)
- Make expm, cosm, sinm work with jax. (2484, by Rochisha Agarwal)
- Fix stochastic solver step method (2491)
- `clip` gives deprecation warning, that might be a problem in the future. Hence switch to `where` (2507, by Rochisha Agarwal)
- Fix brmesolve detection of contant vs time-dependent system. (2530)
- `propagator` now accepts list format `c_ops` like `mesolve` does. (2532)
- Fix compatibility issue with matplotlib>=3.9 in matrix_histogram (2544, by Andreas Maeder)
- Resolve incompatibility of TwoModeQuadratureCorrelation class (2548, by quantum-menace)
- Fix sparse eigen solver issue with many degenerate eigen values. (2586)
- Fix getting tensor permutation for uneven super operators. (2561)
Documentation
-------------
- Improve guide-settings page. (2403)
- Tidy up formatting of type aliases in the api documentation (2436, by Paul Menczel)
- Update documentation
- Update contributors
- Improve apidoc readability (2523)
- Fix error in simdiag docstring (2585, by Sola85)
Miscellaneous
-------------
- Add auto_real_casting options. (2329)
- Add dispatcher for sqrtm (2453, by Rochisha Agarwal)
- Make `e_ops`, `args` and `options` keyword only.
Solver were inconsistent with `e_ops` usually following `c_ops` but sometime
preceding it. Setting it as keyword only remove the need to memorize the
signature of each solver. (2489)
- Introduces a new `NumpyBackend `class that enables dynamic selection of the numpy_backend used in `qutip`.
The class facilitates switching between different numpy implementations ( `numpy` and `jax.numpy` mainly ) based on the configuration specified in `settings.core`. (2490, by Rochisha Agarwal)
- Improve mkl lookup function. (2497)
- Deterministic trajectories are not counted in ``ntraj``. (2502)
- Allow tests to be executed multiple times in one Python session (2538, by Zhang Maiyun)
- Improve performance of qutip.Qobj by using static numpy version check (2557, by Pieter Eendebak)
- Fix towncrier check (2542)