Skip to content

Releases: TimefoldAI/timefold-solver

Timefold Solver 1.24.0

08 Jul 11:29
Compare
Choose a tag to compare

Summertime is here, but we're certainly not taking a break. Today's release brings another dose of features and improvements to your favorite solver!

Featured update: Combine Basic and List variables

In your models, it is now possible to use both a @PlanningVariable and @PlanningListVariable at the same time! This is a big step forward for the solver, and one less reason to still use chained variables.

Progress on Declarative Shadow Variables

Two releases ago, we introduced Declarative Shadow Variables as a preview feature. In this release, we are bringing significant performance improvements, making it run as fast or even faster than the equivalent implementations using variable listeners. We are working hard to finalize this feature, but there is still more to come before we do that - stay tuned!

Changelog

🚀 Features

🐛 Fixes

  • 1356100 Fail fast if @ShadowVariableLooped is reference from a @ShadowSources
  • d052cd9 Fail-fast on @PlanningEntity being used in a @ProblemFactCollectionProperty (#1646)
  • 4b57022 Improve error message when a declarative supplier is missing in Quarkus (#1687)
  • 2c9bb0a Process each entity only once and in topological order (#1662)
  • d253438 DSV graph should notify updater when cycles are formed or broken

🔄️ Changes

  • 6c3c668 Use a single node to represent multiple shadow variables in graphs (#1673)
  • 81374a6 Optimize DSV when used in simpler use cases (#1659)
  • b2e3eed Faster cloning (#1650)
  • fe93472 Revert "fix: clone the solution before sending it to the consumer"

🧰 Tasks

  • d2b2406 Prevent NPE in solution annotation processing
  • 204786b Quarkus extension gets a non-transparent icon

We'd like to thank the following people for their contributions:

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.24.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.24.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.23.0

10 Jun 12:11
Compare
Choose a tag to compare

This release is packed full of bugfixes and assorted small improvements. We've been hard at work improving the recently introduced Declarative Shadow Variables - it now uses significantly less memory, runs faster and is overall much more stable. It is now significantly easier to test these shadow variables as well! They remain a preview feature, but we're making good progress towards full support and your feedback helps us get there sooner, so keep it coming!

Changelog

🚀 Features

  • f7f251d Testing support for Declarative Shadow Variables (#1571)

🐛 Fixes

  • a3f7862 Benchmarker best score graph no longer empty (#1636)
  • a906e68 Update looped status of entity even if no variables changed
  • 8fe2f9d Generate member accessors for referenced collection element members in Quarkus (#1603)
  • 1dde0ab Clone the solution before sending it to the consumer
  • 20b973e Avoid more situations where a K-OPT cannot be found
  • 75afd70 Enforce phase and solver terminations
  • 903d028 Added missing getter and setter for the problemFile in the FileProblemProvider
  • a5048f4 Support MoveCountPerTypeProblemStatistic in JAXB mapping
  • 2456d9d AbstractTimeLineChartProblemStatistic to not throw NPE when unmarshalled by JAXB (#1551)
  • 0da791c Filtering move selector honors the phase termination (#1608)
  • 3e8eeef Support accessing non-declarative shadow variables from a fact (#1621)
  • 56c9783 Allow using declarative shadow variables on extended entities
  • a1567ff Allow ShadowVariableLooped field and supplier method to be private (#1572)

🔄️ Changes

🧰 Tasks

  • 7ff611d Enforce consistency between variable getters and setters
  • f1f1d07 Fail fast if variable path ends on a fact
  • f2ef168 Support pinning in Move Streams (#1560)

📝 Documentation

  • 8fa8b30 Fix an include in Quarkus VRP guide
  • 1938565 Improve documentation on configuration of preview features

Contributors

We'd like to thank the following people for their contributions:

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.23.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.23.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.22.1

09 May 12:09
Compare
Choose a tag to compare

A one-off release to address two small bugs. Nothing else to see here.

Changelog

🧰 Tasks

Contributors

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.1 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.22.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.22.0

28 Apr 11:38
Compare
Choose a tag to compare

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

📝 Documentation

  • 404455f Better explain the requirements for @PlanningId properties (#1529)

Contributors

We'd like to thank the following people for their contributions:

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

08 Apr 11:14
Compare
Choose a tag to compare

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:

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

14 Mar 14:41
Compare
Choose a tag to compare

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

  • 013aefd improve Diminished Returns termination doc (#1448)

Contributors

We'd like to thank the following people for their contributions:

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

11 Mar 12:23
Compare
Choose a tag to compare

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

  • 07bfce3 Allow phase-level terminations on solver level (#1431)

🐛 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:

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

11 Feb 11:47
Compare
Choose a tag to compare

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

📝 Documentation

  • bc77f8e Add diagrams for consecutive and connected collectors

Contributors

We'd like to thank the following people for their contributions:

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

15 Jan 16:49
Compare
Choose a tag to compare

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

🐛 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:

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

10 Dec 14:20
e474d86
Compare
Choose a tag to compare

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

📝 Documentation

Contributors

We'd like to thank the following people for their contributions:

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.