Releases: TimefoldAI/timefold-solver
Timefold Solver 1.22.0
We're even more excited than usual to bring you this release. Sure, it has the usual fixes and improvements, but it also brings... drumroll please...
Declarative shadow variables (Preview)
We've heard from so many of you over the years that variable listeners are too complex. We've also heard that it's too hard to enforce before-after relationships between entities, such as when a job needs to happen after another one, or together with some other. Well, not anymore!
With declarative shadow variables, you can now define methods to compute values for individual shadow variables, and let the solver figure out the dependencies between them, what to call first and how to propagate the changes throughout the planning solution.
We have been working on this for months and we have verified this feature on several of our own planning problems. But before we set the API in stone, we want to hear from you. That's why we're making declarative shadow variables available as a preview feature, and we may still tweak parts of it based on your feedback. Check out the documentation, try replacing your variable listeners, and come talk to us with results - we're looking forward to hearing from you.
Changelog
🐛 Fixes
- 5c48116 Use FIELD_OR_READ_METHOD member accessor type for declarative shadow variable calculator
- b86edcb Do not enumerate constraint matches which do not differ
- 4e192e5 Do not reset global terminations on phase level (#1509)
🧰 Tasks
- 7cdc739 Formalize solution inheritance rules (#1541)
- 90236a3 Formalize entity inheritance rules
- cf87aa7 Make init score inaccessible to users (#1501)
📝 Documentation
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Tom Cools (@TomCools)
- Lukas Downes (@LDWNS)
- Frederico Gonçalves (@zepfred)
- Maarten Mulders (@mthmulders)
- 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.22.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.22.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.
Timefold Solver 1.21.0
With our usual monthly cadence, we bring you another fresh batch of features, bugfixes and small improvements.
Users of Constraint Streams will be happy to know that writing tests for constraints just got easier, as ConstraintVerifier
can automatically update all shadow variables. If you're still not testing your constraints, it's time to start!
Changelog
🚀 Features
- 9d6cc3e Allow ConstraintVerifier to update all shadow variables
🐛 Fixes
- 5447b0f Call cascade listeners for unassigned values (#1480)
- ba5d388 Register TimefoldJacksonModule for native (#1479)
- 17cea63 Address the division by zero issue in the diminished returns termination
🧰 Tasks
- 56340ed Better Quarkus extension metadata
📝 Documentation
- 9574cab Fix constructor in custom move example
- 3c3c41a Split up automatic and manual upgrade from OptaPlanner
Contributors
We'd like to thank the following people for their contributions:
- Geoffrey De Smet (@ge0ffrey)
- Frederico Gonçalves (@zepfred)
- Lukáš Petrovický (@triceo)
- Marek Winkler (@winklerm)
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.21.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.21.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.
Timefold Solver 1.20.1
We interrupt your regularly scheduled programming to bring you a hotfix release.
If you experienced the solver no longer terminating early, this one is for you.
Changelog
🐛 Fixes
- 17c7556 phases should always check if the solver terminated early (#1456)
- 90f02f4 match count in score analysis diff need not match the match list size (#1454)
📝 Documentation
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli )
- 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.20.1
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.20.1
)
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.
Timefold Solver 1.20.0
Spring is in the air and Timefold Solver 1.20.0 brings some spring cleanup! We have fixed some severe bugs and also made numerous improvements to our documentation. One change stands out among others though:
Some score assertions now enabled by default
We noticed that some of our users have score corruptions in their code without even knowing. Score corruption is a serious issue affecting the quality of your solutions to the point not being usable in practice. We have therefore enabled some very basic score corruption checks at the end of every solver phase - if your solver suddenly starts throwing exceptions after upgrading, it is to let you know that you have a dangerous error in your implementation and should look into fixing it.
The new default environment mode is PHASE_ASSERT
. Users who wish to ignore score corruptions may switch to environment mode NO_ASSERT
(formerly known as REPRODUCIBLE
) which will restore the original behavior. Only do so at your own risk - instead, we recommend figuring out the root cause of your problem, perhaps with the help of our lovely community.
Changelog
🚀 Features
🐛 Fixes
- a1fb1fe Improve thread safety around problem changes (#1439)
- f8030ca Do not call variable listeners when the solution is in an inconsistent state in undo moves (#1438)
- 9eff397 Don't terminate if a value can still be unassigned (#1395)
🧰 Tasks
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Nathan Colgate (@nathancolgate)
- Tom Cools (@TomCools)
- Frederico Gonçalves (@zepfred)
- Lukáš Petrovický (@triceo)
- Phạm Trọng Thắng (@phamtrongthang123)
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.20.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.20.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.
Timefold Solver 1.19.0
Valentine's day is still a few days away, but we're giving Timefold Solver care and attention every day! This release is rich with bug fixes and performance improvements, but also a long-awaited feature:
Featured update: Diminished Returns termination
Users of Timefold Solver have surely noticed that the ways of automatically terminating the solver leave something to be desired - they are either too hardware-dependent, or too problem-specific. We are now addressing this with the Diminished Returns termination.
This new termination takes a look at how quickly the solver is improving, and only ends solving when the rate of improvement slows down to nearly nothing. This removes dependency on both hardware and problem sizes, and we recommend that you try it.
Changelog
🚀 Features
- 881f725 Allow SolverManager and SolverJob to submit problem changes in batches
- 6537668 Log a warning when CH terminated prematurely (#1362)
- e94c4e8 Add Diminished Returns termination (#1313)
🐛 Fixes
- f3b830c Only run local search when there is something to run
- a7c8374 Prevent possible concurrent modification of a collection (#1370)
- e4805a8 Do not crash dev mode on empty app
- 9f53d4a Do not double count move evaluations
- 8ca431c Fix Python custom justifications with Decimal scores
- d769425 Use different SolverScope in the RuinRecreateMove nested phase
🔄️ Changes
- 292ea28 Remove certain polymorphic call sites (#1341)
- c42acc7 Improve performance of Bavet indexing (#1324)
- 3bf5d40 Improve tuple store performance (#1329)
📝 Documentation
- bc77f8e Add diagrams for consecutive and connected collectors
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Tom Cools (@TomCools)
- Frederico Gonçalves (@zepfred)
- Lukáš Petrovický (@triceo)
- Geoffrey De Smet (@ge0ffrey)
- Radovan Synek (@rsynek)
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.19.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.19.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.
Timefold Solver 1.18.0
We welcome the new year with another release of Timefold Solver!
This time, it's mostly bugfixes and quality of life improvements, but we also introduce a Solution Diff feature to let you easily check differences between two planning solutions. It starts out its life as a preview feature, so let us know what you think!
Changelog
🚀 Features
- d79f75c Solution diff in SolutionManager (#1312), closes #1312
- 4316a5e (Python) Support deep_planning_clone class decorator (#1271), closes #1271
🐛 Fixes
- 3247e86 Ruin&Recreate score corruption and multi-threaded fixes (#1320), closes #1320
- d3ae68f Use Named Solver fields and method parameters to determine list of solver names in Quarkus (#1308), closes #1308
- 6271534 More accurate type hints for Python @planning_entity
🔄️ Changes
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli )
- Frederico Gonçalves (@zepfred )
- Jonathan Romano (@luxaritas )
- Lukáš Petrovický (@triceo )
- tomashauser (@tomashauser )
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.18.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.18.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.
Timefold Solver 1.17.0
In this, the last release of 2024, we are bringing mostly small fixes and improvements. But we are also...
Introducing Preview Features!
Preview features are developed to the same standard of quality as the rest of Timefold Solver. They are fully specced out, implemented and documented. However, their APIs and behavior are not yet considered stable - we can change them in the future, and we may even remove them if they don't prove themselves. And to make that decision, we need your feedback!
Diversified Late Acceptance Search (DLAS)
We're kicking off the previous features with an improvement to our local search implementation! Diversified Late Acceptance Search is a tweak to the standard Late Acceptance Hill Climbing and if we're right about it, it will get you better solutions to your optimization problems, and it will get there faster.
Please try it out and let us know what your experience is - did your solver reach better solutions than before? How much better? Have you suffered any issues after switching to DLAS? We want to know!
Changelog
🚀 Features
- c6c30e9 Add Diversified Late Acceptance approach (#1253), closes #1253
- 9c6f7b4 Add method to
SolverConfig
for setting unimproved termination limit
🐛 Fixes
- 3a1ef62 Ensure the sort manner is applied to the default CH config (#1258), closes #1258
- 9d7a502 Off-by-one error when choosing element locations
- 07cc41d Use a stable recipe order for
NullableRecipe.getRecipeList()
- 28201ef Recurse through @DeepPlanningCloned classes to discover all @DeepPlanningCloned classes (#1237), closes #1208 #1237
🧰 Tasks
- ab27eef Improve ConstraintAnalysis toString
- ee760ca Unify the handling of list variable shadows (#1228), closes #1228
📝 Documentation
- d55c510 Restucture multi-threaded section (#1269), closes #1269
- 8c769f7 Simplify Vehicle Routing Quickstart (#1229), closes #1229
- 05ebcd4 Add FAQ section
Contributors
We'd like to thank the following people for their contributions:
- Lars Beckmann (@larsbeck )
- Tim te Beek (@timtebeek )
- Lee Carlon (@lee-carlon )
- Christopher Chianelli (@Christopher-Chianelli )
- Tom Cools (@TomCools )
- Frederico Gonçalves (@zepfred )
- Lukáš Petrovický (@triceo )
- Geoffrey De Smet (@ge0ffrey )
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.17.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.17.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.
Timefold Solver 1.16.0
Looks like Christmas came early this year! This release of your favorite solver is packed to the brim with cool new features.
Featured update: Nullness annotations on public API
Users of Kotlin rejoice! All public APIs of Timefold Solver have now been null-marked using JSpecify. This means you should now be able to remove some of those pesky Elvis operators from your code. Both Java and Kotlin users will also be able to benefit from IDE support, warning of improper use and handling of null
.
This has been a big change and we are doubly excited about it, because it was entirely contributed by a member of our growing community! Our thanks go out to Peter Laggner (@greyhairredbear), for the time and effort he spent delivering this. We hope he'll enjoy some Timefold-branded tokens of appreciation we've sent his way.
But that's not all we have in store for you!
- Due to some improvements to the solver, we no longer require you to implement undo moves for your Custom moves; you can safely delete them from your codebase, just like we did with ours.
- We have also updated the Score Analysis API to optionally skip listing all justifications, which will help users with massive datasets.
- We have a brand new documentation website with some refreshed content.
And last but not least, we've been making smaller improvements and bugfixes here and there, as per usual. Enjoy the latest and greatest Timefold Solver, and stay in touch!
Changelog
🚀 Features
- 48542aa Add nullness annotations on public API (Part 2) (#1160), closes #1160
- 06d2c82 Enable score analysis without justifications (#1185), closes #1185
- 34dded5 Add nullness annotations on public API (Part 1) (#1009), closes #1009
🐛 Fixes
📝 Documentation
- 2b68305 Fix syntax issues in Python (#1182), closes #1182
- 1300d72 Improve note on allows unassigned
- 6f5f54f Restructure introduction (#1151), closes #1151
- ef2aae9 Add missing link to backup planning (#1147), closes #1147
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Franco Peschiera (@pchtsp)
- Geoffrey De Smet (@ge0ffrey)
- Lukáš Petrovický (@triceo)
- Peter Laggner (@greyhairredbear)
- Pieter De Schepper (@pieterdeschepper)
- Tom Cools (@TomCools)
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.16.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.16.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.
Timefold Solver 1.15.0
Fall is here and the days are getting shorter, but the release cadence of Timefold Solver is still once a month!
This time, we've brought a whole bunch of smaller improvements and bug fixes. We've extended our Recommendations API, made the recently introduced Ruin and Recreate move more reliable, and improved our Python experience.
Changelog
🚀 Features
- 11cd2fb Support assigned values for Recommendations as well (#1136), closes #1136
- c027d7e Add new move count metric (#1072), closes #1072
- 0801dfd Expose constraint metamodel in Quarkus and Spring Boot (#1108), closes #1108
- 9c36871 Multi-threaded solving support for Ruin and Recreate moves
- 0bf63f6 Add solver job start event (#1084), closes #1084
🐛 Fixes
- 23d64bd Don't pick a move if CH terminates prematurely (#1132), closes #1132
- 753b6f9 Don't restart solver termination in Ruin and Recreate
- c416a8b Don't override value with loop variable
- 141b70f Cast classmethods' first argument to PythonLikeType in 3.10, use same instances for Enum values
- f24fb28 Pop off result of setattr and delattr in generic case
- 1482036 Generate override methods when parent's parameters have a different signature
🧰 Tasks
📝 Documentation
- 1b910cb Updated intro with planning content
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Frederico Gonçalves (@zepfred)
- Lukáš Petrovický
- Matej Čimbora
- lee-carlon
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.15.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.15.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.
Timefold Solver 1.14.0
Summer vacations are over, the big announcements are made, and now we're back with another release of Timefold Solver!
Featured Update: Ruin and Recreate Move
Is your solver getting stuck in local optima, no longer improving the solution? Then you may benefit from the "Ruin and Recreate" move, which destroys part of the solution and rebuilds it all over again. Our experiments show that this can often help the solver escape local optima, so why don't you give it a try? And when you do, we'd love to hear what your own experience with this new move was - come talk to us!
Besides that, we are bringing the usual bunch of bug fixes and improvements. As always, all of these are available for all of our Java, Python and Kotlin users.
Changelog
🚀 Features
- 85e6812 introduce a Ruin And Recreate move (#1010), closes #1010
- ff6ae02 Add missing
of
methods to scores in Python (#1055), closes #1055 - 6c7416c Add chained variable support to Python
- df74d42 improve JVM exceptions (#1037), closes #1037
🐛 Fixes
- f09a244 Prevent excessive logging of constraint weights
- 037450f Allow relative imports in translated functions (#1081), closes #967 #1081
- 5f44f32 Show Python traceback when constructing constraints fail (#1082), closes #969 #1082
- 7149abe Initialize nested selectors correctly
- 96c3da0 Allow @PlanningId to be defined on interfaces (#1060), closes #1060
- 274dadd Use inserted range when retracting range in
toConnectedRanges
(#1056), closes #953 #1056
📝 Documentation
- 3b01463 Fix InverseRelationShadowVariable code snippet (#1066), closes #1066
- 716e45e Add Python examples (#1047), closes #1047
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Frederico Gonçalves (@zepfred)
- Geoffrey De Smet
- Lukáš Petrovický
- Rutger Lubbers
- Tobias Wasner (@wasnertobias)
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.14.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.14.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.