Timefold Solver 1.26.0
A new month, a new Timefold Solver release packed with excitement! We have done many performance improvements around value ranges, and also fixed some important bugs. But most importantly, declarative shadow variables are now part of our public API.
This is a big milestone, and we want to thank everyone who provided their feedback as we were evolving the feature out there in public. The magic of open source in action! For those who were using the feature even while it was in preview, we want to point out the changes we've made in this release, which are likely to affect you:
- All annotations related to the feature moved to their final place in the public API, specifically to the
ai.timefold.solver.core.api.domain.variablepackage. ShadowVariableLoopedannotation was renamed toShadowVariablesInconsistent.- This annotation was also made optional. If you don't need it in your model or for your constraints, you need not include it.
- In constraints,
forEach()andforEachIncludingUnassigned()now filter out every inconsistent (formerly looped) entity. To include them in your constraints, useforEachUnfiltered()instead.
SBOMs
Timefold Solver releases now come with SBOMs to help with supply chain security. You can find our SBOMs in Maven Central alongside our binaries, such as SBOM for Solver core.
Changelog
🚀 Features
- Finalize declarative shadow variables (#1775)
- Add high-level aggregation methods to BenchmarkAggregator (#1777)
🐛 Fixes
- Avoid removing iterators prematurely (#1779)
- Review nullability annotations around SolutionManager (#1757)
- Start the termination counter at the first step (#1736)
- Address Quarkus warning about recorders not being injected as RuntimeValue
🔄️ Changes
- Allow using builtin variable after builtin variable source in declarative shadow variables (#1734)
- Improve entity value range logic for basic variables (#1750)
- Create filtering value range selectors as early as possible (#1738)
🧰 Tasks
- ForEach and forEachUnassigned exclude inconsistent entities by default (#1764)
- Fail-fast if shadow variables has a source-induced loop in their graph (#1758), closes #1675
- Make @ShadowVariablesInconsistent optional (#1778)
- Move streams support for swap moves (#1765)
- Rename @ShadowVariableLooped to @ShadowVariablesInconsistent (#1749)
📝 Documentation
- Rework structure for shadow variables (#1781)
- Add programmatic benchmark aggregation example to documentation (#1774)
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Tom Cools (@TomCools)
- Lukas Downes (@LDWNS)
- Diallo Francis-Patrick (@PatrickDiallo23)
- Frederico Gonçalves (@zepfred)
- Lukáš Petrovický (@triceo)
Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well! For more, see Contributing.
Should your business need to scale to truly massive data sets or require enterprise-grade support, check out Timefold Solver Enterprise Edition.
How to use Timefold Solver
To see Timefold Solver in action, check out the quickstarts.
With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.26.0 dependency in your pom.xml to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.26.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.