Releases: TimefoldAI/timefold-solver
Timefold Solver Community Edition 1.7.0
In this release of Timefold Solver, we focused mostly on bugfixes, improvements to documentation and to the quickstarts.
The release also brings the usual assortment of small tweaks and dependency upgrades.
Featured update: We've made it possible to inject more than one SolverManager
in your Quarkus and Spring Boot applications, a feature often requested by the community.
Changelog
🚀 Features
🐛 Fixes
- 964adbd Recommended Fit API needs to ignore any unassigned entities/values (#618), closes #581 #618
- 5c3bcdf Nearby selection pinning support (#614), closes #614
- a9d7c62 Pass all subclasses of Throwable to the exception handler in SolverManager
- 693e321 Ensuring the spent termination property is read in the Quarkus environment (#600), closes #600
- d9122e6 Avoid eager initialization of the Benchmark resources
📝 Documentation
- dc71df8 Adding VRP quickstart documentation (#623), closes #623
- 8c4e1ee Clearly mention that the timegrain pattern doesn't scale (#611), closes #611
- 042be52 Add MoveIteratorFactory example to the docs (#606), closes #606
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.7.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.7.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 Community Edition 1.6.0
New year, new release, new goodness!
Featured Update - Pinning on list variables, enhancing our support for real-time planning:
- 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. 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
orSolverManager
, look for theSolverConfigOverride
class. - The usual assortment of bugfixes and performance improvements.
- Improvements all over the documentation and 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)
- Geoffrey De Smet
- GitHub
- Lukáš Petrovický (@triceo)
- M.Thimm
- Peter Laggner
- Pieter De Schepper
- Radovan Synek
- dependabot[bot] (@dependabot[bot])
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.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.
Timefold Solver Community Edition 1.5.0
For our final release of 2023, we’ve prepared some exciting things!
Featured Update - Recommended Fit API, a game-changer for appointment scheduling.
- Use case: Imagine you are an operator on a phone line, or an AI chatbot. A customer asks you for an appointment with a sales representative. Where do you put that appointment in their busy calendar?
- Timefold Solver now provides superfast sub-second response times, while still taking all your constraints into account!
- Result: Operators can receive a list of appointment choices, ranked from best fit to worst, for informed decision-making. Ensuring they can make an informed choice that has the least potential to disrupt the schedule as a whole.
Other Enhancements:
- Constraint Streams now simplify solving constraints with sequences of indefinite length.
- Debugging score corruptions is now easier.
- Various other improvements and bug fixes to enhance overall user experience.
Changelog
🚀 Features
- ab44aa6 Introduce the Recommended Fit API, closes #432
- dccbda3 Promote consecutive sequence collector to public API, closes #426
- 4415f4d Add constraint weight to ScoreAnalysis, closes #416
- 86d58e6 Report missing before/after calls on undo corruption, closes #433
- 926bb11 Report shadow variables that differ after recalculating from scratch when undo corruption occurs, closes #430
- 176188b Identify Solver version and edition in Benchmarker, Spring and Quarkus, closes #411
🐛 Fixes
- d8cf97c Shadow entities should be annotated with @PlanningEntityCollectionProperty, closes #445
- ae617f4 Example app logo transparency
- 6f0603f Support repeatable annotations like ShadowVariable in Quarkus
🧰 Tasks
📝 Documentation
- 6de79ff Move development section from user guide to Github CONTRIBUTING
- 663f22d Restructure chapters on using and configuring solver
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Geoffrey De Smet
- Lukáš Petrovický (@triceo)
- Pieter De Schepper
- Radovan Synek
- dependabot[bot] (@dependabot[bot])
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, just add the ai.timefold.solver : timefold-solver-core : 1.5.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.5.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. They exclude 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 0.8.42
End of life
Timefold Solver 0.8.42 is the final release in the 0.8.x line. As both Quarkus 2.x and Spring Boot 2.x reached their public end of life, Timefold can no longer guarantee timely resolution to any current and future security vulnerabilities. We ask users to upgrade to Timefold Solver 1.x, which is actively maintained and will continue so for many years to come.
OptaPlanner 8.x compatibility
At the time of Timefold Solver 0.8.42 release (December 4, 2023), the latest available release of OptaPlanner 8.x was 8.44.0.Final, released three months ago (September 6, 2023). Timefold Solver 0.8.42 is functionally identical with OptaPlanner 8.44.0.Final, but it brings additional bugfixes, performance improvements and dependency upgrades to fix security vulnerabilities.
Changelog
5d6bd81 fix: example app logo transparency
da64374 fix: Support repeatable annotations like ShadowVariable in Quarkus
706df9f fix: Make empty app check also test for planning entities in spring
b1cb26d fix: Do not fail-fast in spring boot extension if there no @PlanningSolution or @PlanningEntity classes
5abd3d4 fix: depend on spring-boot-starter in the starter module
0179616 fix: Deep clone unknown classes in GIZMO solution cloner
647fc2e deps: bump version.ch.qos.logback to 1.2.13
240e826 deps: bump version.org.apache.poi to 5.2.5
6b493cf deps: bump version.org.springframework.boot to 2.7.18
51a587a deps: bump version.io.quarkus to 2.16.12.Final
Timefold Solver Community Edition 1.4.0
It's time for another monthly release of Timefold Solver Community Edition!
Featured Update - JSON-friendly score explanations:
- Even wondered what does a score of
-3hard/-5soft
actually mean? Wonder no more! - Timefold Solver can now break down the score all the way to individual constraint matches.
- It can also compute differences between any two solutions.
- And finally, it can easily send them over the wire from the backend to the frontend.
Furthermore you can now generate a Spring Boot app and include the Timefold Solver dependency without it failing if there's no @PlanningSolution
or @PlanningEntity
classes.
On top of that, we have the usual assortment of performance improvements, bug fixes and dependency upgrades.
Changelog
🚀 Features
🐛 Fixes
- 479843b Do not fail-fast in spring boot extension if there no @PlanningSolution or @PlanningEntity classes (#397), closes #388 #397
- 4b04bb5 depend on spring-boot-starter in the starter module
- 07954c6 invalidate computed variables in Project Job Scheduling correctly (#371), closes #371
- e54309d Enable constraint matching when metrics dictate
🔄️ Changes
- bedeb54 replace stream with a loop on the hot path
- 4e63393 Implement node sharing for groupBy (#401), closes #401
- 7ecaebf Implement node sharing for expand, map and flattenLast (#376), closes #376
- 823dde1 Implement node sharing for ifExists and ifNotExists (#375), closes #375
- 45f0346 Use lambda constants in CS to allow for more node sharing (#374), closes #374
🧰 Tasks
- 1dd4dcd Move implementations of Collectors outside of ConstraintCollectors (#392), closes #392
- 29247f9 rationalize Spring dependencies
- 2855c34 don't use Javadoc tags in Spring Boot properties, closes #387
- 21ee1b3 remove trailing newlines from exception messages
📝 Documentation
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Jente De Meyer (@Jdmbs)
- Lukáš Petrovický (@triceo)
- Radovan Synek
- dependabot[bot] (@dependabot[bot])
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, just add the ai.timefold.solver : timefold-solver-core : 1.4.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.4.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. They exclude 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 Community Edition 1.3.0
Another release, another better version of Timefold Solver Community Edition!
Featured Update - Constraint Stream Concatenation:
- Merge away! Combine multiple streams seamlessly.
- Implement intricate constraints with ease.
Besides the usual bug fixes and dependency upgrades, we also have a smoother experience with improved support for Java’s record
types.
Changelog
🚀 Features
- da28a81 Add concat operation to constraint streams
- 2c56079 improve support for Java records (#308), closes #308
🐛 Fixes
- 471a959 Deep clone unknown classes in GIZMO solution cloner (#341), closes #341
- e4d990c Always propagate map's update even if mapped value does not change
- 5d78bfd exhaustive search must not skip non-doable moves
🔄️ Changes
🧰 Tasks
- 8d5864d Migrate to new Quarkus Dev UI
- eca54d2 fail fast on combination of basic variables & list variables on a single entity (#338), closes #338
📝 Documentation
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Geoffrey De Smet
- Jente De Meyer (@Jdmbs)
- Lukáš Petrovický (@triceo)
- Matej Čimbora
- Radovan Synek
- Wouter (@wouterds)
- dependabot[bot] (@dependabot[bot])
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,
just add the ai.timefold.solver : timefold-solver-core : 1.3.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.3.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.
They exclude 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 0.8.41
We've backported many bugfixes from Timefold Solver 1.x and also bumped several of our dependencies to address CVEs.
Changelog
d2e18b3 fix: Make KOptListMove work in multithreaded environments
e4dd07f fix: Make KOptListMoveSelector work when moveThreadCount != NONE
8cd02bf fix: make SolutionManager.update() work on list variable as well
a23e26b fix: avoid fail-fast to make SolutionManager.update() work on chained variable
49c8d14 fix: dispose of step cache at phase end if necessary
76dccc3 fix: don't attempt to count entities which do not match the descriptor
510a62b fix: make Quarkus and Spring not fail without global solver termination
5c9a211 fix: use the correct parent ClassLoader on Quarkus
06dc8c7 deps: bump version.org.apache.poi from 5.2.3 to 5.2.4
c5e241e deps: bump Drools to 8.44.0.Final
13878cb deps: bump version.org.springframework from 5.3.29 to 5.3.30
82c2e1d deps: bump version.ch.qos.logback from 1.2.9 to 1.2.12
c1166a9 deps: bump org.asciidoctor:asciidoctorj-pdf from 2.3.6 to 2.3.9
be2a7de deps: bump org.asciidoctor:asciidoctor-maven-plugin from 2.2.3 to 2.2.4
20bce05 deps: bump version.jacoco.plugin from 0.8.9 to 0.8.10
54ce8d1 deps: bump version.io.quarkus from 2.16.9.Final to 2.16.11.Final
48b77f3 deps: bump version.org.springframework.boot from 2.7.14 to 2.7.16
7e17461 fix: don't check CS with ANC in native
238ec80 fix: propagate retracts before updates in order to have clean indexes
06a3071 deps: bump Quarkus, Spring and Drools
6c75845 ci: fix release to Nexus authentication fail
Timefold Solver Community Edition 1.2.0
Timefold Solver Community Edition 1.2.0, is here, with a focus on enhancing your experience. In this update, we’ve resolved long-standing bugs to ensure a smoother Timefold journey.
Upgrade now to enjoy a more seamless planning optimization experience!
Changelog
🐛 Fixes
- 3089d72 avoid metaspace leak by no longer using the LambdaMetaFactory (#257), closes #257
- 727eb41 Make KOptListMove work in multithreaded environments
- f32715e Make KOptListMoveSelector work when moveThreadCount != NONE
- 839f9fd make SolutionManager.update() work on list variable as well
- bef5181 avoid fail-fast to make SolutionManager.update() work on chained variable
- 108ebea address some bugs suggested by Sonar
🔄️ Changes
- d832cd0 Changes code to use Java 17's
instanceof
pattern matching
🧰 Tasks
- fc4bec5 better exception when auto-discovery enabled under Quarkus
📝 Documentation
- 21942f8 refactor content for a cleaner ToC
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli
- Lukáš Petrovický (@triceo)
- Maciej Swiderski (@mswiderski)
- Matej Čimbora (@mcimbora)
- Moderne (@openrewrite)
- Radovan Synek
- Tim te Beek (@timtebeek)
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, just add the ai.timefold.solver : timefold-solver-core : 1.2.0
dependency to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.2.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 and manually tweaked.
They exclude 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 Community Edition 1.1.0
We are proud to announce the general availability of Timefold Solver Community Edition 1.1.0!
The highlights of this release include:
- Significant improvements to constraint matching performance.
- Several important bugfixes.
- Documentation improvements and other minor tweaks.
To ensure Constraint Streams process data correctly in all cases, we unfortunately had to sacrifice some solver performance. (See bug #186.)
Some use cases may see score calculation speeds drop by 5 % on average.
Changelog
🐛 Fixes
- 0b47ed1 propagate retracts before updates in order to have clean indexes (#193), closes #193
- 0bc4ec1 bail out of a never-ending loop when no move is doable
- b1761d4 dispose of step cache at phase end if necessary
🔄️ Changes
- 292dc67 read value range size instead of the value range (#205), closes #205
- 4586d66 significantly speed up constraint matching performance (#171), closes #171
📝 Documentation
- 787df84 fix tiny consistency issue regarding method names
- adf714c link the quickstarts repo early after frontpage link (#86), closes #86
- 8a7c815 change example from 'extends AbstractCustomPhaseCommand' to 'implements CustomPhaseCommand'
Contributors
We'd like to thank the following people for their contributions:
- Andreas Lundblad (@aioobe)
- Geoffrey De Smet
- Lukáš Petrovický (@triceo)
- Radovan Synek
- hdotslines (@hdotslines)
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, just add the ai.timefold.solver : timefold-solver-core : 1.1.0
dependency in your pom.xml
to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.1.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.
They exclude 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 Community Edition 1.0.0
Changelog
🚀 Features
- 5d15619 Constraint Streams expand() support (#58), closes #58
- 954fc04 migrate Logback to Timefold too (#57), closes #19 #57
- cbcf0fe modernize the Benchmark report (#28), closes #28
🐛 Fixes
- 0285273 don't attempt to count entities which do not match the descriptor
- 11e8c27 make Quarkus and Spring not fail without global solver termination
- f4b163d use the correct parent ClassLoader on Quarkus
- 732473d quarkus: Workaround quarkus-run.jar fails fast due to gizmo missing
- 310cf3f allow min/max constraint collectors on planning variables (#99), closes #99
- 45d3931 address various issues identified during benchmarking (#90), closes #90
🔄️ Changes
- 607b21a speed up CS consecutive collector (#85), closes #85
- 5ddbcf1 make CS flattenLast() perform better on collections (#68), closes #68
- f23cedd Multi-threaded solving and nearby selection become services (#53), closes #53
🧰 Tasks
- 08909ab release version 1.0.0
- 00ac56a better exception when list variable is null (#140), closes #107 #140
- 292d44c remove the docs single-html and distribution
- eb205e7 remove the aggregated javadocs
- 13a4609 remove the distribution zip, closes #2
- ef03c9a add "Speaker makespan" constraint to Conference Scheduling (#102), closes #102
- dc7eafe move commercial features to Enterprise Edition (#108), closes #108
- 243e0f8 merge CS modules into a single constraint-streams module (#62), closes #62
- a1318e6 introduce issue templates (#31), closes #31
📝 Documentation
- 28684b7 introduce Enterprise Edition
- 18c7e98 describe "Speaker makespan" constraint
- 03caaf8 update the quarkus school-timetabling quickstart, closes #98
Contributors
We'd like to thank the following people for their contributions:
- Geoffrey De Smet
- Lukáš Petrovický (@triceo)
- Radovan Synek
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,
just add the ai.timefold.solver : timefold-solver-core : 1.0.0
dependency to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.0.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.
They exclude 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.