New year, new release, new goodness!
**Featured Update - [Pinning on list variables](https://timefold.ai/docs/timefold-solver/latest/responding-to-change/responding-to-change#partiallyPinnedPlanningListVariable)**, enhancing our support for [real-time planning](https://timefold.ai/docs/timefold-solver/latest/responding-to-change/responding-to-change#realTimePlanning):
- With a new `PlanningPinToIndex` annotation, you can tell the solver that a certain portion of the list variable is pinned and shouldn't be moved.
- For example, for a list of customers that a vehicle will visit, this allows you to model situations where certain visits have either already happened, or where the vehicle is already too far into the trip that it would not be practical for it to turn back.
- Previously, pinning was only available for the [chained variable](https://timefold.ai/docs/timefold-solver/latest/using-timefold-solver/modeling-planning-problems#chainedPlanningVariable). With this, we are ramping up our efforts to bring list variable, which is easier to both understand and implement, on par with the chain variable in terms of features. Stay tuned for more on this front!
Other Enhancements:
- Solver termination can now be overridden without creating a new instance of `Solver` or `SolverManager`, look for the `SolverConfigOverride` class.
- The usual assortment of bugfixes and performance improvements.
- Improvements all over the [documentation](https://timefold.ai/docs/timefold-solver/latest/quickstart/overview/overview-quickstarts) and [quickstarts](https://github.com/TimefoldAI/timefold-quickstarts/).
- Dependency upgrades.
Changelog
🚀 Features
- 3cb5490 Pinning support for list variable (491), closes 491
- d9b99b1 Syntactic sugar for ScoreAnalysis (546), closes 546
- a481fe1 Overriding Solver termination configuration (542), closes 515 542
- d2e52cd PlannerBenchmarkFactory.createFromSolverConfig() (479), closes 479
🐛 Fixes
- 67d4448 Avoid exception when analysing uninitialized solution (536), closes 536
- a5c3960 Fail fast when DeepPlanningClone on a record
- 69e3e55 Make MatchAnalysis implement Comparable to fix score corruption analysis (527), closes 527
- 2b35c89 Updating the School Timetabling quickstarts documentation (494), closes 98 494
- 10ba396 Non-existent methods referenced for score explanation
- a8e7a8a Filter trivial 2-opt moves and make KOptListMove public (485), closes 480 485
- 0357f3e Do not set shadow variables to null when calculating from scratch in TRACED_FULL_ASSERT (484), closes 478 484
🔄️ Changes
- 92ff8fa Reduce allocations in CS
📝 Documentation
- d4a5e1c Add Quickstart code examples for Kotlin (541), closes 541
- 490490a Rename variable names for collection types (499), closes 499
- aaa0ebc Use tabs where possible to have better distinction between Maven and Gradle
- 85dd7d9 Maintenance scheduling class diagram rename tagSet to reality
- c8c28a0 Add chapter on CS performance
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Frederico Gonçalves ([zepfred](https://github.com/zepfred))
- Geoffrey De Smet
- GitHub
- Lukáš Petrovický ([triceo](https://github.com/triceo))
- M.Thimm
- Peter Laggner
- Pieter De Schepper
- Radovan Synek
- dependabot[bot] ([dependabot[bot]](https://github.com/apps/dependabot))
_Timefold Solver Community Edition_ is an open source project, and you are more than welcome to contribute as well!
For more, see [Contributing](https://github.com/TimefoldAI/timefold-solver/blob/main/CONTRIBUTING.adoc).
Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out [_Timefold Solver Enterprise Edition_](https://github.com/TimefoldAI/timefold-solver-enterprise/releases).
How to use Timefold Solver
To see Timefold Solver in action, check out [the quickstarts](https://github.com/TimefoldAI/timefold-quickstarts).
[//]: (Ideally we'd show the pom.xml snippet, but a JReleaser bug would remove all whitespace from it.)
[//]: (See https://github.com/jreleaser/jreleaser/issues/1142)
With Maven or Gradle, add the `ai.timefold.solver : timefold-solver-core : 1.6.0` dependency in your `pom.xml` to get started.
You can also import the Timefold Solver Bom (`ai.timefold.solver : timefold-solver-bom : 1.6.0`)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.
Additional notes
The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.