# greatR 2.1.0

## Changes

* Aligned `num_spline_params` used in `compare_H1_and_H2()` BIC calculation with the spline model (5 parameters per curve).
* `calculate_distance()` now imputes query expression on the registered time grid with `impute_query_exp_value()` (linear interpolation via `stats::approxfun()`); spline-based imputation remains available as `impute_query_exp_value_from_spline()` for comparison workflows.
* `get_timepoint_comb_data()` gains optional `cross_join_all` to support four-quadrant time-point combinations (reference-reference, query-query, etc.); `ref_` / `query_` prefixes are only applied in that mode so the default path keeps numeric time points.
* `calculate_distance()` and `plot.dist_greatR()` now handle numeric and label-formatted time-point tables more robustly (pre-aggregation relabelling removed from distance calculation; plot-side label stripping is conditional).

## Tooling & Documentation

* Added maintainer script `dev/scripts/rebuild_brapa_registration_rds.R` (plus notes under `dev/`) to regenerate `inst/extdata/brapa_arabidopsis_registration.rds` after registration changes.
* `dev/full_pipeline_example.Rmd`: runnable full pipeline (CSV → `register()` → summaries, curves, distances) for smoke-testing from a source checkout.
* Added `here` under `Suggests` for the rebuild script; updated `Config/roxygen2/version` for current {roxygen2}.

## Tests

* Updated unit test expectations for `BIC_diff` and `calculate_distance()` to match current outputs.

# greatR 2.0.0

* Added {patchwork} as a dependency.
* Updated {greatR} logo.
* Updated default `optimisation_method` in `register()` to be "lbfgsb" (LBFSG-B) instead of "nm" (Nelder-Mead).
* Added sample SOC1 `arabidopsis_SOC1_data.csv` and `brapa_SOC1_data.csv` extdata.
* Refactored `optimise_registration_parameters` argument in `register()` to `use_optimisation`.
* Updated `register()` to return object of S3 class `res_greatR`.
* Updated `calculate_distance()` to return object of S3 class `dist_greatR`.
* Refactored `summarise_registration()` as `summary.res_greatR()` S3 method.

## Improvements

* Deprecate use of `time_delta` variable in registration process.
* Added `fun_args` (a list of arguments used when calling the function) in `register()` results.
* Updated `summary.res_greatR()` to return `NA` instead of `[NA, NA]` when all genes are non-registered.
* Added `reg_params` (table containing distribution of registration parameters) to results list in `summary.res_greatR()` method.
* Simplified `calc_overlapping_percent()` calculation.
* Take into consideration `overlapping_percent` when applying manual registration.
* Updated logic of `calc_variance()` for data with no replicates to consider `expression_value`.
* Updated `get_stretch_search_space_limits()` and `get_shift_search_space_limits()` to exclude unexplorable regions in search space.
* Improved `calculate_distance()` and aux `get_timepoint_comb_*_data()` functions to eliminate column selection and renaming inside `lapply()` calls, reducing execution time by up to 25%.
* Added `type` ("registered" or "all") and `genes_list` arguments to `calculate_distance()` to filter genes.
* Added new unit tests.
* Updated unit tests, and added S3 class checks where apropriate.
* Updated vignettes and README diagrams and figures.
* Updated vignettes with additional examples, comments on arguments, and full coverage of all `plot()` methods.

## Bug fixes

* Fixed `get_shift_search_space_limits()` to adjust shift space limits accordingly to removal of `time_delta` variable (see 48c943cd).
* Fixed default `overlapping_percent = 0.5` (instead of 50) in `register_manually()`.
* Fixed `get_stretch_search_space_limits()` to correctly determine lower and upper limits when single stretch value is provided.
* Fixed issue in `get_shift_search_space_limits()` where range variables were not available when `calc_mode == "bound"`.

## New functions

