dabke 0.83.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 +21 -0
- package/README.md +22 -27
- 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 -24
- package/dist/cpsat/rules/index.d.ts.map +1 -1
- package/dist/cpsat/rules/index.js +30 -24
- 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 +17 -31
- package/dist/cpsat/rules/max-days-week.d.ts.map +1 -1
- package/dist/cpsat/rules/max-days-week.js +69 -81
- package/dist/cpsat/rules/max-days-week.js.map +1 -1
- 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 +13 -26
- package/dist/cpsat/rules/min-days-week.d.ts.map +1 -1
- package/dist/cpsat/rules/min-days-week.js +85 -74
- package/dist/cpsat/rules/min-days-week.js.map +1 -1
- 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 +5 -42
- package/dist/cpsat/rules/must-assign.d.ts.map +1 -1
- package/dist/cpsat/rules/must-assign.js +43 -75
- package/dist/cpsat/rules/must-assign.js.map +1 -1
- 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 -30
- package/dist/cpsat/rules/registry.d.ts.map +1 -1
- package/dist/cpsat/rules/registry.js +98 -34
- 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 +90 -17
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.d.ts +24 -11
- 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 +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/schedule/cost.d.ts +48 -60
- package/dist/schedule/cost.d.ts.map +1 -1
- package/dist/schedule/cost.js +15 -51
- package/dist/schedule/cost.js.map +1 -1
- package/dist/schedule/coverage.d.ts +57 -28
- package/dist/schedule/coverage.d.ts.map +1 -1
- package/dist/schedule/coverage.js +24 -1
- package/dist/schedule/coverage.js.map +1 -1
- package/dist/schedule/definition.d.ts +138 -19
- package/dist/schedule/definition.d.ts.map +1 -1
- package/dist/schedule/definition.js +99 -90
- package/dist/schedule/definition.js.map +1 -1
- package/dist/schedule/index.d.ts +4 -4
- package/dist/schedule/index.d.ts.map +1 -1
- package/dist/schedule/index.js +2 -2
- package/dist/schedule/index.js.map +1 -1
- package/dist/schedule/rules.d.ts +438 -113
- package/dist/schedule/rules.d.ts.map +1 -1
- package/dist/schedule/rules.js +310 -108
- package/dist/schedule/rules.js.map +1 -1
- package/dist/schedule/shift-patterns.d.ts +0 -17
- package/dist/schedule/shift-patterns.d.ts.map +1 -1
- package/dist/schedule/shift-patterns.js +0 -17
- package/dist/schedule/shift-patterns.js.map +1 -1
- package/dist/schedule/time-periods.d.ts +37 -27
- package/dist/schedule/time-periods.d.ts.map +1 -1
- package/dist/schedule/time-periods.js +37 -27
- package/dist/schedule/time-periods.js.map +1 -1
- 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 -9
- 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 -24
- 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 +89 -115
- 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 +93 -91
- 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 +44 -81
- 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 -62
- package/src/cpsat/rules/resolver.ts +58 -30
- package/src/cpsat/rules/role-preference.ts +92 -0
- package/src/cpsat/rules/rules.types.ts +89 -17
- package/src/cpsat/rules/scope.types.ts +31 -26
- 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 +64 -12
- package/src/schedule/cost.ts +40 -61
- package/src/schedule/coverage.ts +57 -28
- package/src/schedule/definition.ts +565 -76
- package/src/schedule/index.ts +23 -3
- package/src/schedule/rules.ts +631 -132
- package/src/schedule/shift-patterns.ts +0 -17
- package/src/schedule/time-periods.ts +37 -27
- package/src/types.ts +114 -2
|
@@ -3,25 +3,79 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import type { DayOfWeek } from "../types.js";
|
|
6
|
+
import type { DateString, DayOfWeek } from "../types.js";
|
|
7
7
|
import type { SemanticTimeEntry } from "../cpsat/semantic-time.js";
|
|
8
8
|
import type { CompilationResult } from "../cpsat/model-builder.js";
|
|
9
9
|
import { ModelBuilder } from "../cpsat/model-builder.js";
|
|
10
10
|
import type { SchedulingMember, ShiftPattern } from "../cpsat/types.js";
|
|
11
|
-
import type {
|
|
11
|
+
import type { BuiltInCpsatRuleRegistry, CpsatRuleConfigEntryFor, CpsatRuleRegistry } from "../cpsat/rules/rules.types.js";
|
|
12
12
|
import type { SolverClient } from "../client.types.js";
|
|
13
13
|
import type { ShiftAssignment } from "../cpsat/response.js";
|
|
14
14
|
import type { ScheduleValidation } from "../cpsat/validation.types.js";
|
|
15
15
|
import type { CostBreakdown } from "../cpsat/cost.js";
|
|
16
16
|
import type { CoverageEntry } from "./coverage.js";
|
|
17
|
-
import type { RuleEntry } from "./rules.js";
|
|
17
|
+
import type { RuleEntry, ScheduleRuleEntry } from "./rules.js";
|
|
18
18
|
/** A value that can be passed to {@link Schedule.with}. */
|
|
19
|
-
type WithArg = Schedule | SchedulingMember[];
|
|
19
|
+
type WithArg = Schedule<CpsatRuleRegistry> | SchedulingMember[];
|
|
20
|
+
type EmptyRuleRegistry = Record<never, never>;
|
|
21
|
+
type BuiltInRuleRegistry = BuiltInCpsatRuleRegistry;
|
|
22
|
+
type CustomRuleRegistry<TRuleRegistry extends BuiltInRuleRegistry> = CpsatRuleRegistry & {
|
|
23
|
+
[K in Extract<Exclude<keyof TRuleRegistry, keyof BuiltInRuleRegistry>, string>]: TRuleRegistry[K];
|
|
24
|
+
};
|
|
25
|
+
type RegistryFromWithArg<T> = T extends Schedule<infer Registry> ? Registry : EmptyRuleRegistry;
|
|
26
|
+
type RuleEntryFields<T> = T extends RuleEntry<any, infer Fields> ? Fields : never;
|
|
27
|
+
type BuiltInScheduleRuleAuthoringFields<Name extends keyof BuiltInRuleRegistry> = Name extends "max-hours-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxHoursPerDay>> : Name extends "max-hours-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxHoursPerWeek>> : Name extends "min-hours-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minHoursPerDay>> : Name extends "min-hours-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minHoursPerWeek>> : Name extends "max-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxDaysPerWeek>> : Name extends "min-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minDaysPerWeek>> : Name extends "target-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").targetDaysPerWeek>> : Name extends "max-shifts-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxShiftsPerDay>> : Name extends "max-concurrent-assignments" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxConcurrentAssignments>> : Name extends "target-peak-concurrent-assignments" ? RuleEntryFields<ReturnType<typeof import("./rules.js").targetPeakConcurrentAssignments>> : Name extends "max-consecutive-days" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxConsecutiveDays>> : Name extends "min-consecutive-days" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minConsecutiveDays>> : Name extends "min-rest-between-shifts" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minRestBetweenShifts>> : Name extends "must-assign" ? RuleEntryFields<ReturnType<typeof import("./rules.js").mustAssign>> : Name extends "assignment-priority" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferAssignment>> : Name extends "role-preference" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferRole>> : Name extends "location-preference" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferLocation>> : Name extends "time-off" ? RuleEntryFields<ReturnType<typeof import("./rules.js").timeOff>> : Name extends "assign-together" ? RuleEntryFields<ReturnType<typeof import("./rules.js").assignTogether>> : Name extends "max-days-of-week-per-period" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxDaysOfWeekPerPeriod>> : Name extends "min-days-of-week-per-period" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minDaysOfWeekPerPeriod>> : Name extends "minimize-cost" ? RuleEntryFields<ReturnType<typeof import("./cost.js").minimizeCost>> : Name extends "day-cost-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dayMultiplier>> : Name extends "day-cost-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").daySurcharge>> : Name extends "time-cost-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").timeSurcharge>> : Name extends "overtime-weekly-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").overtimeMultiplier>> : Name extends "overtime-weekly-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").overtimeSurcharge>> : Name extends "overtime-daily-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dailyOvertimeMultiplier>> : Name extends "overtime-daily-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dailyOvertimeSurcharge>> : Name extends "overtime-tiered-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").tieredOvertimeMultiplier>> : never;
|
|
28
|
+
type ValidateScheduleRuleEntry<TRuleRegistry extends CpsatRuleRegistry, Entry> = Entry extends ScheduleRuleEntry<TRuleRegistry> ? Entry : Entry extends RuleEntry<infer Name, infer Fields> ? string extends Name ? Entry : Name extends keyof TRuleRegistry & string ? Name extends keyof BuiltInRuleRegistry ? Fields extends BuiltInScheduleRuleAuthoringFields<Name> ? Entry : never : Fields extends Omit<CpsatRuleConfigEntryFor<Pick<TRuleRegistry, Name>>, "name"> ? Entry : never : never : never;
|
|
29
|
+
type ValidateScheduleRules<TRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = {
|
|
30
|
+
readonly [Index in keyof TRules]: ValidateScheduleRuleEntry<TRuleRegistry, TRules[Index]>;
|
|
31
|
+
};
|
|
32
|
+
type BuiltInScheduleConfigInput<R extends readonly string[], S extends readonly string[], T extends Record<string, SemanticTimeEntry>, TRules extends readonly unknown[]> = Omit<ScheduleConfig<R, S, T, BuiltInRuleRegistry>, "rules" | "ruleRegistry"> & {
|
|
33
|
+
rules?: ValidateScheduleRules<BuiltInRuleRegistry, TRules>;
|
|
34
|
+
ruleRegistry?: undefined;
|
|
35
|
+
};
|
|
36
|
+
type CustomScheduleConfigInput<R extends readonly string[], S extends readonly string[], T extends Record<string, SemanticTimeEntry>, TCustomRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = Omit<ScheduleConfig<R, S, T, BuiltInRuleRegistry & TCustomRuleRegistry>, "rules" | "ruleRegistry"> & {
|
|
37
|
+
ruleRegistry: TCustomRuleRegistry;
|
|
38
|
+
rules?: ValidateScheduleRules<BuiltInRuleRegistry & TCustomRuleRegistry, TRules>;
|
|
39
|
+
};
|
|
40
|
+
type BuiltInPartialScheduleConfigInput<TRules extends readonly unknown[]> = Partial<Omit<ScheduleConfig<readonly string[], readonly string[], Record<string, SemanticTimeEntry>, BuiltInRuleRegistry>, "rules" | "ruleRegistry">> & {
|
|
41
|
+
rules?: ValidateScheduleRules<BuiltInRuleRegistry, TRules>;
|
|
42
|
+
ruleRegistry?: undefined;
|
|
43
|
+
};
|
|
44
|
+
type CustomPartialScheduleConfigInput<TCustomRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = Partial<Omit<ScheduleConfig<readonly string[], readonly string[], Record<string, SemanticTimeEntry>, BuiltInRuleRegistry & TCustomRuleRegistry>, "rules" | "ruleRegistry">> & {
|
|
45
|
+
ruleRegistry: TCustomRuleRegistry;
|
|
46
|
+
rules?: ValidateScheduleRules<BuiltInRuleRegistry & TCustomRuleRegistry, TRules>;
|
|
47
|
+
};
|
|
48
|
+
type UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (value: infer Result) => void ? Result : never;
|
|
49
|
+
type MergedRegistryFromArgs<Args extends readonly WithArg[]> = UnionToIntersection<RegistryFromWithArg<Args[number]>>;
|
|
20
50
|
/** Status of a solve attempt, using idiomatic lowercase TypeScript literals. */
|
|
21
51
|
export type SolveStatus = "optimal" | "feasible" | "infeasible" | "no_solution";
|
|
52
|
+
/**
|
|
53
|
+
* Strategy for {@link Schedule.solve} and {@link Schedule.compile}.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* `{ type: "optimize" }` optimizes objectives and soft constraints.
|
|
57
|
+
* `{ type: "feasibility-only" }` asks the solver for a hard-feasible solution
|
|
58
|
+
* only, ignoring objectives and soft-constraint penalties. Feasibility-only
|
|
59
|
+
* results do not guarantee cost, objective optimality, or soft-constraint
|
|
60
|
+
* diagnostics.
|
|
61
|
+
*
|
|
62
|
+
* @category Schedule Definition
|
|
63
|
+
*/
|
|
64
|
+
export type SolveStrategy = {
|
|
65
|
+
/** Optimize objectives and soft constraints. */
|
|
66
|
+
readonly type: "optimize";
|
|
67
|
+
} | {
|
|
68
|
+
/** Find a hard-feasible solution without optimizing objectives or soft constraints. */
|
|
69
|
+
readonly type: "feasibility-only";
|
|
70
|
+
};
|
|
22
71
|
/**
|
|
23
72
|
* Result of {@link Schedule.solve}.
|
|
24
73
|
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* Feasibility-only solves return hard-feasible assignments when one is found,
|
|
76
|
+
* but they do not optimize objectives or compute objective-derived metadata.
|
|
77
|
+
* Cost is therefore only produced for optimized solves.
|
|
78
|
+
*
|
|
25
79
|
* @category Schedule Definition
|
|
26
80
|
*/
|
|
27
81
|
export interface SolveResult {
|
|
@@ -29,9 +83,9 @@ export interface SolveResult {
|
|
|
29
83
|
status: SolveStatus;
|
|
30
84
|
/** Shift assignments (empty when infeasible or no solution). */
|
|
31
85
|
assignments: ShiftAssignment[];
|
|
32
|
-
/** Validation
|
|
86
|
+
/** Validation results collected during compilation and solving. */
|
|
33
87
|
validation: ScheduleValidation;
|
|
34
|
-
/** Cost breakdown
|
|
88
|
+
/** Cost breakdown for optimized solves when cost rules are used and a solution is found. */
|
|
35
89
|
cost?: CostBreakdown;
|
|
36
90
|
}
|
|
37
91
|
/**
|
|
@@ -42,9 +96,20 @@ export interface SolveResult {
|
|
|
42
96
|
export interface SolveOptions {
|
|
43
97
|
/** The date range to schedule. */
|
|
44
98
|
dateRange: {
|
|
45
|
-
start:
|
|
46
|
-
end:
|
|
99
|
+
start: DateString;
|
|
100
|
+
end: DateString;
|
|
47
101
|
};
|
|
102
|
+
/** Solver time limit in seconds. */
|
|
103
|
+
timeLimitSeconds?: number;
|
|
104
|
+
/**
|
|
105
|
+
* Strategy used by the solver.
|
|
106
|
+
*
|
|
107
|
+
* `{ type: "optimize" }` optimizes objectives and soft constraints.
|
|
108
|
+
* `{ type: "feasibility-only" }` finds any hard-feasible solution, ignoring
|
|
109
|
+
* objectives, soft-constraint penalties, and objective-derived metadata such
|
|
110
|
+
* as cost.
|
|
111
|
+
*/
|
|
112
|
+
strategy?: SolveStrategy;
|
|
48
113
|
/**
|
|
49
114
|
* Fixed assignments from a prior solve (e.g., rolling schedule).
|
|
50
115
|
* These are injected as fixed variables in the solver.
|
|
@@ -65,9 +130,13 @@ export interface SolveOptions {
|
|
|
65
130
|
* `roleIds`, `times`, `coverage`, and `shiftPatterns` are required.
|
|
66
131
|
* These four fields form the minimum solvable schedule.
|
|
67
132
|
*
|
|
133
|
+
* The `TRuleRegistry` generic represents the full active rule registry for the
|
|
134
|
+
* schedule. In `schedule()`, that registry always includes the built-in rules,
|
|
135
|
+
* and `ruleRegistry` adds any custom extensions on top.
|
|
136
|
+
*
|
|
68
137
|
* @category Schedule Definition
|
|
69
138
|
*/
|
|
70
|
-
export interface ScheduleConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry
|
|
139
|
+
export interface ScheduleConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends BuiltInRuleRegistry = BuiltInRuleRegistry> {
|
|
71
140
|
/** Declared role IDs. */
|
|
72
141
|
roleIds: R;
|
|
73
142
|
/** Declared skill IDs. When omitted, coverage targets can only be roles. */
|
|
@@ -79,13 +148,45 @@ export interface ScheduleConfig<R extends readonly string[] = readonly string[],
|
|
|
79
148
|
/** Available shift patterns. */
|
|
80
149
|
shiftPatterns: ShiftPattern[];
|
|
81
150
|
/** Scheduling rules and constraints. */
|
|
82
|
-
rules?:
|
|
151
|
+
rules?: ScheduleRuleEntry<TRuleRegistry>[];
|
|
83
152
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
153
|
+
* Additional rule descriptors keyed by rule name.
|
|
154
|
+
*
|
|
155
|
+
* @remarks
|
|
156
|
+
* These entries are merged with the built-in rule registry at compile time.
|
|
86
157
|
* Built-in rule names cannot be overridden.
|
|
87
158
|
*/
|
|
88
|
-
|
|
159
|
+
ruleRegistry?: CustomRuleRegistry<TRuleRegistry>;
|
|
160
|
+
/** Team members (typically added via `.with()` at runtime). */
|
|
161
|
+
members?: SchedulingMember[];
|
|
162
|
+
/** Days of the week the business operates (inclusion filter). */
|
|
163
|
+
dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
|
|
164
|
+
/** Which day starts the week for weekly rules. Defaults to `"monday"`. */
|
|
165
|
+
weekStartsOn?: DayOfWeek;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Configuration for {@link scheduleWithRuleRegistry}.
|
|
169
|
+
*
|
|
170
|
+
* @remarks
|
|
171
|
+
* Unlike {@link ScheduleConfig}, this config does not implicitly include the
|
|
172
|
+
* built-in rule registry. The provided registry is the complete active rule
|
|
173
|
+
* registry for the schedule.
|
|
174
|
+
*
|
|
175
|
+
* @category Schedule Definition
|
|
176
|
+
*/
|
|
177
|
+
export interface ScheduleWithRuleRegistryConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry> {
|
|
178
|
+
/** Declared role IDs. */
|
|
179
|
+
roleIds: R;
|
|
180
|
+
/** Declared skill IDs. When omitted, coverage targets can only be roles. */
|
|
181
|
+
skillIds?: S;
|
|
182
|
+
/** Named semantic time periods. */
|
|
183
|
+
times: T;
|
|
184
|
+
/** Staffing requirements per time period (entries stack additively). */
|
|
185
|
+
coverage: NoInfer<CoverageEntry<keyof T & string, R[number] | S[number]>>[];
|
|
186
|
+
/** Available shift patterns. */
|
|
187
|
+
shiftPatterns: ShiftPattern[];
|
|
188
|
+
/** Scheduling rules and constraints. */
|
|
189
|
+
rules?: ScheduleRuleEntry<TRuleRegistry>[];
|
|
89
190
|
/** Team members (typically added via `.with()` at runtime). */
|
|
90
191
|
members?: SchedulingMember[];
|
|
91
192
|
/** Days of the week the business operates (inclusion filter). */
|
|
@@ -100,8 +201,8 @@ interface MergedScheduleConfig {
|
|
|
100
201
|
times: Record<string, SemanticTimeEntry>;
|
|
101
202
|
coverage: CoverageEntry[];
|
|
102
203
|
shiftPatterns: ShiftPattern[];
|
|
103
|
-
rules:
|
|
104
|
-
|
|
204
|
+
rules: ScheduleRuleEntry<CpsatRuleRegistry>[];
|
|
205
|
+
ruleRegistry: CpsatRuleRegistry;
|
|
105
206
|
members: SchedulingMember[];
|
|
106
207
|
dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
|
|
107
208
|
weekStartsOn?: DayOfWeek;
|
|
@@ -114,7 +215,7 @@ interface MergedScheduleConfig {
|
|
|
114
215
|
*
|
|
115
216
|
* @category Schedule Definition
|
|
116
217
|
*/
|
|
117
|
-
export declare class Schedule {
|
|
218
|
+
export declare class Schedule<TRuleRegistry extends CpsatRuleRegistry = BuiltInRuleRegistry> {
|
|
118
219
|
#private;
|
|
119
220
|
/** @internal */
|
|
120
221
|
constructor(config: MergedScheduleConfig);
|
|
@@ -148,7 +249,7 @@ export declare class Schedule {
|
|
|
148
249
|
* Validation runs eagerly: role/skill disjointness, coverage targets
|
|
149
250
|
* referencing declared roles/skills, member role references, etc.
|
|
150
251
|
*/
|
|
151
|
-
with(...args:
|
|
252
|
+
with<const Args extends readonly WithArg[]>(...args: Args): Schedule<TRuleRegistry & MergedRegistryFromArgs<Args>>;
|
|
152
253
|
/**
|
|
153
254
|
* Compiles, validates, solves, and parses in one call.
|
|
154
255
|
*
|
|
@@ -171,6 +272,10 @@ export declare class Schedule {
|
|
|
171
272
|
* Returns an immutable {@link Schedule} that can be composed via `.with()`
|
|
172
273
|
* and solved via `.solve()`.
|
|
173
274
|
*
|
|
275
|
+
* @remarks
|
|
276
|
+
* `schedule()` always uses the built-in rule registry as its default. Passing
|
|
277
|
+
* `ruleRegistry` extends that default with custom rules.
|
|
278
|
+
*
|
|
174
279
|
* @example
|
|
175
280
|
* ```typescript
|
|
176
281
|
* const venue = schedule({
|
|
@@ -203,7 +308,20 @@ export declare class Schedule {
|
|
|
203
308
|
*
|
|
204
309
|
* @category Schedule Definition
|
|
205
310
|
*/
|
|
206
|
-
export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry
|
|
311
|
+
export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry>[]>(config: BuiltInScheduleConfigInput<R, S, T, TRules>): Schedule<BuiltInRuleRegistry>;
|
|
312
|
+
export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TCustomRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry & TCustomRuleRegistry>[]>(config: CustomScheduleConfigInput<R, S, T, TCustomRuleRegistry, TRules>): Schedule<BuiltInRuleRegistry & TCustomRuleRegistry>;
|
|
313
|
+
/**
|
|
314
|
+
* Create a schedule definition with an explicit complete rule registry.
|
|
315
|
+
*
|
|
316
|
+
* @remarks
|
|
317
|
+
* Use this when you want full control over the active rule registry, including
|
|
318
|
+
* schedules that do not include the built-in rules.
|
|
319
|
+
*
|
|
320
|
+
* @category Schedule Definition
|
|
321
|
+
*/
|
|
322
|
+
export declare function scheduleWithRuleRegistry<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<TRuleRegistry>[]>(ruleRegistry: TRuleRegistry, config: Omit<ScheduleWithRuleRegistryConfig<R, S, T, TRuleRegistry>, "rules"> & {
|
|
323
|
+
rules?: ValidateScheduleRules<TRuleRegistry, TRules>;
|
|
324
|
+
}): Schedule<TRuleRegistry>;
|
|
207
325
|
/**
|
|
208
326
|
* Create a partial schedule for composition via `.with()`.
|
|
209
327
|
*
|
|
@@ -222,6 +340,7 @@ export declare function schedule<const R extends readonly string[], const S exte
|
|
|
222
340
|
*
|
|
223
341
|
* @category Schedule Definition
|
|
224
342
|
*/
|
|
225
|
-
export declare function partialSchedule
|
|
343
|
+
export declare function partialSchedule<const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry>[]>(config: BuiltInPartialScheduleConfigInput<TRules>): Schedule<BuiltInRuleRegistry>;
|
|
344
|
+
export declare function partialSchedule<TCustomRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry & TCustomRuleRegistry>[]>(config: CustomPartialScheduleConfigInput<TCustomRuleRegistry, TRules>): Schedule<BuiltInRuleRegistry & TCustomRuleRegistry>;
|
|
226
345
|
export {};
|
|
227
346
|
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/schedule/definition.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/schedule/definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { defineSemanticTimes } from "../cpsat/semantic-time.js";
|
|
7
7
|
import { resolveDaysFromPeriod } from "../datetime.utils.js";
|
|
8
8
|
import { ModelBuilder } from "../cpsat/model-builder.js";
|
|
9
|
-
import {
|
|
9
|
+
import { assertNoBuiltInCpsatRuleOverrides, assertValidCpsatRuleRegistry, builtInCpsatRuleRegistry, } from "../cpsat/rules/registry.js";
|
|
10
10
|
import { parseSolverResponse, resolveAssignments } from "../cpsat/response.js";
|
|
11
11
|
import { calculateScheduleCost } from "../cpsat/cost.js";
|
|
12
12
|
import { resolveAppliesTo } from "./rules.js";
|
|
@@ -37,7 +37,7 @@ export class Schedule {
|
|
|
37
37
|
coverage: [...this.#config.coverage],
|
|
38
38
|
shiftPatterns: [...this.#config.shiftPatterns],
|
|
39
39
|
rules: [...this.#config.rules],
|
|
40
|
-
|
|
40
|
+
ruleRegistry: { ...this.#config.ruleRegistry },
|
|
41
41
|
members: [...this.#config.members],
|
|
42
42
|
};
|
|
43
43
|
}
|
|
@@ -99,6 +99,7 @@ export class Schedule {
|
|
|
99
99
|
* @param options - Date range and optional pinned assignments
|
|
100
100
|
*/
|
|
101
101
|
async solve(client, options) {
|
|
102
|
+
const strategy = resolveSolveStrategy(options.strategy);
|
|
102
103
|
const compiled = this.compile(options);
|
|
103
104
|
if (!compiled.canSolve) {
|
|
104
105
|
return {
|
|
@@ -108,7 +109,7 @@ export class Schedule {
|
|
|
108
109
|
};
|
|
109
110
|
}
|
|
110
111
|
const response = await client.solve(compiled.request);
|
|
111
|
-
return buildSolveResult(response, compiled, this.#config);
|
|
112
|
+
return buildSolveResult(response, compiled, this.#config, strategy);
|
|
112
113
|
}
|
|
113
114
|
/**
|
|
114
115
|
* Diagnostic escape hatch. Compiles the schedule without solving.
|
|
@@ -119,83 +120,51 @@ export class Schedule {
|
|
|
119
120
|
if (options.pinned && options.pinned.length > 0) {
|
|
120
121
|
throw new Error("Pinned assignments are not yet supported.");
|
|
121
122
|
}
|
|
122
|
-
const
|
|
123
|
+
const strategy = resolveSolveStrategy(options.strategy);
|
|
124
|
+
const modelConfig = resolveToModelConfig(this.#config, options, strategy);
|
|
123
125
|
const builder = new ModelBuilder(modelConfig);
|
|
124
126
|
const result = builder.compile();
|
|
125
127
|
return { ...result, builder };
|
|
126
128
|
}
|
|
127
129
|
}
|
|
128
|
-
// ============================================================================
|
|
129
|
-
// schedule() factory
|
|
130
|
-
// ============================================================================
|
|
131
|
-
/**
|
|
132
|
-
* Create a schedule definition.
|
|
133
|
-
*
|
|
134
|
-
* Returns an immutable {@link Schedule} that can be composed via `.with()`
|
|
135
|
-
* and solved via `.solve()`.
|
|
136
|
-
*
|
|
137
|
-
* @example
|
|
138
|
-
* ```typescript
|
|
139
|
-
* const venue = schedule({
|
|
140
|
-
* roleIds: ["waiter", "runner", "manager"],
|
|
141
|
-
* skillIds: ["senior"],
|
|
142
|
-
* times: {
|
|
143
|
-
* lunch: time({ startTime: t(12), endTime: t(15) }),
|
|
144
|
-
* dinner: time(
|
|
145
|
-
* { startTime: t(17), endTime: t(21) },
|
|
146
|
-
* { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
|
|
147
|
-
* ),
|
|
148
|
-
* },
|
|
149
|
-
* coverage: [
|
|
150
|
-
* cover("lunch", "waiter", 2),
|
|
151
|
-
* cover("dinner", "waiter", 4, { dayOfWeek: weekdays }),
|
|
152
|
-
* cover("dinner", "waiter", 5, { dayOfWeek: weekend }),
|
|
153
|
-
* cover("dinner", "manager", 1),
|
|
154
|
-
* ],
|
|
155
|
-
* shiftPatterns: [
|
|
156
|
-
* shift("lunch_shift", t(11, 30), t(15)),
|
|
157
|
-
* shift("evening", t(17), t(22)),
|
|
158
|
-
* ],
|
|
159
|
-
* rules: [
|
|
160
|
-
* maxHoursPerDay(10),
|
|
161
|
-
* maxHoursPerWeek(48),
|
|
162
|
-
* minRestBetweenShifts(11),
|
|
163
|
-
* ],
|
|
164
|
-
* });
|
|
165
|
-
* ```
|
|
166
|
-
*
|
|
167
|
-
* @category Schedule Definition
|
|
168
|
-
*/
|
|
169
130
|
export function schedule(config) {
|
|
170
|
-
const
|
|
131
|
+
const customRuleRegistry = config.ruleRegistry ?? {};
|
|
132
|
+
validateRuleRegistryExtension(customRuleRegistry);
|
|
133
|
+
const merged = buildMergedConfig(config, {
|
|
134
|
+
...builtInCpsatRuleRegistry,
|
|
135
|
+
...customRuleRegistry,
|
|
136
|
+
});
|
|
171
137
|
validateConfig(merged);
|
|
172
138
|
return new Schedule(merged);
|
|
173
139
|
}
|
|
174
140
|
/**
|
|
175
|
-
* Create a
|
|
176
|
-
*
|
|
177
|
-
* Unlike {@link schedule}, all fields are optional. Use this for
|
|
178
|
-
* schedules that layer rules, coverage, or other config onto a
|
|
179
|
-
* complete base schedule.
|
|
180
|
-
*
|
|
181
|
-
* @example
|
|
182
|
-
* ```typescript
|
|
183
|
-
* const companyPolicy = partialSchedule({
|
|
184
|
-
* rules: [maxHoursPerWeek(40), minRestBetweenShifts(11)],
|
|
185
|
-
* });
|
|
141
|
+
* Create a schedule definition with an explicit complete rule registry.
|
|
186
142
|
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
143
|
+
* @remarks
|
|
144
|
+
* Use this when you want full control over the active rule registry, including
|
|
145
|
+
* schedules that do not include the built-in rules.
|
|
189
146
|
*
|
|
190
147
|
* @category Schedule Definition
|
|
191
148
|
*/
|
|
149
|
+
export function scheduleWithRuleRegistry(ruleRegistry, config) {
|
|
150
|
+
assertValidCpsatRuleRegistry(ruleRegistry);
|
|
151
|
+
assertNoBuiltInCpsatRuleOverrides(ruleRegistry);
|
|
152
|
+
const merged = buildMergedConfig(config, ruleRegistry);
|
|
153
|
+
validateConfig(merged);
|
|
154
|
+
return new Schedule(merged);
|
|
155
|
+
}
|
|
192
156
|
export function partialSchedule(config) {
|
|
157
|
+
const customRuleRegistry = config.ruleRegistry ?? {};
|
|
158
|
+
validateRuleRegistryExtension(customRuleRegistry);
|
|
193
159
|
const merged = buildMergedConfig({
|
|
194
160
|
roleIds: [],
|
|
195
161
|
times: {},
|
|
196
162
|
coverage: [],
|
|
197
163
|
shiftPatterns: [],
|
|
198
164
|
...config,
|
|
165
|
+
}, {
|
|
166
|
+
...builtInCpsatRuleRegistry,
|
|
167
|
+
...customRuleRegistry,
|
|
199
168
|
});
|
|
200
169
|
validateConfig(merged);
|
|
201
170
|
return new Schedule(merged);
|
|
@@ -203,7 +172,7 @@ export function partialSchedule(config) {
|
|
|
203
172
|
// ============================================================================
|
|
204
173
|
// Internal: Build merged config from user input
|
|
205
174
|
// ============================================================================
|
|
206
|
-
function buildMergedConfig(config) {
|
|
175
|
+
function buildMergedConfig(config, ruleRegistry) {
|
|
207
176
|
return {
|
|
208
177
|
roleIds: [...config.roleIds],
|
|
209
178
|
skillIds: [...(config.skillIds ?? [])],
|
|
@@ -211,7 +180,7 @@ function buildMergedConfig(config) {
|
|
|
211
180
|
coverage: [...config.coverage],
|
|
212
181
|
shiftPatterns: [...config.shiftPatterns],
|
|
213
182
|
rules: [...(config.rules ?? [])],
|
|
214
|
-
|
|
183
|
+
ruleRegistry: { ...ruleRegistry },
|
|
215
184
|
members: [...(config.members ?? [])],
|
|
216
185
|
dayOfWeek: config.dayOfWeek,
|
|
217
186
|
weekStartsOn: config.weekStartsOn,
|
|
@@ -220,15 +189,14 @@ function buildMergedConfig(config) {
|
|
|
220
189
|
// ============================================================================
|
|
221
190
|
// Internal: Validate merged config
|
|
222
191
|
// ============================================================================
|
|
192
|
+
function validateRuleRegistryExtension(ruleRegistry) {
|
|
193
|
+
assertValidCpsatRuleRegistry(ruleRegistry);
|
|
194
|
+
assertNoBuiltInCpsatRuleOverrides(ruleRegistry);
|
|
195
|
+
}
|
|
223
196
|
function validateConfig(config) {
|
|
224
197
|
const roles = new Set(config.roleIds);
|
|
225
198
|
const skills = new Set(config.skillIds);
|
|
226
|
-
|
|
227
|
-
for (const name of Object.keys(config.ruleFactories)) {
|
|
228
|
-
if (name in builtInCpsatRuleFactories) {
|
|
229
|
-
throw new Error(`Custom rule factory "${name}" conflicts with a built-in rule. Choose a different name.`);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
199
|
+
assertValidCpsatRuleRegistry(config.ruleRegistry);
|
|
232
200
|
// Validate role/skill disjointness
|
|
233
201
|
for (const skill of skills) {
|
|
234
202
|
if (roles.has(skill)) {
|
|
@@ -316,7 +284,7 @@ function mergeConfig(base, args) {
|
|
|
316
284
|
coverage: [...base.coverage],
|
|
317
285
|
shiftPatterns: [...base.shiftPatterns],
|
|
318
286
|
rules: [...base.rules],
|
|
319
|
-
|
|
287
|
+
ruleRegistry: { ...base.ruleRegistry },
|
|
320
288
|
members: [...base.members],
|
|
321
289
|
dayOfWeek: base.dayOfWeek,
|
|
322
290
|
weekStartsOn: base.weekStartsOn,
|
|
@@ -394,12 +362,12 @@ function mergeScheduleFragment(result, s) {
|
|
|
394
362
|
}
|
|
395
363
|
// Rules: additive
|
|
396
364
|
result.rules.push(...other.rules);
|
|
397
|
-
// Rule
|
|
398
|
-
for (const [name,
|
|
399
|
-
if (name in result.
|
|
400
|
-
throw new Error(`Rule
|
|
365
|
+
// Rule registry: merge, error on collision
|
|
366
|
+
for (const [name, descriptor] of Object.entries(other.ruleRegistry)) {
|
|
367
|
+
if (name in result.ruleRegistry && result.ruleRegistry[name] !== descriptor) {
|
|
368
|
+
throw new Error(`Rule registry entry "${name}" already registered. Cannot merge schedules with colliding rule registries.`);
|
|
401
369
|
}
|
|
402
|
-
result.
|
|
370
|
+
result.ruleRegistry[name] = descriptor;
|
|
403
371
|
}
|
|
404
372
|
// Members: additive, error on duplicate ID
|
|
405
373
|
const existingMemberIds = new Set(result.members.map((m) => m.id));
|
|
@@ -424,7 +392,7 @@ function mergeMembers(result, incoming) {
|
|
|
424
392
|
// ============================================================================
|
|
425
393
|
// Internal: Resolve to ModelBuilderConfig
|
|
426
394
|
// ============================================================================
|
|
427
|
-
function resolveToModelConfig(config, options) {
|
|
395
|
+
function resolveToModelConfig(config, options, strategy) {
|
|
428
396
|
const roles = new Set(config.roleIds);
|
|
429
397
|
const skills = new Set(config.skillIds);
|
|
430
398
|
const memberIds = new Set(config.members.map((m) => m.id));
|
|
@@ -455,7 +423,7 @@ function resolveToModelConfig(config, options) {
|
|
|
455
423
|
"overtime-tiered-multiplier",
|
|
456
424
|
]);
|
|
457
425
|
const hasCostRules = allRules.some((r) => costRuleNames.has(r._rule));
|
|
458
|
-
if (hasCostRules) {
|
|
426
|
+
if (strategy.type === "optimize" && hasCostRules) {
|
|
459
427
|
const missingPay = config.members.filter((m) => !m.pay).map((m) => m.id);
|
|
460
428
|
if (missingPay.length > 0) {
|
|
461
429
|
throw new Error(`Cost rules require pay data on all members. Missing pay: ${missingPay.join(", ")}`);
|
|
@@ -470,19 +438,38 @@ function resolveToModelConfig(config, options) {
|
|
|
470
438
|
schedulingPeriod: resolvedPeriod,
|
|
471
439
|
coverage: resolvedCoverage,
|
|
472
440
|
ruleConfigs,
|
|
473
|
-
|
|
474
|
-
? { ...builtInCpsatRuleFactories, ...config.ruleFactories }
|
|
475
|
-
: undefined,
|
|
441
|
+
ruleRegistry: config.ruleRegistry,
|
|
476
442
|
weekStartsOn: config.weekStartsOn,
|
|
443
|
+
solverOptions: buildSolverOptions(options),
|
|
444
|
+
strategy,
|
|
477
445
|
};
|
|
478
446
|
}
|
|
479
447
|
// ============================================================================
|
|
480
448
|
// Internal: Build SolveResult from solver response
|
|
481
449
|
// ============================================================================
|
|
482
|
-
function
|
|
450
|
+
function resolveSolveStrategy(strategy) {
|
|
451
|
+
if (strategy === undefined) {
|
|
452
|
+
return { type: "optimize" };
|
|
453
|
+
}
|
|
454
|
+
if (typeof strategy !== "object" || strategy === null || !("type" in strategy)) {
|
|
455
|
+
throw new Error("Solve strategy must be an object with a type field.");
|
|
456
|
+
}
|
|
457
|
+
const strategyType = strategy.type;
|
|
458
|
+
if (strategyType === "optimize" || strategyType === "feasibility-only") {
|
|
459
|
+
return { type: strategyType };
|
|
460
|
+
}
|
|
461
|
+
throw new Error(`Unknown solve strategy "${String(strategyType)}".`);
|
|
462
|
+
}
|
|
463
|
+
function buildSolverOptions(options) {
|
|
464
|
+
if (options.timeLimitSeconds === undefined) {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
return { timeLimitSeconds: options.timeLimitSeconds };
|
|
468
|
+
}
|
|
469
|
+
function mapSolverStatus(solverStatus, strategy) {
|
|
483
470
|
switch (solverStatus) {
|
|
484
471
|
case "OPTIMAL":
|
|
485
|
-
return "optimal";
|
|
472
|
+
return strategy.type === "feasibility-only" ? "feasible" : "optimal";
|
|
486
473
|
case "FEASIBLE":
|
|
487
474
|
return "feasible";
|
|
488
475
|
case "INFEASIBLE":
|
|
@@ -494,13 +481,23 @@ function mapSolverStatus(solverStatus) {
|
|
|
494
481
|
return "no_solution";
|
|
495
482
|
}
|
|
496
483
|
}
|
|
497
|
-
function buildSolveResult(response, compiled, config) {
|
|
498
|
-
const status = mapSolverStatus(response.status);
|
|
499
|
-
const
|
|
484
|
+
function buildSolveResult(response, compiled, config, strategy) {
|
|
485
|
+
const status = mapSolverStatus(response.status, strategy);
|
|
486
|
+
const hasFinalSolution = status === "optimal" || status === "feasible";
|
|
487
|
+
const parsed = hasFinalSolution
|
|
488
|
+
? parseSolverResponse(response)
|
|
489
|
+
: {
|
|
490
|
+
status: response.status,
|
|
491
|
+
assignments: [],
|
|
492
|
+
statistics: response.statistics,
|
|
493
|
+
error: response.error,
|
|
494
|
+
};
|
|
495
|
+
compiled.builder.reporter.analyzeSolution(response, {
|
|
496
|
+
analyzeSoftConstraints: strategy.type === "optimize",
|
|
497
|
+
});
|
|
500
498
|
// Run post-solve validation when a solution exists
|
|
501
|
-
if (parsed.assignments.length > 0 &&
|
|
499
|
+
if (parsed.assignments.length > 0 && hasFinalSolution && strategy.type === "optimize") {
|
|
502
500
|
const resolved = resolveAssignments(parsed.assignments, compiled.builder.shiftPatterns);
|
|
503
|
-
compiled.builder.reporter.analyzeSolution(response);
|
|
504
501
|
compiled.builder.validateSolution(resolved);
|
|
505
502
|
}
|
|
506
503
|
const validation = compiled.builder.reporter.getValidation();
|
|
@@ -509,14 +506,16 @@ function buildSolveResult(response, compiled, config) {
|
|
|
509
506
|
assignments: parsed.assignments,
|
|
510
507
|
validation,
|
|
511
508
|
};
|
|
512
|
-
// Compute cost breakdown when cost
|
|
513
|
-
if (parsed.assignments.length > 0 &&
|
|
514
|
-
const
|
|
515
|
-
if (
|
|
509
|
+
// Compute cost breakdown when cost artifacts are present and a solution was found
|
|
510
|
+
if (parsed.assignments.length > 0 && hasFinalSolution && strategy.type === "optimize") {
|
|
511
|
+
const hasCostArtifacts = compiled.builder.rules.some((rule) => rule.artifacts.some((artifact) => artifact.kind === "cost"));
|
|
512
|
+
if (hasCostArtifacts) {
|
|
516
513
|
result.cost = calculateScheduleCost(parsed.assignments, {
|
|
517
514
|
members: config.members,
|
|
518
515
|
shiftPatterns: config.shiftPatterns,
|
|
519
516
|
rules: compiled.builder.rules,
|
|
517
|
+
days: compiled.builder.days,
|
|
518
|
+
weekStartsOn: compiled.builder.weekStartsOn,
|
|
520
519
|
});
|
|
521
520
|
}
|
|
522
521
|
}
|
|
@@ -581,8 +580,18 @@ function buildSimpleCoverageTarget(entry, base, roles, skills) {
|
|
|
581
580
|
/**
|
|
582
581
|
* Build a VariantCoverageRequirement from a variant-form CoverageEntry.
|
|
583
582
|
*/
|
|
583
|
+
function requireCoverageVariants(entry) {
|
|
584
|
+
if (!entry.variants || entry.variants.length === 0) {
|
|
585
|
+
throw new Error(`Coverage entry for "${entry.timeName}" must define at least one variant.`);
|
|
586
|
+
}
|
|
587
|
+
const first = entry.variants[0];
|
|
588
|
+
if (!first) {
|
|
589
|
+
throw new Error(`Coverage entry for "${entry.timeName}" must define at least one variant.`);
|
|
590
|
+
}
|
|
591
|
+
return [first, ...entry.variants.slice(1)];
|
|
592
|
+
}
|
|
584
593
|
function buildVariantCoverageRequirement(entry, roles, skills) {
|
|
585
|
-
const variants = entry
|
|
594
|
+
const variants = requireCoverageVariants(entry);
|
|
586
595
|
const resolveTarget = () => {
|
|
587
596
|
if (Array.isArray(entry.target)) {
|
|
588
597
|
return { roleIds: entry.target };
|