# New features

## Generalized MPI parallelization
* The `Mpi` class now supports any number of MPI ranks, a single rank can own several bunches. Previously, parallelization required exactly one core per bunch.
* All tracking elements (`WakePotential`, `CavityResonator`, monitors, etc.) updated to support the generalized mapping.
* Add MPI consistency tests (`tests/mpi/`) to validate that serial and parallel runs produce identical results.

## CSR wakefield tracking
* Extend `FreeSpaceCSR` and `ParallelPlatesCSR` to provide the longitudinal wake antiderivative, enabling CSR kick tracking via `WakePotential`.
* `WakePotential` detects CSR components and uses the antiderivative–derivative convolution to avoid the singularity.
* Add a `coherent_synchrotron_radiation.ipynb` example notebook illustrating CSR tracking.

## LongitudinalExponentialDamper
* Add `LongitudinalExponentialDamper` element in `tracking/feedback.py` for longitudinal bunch-by-bunch feedback tracking.

## ResistiveWallModel
* Add `ResistiveWallModel` class in `impedance/resistive_wall_model.py` to store aperture, resistivity and Yokoya factors along the longitudinal position for global resistive wall computation using the effective radius formalism.
* Includes `resistive_wall_effective_radius_yokoya` method and visualization tools.

## Quadrupolar wakes in LongRangeResistiveWall
* `LongRangeResistiveWall` now supports quadrupolar wake types (`Wxquad`, `Wyquad`) in addition to the previous dipolar and longitudinal wakes.

## Resonator properties
* Add properties to `Resonator`: resonant frequency, quality factor, shunt impedance, and derived quantities accessible as attributes.
* Fix `PureResistive` impedance model.

## WakePotential convenience methods
* Add `wakefunction_max_frequency`, `binning_max_frequency`, and `wakepotential_max_frequency` methods to `WakePotential`.
* `WakePotentialMonitor` now saves the `max_frequency` attribute.

# Other improvements and modifications
* Move `Synchrotron` class from `tracking/synchrotron.py` to `utilities/synchrotron.py`. Old import paths remain valid via `__init__.py` re-exports.
* Add `__repr__` and `__str__` methods to `Synchrotron`, `Optics`, and `Particle` classes.
* Vectorize `transverse_gaussian_space_charge_tune_shift`: `bunch_current` now accepts an array.
* Add type hints across the codebase.
* All plotting functions now accept an optional `ax` argument and return axes instead of figures.
* `plot_profiledata` and `plot_wakedata` now default to a profile plot, with an option to produce a streak plot.
* `BunchSpectrumMonitor` and `BeamSpectrumMonitor`: `buffer_size` is now optional; fix a longstanding issue where `save_every` did not reliably flush data.
* Add `merge_files` utility function in `tracking/monitors/tools.py`.
* Refactor `IntrabeamScattering` for improved clarity and performance.

## Project management
* Restructure documentation: switch to the Awesome Sphinx theme, add per-module RST pages, include example notebooks.
* Add `pylintrc` configuration file.
* Add merge request template.
* Update `poetry.lock` and `pyproject.toml`.
* Update `.gitlab-ci.yml`.
* Unify version management

# Bugfix
* Fix `TransverseExponentialDamper` kick calculation in the Y direction.
* Fix `CavityResonator` phase calculation (replace manual angle with `arctan2`).
* Fix `ImpedanceModel.group_attributes` (issue #11).
* Fix `WakePotential.get_gaussian_wakepotential`.
* Fix impedance-file reading (`delim_whitespace` deprecation replaced with `sep=r'\s+'`).
* Fix h5py file opens to use context managers, preventing file handle leaks.
* Remove leftover `PhysicalModel` class from `optics.py` (was renamed to `ResistiveWallModel` in a prior release but not removed).

# Authors who took part in this release
Alexis Gamelin, Vadim Gubaidulin, Elene Kravishvili, Lee Carver