Changelog
Generated from CHANGELOG.md in the project repository. Never maintained twice.
0.3.2
14 September 2026
- added
MinimumDistanceconstraint andModelBuilder::add_minimum_distance: two variables must be at least a given distance apart. Propagation prunes the other side once one side is fixed. - added
MaximumBucketLoadconstraint andModelBuilder::add_maximum_bucket_load: caps the summeddemand × occupied timeof a group ofBucketedTasks inside every bucket, described by half-openBucketRanges (for example one per day). Optional tasks count only while their presence variable is1. - added
BucketBlockPatternconstraint andModelBuilder::add_bucket_block_pattern: the consecutive blocks a group of tasks occupies across all buckets must form one of the allowed block-length multisets, such as[2, 1, 1]. - added
BucketRange,BucketedTask,MaximumBucketLoadandMinimumDistanceare re-exported at the crate root.
0.3.1
4 September 2026
- fixed
LnsSolverno longer returns an assignment of domain minimums, which could violate constraints, when it has nothing to destroy or ends without a feasible solution; it falls back to the repair solver instead. - fixed
HardSoftScore's ordering also compares the summedsoftscore last, so it agrees with equality.
0.3.0
4 September 2026
- addedLexicographic soft-score levels:
HardSoftScorehasstrong,mediumandweaknext to the summedsoft,HardSoftScore::tieredbuilds such a score, andScoreLevelnames the levels. - added
Objective::categoryandObjective::level(defaults: the objective's name andScoreLevel::Weak),CategorizedObjectiveto set both for any objective, andModelBuilder::add_scored_objective. - added
PeriodicValuesconstraint andModelBuilder::add_periodic_calendar: allowed offsets in a repeating period plus absolute unavailable ranges, stored independently of the horizon. - added
LnsSolver::solve_from: repair from a caller-provided baseline assignment, even one that changed constraints have made infeasible. - changed
ScoreCalculatortotals each soft level separately. - changed
LnsSolveronly keeps feasible solutions as its best solution and shared incumbent. - breaking
HardSoftScorehas new public fields, so struct literals no longer compile; useHardSoftScore::neworHardSoftScore::tiered. - breaking
HardSoftScoreprints every level, for exampleFeasible(strong=0, medium=0, weak=-11)instead ofFeasible(-11). - breaking
ModelBuilder::add_constraintreturns the newConstraintId.
0.2.0
4 September 2026
- added
ValidatedGraph::check_incremental: evaluates only the constraints touched by changed variables, without starting a search, and returnsConstraintViolations. - addedStructured constraint explanations (
Constraint::explain,Explanation), with specialized messages forNoOverlap,CumulativeandPrecedence. - changedRequires
pathwise0.2.0 instead of 0.1.0. - breaking
ModelBuilder::compile_scheduling_modelreturns theResourceIdtoConstraintIdmapping it built (Result<HashMap<ResourceId, ConstraintId>, _>instead ofResult<(), _>), so a violation can be attributed to its resource.
0.1.1
1 September 2026
- addedCriterion benchmarks for the solvers.
- fixedStale references in the README.
0.1.0
1 September 2026
- addedFirst release: constraint graph with validation, built-in and global constraints, hard/soft scoring, five solvers (Backtracking, Branch & Bound, Local Search, LNS, parallel portfolio) and scheduling primitives.