What's new in PyCPL 0.9
=======================

*PyCPL* 0.9 is an early release, which is made available to the public
in order to obtain feedback from a wider audience.

Added
-----

- Docstrings and comments added to `cpl.core.table_bindings` and `cpl.core.matrix_bindings` (!156)
- Module level docstrings were added to the submodules `cpl.core`, `cpl.dfs`, `cpl.drs`, and `cpl.ui`, summarizing the provided functionality. (!139)
- `equals` function to `cpl.core.Image`, used to compare equivalence of the image to another image.
- `cpl.drs.geometric_transforms` pydocs and unit tests (!111)
- `cpl.drs.detector` pydocs and unit tests (!109)
- `DESCRIPTION` constant accessible via `cpl.DESCRIPTION`. This is a string detailing the libraries linked to CPL (including CPL itself) and their version numbers. (!131)
- large number of `cpl.core.Table` method pydocs added (!137)
- large number of `cpl.core.Matrix` method pydocs added (!137)
- `cpl.core.Image.labelise_create` added (!108)
- `cpl.core.Image` can now be deep copied (!108)
- `cpl.drs.Apertures` is now fully documented with unit tests. (!108)
- `cpl.drs.wlcalib` documented with some unit tests (!107)
- `cpl.core.Image.fft` now bound (!140)

Changed
-------

- parameter `zone_def` for all `cpl.drs.detector` functions is now a tuple of 4 values (data types dependent on function). The parameter is also now made optional. (!109)
- `cpl.core.ImageList.load` now loads data as CPL_TYPE_DOUBLE by default while Image.load() loads data as it is in the file. (!127)
- `cpl.core.Image` constructor simplified and better documented. Zero initialised images now constructed with `cpl.core.Image.zeros` (!134)
- `cpl.core.Image.fill_abs_arg` has been renamed to `cpl.core.Image.split_abs_arg` and `cpl.core.Image.fill_abs_arg` has been renamed to `cpl.core.Image.fill_real_imag` to be more indicative of the function's purpse. (!134)
- `cpl.core.Image.as_type` added as an alternative interface to `cpl.core.Image.cast`. (!134)
- `cpl.core.Image.fill_gaussian` now uses 0 indexed values for xcen and ycen to be more consistent with the rest of the methods (!134)
- `cpl.core.dump_window` removed, now `cpl.core.dump` supports optional window arg to provide the same functionality. (!134)
- `cpl.core.get_median_dev` now returns a tuple of two values instead of just one, as it also returns the mean absolution median devation (!134)
- FITS keyword names are now rendered as code in the documentation of `cpl.dfs`. (!139)
- `cpl.core.Matrix.solve_lu` returns a new matrix based on the solution applied to `rhs` instead of modifying `rhs` (!136)
- `cpl.core.Matrix.sort_rows` and `cpl.core.Matrix.sort_columns` now take a boolean arg instead of an integer mode to decide to sort by absolute or value (!136)
- `cpl.core.Matrix` has new init structure using optional arguments. Initialising an empty matrix now done via `cpl.core.Matrix.zeros` (!136)
- `cpl.core.Matrix.threshold_small`, `cpl.core.Matrix.is_zero`, `cpl.core.Matrix.is_diagonal` and `cpl.core.Matrix.is_identity` now have `None` as the default value for `threshold` instead of -1.0, but has the same effect. (!136)
- `cpl.core.Matrix.copy` renamed to `cpl.core.Matrix.copy_values_from` (!136)

Fixed
-----

- Critical warnings from Sphinx about unexpected section titles in the documentation of overloaded functions were fixed by manually formatting these sections. (!139)
- clang compiler warnings should no longer be present, making clang fully supported
- Symbols and constants from the CPL C API appearing in the documentation of `cpl.dfs` were replaced by their PyCPL counterparts. (!139)
- C++ types in the docs have been corrected to their corresponding python types
- CPL path set by environment variables CPL_ROOT now takes priority over system directories to be linked during installation
- Unit test for eval test adjusted for m1 macs due to reduced double precision
- `cpl.core.Image` equality works for images of all data types now
- `cpl.core.Matrix.is_zero`, `cpl.core.Matrix.is_diagonal` and `cpl.core.Matrix.is_identity` now return booleans (!136)
- `cpl.core.Matrix.is_diagonal` and `cpl.core.Matrix.is_identity` throws `cpl.core.IllegalInputError` rather than simply returning `False` when called on a square matrix (!136)
- `cpl.core.Table.is_selected` returns `bool` as intentded (!137)
- `cpl.core.Image` equality works for images of all data types now (!127)
- `cpl.core.Image.load` now allows specifying the image target and target window type when loading a file as it should have.  (!127)
- `cpl.drs.wlcalib.SlitModel` could not previously be initialised. This has now been fixed. (!142)
- `cpl.drs.wlcalib.SlitModel.fit_best_1d` was a typo. Corrected to `cpl.drs.wlcalib.SlitModel.find_best_1d` (!142)
- `cpl.drs.wlcalib.SlitModel.find_best_1d` returned NamedTuple previously used the wrong field names. This has now been corrected. (!142)
- `cpl.drs.fit.lvmq` no longer throws bad_function_call when PyCPL is compiled with >=gcc11 on MacOS (!141)
- `cpl.drs.geometric_transforms.img_offset_combine` warning when compiling with clang now fixed. (!145)
- `cpl.core.Table.load_window`'s ordering of arguments was previously incorrect. Now fixed. (!145)
- `cpl.drs.detector.get_noise_ring` now returns correct values on gcc (!145)
- `cpl.drs.geometric_transforms.img_offset_combine` warning when compiling with clang now fixed.
- `cpl.core.Matrix.solve_lu` copies `rhs` and returns the modification rather than modifies `rhs` inplace (!136)
