Build System
- Update versions ([89](https://github.com/estripling/onekit/pull/89),
[`e5b116e`](https://github.com/estripling/onekit/commit/e5b116e8ca365bfd537af15886eb3b8aba9ff173))
* build(workflows/release.yml): add spark setup
* build: update python (3.11), poetry (2.1.1), and spark (3.5.3)
- **pyproject.toml**: Include packages keyword ([87](https://github.com/estripling/onekit/pull/87),
[`8c8fa44`](https://github.com/estripling/onekit/commit/8c8fa44b407835420627e717a68ea6bd862474cf))
Features
- Add dekit ([88](https://github.com/estripling/onekit/pull/88),
[`3c9d036`](https://github.com/estripling/onekit/commit/3c9d0365cb86c71fde8d86f6d08f4e33cb6fa3c4))
* feat(dekit): add Individual
* refactor(Individual): add __repr__
* feat(dekit): add Population
* feat(Population): add size
* test(Population): add list methods tests
* refactor(Individual.evaluate): return self
* refactor(Population): add evaluate
* feat(Population): overwrite sort
* feat(Population): add min
* feat(Population): add max
* refactor(Individual): make x a positional argument
* test(Individual): ignore immutable property inspection
* feat(numpykit): add check_random_state
* refactor(Population): add iterable type hint
* refactor(Population): add is_evaluated
* refactor(Population): update key for test_incomplete_evaluation
* test(Population): list methods - slice
* test(Individual): repr
* feat(dekit): add check_bounds
* feat(dekit): add factory for initialization strategies
* refactor: add InitializationStrategy type
* feat(Initialization): add random__standard_uniform
* refactor: rename random_real_vectors -> random__uniform
* refactor(check_random_state): check for generator first
* feat(dekit): add Mutation.rand_1
* feat(dekit): add Mutation.best_1
* feat(dekit): add crossover binomial strategies
* feat(dekit): add selection strategy
* fix(Population): is_evaluated for empty population
* feat(dekit): add bound repair strategies
* refactor(BoundsHandler): rename properties
* refactor(Initialization): rename to x_mat
* feat(dekit): add normalize and denormalize
* refactor(x_bounds): use int32
* refactor(Individual): rename property fun -> fx
* build: add dekit dependencies
* feat(Population): add generation count
* feat(Population): overwrite copy method
* test: format style
* feat(Population): add increment_generation_count
* refactor(Crossover): rename binomial methods
* refactor(Population.generation): add docstring
* refactor(are_predicates_true): type hint
* feat(dekit): add termination strategies
* feat(dekit): add differential evolution
* test: small updates
* feat: add termination message
* feat: add current_to_best
* test: parametrize mutation strategies
* feat: add rand_to_best
* refactor: consistent syntax
* feat: add termination has_reached_max_best_so_far
* refactor: add docstring for mutation strategies
* feat(Population): add shuffle
* test: shuffle
* feat(Population): add sample
* refactor: mutation strategies to use population.sample
* refactor: rename mutation functions
* refactor(Population): sample
* feat: add current_to_pbest_1
* feat: add rand_to_pbest_1
* fix: compatibility with python 3.9
* feat(dekit): add shade
* refactor(DeV3): shade 1.0
* refactor(BoundRepair): rename variable
* refactor: DeV3.get_cr_value
* feat: add shade 1.1
* docs(Dev4): add details that motivates shade 1.1
* refactor: add target to bound repair strategies
* feat(BoundRepair): add mean_target_bound
* feat(BoundRepair): add bounce
* feat(BoundRepair): add hypersphere_universe
* docs: update references
* fix(update_archive): do not exceed max_size
* feat: add population size adaption lpsr
* test: add update_archive
* test: update test_shade
* feat: add lshade
* docs: fix variant count
* refactor: rename mean_target_bound to midway
* feat: add exponential crossover
* refactor: check_random_state
* feat: add dekit.ipynb
* refactor(playbook.py): delete directories first
* build: remove .master('local[*]') from spark session for testing
* revert: remove .master('local[*]') from spark session for testing
This reverts commit f3ef8eb44c4aa422807ca63a3d1debe22881263e.
* build(workflows/test.yml): add spark setup
* build(workflows/test.yml): fix java distribution
* build(workflows/test.yml): fix spark version
* build(workflows/test.yml): update spark version
* test: do not test spark version
- Refactor sparkkit function signatures ([90](https://github.com/estripling/onekit/pull/90),
[`2a49323`](https://github.com/estripling/onekit/commit/2a49323b47c0b1c4b0c9ba6a54f1d3441d9a8985))
* docs(DEVELOPERS.md): update PSR link
* refactor: improve type hints
* fix(Dockerfile): workspace
* feat: refactor sparkkit function signatures
BREAKING CHANGE: function signature change
Refactoring
- Remove curry from mathkit functions ([92](https://github.com/estripling/onekit/pull/92),
[`624c4c1`](https://github.com/estripling/onekit/commit/624c4c17d1b1039234cc10f7e5a4299da4a99f6f))
* refactor(digitscale): remove curry
* refactor(isdivisible): remove curry
- Rename c2.py to playbook.py ([85](https://github.com/estripling/onekit/pull/85),
[`bbed8f6`](https://github.com/estripling/onekit/commit/bbed8f6a6ee5a48fba95c3a4837f9c061e2226bf))
- Rename number_of_days -> num_days ([96](https://github.com/estripling/onekit/pull/96),
[`36bbd79`](https://github.com/estripling/onekit/commit/36bbd797800a0ceb11cab8124422d0cefbafdb52))
BREAKING CHANGE: renamed function number_of_days -> num_days
- **fetch_minima**: Remove curry ([97](https://github.com/estripling/onekit/pull/97),
[`e6edfa4`](https://github.com/estripling/onekit/commit/e6edfa42dc1ca0882ea79c30e0b7965b62372f84))
- **pythonkit**: Remove curry ([94](https://github.com/estripling/onekit/pull/94),
[`87ed704`](https://github.com/estripling/onekit/commit/87ed7041cb65bf11dfb35672d1fe54e0fe3357f7))
* refactor(date_ago): remove curry
* docs(date_ago): shorten docstring
* refactor(date_ahead): remove curry
* refactor(op): remove curry
* refactor(signif): remove curry
* refactor: improve type hints
* refactor(reduce_sets): remove curry
* refactor(pythonkit): improve type inspection
* refactor(pythonkit): rename d0 -> ref_date
BREAKING CHANGE: signature change of pythonkit functions
- **select_col_types**: Apply try/except logic ([91](https://github.com/estripling/onekit/pull/91),
[`1e95fe3`](https://github.com/estripling/onekit/commit/1e95fe3450d5a0777f5e691a102a18918d0904f3))
- **select_col_types**: Check if value has attr
([86](https://github.com/estripling/onekit/pull/86),
[`4c42978`](https://github.com/estripling/onekit/commit/4c429782680a08da575dc0a97bbb8942877f5fff))
- **sparkkit**: Peek ([93](https://github.com/estripling/onekit/pull/93),
[`df6d4f5`](https://github.com/estripling/onekit/commit/df6d4f5d3ed65e060e34ba88742cfd05d7f04332))
* feat(pythonkit): add get_shell_type
* build(pandaskit): add tabulate
* refactor(num_to_str): integrate g format
* feat(pandaskit): add display
* refactor(sparkkit): use display function in peek
BREAKING CHANGE: function signature change of sparkkit.peek
- **sparkkit**: Rename d0 -> ref_date ([95](https://github.com/estripling/onekit/pull/95),
[`dd9be68`](https://github.com/estripling/onekit/commit/dd9be68534b9956e070716f18bfcf54f97596ac1))
* refactor(filter_date): rename d0 -> ref_date
* refactor(sparkkit): rename d0 -> ref_date
BREAKING CHANGE: function signature change of filter_date, with_date_diff_ago, and
with_date_diff_ahead
- **stopwatch**: Set default flush to false ([84](https://github.com/estripling/onekit/pull/84),
[`0f9e93f`](https://github.com/estripling/onekit/commit/0f9e93fd0ef1e5d865400e66e28b95a58df4e9a7))
Breaking Changes
- Function signature change