NOTICE
======

phenoflex-py — Python port of selected functions from the chillR R package
---------------------------------------------------------------------------

Original R Package
------------------
Name:       chillR
Version:    see https://cran.r-project.org/package=chillR for current version
Repository: https://cran.r-project.org/package=chillR
            https://github.com/cran/chillR

Original Authors (chillR):
  Copyright (C) Eike Luedeling <eike@eikeluedeling.com>  [aut, cre]
  Copyright (C) Lars Caspersen <lcaspers@uni-bonn.de>    [aut]
  Copyright (C) Eduardo Fernandez <eduardo.fernandez.c@pucv.cl> [aut]

Original License: GNU General Public License v3 (GPL-3.0-only)

Python Port
-----------
Author:     Philipp August Muenker
Year:       2025
License:    GNU General Public License v3 (GPL-3.0-only)

Description of Changes
----------------------
This Python package contains translations and adaptations of selected
functions from the chillR R package. The following changes were made:

  - Selected R functions translated to Python (numpy/pandas/scipy)
  - The PhenoFlex core model re-implemented with Numba JIT compilation
    for performance (original C++ implementation by Carsten Urbach)
  - API adapted for idiomatic Python usage (DataFrames, dicts, kwargs)
  - Implementation reorganized into a Python package structure
  - Optimizer replaced: GenSA (R) -> scipy.optimize.dual_annealing
  - Tests and packaging added; results validated against R/chillR output

Functions ported from chillR
-----------------------------
  chillR::step_model()            -> phenoflex.step_model()
  chillR::Chilling_Hours()        -> phenoflex.Chilling_Hours()
  chillR::Utah_Model()            -> phenoflex.Utah_Model()
  chillR::Dynamic_Model()         -> phenoflex.Dynamic_Model()
  chillR::GDH() / GDH_model()    -> phenoflex.GDH()
  chillR::GDD()                   -> phenoflex.GDD()
  chillR::tempResponse()          -> phenoflex.tempResponse()
  chillR::genSeason()             -> phenoflex.genSeason()
  chillR::genSeasonList()         -> phenoflex.genSeasonList()
  chillR::PhenoFlex()             -> phenoflex.PhenoFlex_run()
  chillR::PhenoFlex_GDHwrapper()  -> phenoflex.PhenoFlex_GDHwrapper()
  chillR::PhenoFlex_GAUSSwrapper()-> phenoflex.PhenoFlex_GAUSSwrapper()
  chillR::RMSEP()                 -> phenoflex.RMSEP()
  chillR::phenologyFitter()       -> phenoflex.phenologyFitter()
  chillR::make_JDay()             -> phenoflex.make_JDay()
  chillR::daylength()             -> phenoflex.daylength()
  chillR::make_hourly_temps()     -> phenoflex.make_hourly_temps()
  chillR::stack_hourly_temps()    -> phenoflex.stack_hourly_temps()

Datasets ported from chillR
----------------------------
  chillR::KA_weather              -> phenoflex.load_KA_weather()
  chillR::KA_bloom                -> phenoflex.load_KA_bloom()

GPL Compliance
--------------
Because this package contains translations and adaptations of code from
chillR, which is licensed under the GNU General Public License v3
(GPL-3.0-only), this Python package is also licensed under
GPL-3.0-only. The full license text is provided in the LICENSE file.

Users of this package have the rights granted by the GNU GPL v3,
including the right to use, study, modify, and distribute this software
under the same license terms. No additional restrictions beyond those
of the GPL v3 are imposed.