* `bind_results()` auxiliary function to merge results from `register()`.
* `theme_greatR()` function and `greatR_palettes` list.
* `transform_input()` S3 generic to accept different types of input in `register()`.
* `plot.res_greatR()` S3 method to replace `plot_registration_results()`.
* `plot.dist_greatR()` S3 method to replace `plot_heatmap()`.
* `plot.summary.res_greatR()` S3 method inspired by `WVPlots::ScatterHistC()`.

# greatR 1.1.0

* Added {furrr} and {future} as dependencies.
* Added `num_cores` parameter to `register()` to allow users to run registration in parallel.
* Added `exp_sd` parameter to `register()` to allow users to manually set up experimental gene expression variance.
* Updated `scaling_method` parameter in `register()` and `scale_data()` to allow no scaling ("none", default), Z-score scaling ("z-score"), and min-max scaling ("min-max"), and updated unit tests accordingly.

## Improvements

* Updated `register()` to perform 3 sequential registrations when using Nelder-Mead, this improves the results of optimal stretch and shift parameters.
* Updated `calc_loglik()` to use `sigma_squared` in every time point in the sum.
* Updated `scaled_data()` and `preprocess_data()` to return `all_data` object only, instead of a `list()` containing `all_data`.
* Updated `compare_H1_and_H2()` to return `BIC_diff` column (`BIC_combined - BIC_separate`), instead of `BIC_combined` and `BIC_separate` on their own.
* Updated `explore_manual_search_space()` to use `BIC_diff` instead of `BIC_combined` to calculate `best_params` from `model_comparison` table.
* Updated `register()` to perform 3 sequential registrations when using Nelder-Mead, this improves the results of optimal stretch and shift parameters. This may be reverted by tweaking `neldermead()` parameters to ensure correct convergence.
* Added optional `stretch_init` and `shift_init` to `get_search_space_limits()`, and updated `optimise()` to allow for different `space_lims` calculation settings: automatic, given boundary box, and given initial coords (new).
* Removed unused `mean_data` calculation from `preprocess_data()` and argument from `scale_data()`.
* Moved "Will process N genes" message from `register()` to `preprocess_data()` after running `filter_*()` functions.
* Ensure `results_list$data` is arranged/ordered correctly in `register()`.
* Updated `get_H*_model_curves()` functions to ensure model curves are smooth.
* Updated `parse_gene_facets()` to display `BIC_diff` in facet strips.
* Added `plot_mean_data` parameter to `plot_registration_results()`.
* Updated `overlapping_percent` parameter in `register()` so it goes from 0 to 100 (it's later normalised in the function to avoid breakages down the line).
* Added `scaling_method` as an attribute in `data` results from `register()`, this is used in `plot_registration_results()` to build the y-axis label according the the scaling method used.
* Updated `brapa_arabidopsis_registration.rds` file with new pipeline results.
* Split `get_search_space_limits()` into separate aux functions for stretch and shift, which allows more stretch and shift input combinations.
* Updated `validate_params(..., registration_type = "optimisation")` to allow more stretch and shift input combinations.

## Bug fixes

* Improved `get_timepoint_comb_original_data()` and `get_timepoint_comb_registered_data()` to perform `cross_join()` on a single `gene_id` at a time using `lapply()`, this fixes "Error: vector memory exhausted (limit reached?)" error.
* Updated `match_names()` to do double `setdiff()` to ensure name matching is done two ways, and updated corresponding unit test.

## New functions

* `filter_incomplete_accession_pairs()` to filter out genes that are missing one accession.
* `calc_variance()` to preprocess data variance inside `preprocess_data()` instead of `calc_loglik()`.
* Aux `register_single_gene_*()` functions inside `register()` to simplify and generalise the pipeline for parallel registration.

# greatR 1.0.0

* Rewrote registration pipeline from scratch, deprecating unnecessary, and redundant auxiliary functions.
* Added L-BFGS-B and Nelder-Mead (now default) optimisation methods to {greatR}.
* Switched to manual calculation of log likelihood via `calc_loglik()` instead of `stats::logLik()`.
* Reduced computation time up to 1000 times, (x30 speed-up from package rewrite, and x35 speed-up from switching default optimisation method).
* Removed {dplyr}, {magrittr}, {purrr}, {rlang}, and {stringr} as package dependencies.
* Added {neldermead} as a package dependency.
* Updated list of exported functions:
  * `register()`
  * `summarise_registration()`
  * `get_approximate_stretch()`
  * `plot_registration_results()`
  * `plot_heatmap()`
  * `calculate_distance()`

## Improvements

* Simplified parameters of main `register()` function, and added `scaling_method`.
* Simplified structure of output object of `register()`.
* Simplified parameters of `summarise_registration()`, `plot_registration_results()`, `plot_heatmap()`, `calculate_distance()` to simply require `results` object from `register()`, vastly simplifying usage.
* Improved messages, errors, and progress indicators with {cli}.
* Added correct pluralisation in {cli} messages.
* Rewrote unit tests to use {data.table} exclusively for data manipulation.
* Added unit tests for `calc_loglik_H1()`, `calc_loglik_H2()`, `calc_overlapping_percent()`, `calculate_distance()`, `cross_join()`, `get_search_space_limits_from_params()`, `get_search_space_limits()`, `objective_fun()`, `optimise()`, `plot_heatmap()`, `plot_registration_results()`, `preprocess_data()`, `register_manually()`, `register()`, `summary_registration()`, `validate_params()`.

## Bug fixes

* Fixed `match_names()` call when validating accession names in `register()`
* Fixed use of deprecated `aes_string()` by parsing `timepoint_var` using `!!ggplot2::sym()` call.
* Fixed `preds` left join in `plot_registration_results()`.
* Fixed issue in `plot_registration_results()` not working when all genes are unregistered with `type = "registered"`.
* Fixed calculation of `time_delta` in `preprocess_data()` to ensure it's grouped by `gene_id` and `accession` (not just `accession`).

# greatR 0.2.0

* Added Alex Calderwood as package co-author.
* Added vignette for optimisation process.
* Refactored `num_shifts` and `shift_extreme` parameters by simplified `shifts` parameter.

## Improvements

* Improved default parameter values in exported functions.
* Added {optimization}, {purrr} as package dependencies.
* Removed {cowplot}, {ggpubr}, {ggrepel}, {Rtsne}, and {viridis} as package dependencies.
* Cleaned up {cli} messages.
* Removed legacy AIC references, as it is no longer used.
* Updated `calculate_between_sample_distance()` to use `registration_results` as primary parameter instead of `mean_df`, `mean_df_sc`, and `imputed_mean_df`.
* Added warning if there is no comparable time points found using users' pre-defined parameters.
* Refactored `optimise_shift_extreme` as `maintain_min_num_overlapping_points`, properly defined and corrected the boundary box if number overlapping points whether needed to be maintained or not.

## Bug fixes

* Check that input accessions exist in the input data in `get_approximate_stretch()`.
* Manually create time point sorting levels for `x_sample` and `y_sample` columns according in `plot_heatmap()`.
* Properly handle `-` character in accession names in `plot_heatmap()` so that time points are parsed correctly.

## New features

* Added optional parameter optimisation process using Simulated Annealing through `optimise_registration_params()`.

## New functions

* `preprocess_data()` to simplify `scale_and_register_data()` code and reuse logic elsewhere.
* `get_best_stretch_and_shift_simplified()`.
* `get_BIC_from_registering_data()`.
* `get_boundary_box()`.
* `optimise_registration_params_single_gene()`.
* `optimise_registration_params()` as wrapper of `optimise_registration_params_single_gene()` for multiple genes.
* `get_best_stretch_and_shift_after_optimisation()`.

# greatR 0.1.0

* Initial release.
* Added a `NEWS.md` file to track changes to the package.
