# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).


## [1.0.0] - in planning

*Aim: 3 species, 2 crop growth models, farm model, GAEC scenarios, experimental analysis*

## [0.6.0] - in planning

*Plan: integrate AquaCrop (#79), set up first experiments*

---

## [0.5.5] - unreleased

*Plan: basic farm model (#16), decouple CairoMakie (#81)*


## [0.5.4] - 08-08-2024

**Skylark data analysis and new internal utility functions**

### Added

- `AnnualDate` type and associated functions for working with recurring dates (#101)
  - can be constructed from two `Int64`, a `Date`, or a `Tuple{Int64,Int64}`
  - automatic conversion from `Date` or `Tuple{Int64,Int64}`
  - can use operators: `==`, `<`, `+`, `-`, `:`
  - `thisyear()`, `lastyear()`, `nextyear()` functions and macros

- new file `core/utils.jl` for utility functions that fit in no other file

- irregular data logging using `record!()`/`@record()` (#103)

- data outputs & visualisation for the skylark model (#97)

- `randn()` function and macro to sample from a vector using a normal distribution

- `make install` to download and install Julia and package dependencies (on Linux, #67)

- weather file for the Thüringer Becken

### Changed

- moved random number functions and macros from `input.jl` to `utils.jl`

- expanded weather data for Jena to 1990-2023

- Non-breeding skylarks only search for neighbours to follow once (-> huge
  performance improvement!)

### Fixed

- bug fixes in the skylark model


## [0.5.3] - 31-07-2024

**Switchable crop models**

### Added

- Support for switchable crop models (#70), crop models can be set
  with the `cropmodel` setting in the `[crop]` section of
  `parameters.toml`.

- New submodules `ALMaSS` for the ALMaSS crop model, and `SimpleCrop`
  for testing switchable crop models.

### Changed

- All functionality specific to the ALMaSS crop model has been moved
  to the submodule `ALMaSS`.

- Due to switchable crop models, some types are now parametric:
  `AgricultureModel{Tcroptype,Tcropstate}` and `FarmPlot{Tcropstate}`.

- `FarmPlot{Tcropstate}` now only stores basic information about which
  pixels are part of the farm plot, all crop-specific information is
  now stored in the field `cropstate`.  Many functions acting on a
  `FarmPlot` now mostly forward to functions of the same name acting
  on the `cropstate` field of a `FarmPlot`.

- The type of `height` in `ALMaSS.CropState` and
  `ALMaSS.CropCurveParams` is now a unitful number `::Length{Float64}`.

- Both crop models `ALMaSS` and `SimpleCrop` now also support the
  functions `cropcover` and `cropyield` in addition to `croptype`,
  `cropname`, `cropheight`.

- `cropheight` now returns a unitful number `::Length{Float64}`, and
  returns height `0cm` if the landscape at that position is not a
  `FarmPlot`.


## [0.5.2] - 30-07-2024

**Rewrote the skylark model**

### Added

- Skylark model is largely rewritten to follow a new phase structure (#9)

- animals can occupy territories (see `@occupy`, `@isoccupied`, `@vacate` macros/functions) (#94)

- `@cropcover` macro and function

- ODD documentation for Skylark

### Changed

- input files that are now copied to a separate `inputs` directory within the output directory

- `EventType` renamed to `Management` for clarity

- documentation website now has a "Scientific Documentation" section

### Removed

- old skylark model (has been rewritten, see above)

### Fixed

- all skylarks now migrate (#90)

- `insectbiomass()` uses units


## [0.5.1] - 13-06-2024

**Added Unitful.jl**

### Added

- Unitful.jl now used to add units to quantities

- `world.mapdirectory` parameter specifies the path to the directory in which
 `landcovermap`, `farmfieldsmap`, and `weatherfile` are located
 
- `world.mapresolution` parameter specifies the input maps' spatial resolution in meters
 
### Changed

- spatial functions now work with explicit distances (using Unitful.jl) rather than using
  the number of pixels

- all species definitions and tests updated to use units

---

## [0.5.0] - 07-06-2024

**This release doesn't add much new functionality, but represents a major restructuring 
of the code base. Specifically, it removes the Agents.jl dependency and changes the 
way the species definition macros work and are used.**

### Added

- `SimulationModel` type, extended by `AgricultureModel` struct

- `@create` macro defines a special phase function that is called when an individual
  animal is created (at birth or on model initialisation)
  
- functions (and associated macros) to replace Agents.jl functionality:
  - `move!()` and `walk!()` 
  - `nearby_ids()`, `nearby_animals()`, `countanimals()`, `neighbours()`
  - `directionto()`, `distanceto()`, `randomdirection()`
  - `nagents()`, `killallanimals!()`

- `@here` macro to return the pixel currently occupied by the active animal

- `core.logoutput` parameter to define whether logs are printed to screen, file, none, or both

- large logo and model structure diagram

- Changelog

### Changed

- `SimulationModel` replaces `AgentBasedModel`

- Species definition macros revamped:
  - `@species` now only defines parameters and variables and creates a mutable struct
  - `@phase` must now be defined in the top-level code and creates a global function
  - `@initialise` renamed to `@populate`, must also be called in the top-level code
  - `initindividual()` renamed to `create!()`
  
- Skylark, Wolpertinger, and Wyvern updated to match the new macros

- requires Julia 1.10

### Removed

- Agents.jl dependency (including `AgentBasedModel` and functions for adding/moving/removing agents)

---

## [0.4.1] - 2023-11-14

**Initial version of the skylark model**

### Added

- initial version of the Skylark species

- small Jena map

- animal individuals keep track of their parents' IDs

- several new functions and macros for animals

- installation instructions for Windows

### Changed

- graphics output is more configurable


## [0.4.0] - 2023-10-28

**Functions for animal populations**

### Added

- initialisation functions for individuals (not just species)

- migration function / migrant pool for animals that disappear from the landscape during winter

- skylark migration

### Changed

- online documentation was expanded and restructured

- nature macros moved to a separate file


*Started changelog at this point, earlier versions are not included.*

<!-- Template

## [version] - unreleased

<comments>

### *PLANNED*

### Added

### Changed

### Deprecated

### Removed

### Fixed

-->