dabke 0.82.0 → 0.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +22 -24
- package/dist/client.d.ts +39 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/client.schemas.d.ts +118 -18
- package/dist/client.schemas.d.ts.map +1 -1
- package/dist/client.schemas.js +110 -6
- package/dist/client.schemas.js.map +1 -1
- package/dist/client.types.d.ts +63 -7
- package/dist/client.types.d.ts.map +1 -1
- package/dist/client.types.js.map +1 -1
- package/dist/cpsat/cost.d.ts +5 -2
- package/dist/cpsat/cost.d.ts.map +1 -1
- package/dist/cpsat/cost.js +13 -6
- package/dist/cpsat/cost.js.map +1 -1
- package/dist/cpsat/model-builder.d.ts +42 -61
- package/dist/cpsat/model-builder.d.ts.map +1 -1
- package/dist/cpsat/model-builder.js +451 -56
- package/dist/cpsat/model-builder.js.map +1 -1
- package/dist/cpsat/response.d.ts +19 -7
- package/dist/cpsat/response.d.ts.map +1 -1
- package/dist/cpsat/response.js +48 -9
- package/dist/cpsat/response.js.map +1 -1
- package/dist/cpsat/rule-descriptor.d.ts +250 -0
- package/dist/cpsat/rule-descriptor.d.ts.map +1 -0
- package/dist/cpsat/rule-descriptor.js +51 -0
- package/dist/cpsat/rule-descriptor.js.map +1 -0
- package/dist/cpsat/rules/artifacts.d.ts +9 -0
- package/dist/cpsat/rules/artifacts.d.ts.map +1 -0
- package/dist/cpsat/rules/artifacts.js +31 -0
- package/dist/cpsat/rules/artifacts.js.map +1 -0
- package/dist/cpsat/rules/assign-together.d.ts +18 -20
- package/dist/cpsat/rules/assign-together.d.ts.map +1 -1
- package/dist/cpsat/rules/assign-together.js +90 -54
- package/dist/cpsat/rules/assign-together.js.map +1 -1
- package/dist/cpsat/rules/assigned-day.d.ts +12 -0
- package/dist/cpsat/rules/assigned-day.d.ts.map +1 -0
- package/dist/cpsat/rules/assigned-day.js +43 -0
- package/dist/cpsat/rules/assigned-day.js.map +1 -0
- package/dist/cpsat/rules/assignment-priority.d.ts +15 -29
- package/dist/cpsat/rules/assignment-priority.d.ts.map +1 -1
- package/dist/cpsat/rules/assignment-priority.js +47 -50
- package/dist/cpsat/rules/assignment-priority.js.map +1 -1
- package/dist/cpsat/rules/assignment-terms.d.ts +6 -0
- package/dist/cpsat/rules/assignment-terms.d.ts.map +1 -0
- package/dist/cpsat/rules/assignment-terms.js +19 -0
- package/dist/cpsat/rules/assignment-terms.js.map +1 -0
- package/dist/cpsat/rules/concurrent-intervals.d.ts +19 -0
- package/dist/cpsat/rules/concurrent-intervals.d.ts.map +1 -0
- package/dist/cpsat/rules/concurrent-intervals.js +57 -0
- package/dist/cpsat/rules/concurrent-intervals.js.map +1 -0
- package/dist/cpsat/rules/cost-utils.d.ts +1 -3
- package/dist/cpsat/rules/cost-utils.d.ts.map +1 -1
- package/dist/cpsat/rules/cost-utils.js +0 -7
- package/dist/cpsat/rules/cost-utils.js.map +1 -1
- package/dist/cpsat/rules/day-cost-multiplier.d.ts +10 -10
- package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-multiplier.js +88 -77
- package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.d.ts +10 -10
- package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.js +76 -65
- package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/index.d.ts +30 -21
- package/dist/cpsat/rules/index.d.ts.map +1 -1
- package/dist/cpsat/rules/index.js +30 -21
- package/dist/cpsat/rules/index.js.map +1 -1
- package/dist/cpsat/rules/location-preference.d.ts +14 -21
- package/dist/cpsat/rules/location-preference.d.ts.map +1 -1
- package/dist/cpsat/rules/location-preference.js +45 -45
- package/dist/cpsat/rules/location-preference.js.map +1 -1
- package/dist/cpsat/rules/max-concurrent-assignments.d.ts +46 -0
- package/dist/cpsat/rules/max-concurrent-assignments.d.ts.map +1 -0
- package/dist/cpsat/rules/max-concurrent-assignments.js +121 -0
- package/dist/cpsat/rules/max-concurrent-assignments.js.map +1 -0
- package/dist/cpsat/rules/max-consecutive-days.d.ts +18 -17
- package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/max-consecutive-days.js +67 -66
- package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/max-days-of-week-per-period.d.ts +45 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.d.ts.map +1 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.js +95 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.js.map +1 -0
- package/dist/cpsat/rules/max-days-week.d.ts +30 -0
- package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/max-days-week.js +83 -0
- package/dist/cpsat/rules/max-days-week.js.map +1 -0
- package/dist/cpsat/rules/max-hours-day.d.ts +14 -31
- package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-day.js +56 -72
- package/dist/cpsat/rules/max-hours-day.js.map +1 -1
- package/dist/cpsat/rules/max-hours-week.d.ts +15 -31
- package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-week.js +60 -75
- package/dist/cpsat/rules/max-hours-week.js.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.d.ts +17 -33
- package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.js +57 -73
- package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.d.ts +18 -18
- package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.js +123 -94
- package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/min-days-of-week-per-period.d.ts +35 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.d.ts.map +1 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.js +108 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.js.map +1 -0
- package/dist/cpsat/rules/min-days-week.d.ts +21 -0
- package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/min-days-week.js +95 -0
- package/dist/cpsat/rules/min-days-week.js.map +1 -0
- package/dist/cpsat/rules/min-hours-day.d.ts +14 -17
- package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-day.js +72 -54
- package/dist/cpsat/rules/min-hours-day.js.map +1 -1
- package/dist/cpsat/rules/min-hours-week.d.ts +15 -18
- package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-week.js +75 -57
- package/dist/cpsat/rules/min-hours-week.js.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts +14 -17
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.js +148 -138
- package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
- package/dist/cpsat/rules/minimize-cost.d.ts +2 -18
- package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
- package/dist/cpsat/rules/minimize-cost.js +151 -163
- package/dist/cpsat/rules/minimize-cost.js.map +1 -1
- package/dist/cpsat/rules/must-assign.d.ts +12 -0
- package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
- package/dist/cpsat/rules/must-assign.js +54 -0
- package/dist/cpsat/rules/must-assign.js.map +1 -0
- package/dist/cpsat/rules/overtime-daily-multiplier.d.ts +6 -10
- package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-multiplier.js +118 -112
- package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.d.ts +6 -11
- package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.js +104 -99
- package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +9 -21
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.js +181 -199
- package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts +13 -12
- package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.js +143 -143
- package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts +7 -11
- package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.js +124 -119
- package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
- package/dist/cpsat/rules/pattern-eligibility.d.ts +6 -0
- package/dist/cpsat/rules/pattern-eligibility.d.ts.map +1 -0
- package/dist/cpsat/rules/pattern-eligibility.js +16 -0
- package/dist/cpsat/rules/pattern-eligibility.js.map +1 -0
- package/dist/cpsat/rules/pattern-time.d.ts +5 -0
- package/dist/cpsat/rules/pattern-time.d.ts.map +1 -0
- package/dist/cpsat/rules/pattern-time.js +20 -0
- package/dist/cpsat/rules/pattern-time.js.map +1 -0
- package/dist/cpsat/rules/registry.d.ts +217 -27
- package/dist/cpsat/rules/registry.d.ts.map +1 -1
- package/dist/cpsat/rules/registry.js +98 -31
- package/dist/cpsat/rules/registry.js.map +1 -1
- package/dist/cpsat/rules/resolver.d.ts +9 -7
- package/dist/cpsat/rules/resolver.d.ts.map +1 -1
- package/dist/cpsat/rules/resolver.js +19 -18
- package/dist/cpsat/rules/resolver.js.map +1 -1
- package/dist/cpsat/rules/role-preference.d.ts +24 -0
- package/dist/cpsat/rules/role-preference.d.ts.map +1 -0
- package/dist/cpsat/rules/role-preference.js +72 -0
- package/dist/cpsat/rules/role-preference.js.map +1 -0
- package/dist/cpsat/rules/rules.types.d.ts +93 -17
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.d.ts +25 -12
- package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.js +14 -19
- package/dist/cpsat/rules/scope.types.js.map +1 -1
- package/dist/cpsat/rules/target-days-week.d.ts +31 -0
- package/dist/cpsat/rules/target-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/target-days-week.js +80 -0
- package/dist/cpsat/rules/target-days-week.js.map +1 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts +33 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts.map +1 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.js +146 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.js.map +1 -0
- package/dist/cpsat/rules/time-cost-surcharge.d.ts +15 -14
- package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/time-cost-surcharge.js +82 -96
- package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/time-off.d.ts +21 -57
- package/dist/cpsat/rules/time-off.d.ts.map +1 -1
- package/dist/cpsat/rules/time-off.js +114 -127
- package/dist/cpsat/rules/time-off.js.map +1 -1
- package/dist/cpsat/rules/variables.d.ts +4 -0
- package/dist/cpsat/rules/variables.d.ts.map +1 -0
- package/dist/cpsat/rules/variables.js +10 -0
- package/dist/cpsat/rules/variables.js.map +1 -0
- package/dist/cpsat/rules.d.ts +20 -3
- package/dist/cpsat/rules.d.ts.map +1 -1
- package/dist/cpsat/rules.js +19 -2
- package/dist/cpsat/rules.js.map +1 -1
- package/dist/cpsat/semantic-time.d.ts +7 -6
- package/dist/cpsat/semantic-time.d.ts.map +1 -1
- package/dist/cpsat/semantic-time.js +15 -28
- package/dist/cpsat/semantic-time.js.map +1 -1
- package/dist/cpsat/types.d.ts +47 -4
- package/dist/cpsat/types.d.ts.map +1 -1
- package/dist/cpsat/types.js +24 -1
- package/dist/cpsat/types.js.map +1 -1
- package/dist/cpsat/utils.d.ts +23 -6
- package/dist/cpsat/utils.d.ts.map +1 -1
- package/dist/cpsat/utils.js +76 -15
- package/dist/cpsat/utils.js.map +1 -1
- package/dist/cpsat/validation-reporter.d.ts +6 -2
- package/dist/cpsat/validation-reporter.d.ts.map +1 -1
- package/dist/cpsat/validation-reporter.js +122 -10
- package/dist/cpsat/validation-reporter.js.map +1 -1
- package/dist/cpsat/validation.types.d.ts +21 -10
- package/dist/cpsat/validation.types.d.ts.map +1 -1
- package/dist/datetime.utils.d.ts +7 -13
- package/dist/datetime.utils.d.ts.map +1 -1
- package/dist/datetime.utils.js +29 -36
- package/dist/datetime.utils.js.map +1 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/schedule/cost.d.ts +192 -0
- package/dist/schedule/cost.d.ts.map +1 -0
- package/dist/schedule/cost.js +151 -0
- package/dist/schedule/cost.js.map +1 -0
- package/dist/schedule/coverage.d.ts +114 -0
- package/dist/schedule/coverage.d.ts.map +1 -0
- package/dist/schedule/coverage.js +56 -0
- package/dist/schedule/coverage.js.map +1 -0
- package/dist/schedule/definition.d.ts +346 -0
- package/dist/schedule/definition.d.ts.map +1 -0
- package/dist/schedule/definition.js +668 -0
- package/dist/schedule/definition.js.map +1 -0
- package/dist/schedule/index.d.ts +67 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +69 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/rules.d.ts +678 -0
- package/dist/schedule/rules.d.ts.map +1 -0
- package/dist/schedule/rules.js +554 -0
- package/dist/schedule/rules.js.map +1 -0
- package/dist/schedule/shift-patterns.d.ts +17 -0
- package/dist/schedule/shift-patterns.d.ts.map +1 -0
- package/dist/schedule/shift-patterns.js +24 -0
- package/dist/schedule/shift-patterns.js.map +1 -0
- package/dist/schedule/time-periods.d.ts +79 -0
- package/dist/schedule/time-periods.d.ts.map +1 -0
- package/dist/schedule/time-periods.js +101 -0
- package/dist/schedule/time-periods.js.map +1 -0
- package/dist/types.d.ts +67 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +64 -0
- package/dist/types.js.map +1 -1
- package/package.json +8 -14
- package/solver/src/solver/models.py +41 -4
- package/solver/src/solver/solver.py +546 -157
- package/solver/tests/test_solver.py +363 -7
- package/src/client.schemas.ts +127 -10
- package/src/client.ts +3 -0
- package/src/client.types.ts +73 -7
- package/src/cpsat/cost.ts +17 -7
- package/src/cpsat/model-builder.ts +614 -129
- package/src/cpsat/response.ts +57 -13
- package/src/cpsat/rule-descriptor.ts +311 -0
- package/src/cpsat/rules/artifacts.ts +56 -0
- package/src/cpsat/rules/assign-together.ts +104 -69
- package/src/cpsat/rules/assigned-day.ts +70 -0
- package/src/cpsat/rules/assignment-priority.ts +54 -58
- package/src/cpsat/rules/assignment-terms.ts +43 -0
- package/src/cpsat/rules/concurrent-intervals.ts +93 -0
- package/src/cpsat/rules/cost-utils.ts +1 -9
- package/src/cpsat/rules/day-cost-multiplier.ts +101 -81
- package/src/cpsat/rules/day-cost-surcharge.ts +91 -70
- package/src/cpsat/rules/index.ts +30 -21
- package/src/cpsat/rules/location-preference.ts +47 -52
- package/src/cpsat/rules/max-concurrent-assignments.ts +170 -0
- package/src/cpsat/rules/max-consecutive-days.ts +74 -91
- package/src/cpsat/rules/max-days-of-week-per-period.ts +127 -0
- package/src/cpsat/rules/max-days-week.ts +117 -0
- package/src/cpsat/rules/max-hours-day.ts +64 -84
- package/src/cpsat/rules/max-hours-week.ts +74 -90
- package/src/cpsat/rules/max-shifts-day.ts +65 -85
- package/src/cpsat/rules/min-consecutive-days.ts +161 -127
- package/src/cpsat/rules/min-days-of-week-per-period.ts +144 -0
- package/src/cpsat/rules/min-days-week.ts +122 -0
- package/src/cpsat/rules/min-hours-day.ts +79 -58
- package/src/cpsat/rules/min-hours-week.ts +87 -62
- package/src/cpsat/rules/min-rest-between-shifts.ts +191 -178
- package/src/cpsat/rules/minimize-cost.ts +175 -188
- package/src/cpsat/rules/must-assign.ts +71 -0
- package/src/cpsat/rules/overtime-daily-multiplier.ts +158 -140
- package/src/cpsat/rules/overtime-daily-surcharge.ts +141 -126
- package/src/cpsat/rules/overtime-tiered-multiplier.ts +234 -253
- package/src/cpsat/rules/overtime-weekly-multiplier.ts +183 -175
- package/src/cpsat/rules/overtime-weekly-surcharge.ts +161 -150
- package/src/cpsat/rules/pattern-eligibility.ts +26 -0
- package/src/cpsat/rules/pattern-time.ts +30 -0
- package/src/cpsat/rules/registry.ts +140 -56
- package/src/cpsat/rules/resolver.ts +58 -30
- package/src/cpsat/rules/role-preference.ts +92 -0
- package/src/cpsat/rules/rules.types.ts +92 -17
- package/src/cpsat/rules/scope.types.ts +32 -27
- package/src/cpsat/rules/target-days-week.ts +105 -0
- package/src/cpsat/rules/target-peak-concurrent-assignments.ts +212 -0
- package/src/cpsat/rules/time-cost-surcharge.ts +116 -122
- package/src/cpsat/rules/time-off.ts +154 -163
- package/src/cpsat/rules/variables.ts +11 -0
- package/src/cpsat/rules.ts +43 -17
- package/src/cpsat/semantic-time.ts +29 -43
- package/src/cpsat/types.ts +53 -4
- package/src/cpsat/utils.ts +92 -20
- package/src/cpsat/validation-reporter.ts +170 -19
- package/src/cpsat/validation.types.ts +22 -11
- package/src/datetime.utils.ts +45 -44
- package/src/index.ts +72 -15
- package/src/schedule/cost.ts +221 -0
- package/src/schedule/coverage.ts +164 -0
- package/src/schedule/definition.ts +1447 -0
- package/src/schedule/index.ts +132 -0
- package/src/schedule/rules.ts +1028 -0
- package/src/schedule/shift-patterns.ts +29 -0
- package/src/schedule/time-periods.ts +120 -0
- package/src/types.ts +114 -2
- package/dist/llms.d.ts +0 -2
- package/dist/llms.d.ts.map +0 -1
- package/dist/llms.js +0 -3
- package/dist/llms.js.map +0 -1
- package/dist/schedule.d.ts +0 -917
- package/dist/schedule.d.ts.map +0 -1
- package/dist/schedule.js +0 -1323
- package/dist/schedule.js.map +0 -1
- package/llms.txt +0 -758
- package/src/llms.ts +0 -3
- package/src/schedule.ts +0 -1960
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-time.js","sourceRoot":"","sources":["../../src/cpsat/semantic-time.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"semantic-time.js","sourceRoot":"","sources":["../../src/cpsat/semantic-time.ts"],"names":[],"mappings":"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"}
|
package/dist/cpsat/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TimeOfDay, DayOfWeek } from "../types.js";
|
|
1
|
+
import type { DateString, TimeOfDay, DayOfWeek } from "../types.js";
|
|
2
2
|
import type { SolverRequest, SolverTerm } from "../client.types.js";
|
|
3
3
|
import type { ValidationGroup } from "./validation.types.js";
|
|
4
4
|
/**
|
|
@@ -13,11 +13,12 @@ export interface HourlyPay {
|
|
|
13
13
|
/**
|
|
14
14
|
* Annual salary with contracted weekly hours.
|
|
15
15
|
*
|
|
16
|
+
* @remarks
|
|
16
17
|
* The solver treats salaried members as having a fixed weekly cost
|
|
17
18
|
* (`annual / 52`) that is incurred once they work any shift in a week.
|
|
18
19
|
* Additional shifts within the same week have zero marginal cost.
|
|
19
20
|
*
|
|
20
|
-
*
|
|
21
|
+
* Overtime multiplier rules apply only to hourly members.
|
|
21
22
|
* Overtime surcharge rules apply to all members regardless of pay type.
|
|
22
23
|
*
|
|
23
24
|
* @category Supporting Types
|
|
@@ -31,12 +32,34 @@ export interface SalariedPay {
|
|
|
31
32
|
/**
|
|
32
33
|
* How strictly the solver enforces a rule.
|
|
33
34
|
*
|
|
35
|
+
* @remarks
|
|
36
|
+
* Priority is part of the schedule design, not a cosmetic option. Use it to
|
|
37
|
+
* preserve the distinction between hard requirements and softer preferences
|
|
38
|
+
* from the requirements. In practice, words like "must", "at least", "needs", and
|
|
39
|
+
* "cannot" usually map to `"MANDATORY"`, while words like "ideally",
|
|
40
|
+
* "prefer", "mainly", and "where possible" usually map to a soft priority.
|
|
41
|
+
* The same coverage shape or rule scope can be modeled with different
|
|
42
|
+
* priorities when the business language is subtler than a pure hard limit.
|
|
43
|
+
*
|
|
34
44
|
* - `"LOW"`, `"MEDIUM"`, `"HIGH"`: soft constraints with increasing penalty for violations
|
|
35
45
|
* - `"MANDATORY"`: hard constraint; the solver will not produce a solution that violates it
|
|
36
46
|
*
|
|
37
47
|
* @category Supporting Types
|
|
38
48
|
*/
|
|
39
|
-
export
|
|
49
|
+
export declare const PRIORITY_VALUES: readonly ["LOW", "MEDIUM", "HIGH", "MANDATORY"];
|
|
50
|
+
/**
|
|
51
|
+
* The soft-only priority values.
|
|
52
|
+
*
|
|
53
|
+
* @category Supporting Types
|
|
54
|
+
*/
|
|
55
|
+
export declare const SOFT_PRIORITY_VALUES: readonly ["LOW", "MEDIUM", "HIGH"];
|
|
56
|
+
export type Priority = (typeof PRIORITY_VALUES)[number];
|
|
57
|
+
/**
|
|
58
|
+
* Soft-only priority values.
|
|
59
|
+
*
|
|
60
|
+
* @category Supporting Types
|
|
61
|
+
*/
|
|
62
|
+
export type SoftPriority = (typeof SOFT_PRIORITY_VALUES)[number];
|
|
40
63
|
/**
|
|
41
64
|
* A team member available for scheduling.
|
|
42
65
|
*
|
|
@@ -120,7 +143,7 @@ export interface ShiftPattern {
|
|
|
120
143
|
endTime: TimeOfDay;
|
|
121
144
|
}
|
|
122
145
|
export interface TimeInterval {
|
|
123
|
-
day:
|
|
146
|
+
day: DateString;
|
|
124
147
|
startTime: TimeOfDay;
|
|
125
148
|
endTime: TimeOfDay;
|
|
126
149
|
}
|
|
@@ -199,12 +222,32 @@ interface SkillBasedCoverageRequirement extends CoverageRequirementBase {
|
|
|
199
222
|
* { day: "2024-01-01", startTime: { hours: 9 }, endTime: { hours: 17 }, roleIds: ["waiter"], skillIds: ["senior"], targetCount: 1, priority: "HIGH" }
|
|
200
223
|
*/
|
|
201
224
|
export type CoverageRequirement = RoleBasedCoverageRequirement | SkillBasedCoverageRequirement;
|
|
225
|
+
/**
|
|
226
|
+
* Compile-time solve profile used by model builders.
|
|
227
|
+
*
|
|
228
|
+
* @category Model Builder
|
|
229
|
+
*/
|
|
230
|
+
export type ModelSolveStrategy = {
|
|
231
|
+
/** Build the normal optimized solver request. */
|
|
232
|
+
readonly type: "optimize";
|
|
233
|
+
} | {
|
|
234
|
+
/** Build a hard-feasibility request that ignores objectives and soft constraints. */
|
|
235
|
+
readonly type: "feasibility-only";
|
|
236
|
+
};
|
|
202
237
|
/** Optional settings for the model builder. */
|
|
203
238
|
export interface ModelBuilderOptions {
|
|
204
239
|
/** Which day starts the week for weekly rules. Defaults to "monday". */
|
|
205
240
|
weekStartsOn?: DayOfWeek;
|
|
206
241
|
/** Solver-level options (time limit, solution limit). */
|
|
207
242
|
solverOptions?: SolverRequest["options"];
|
|
243
|
+
/** Compile-time solve profile. Defaults to optimized solving. */
|
|
244
|
+
strategy?: ModelSolveStrategy;
|
|
245
|
+
/**
|
|
246
|
+
* Internal objective stage order for staged solver requests.
|
|
247
|
+
*
|
|
248
|
+
* @internal
|
|
249
|
+
*/
|
|
250
|
+
objectiveStageOrder?: readonly string[];
|
|
208
251
|
/**
|
|
209
252
|
* Bucket size used when translating coverage requirements into time-indexed constraints.
|
|
210
253
|
* Smaller buckets are more accurate but increase the number of constraints.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cpsat/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cpsat/types.ts"],"names":[],"mappings":"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"}
|
package/dist/cpsat/types.js
CHANGED
|
@@ -1,2 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* How strictly the solver enforces a rule.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Priority is part of the schedule design, not a cosmetic option. Use it to
|
|
6
|
+
* preserve the distinction between hard requirements and softer preferences
|
|
7
|
+
* from the requirements. In practice, words like "must", "at least", "needs", and
|
|
8
|
+
* "cannot" usually map to `"MANDATORY"`, while words like "ideally",
|
|
9
|
+
* "prefer", "mainly", and "where possible" usually map to a soft priority.
|
|
10
|
+
* The same coverage shape or rule scope can be modeled with different
|
|
11
|
+
* priorities when the business language is subtler than a pure hard limit.
|
|
12
|
+
*
|
|
13
|
+
* - `"LOW"`, `"MEDIUM"`, `"HIGH"`: soft constraints with increasing penalty for violations
|
|
14
|
+
* - `"MANDATORY"`: hard constraint; the solver will not produce a solution that violates it
|
|
15
|
+
*
|
|
16
|
+
* @category Supporting Types
|
|
17
|
+
*/
|
|
18
|
+
export const PRIORITY_VALUES = ["LOW", "MEDIUM", "HIGH", "MANDATORY"];
|
|
19
|
+
/**
|
|
20
|
+
* The soft-only priority values.
|
|
21
|
+
*
|
|
22
|
+
* @category Supporting Types
|
|
23
|
+
*/
|
|
24
|
+
export const SOFT_PRIORITY_VALUES = ["LOW", "MEDIUM", "HIGH"];
|
|
2
25
|
//# sourceMappingURL=types.js.map
|
package/dist/cpsat/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cpsat/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cpsat/types.ts"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC"}
|
package/dist/cpsat/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type { Priority } from "./types.js";
|
|
1
|
+
import { type DayOfWeek, type SchedulingDay, type TimeOfDay } from "../types.js";
|
|
2
|
+
import type { Priority, SoftPriority } from "./types.js";
|
|
3
3
|
export declare const MINUTES_PER_DAY: number;
|
|
4
4
|
/**
|
|
5
5
|
* Standard objective weights for the scheduling solver.
|
|
@@ -39,13 +39,16 @@ export declare const OBJECTIVE_WEIGHTS: {
|
|
|
39
39
|
readonly ASSIGNMENT_BASE: 1;
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
42
|
+
* Maps {@link Priority} levels to penalty weights for preference rules.
|
|
43
|
+
*
|
|
44
|
+
* Used by `assignment-priority`, `location-preference`, and `role-preference`
|
|
45
|
+
* to scale the strength of their soft constraints.
|
|
44
46
|
*/
|
|
45
|
-
export declare
|
|
47
|
+
export declare const PREFERENCE_WEIGHTS: Record<Priority, number>;
|
|
46
48
|
export declare function timeOfDayToMinutes(time: TimeOfDay): number;
|
|
47
49
|
export declare function normalizeEndMinutes(startMinutes: number, endMinutes: number): number;
|
|
48
50
|
export declare function priorityToPenalty(priority: Priority): number;
|
|
51
|
+
export declare function targetPeakPriorityToPenalty(priority: SoftPriority): number;
|
|
49
52
|
/**
|
|
50
53
|
* Computes the total duration of the union of time ranges.
|
|
51
54
|
*
|
|
@@ -57,5 +60,19 @@ export declare function unionMinutes(ranges: ReadonlyArray<{
|
|
|
57
60
|
start: number;
|
|
58
61
|
end: number;
|
|
59
62
|
}>): number;
|
|
60
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Splits scheduling days into non-overlapping chunks of N calendar months.
|
|
65
|
+
*
|
|
66
|
+
* Days are grouped by their {@link SchedulingDay.yearMonth}, then consecutive
|
|
67
|
+
* months are merged into chunks of the requested size.
|
|
68
|
+
*/
|
|
69
|
+
export declare function splitIntoMonths(days: SchedulingDay[], monthsPerChunk: number): SchedulingDay[][];
|
|
70
|
+
/**
|
|
71
|
+
* Groups days into chunks of N weeks, aligned to weekStartsOn.
|
|
72
|
+
*
|
|
73
|
+
* Uses {@link splitIntoWeeks} internally, then merges consecutive weeks
|
|
74
|
+
* into larger chunks.
|
|
75
|
+
*/
|
|
76
|
+
export declare function groupWeekChunks(days: SchedulingDay[], weeksPerChunk: number, weekStartsOn: DayOfWeek): SchedulingDay[][];
|
|
77
|
+
export declare function splitIntoWeeks(days: SchedulingDay[], weekStartsOn: DayOfWeek): SchedulingDay[][];
|
|
61
78
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cpsat/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cpsat/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,eAAO,MAAM,eAAe,QAAU,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,iBAAiB;IAC5B,0EAA0E;;IAE1E,6DAA6D;;IAE7D,sFAAsF;;IAEtF,+EAA+E;;IAE/E,8CAA8C;;CAEtC,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKvD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGpF;AASD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE5D;AAQD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAe1F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,aAAa,EAAE,EAAE,CAyBhG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EAAE,EACrB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,SAAS,GACtB,aAAa,EAAE,EAAE,CAYnB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,aAAa,EAAE,EAAE,CA8BhG"}
|
package/dist/cpsat/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DAY_OF_WEEK_INDEX } from "../types.js";
|
|
2
2
|
export const MINUTES_PER_DAY = 24 * 60;
|
|
3
3
|
/**
|
|
4
4
|
* Standard objective weights for the scheduling solver.
|
|
@@ -38,12 +38,17 @@ export const OBJECTIVE_WEIGHTS = {
|
|
|
38
38
|
ASSIGNMENT_BASE: 1,
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
41
|
+
* Maps {@link Priority} levels to penalty weights for preference rules.
|
|
42
|
+
*
|
|
43
|
+
* Used by `assignment-priority`, `location-preference`, and `role-preference`
|
|
44
|
+
* to scale the strength of their soft constraints.
|
|
43
45
|
*/
|
|
44
|
-
export
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
export const PREFERENCE_WEIGHTS = {
|
|
47
|
+
LOW: OBJECTIVE_WEIGHTS.FAIRNESS,
|
|
48
|
+
MEDIUM: OBJECTIVE_WEIGHTS.ASSIGNMENT_PREFERENCE,
|
|
49
|
+
HIGH: OBJECTIVE_WEIGHTS.ASSIGNMENT_PREFERENCE * 2.5,
|
|
50
|
+
MANDATORY: OBJECTIVE_WEIGHTS.ASSIGNMENT_PREFERENCE * 5,
|
|
51
|
+
};
|
|
47
52
|
export function timeOfDayToMinutes(time) {
|
|
48
53
|
return time.hours * 60 + (time.minutes ?? 0);
|
|
49
54
|
}
|
|
@@ -61,6 +66,14 @@ const PRIORITY_PENALTIES = {
|
|
|
61
66
|
export function priorityToPenalty(priority) {
|
|
62
67
|
return PRIORITY_PENALTIES[priority];
|
|
63
68
|
}
|
|
69
|
+
const TARGET_PEAK_PRIORITY_PENALTIES = {
|
|
70
|
+
LOW: OBJECTIVE_WEIGHTS.COST,
|
|
71
|
+
MEDIUM: OBJECTIVE_WEIGHTS.SHIFT_ACTIVE,
|
|
72
|
+
HIGH: OBJECTIVE_WEIGHTS.SHIFT_ACTIVE * 2.5,
|
|
73
|
+
};
|
|
74
|
+
export function targetPeakPriorityToPenalty(priority) {
|
|
75
|
+
return TARGET_PEAK_PRIORITY_PENALTIES[priority];
|
|
76
|
+
}
|
|
64
77
|
/**
|
|
65
78
|
* Computes the total duration of the union of time ranges.
|
|
66
79
|
*
|
|
@@ -72,8 +85,11 @@ export function unionMinutes(ranges) {
|
|
|
72
85
|
if (ranges.length === 0)
|
|
73
86
|
return 0;
|
|
74
87
|
const sorted = ranges.toSorted((a, b) => a.start - b.start);
|
|
88
|
+
const first = sorted[0];
|
|
89
|
+
if (!first)
|
|
90
|
+
return 0;
|
|
75
91
|
let total = 0;
|
|
76
|
-
let currentEnd =
|
|
92
|
+
let currentEnd = first.start;
|
|
77
93
|
for (const r of sorted) {
|
|
78
94
|
const effectiveStart = Math.max(r.start, currentEnd);
|
|
79
95
|
if (effectiveStart < r.end) {
|
|
@@ -83,24 +99,69 @@ export function unionMinutes(ranges) {
|
|
|
83
99
|
}
|
|
84
100
|
return total;
|
|
85
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Splits scheduling days into non-overlapping chunks of N calendar months.
|
|
104
|
+
*
|
|
105
|
+
* Days are grouped by their {@link SchedulingDay.yearMonth}, then consecutive
|
|
106
|
+
* months are merged into chunks of the requested size.
|
|
107
|
+
*/
|
|
108
|
+
export function splitIntoMonths(days, monthsPerChunk) {
|
|
109
|
+
if (days.length === 0)
|
|
110
|
+
return [];
|
|
111
|
+
const monthGroups = new Map();
|
|
112
|
+
for (const day of days) {
|
|
113
|
+
let group = monthGroups.get(day.yearMonth);
|
|
114
|
+
if (!group) {
|
|
115
|
+
group = [];
|
|
116
|
+
monthGroups.set(day.yearMonth, group);
|
|
117
|
+
}
|
|
118
|
+
group.push(day);
|
|
119
|
+
}
|
|
120
|
+
const sortedKeys = [...monthGroups.keys()].toSorted();
|
|
121
|
+
const chunks = [];
|
|
122
|
+
for (let i = 0; i < sortedKeys.length; i += monthsPerChunk) {
|
|
123
|
+
const chunkKeys = sortedKeys.slice(i, i + monthsPerChunk);
|
|
124
|
+
const chunk = chunkKeys.flatMap((key) => monthGroups.get(key));
|
|
125
|
+
if (chunk.length > 0) {
|
|
126
|
+
chunks.push(chunk);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return chunks;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Groups days into chunks of N weeks, aligned to weekStartsOn.
|
|
133
|
+
*
|
|
134
|
+
* Uses {@link splitIntoWeeks} internally, then merges consecutive weeks
|
|
135
|
+
* into larger chunks.
|
|
136
|
+
*/
|
|
137
|
+
export function groupWeekChunks(days, weeksPerChunk, weekStartsOn) {
|
|
138
|
+
const weeks = splitIntoWeeks(days, weekStartsOn);
|
|
139
|
+
const chunks = [];
|
|
140
|
+
for (let i = 0; i < weeks.length; i += weeksPerChunk) {
|
|
141
|
+
const chunk = weeks.slice(i, i + weeksPerChunk).flat();
|
|
142
|
+
if (chunk.length > 0) {
|
|
143
|
+
chunks.push(chunk);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return chunks;
|
|
147
|
+
}
|
|
86
148
|
export function splitIntoWeeks(days, weekStartsOn) {
|
|
87
149
|
if (days.length === 0)
|
|
88
150
|
return [];
|
|
89
|
-
const weekStartIndex =
|
|
151
|
+
const weekStartIndex = DAY_OF_WEEK_INDEX[weekStartsOn];
|
|
90
152
|
const result = [];
|
|
91
153
|
let currentWeek = [];
|
|
92
|
-
let
|
|
154
|
+
let currentWeekStartEpoch = null;
|
|
93
155
|
for (const day of days) {
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
const isNewWeek = isWeekStartDay && currentWeekStart !== null && date.getTime() !== currentWeekStart.getTime();
|
|
156
|
+
const isWeekStartDay = DAY_OF_WEEK_INDEX[day.dayOfWeek] === weekStartIndex;
|
|
157
|
+
const isNewWeek = isWeekStartDay && currentWeekStartEpoch !== null && day.epochDay !== currentWeekStartEpoch;
|
|
97
158
|
if (isNewWeek) {
|
|
98
159
|
result.push(currentWeek);
|
|
99
160
|
currentWeek = [];
|
|
100
|
-
|
|
161
|
+
currentWeekStartEpoch = null;
|
|
101
162
|
}
|
|
102
|
-
if (
|
|
103
|
-
|
|
163
|
+
if (currentWeekStartEpoch === null) {
|
|
164
|
+
currentWeekStartEpoch = day.epochDay;
|
|
104
165
|
}
|
|
105
166
|
currentWeek.push(day);
|
|
106
167
|
}
|
package/dist/cpsat/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cpsat/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cpsat/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,11 @@ export interface ValidationReporter {
|
|
|
13
13
|
hasErrors(): boolean;
|
|
14
14
|
getValidation(): ScheduleValidation;
|
|
15
15
|
getExclusions(): CoverageExclusion[];
|
|
16
|
-
analyzeSolution(response: SolverResponse): void;
|
|
16
|
+
analyzeSolution(response: SolverResponse, options?: AnalyzeSolutionOptions): void;
|
|
17
|
+
}
|
|
18
|
+
export interface AnalyzeSolutionOptions {
|
|
19
|
+
/** Whether solver-reported soft constraint diagnostics should update validation. */
|
|
20
|
+
analyzeSoftConstraints?: boolean;
|
|
17
21
|
}
|
|
18
22
|
export declare class ValidationReporterImpl implements ValidationReporter {
|
|
19
23
|
#private;
|
|
@@ -30,7 +34,7 @@ export declare class ValidationReporterImpl implements ValidationReporter {
|
|
|
30
34
|
hasErrors(): boolean;
|
|
31
35
|
getValidation(): ScheduleValidation;
|
|
32
36
|
getTrackedConstraints(): TrackedConstraint[];
|
|
33
|
-
analyzeSolution(response: SolverResponse): void;
|
|
37
|
+
analyzeSolution(response: SolverResponse, options?: AnalyzeSolutionOptions): void;
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Aggregates validation items by their group into summaries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-reporter.d.ts","sourceRoot":"","sources":["../../src/cpsat/validation-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"validation-reporter.d.ts","sourceRoot":"","sources":["../../src/cpsat/validation-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const MISSING_SOFT_CONSTRAINT_VIOLATIONS_ERROR = "Solver response missing softConstraintViolations for tracked soft constraints.";
|
|
1
2
|
/**
|
|
2
3
|
* Generates a deterministic ID for a coverage-based validation item.
|
|
3
4
|
* Format: {category}:coverage:{day}:{timeSlots}:{roles}:{skills}
|
|
@@ -33,16 +34,22 @@ export class ValidationReporterImpl {
|
|
|
33
34
|
#passed = [];
|
|
34
35
|
#trackedConstraints = new Map();
|
|
35
36
|
#exclusions = [];
|
|
37
|
+
#validationIdCounts = new Map();
|
|
36
38
|
#solverErrorCount = 0;
|
|
39
|
+
#nextValidationId(baseId) {
|
|
40
|
+
const count = (this.#validationIdCounts.get(baseId) ?? 0) + 1;
|
|
41
|
+
this.#validationIdCounts.set(baseId, count);
|
|
42
|
+
return count === 1 ? baseId : `${baseId}:${count}`;
|
|
43
|
+
}
|
|
37
44
|
excludeFromCoverage(exclusion) {
|
|
38
45
|
this.#exclusions.push(exclusion);
|
|
39
46
|
}
|
|
40
47
|
reportCoverageError(error) {
|
|
41
|
-
const id = coverageId("error", error.day, error.timeSlots, error.roleIds, error.skillIds);
|
|
48
|
+
const id = this.#nextValidationId(coverageId("error", error.day, error.timeSlots, error.roleIds, error.skillIds));
|
|
42
49
|
this.#errors.push({ id, type: "coverage", ...error });
|
|
43
50
|
}
|
|
44
51
|
reportRuleError(error) {
|
|
45
|
-
const id = ruleId("error", error.rule, error.context);
|
|
52
|
+
const id = this.#nextValidationId(ruleId("error", error.rule, error.context));
|
|
46
53
|
this.#errors.push({ id, type: "rule", ...error });
|
|
47
54
|
}
|
|
48
55
|
reportSolverError(message) {
|
|
@@ -51,19 +58,19 @@ export class ValidationReporterImpl {
|
|
|
51
58
|
this.#errors.push({ id, type: "solver", message });
|
|
52
59
|
}
|
|
53
60
|
reportCoverageViolation(violation) {
|
|
54
|
-
const id = coverageId("violation", violation.day, violation.timeSlots, violation.roleIds, violation.skillIds);
|
|
61
|
+
const id = this.#nextValidationId(coverageId("violation", violation.day, violation.timeSlots, violation.roleIds, violation.skillIds));
|
|
55
62
|
this.#violations.push({ id, type: "coverage", ...violation });
|
|
56
63
|
}
|
|
57
64
|
reportRuleViolation(violation) {
|
|
58
|
-
const id = ruleId("violation", violation.rule, violation.context);
|
|
65
|
+
const id = this.#nextValidationId(ruleId("violation", violation.rule, violation.context));
|
|
59
66
|
this.#violations.push({ id, type: "rule", ...violation });
|
|
60
67
|
}
|
|
61
68
|
reportCoveragePassed(passed) {
|
|
62
|
-
const id = coverageId("passed", passed.day, passed.timeSlots, passed.roleIds, passed.skillIds);
|
|
69
|
+
const id = this.#nextValidationId(coverageId("passed", passed.day, passed.timeSlots, passed.roleIds, passed.skillIds));
|
|
63
70
|
this.#passed.push({ id, type: "coverage", ...passed });
|
|
64
71
|
}
|
|
65
72
|
reportRulePassed(passed) {
|
|
66
|
-
const id = ruleId("passed", passed.rule, passed.context);
|
|
73
|
+
const id = this.#nextValidationId(ruleId("passed", passed.rule, passed.context));
|
|
67
74
|
this.#passed.push({ id, type: "rule", ...passed });
|
|
68
75
|
}
|
|
69
76
|
getExclusions() {
|
|
@@ -85,10 +92,14 @@ export class ValidationReporterImpl {
|
|
|
85
92
|
getTrackedConstraints() {
|
|
86
93
|
return [...this.#trackedConstraints.values()];
|
|
87
94
|
}
|
|
88
|
-
analyzeSolution(response) {
|
|
95
|
+
analyzeSolution(response, options) {
|
|
89
96
|
if (response.status !== "OPTIMAL" && response.status !== "FEASIBLE") {
|
|
90
97
|
if (response.status === "INFEASIBLE") {
|
|
98
|
+
this.#reportHardConstraintConflicts((response.hardConstraintConflicts ?? []).map((conflict) => conflict.constraintId));
|
|
91
99
|
this.reportSolverError(response.solutionInfo ?? "Schedule is infeasible");
|
|
100
|
+
if (response.error) {
|
|
101
|
+
this.reportSolverError(response.error);
|
|
102
|
+
}
|
|
92
103
|
}
|
|
93
104
|
else if (response.status === "TIMEOUT") {
|
|
94
105
|
this.reportSolverError("Solver timed out");
|
|
@@ -98,14 +109,25 @@ export class ValidationReporterImpl {
|
|
|
98
109
|
}
|
|
99
110
|
return;
|
|
100
111
|
}
|
|
101
|
-
const
|
|
112
|
+
const analyzeSoftConstraints = options?.analyzeSoftConstraints ?? true;
|
|
113
|
+
const hasTrackedSoftConstraints = [...this.#trackedConstraints.values()].some((constraint) => constraint.source === "soft");
|
|
114
|
+
if (analyzeSoftConstraints &&
|
|
115
|
+
hasTrackedSoftConstraints &&
|
|
116
|
+
response.softConstraintViolations === undefined) {
|
|
117
|
+
throw new Error(MISSING_SOFT_CONSTRAINT_VIOLATIONS_ERROR);
|
|
118
|
+
}
|
|
119
|
+
const solverViolations = analyzeSoftConstraints
|
|
120
|
+
? (response.softConstraintViolations ?? [])
|
|
121
|
+
: [];
|
|
102
122
|
for (const violation of solverViolations) {
|
|
103
123
|
const tracked = this.#trackedConstraints.get(violation.constraintId);
|
|
104
124
|
if (tracked?.type === "coverage") {
|
|
125
|
+
if (!tracked.day)
|
|
126
|
+
continue;
|
|
105
127
|
const roles = tracked.roleIds?.join(", ") ?? "staff";
|
|
106
128
|
const slot = tracked.timeSlot ?? "all day";
|
|
107
129
|
this.reportCoverageViolation({
|
|
108
|
-
day: tracked.day
|
|
130
|
+
day: tracked.day,
|
|
109
131
|
timeSlots: tracked.timeSlot ? [tracked.timeSlot] : [],
|
|
110
132
|
roleIds: tracked.roleIds,
|
|
111
133
|
skillIds: tracked.skillIds,
|
|
@@ -138,11 +160,15 @@ export class ValidationReporterImpl {
|
|
|
138
160
|
// Mark tracked coverage constraints as passed if not violated
|
|
139
161
|
const violatedIds = new Set(solverViolations.map((v) => v.constraintId));
|
|
140
162
|
for (const tracked of this.#trackedConstraints.values()) {
|
|
163
|
+
if (!analyzeSoftConstraints && tracked.source === "soft")
|
|
164
|
+
continue;
|
|
141
165
|
if (violatedIds.has(tracked.id))
|
|
142
166
|
continue;
|
|
143
167
|
if (tracked.type === "coverage") {
|
|
168
|
+
if (!tracked.day)
|
|
169
|
+
continue;
|
|
144
170
|
this.reportCoveragePassed({
|
|
145
|
-
day: tracked.day
|
|
171
|
+
day: tracked.day,
|
|
146
172
|
timeSlots: tracked.timeSlot ? [tracked.timeSlot] : [],
|
|
147
173
|
roleIds: tracked.roleIds,
|
|
148
174
|
skillIds: tracked.skillIds,
|
|
@@ -152,6 +178,92 @@ export class ValidationReporterImpl {
|
|
|
152
178
|
}
|
|
153
179
|
}
|
|
154
180
|
}
|
|
181
|
+
#reportHardConstraintConflicts(constraintIds) {
|
|
182
|
+
if (constraintIds.length === 0) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const coverageGroups = new Map();
|
|
186
|
+
const ruleGroups = new Map();
|
|
187
|
+
for (const constraintId of constraintIds) {
|
|
188
|
+
const tracked = this.#trackedConstraints.get(constraintId);
|
|
189
|
+
if (!tracked)
|
|
190
|
+
continue;
|
|
191
|
+
if (tracked.type === "coverage") {
|
|
192
|
+
if (!tracked.day)
|
|
193
|
+
continue;
|
|
194
|
+
const key = [
|
|
195
|
+
tracked.group?.key ?? tracked.id,
|
|
196
|
+
tracked.day,
|
|
197
|
+
tracked.roleIds?.join(",") ?? "_",
|
|
198
|
+
tracked.skillIds?.join(",") ?? "_",
|
|
199
|
+
].join(":");
|
|
200
|
+
const existing = coverageGroups.get(key);
|
|
201
|
+
if (existing) {
|
|
202
|
+
if (tracked.timeSlot)
|
|
203
|
+
existing.timeSlots.add(tracked.timeSlot);
|
|
204
|
+
existing.descriptions.push(tracked.description);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
coverageGroups.set(key, {
|
|
208
|
+
day: tracked.day,
|
|
209
|
+
timeSlots: new Set(tracked.timeSlot ? [tracked.timeSlot] : []),
|
|
210
|
+
roleIds: tracked.roleIds,
|
|
211
|
+
skillIds: tracked.skillIds,
|
|
212
|
+
group: tracked.group,
|
|
213
|
+
descriptions: [tracked.description],
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const key = tracked.group?.key ?? tracked.id;
|
|
218
|
+
const existing = ruleGroups.get(key);
|
|
219
|
+
if (existing) {
|
|
220
|
+
for (const day of tracked.context.days ?? [])
|
|
221
|
+
existing.days.add(day);
|
|
222
|
+
for (const memberId of tracked.context.memberIds ?? [])
|
|
223
|
+
existing.memberIds.add(memberId);
|
|
224
|
+
existing.descriptions.push(tracked.description);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
ruleGroups.set(key, {
|
|
228
|
+
rule: tracked.rule ?? "unknown",
|
|
229
|
+
days: new Set(tracked.context.days ?? []),
|
|
230
|
+
memberIds: new Set(tracked.context.memberIds ?? []),
|
|
231
|
+
group: tracked.group,
|
|
232
|
+
descriptions: [tracked.description],
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
for (const coverage of coverageGroups.values()) {
|
|
236
|
+
const label = coverage.group?.title ?? coverage.descriptions[0] ?? "Coverage requirement";
|
|
237
|
+
this.reportCoverageError({
|
|
238
|
+
day: coverage.day,
|
|
239
|
+
timeSlots: [...coverage.timeSlots].toSorted(),
|
|
240
|
+
roleIds: coverage.roleIds,
|
|
241
|
+
skillIds: coverage.skillIds,
|
|
242
|
+
message: `${label} is part of a sufficient infeasible constraint set.`,
|
|
243
|
+
suggestions: [
|
|
244
|
+
"Relax this mandatory coverage requirement",
|
|
245
|
+
"Relax conflicting mandatory rules or add eligible team members",
|
|
246
|
+
],
|
|
247
|
+
group: coverage.group,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
for (const rule of ruleGroups.values()) {
|
|
251
|
+
const label = rule.group?.title ?? rule.descriptions[0] ?? rule.rule;
|
|
252
|
+
this.reportRuleError({
|
|
253
|
+
rule: rule.rule,
|
|
254
|
+
message: `${label} is part of a sufficient infeasible constraint set.`,
|
|
255
|
+
context: {
|
|
256
|
+
days: [...rule.days].toSorted(),
|
|
257
|
+
memberIds: [...rule.memberIds].toSorted(),
|
|
258
|
+
},
|
|
259
|
+
suggestions: [
|
|
260
|
+
"Relax this mandatory rule",
|
|
261
|
+
"Relax conflicting mandatory coverage requirements or add eligible team members",
|
|
262
|
+
],
|
|
263
|
+
group: rule.group,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
155
267
|
}
|
|
156
268
|
/**
|
|
157
269
|
* Aggregates validation items by their group into summaries.
|