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.
Files changed (341) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +22 -24
  3. package/dist/client.d.ts +39 -3
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js.map +1 -1
  6. package/dist/client.schemas.d.ts +118 -18
  7. package/dist/client.schemas.d.ts.map +1 -1
  8. package/dist/client.schemas.js +110 -6
  9. package/dist/client.schemas.js.map +1 -1
  10. package/dist/client.types.d.ts +63 -7
  11. package/dist/client.types.d.ts.map +1 -1
  12. package/dist/client.types.js.map +1 -1
  13. package/dist/cpsat/cost.d.ts +5 -2
  14. package/dist/cpsat/cost.d.ts.map +1 -1
  15. package/dist/cpsat/cost.js +13 -6
  16. package/dist/cpsat/cost.js.map +1 -1
  17. package/dist/cpsat/model-builder.d.ts +42 -61
  18. package/dist/cpsat/model-builder.d.ts.map +1 -1
  19. package/dist/cpsat/model-builder.js +451 -56
  20. package/dist/cpsat/model-builder.js.map +1 -1
  21. package/dist/cpsat/response.d.ts +19 -7
  22. package/dist/cpsat/response.d.ts.map +1 -1
  23. package/dist/cpsat/response.js +48 -9
  24. package/dist/cpsat/response.js.map +1 -1
  25. package/dist/cpsat/rule-descriptor.d.ts +250 -0
  26. package/dist/cpsat/rule-descriptor.d.ts.map +1 -0
  27. package/dist/cpsat/rule-descriptor.js +51 -0
  28. package/dist/cpsat/rule-descriptor.js.map +1 -0
  29. package/dist/cpsat/rules/artifacts.d.ts +9 -0
  30. package/dist/cpsat/rules/artifacts.d.ts.map +1 -0
  31. package/dist/cpsat/rules/artifacts.js +31 -0
  32. package/dist/cpsat/rules/artifacts.js.map +1 -0
  33. package/dist/cpsat/rules/assign-together.d.ts +18 -20
  34. package/dist/cpsat/rules/assign-together.d.ts.map +1 -1
  35. package/dist/cpsat/rules/assign-together.js +90 -54
  36. package/dist/cpsat/rules/assign-together.js.map +1 -1
  37. package/dist/cpsat/rules/assigned-day.d.ts +12 -0
  38. package/dist/cpsat/rules/assigned-day.d.ts.map +1 -0
  39. package/dist/cpsat/rules/assigned-day.js +43 -0
  40. package/dist/cpsat/rules/assigned-day.js.map +1 -0
  41. package/dist/cpsat/rules/assignment-priority.d.ts +15 -29
  42. package/dist/cpsat/rules/assignment-priority.d.ts.map +1 -1
  43. package/dist/cpsat/rules/assignment-priority.js +47 -50
  44. package/dist/cpsat/rules/assignment-priority.js.map +1 -1
  45. package/dist/cpsat/rules/assignment-terms.d.ts +6 -0
  46. package/dist/cpsat/rules/assignment-terms.d.ts.map +1 -0
  47. package/dist/cpsat/rules/assignment-terms.js +19 -0
  48. package/dist/cpsat/rules/assignment-terms.js.map +1 -0
  49. package/dist/cpsat/rules/concurrent-intervals.d.ts +19 -0
  50. package/dist/cpsat/rules/concurrent-intervals.d.ts.map +1 -0
  51. package/dist/cpsat/rules/concurrent-intervals.js +57 -0
  52. package/dist/cpsat/rules/concurrent-intervals.js.map +1 -0
  53. package/dist/cpsat/rules/cost-utils.d.ts +1 -3
  54. package/dist/cpsat/rules/cost-utils.d.ts.map +1 -1
  55. package/dist/cpsat/rules/cost-utils.js +0 -7
  56. package/dist/cpsat/rules/cost-utils.js.map +1 -1
  57. package/dist/cpsat/rules/day-cost-multiplier.d.ts +10 -10
  58. package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
  59. package/dist/cpsat/rules/day-cost-multiplier.js +88 -77
  60. package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
  61. package/dist/cpsat/rules/day-cost-surcharge.d.ts +10 -10
  62. package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
  63. package/dist/cpsat/rules/day-cost-surcharge.js +76 -65
  64. package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
  65. package/dist/cpsat/rules/index.d.ts +30 -21
  66. package/dist/cpsat/rules/index.d.ts.map +1 -1
  67. package/dist/cpsat/rules/index.js +30 -21
  68. package/dist/cpsat/rules/index.js.map +1 -1
  69. package/dist/cpsat/rules/location-preference.d.ts +14 -21
  70. package/dist/cpsat/rules/location-preference.d.ts.map +1 -1
  71. package/dist/cpsat/rules/location-preference.js +45 -45
  72. package/dist/cpsat/rules/location-preference.js.map +1 -1
  73. package/dist/cpsat/rules/max-concurrent-assignments.d.ts +46 -0
  74. package/dist/cpsat/rules/max-concurrent-assignments.d.ts.map +1 -0
  75. package/dist/cpsat/rules/max-concurrent-assignments.js +121 -0
  76. package/dist/cpsat/rules/max-concurrent-assignments.js.map +1 -0
  77. package/dist/cpsat/rules/max-consecutive-days.d.ts +18 -17
  78. package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
  79. package/dist/cpsat/rules/max-consecutive-days.js +67 -66
  80. package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
  81. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts +45 -0
  82. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts.map +1 -0
  83. package/dist/cpsat/rules/max-days-of-week-per-period.js +95 -0
  84. package/dist/cpsat/rules/max-days-of-week-per-period.js.map +1 -0
  85. package/dist/cpsat/rules/max-days-week.d.ts +30 -0
  86. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
  87. package/dist/cpsat/rules/max-days-week.js +83 -0
  88. package/dist/cpsat/rules/max-days-week.js.map +1 -0
  89. package/dist/cpsat/rules/max-hours-day.d.ts +14 -31
  90. package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
  91. package/dist/cpsat/rules/max-hours-day.js +56 -72
  92. package/dist/cpsat/rules/max-hours-day.js.map +1 -1
  93. package/dist/cpsat/rules/max-hours-week.d.ts +15 -31
  94. package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
  95. package/dist/cpsat/rules/max-hours-week.js +60 -75
  96. package/dist/cpsat/rules/max-hours-week.js.map +1 -1
  97. package/dist/cpsat/rules/max-shifts-day.d.ts +17 -33
  98. package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
  99. package/dist/cpsat/rules/max-shifts-day.js +57 -73
  100. package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
  101. package/dist/cpsat/rules/min-consecutive-days.d.ts +18 -18
  102. package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
  103. package/dist/cpsat/rules/min-consecutive-days.js +123 -94
  104. package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
  105. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts +35 -0
  106. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts.map +1 -0
  107. package/dist/cpsat/rules/min-days-of-week-per-period.js +108 -0
  108. package/dist/cpsat/rules/min-days-of-week-per-period.js.map +1 -0
  109. package/dist/cpsat/rules/min-days-week.d.ts +21 -0
  110. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
  111. package/dist/cpsat/rules/min-days-week.js +95 -0
  112. package/dist/cpsat/rules/min-days-week.js.map +1 -0
  113. package/dist/cpsat/rules/min-hours-day.d.ts +14 -17
  114. package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
  115. package/dist/cpsat/rules/min-hours-day.js +72 -54
  116. package/dist/cpsat/rules/min-hours-day.js.map +1 -1
  117. package/dist/cpsat/rules/min-hours-week.d.ts +15 -18
  118. package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
  119. package/dist/cpsat/rules/min-hours-week.js +75 -57
  120. package/dist/cpsat/rules/min-hours-week.js.map +1 -1
  121. package/dist/cpsat/rules/min-rest-between-shifts.d.ts +14 -17
  122. package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
  123. package/dist/cpsat/rules/min-rest-between-shifts.js +148 -138
  124. package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
  125. package/dist/cpsat/rules/minimize-cost.d.ts +2 -18
  126. package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
  127. package/dist/cpsat/rules/minimize-cost.js +151 -163
  128. package/dist/cpsat/rules/minimize-cost.js.map +1 -1
  129. package/dist/cpsat/rules/must-assign.d.ts +12 -0
  130. package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
  131. package/dist/cpsat/rules/must-assign.js +54 -0
  132. package/dist/cpsat/rules/must-assign.js.map +1 -0
  133. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts +6 -10
  134. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
  135. package/dist/cpsat/rules/overtime-daily-multiplier.js +118 -112
  136. package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
  137. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts +6 -11
  138. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
  139. package/dist/cpsat/rules/overtime-daily-surcharge.js +104 -99
  140. package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
  141. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +9 -21
  142. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
  143. package/dist/cpsat/rules/overtime-tiered-multiplier.js +181 -199
  144. package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
  145. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts +13 -12
  146. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
  147. package/dist/cpsat/rules/overtime-weekly-multiplier.js +143 -143
  148. package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
  149. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts +7 -11
  150. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
  151. package/dist/cpsat/rules/overtime-weekly-surcharge.js +124 -119
  152. package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
  153. package/dist/cpsat/rules/pattern-eligibility.d.ts +6 -0
  154. package/dist/cpsat/rules/pattern-eligibility.d.ts.map +1 -0
  155. package/dist/cpsat/rules/pattern-eligibility.js +16 -0
  156. package/dist/cpsat/rules/pattern-eligibility.js.map +1 -0
  157. package/dist/cpsat/rules/pattern-time.d.ts +5 -0
  158. package/dist/cpsat/rules/pattern-time.d.ts.map +1 -0
  159. package/dist/cpsat/rules/pattern-time.js +20 -0
  160. package/dist/cpsat/rules/pattern-time.js.map +1 -0
  161. package/dist/cpsat/rules/registry.d.ts +217 -27
  162. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  163. package/dist/cpsat/rules/registry.js +98 -31
  164. package/dist/cpsat/rules/registry.js.map +1 -1
  165. package/dist/cpsat/rules/resolver.d.ts +9 -7
  166. package/dist/cpsat/rules/resolver.d.ts.map +1 -1
  167. package/dist/cpsat/rules/resolver.js +19 -18
  168. package/dist/cpsat/rules/resolver.js.map +1 -1
  169. package/dist/cpsat/rules/role-preference.d.ts +24 -0
  170. package/dist/cpsat/rules/role-preference.d.ts.map +1 -0
  171. package/dist/cpsat/rules/role-preference.js +72 -0
  172. package/dist/cpsat/rules/role-preference.js.map +1 -0
  173. package/dist/cpsat/rules/rules.types.d.ts +93 -17
  174. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  175. package/dist/cpsat/rules/scope.types.d.ts +25 -12
  176. package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
  177. package/dist/cpsat/rules/scope.types.js +14 -19
  178. package/dist/cpsat/rules/scope.types.js.map +1 -1
  179. package/dist/cpsat/rules/target-days-week.d.ts +31 -0
  180. package/dist/cpsat/rules/target-days-week.d.ts.map +1 -0
  181. package/dist/cpsat/rules/target-days-week.js +80 -0
  182. package/dist/cpsat/rules/target-days-week.js.map +1 -0
  183. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts +33 -0
  184. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts.map +1 -0
  185. package/dist/cpsat/rules/target-peak-concurrent-assignments.js +146 -0
  186. package/dist/cpsat/rules/target-peak-concurrent-assignments.js.map +1 -0
  187. package/dist/cpsat/rules/time-cost-surcharge.d.ts +15 -14
  188. package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
  189. package/dist/cpsat/rules/time-cost-surcharge.js +82 -96
  190. package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
  191. package/dist/cpsat/rules/time-off.d.ts +21 -57
  192. package/dist/cpsat/rules/time-off.d.ts.map +1 -1
  193. package/dist/cpsat/rules/time-off.js +114 -127
  194. package/dist/cpsat/rules/time-off.js.map +1 -1
  195. package/dist/cpsat/rules/variables.d.ts +4 -0
  196. package/dist/cpsat/rules/variables.d.ts.map +1 -0
  197. package/dist/cpsat/rules/variables.js +10 -0
  198. package/dist/cpsat/rules/variables.js.map +1 -0
  199. package/dist/cpsat/rules.d.ts +20 -3
  200. package/dist/cpsat/rules.d.ts.map +1 -1
  201. package/dist/cpsat/rules.js +19 -2
  202. package/dist/cpsat/rules.js.map +1 -1
  203. package/dist/cpsat/semantic-time.d.ts +7 -6
  204. package/dist/cpsat/semantic-time.d.ts.map +1 -1
  205. package/dist/cpsat/semantic-time.js +15 -28
  206. package/dist/cpsat/semantic-time.js.map +1 -1
  207. package/dist/cpsat/types.d.ts +47 -4
  208. package/dist/cpsat/types.d.ts.map +1 -1
  209. package/dist/cpsat/types.js +24 -1
  210. package/dist/cpsat/types.js.map +1 -1
  211. package/dist/cpsat/utils.d.ts +23 -6
  212. package/dist/cpsat/utils.d.ts.map +1 -1
  213. package/dist/cpsat/utils.js +76 -15
  214. package/dist/cpsat/utils.js.map +1 -1
  215. package/dist/cpsat/validation-reporter.d.ts +6 -2
  216. package/dist/cpsat/validation-reporter.d.ts.map +1 -1
  217. package/dist/cpsat/validation-reporter.js +122 -10
  218. package/dist/cpsat/validation-reporter.js.map +1 -1
  219. package/dist/cpsat/validation.types.d.ts +21 -10
  220. package/dist/cpsat/validation.types.d.ts.map +1 -1
  221. package/dist/datetime.utils.d.ts +7 -13
  222. package/dist/datetime.utils.d.ts.map +1 -1
  223. package/dist/datetime.utils.js +29 -36
  224. package/dist/datetime.utils.js.map +1 -1
  225. package/dist/index.d.ts +15 -9
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +11 -4
  228. package/dist/index.js.map +1 -1
  229. package/dist/schedule/cost.d.ts +192 -0
  230. package/dist/schedule/cost.d.ts.map +1 -0
  231. package/dist/schedule/cost.js +151 -0
  232. package/dist/schedule/cost.js.map +1 -0
  233. package/dist/schedule/coverage.d.ts +114 -0
  234. package/dist/schedule/coverage.d.ts.map +1 -0
  235. package/dist/schedule/coverage.js +56 -0
  236. package/dist/schedule/coverage.js.map +1 -0
  237. package/dist/schedule/definition.d.ts +346 -0
  238. package/dist/schedule/definition.d.ts.map +1 -0
  239. package/dist/schedule/definition.js +668 -0
  240. package/dist/schedule/definition.js.map +1 -0
  241. package/dist/schedule/index.d.ts +67 -0
  242. package/dist/schedule/index.d.ts.map +1 -0
  243. package/dist/schedule/index.js +69 -0
  244. package/dist/schedule/index.js.map +1 -0
  245. package/dist/schedule/rules.d.ts +678 -0
  246. package/dist/schedule/rules.d.ts.map +1 -0
  247. package/dist/schedule/rules.js +554 -0
  248. package/dist/schedule/rules.js.map +1 -0
  249. package/dist/schedule/shift-patterns.d.ts +17 -0
  250. package/dist/schedule/shift-patterns.d.ts.map +1 -0
  251. package/dist/schedule/shift-patterns.js +24 -0
  252. package/dist/schedule/shift-patterns.js.map +1 -0
  253. package/dist/schedule/time-periods.d.ts +79 -0
  254. package/dist/schedule/time-periods.d.ts.map +1 -0
  255. package/dist/schedule/time-periods.js +101 -0
  256. package/dist/schedule/time-periods.js.map +1 -0
  257. package/dist/types.d.ts +67 -3
  258. package/dist/types.d.ts.map +1 -1
  259. package/dist/types.js +64 -0
  260. package/dist/types.js.map +1 -1
  261. package/package.json +8 -14
  262. package/solver/src/solver/models.py +41 -4
  263. package/solver/src/solver/solver.py +546 -157
  264. package/solver/tests/test_solver.py +363 -7
  265. package/src/client.schemas.ts +127 -10
  266. package/src/client.ts +3 -0
  267. package/src/client.types.ts +73 -7
  268. package/src/cpsat/cost.ts +17 -7
  269. package/src/cpsat/model-builder.ts +614 -129
  270. package/src/cpsat/response.ts +57 -13
  271. package/src/cpsat/rule-descriptor.ts +311 -0
  272. package/src/cpsat/rules/artifacts.ts +56 -0
  273. package/src/cpsat/rules/assign-together.ts +104 -69
  274. package/src/cpsat/rules/assigned-day.ts +70 -0
  275. package/src/cpsat/rules/assignment-priority.ts +54 -58
  276. package/src/cpsat/rules/assignment-terms.ts +43 -0
  277. package/src/cpsat/rules/concurrent-intervals.ts +93 -0
  278. package/src/cpsat/rules/cost-utils.ts +1 -9
  279. package/src/cpsat/rules/day-cost-multiplier.ts +101 -81
  280. package/src/cpsat/rules/day-cost-surcharge.ts +91 -70
  281. package/src/cpsat/rules/index.ts +30 -21
  282. package/src/cpsat/rules/location-preference.ts +47 -52
  283. package/src/cpsat/rules/max-concurrent-assignments.ts +170 -0
  284. package/src/cpsat/rules/max-consecutive-days.ts +74 -91
  285. package/src/cpsat/rules/max-days-of-week-per-period.ts +127 -0
  286. package/src/cpsat/rules/max-days-week.ts +117 -0
  287. package/src/cpsat/rules/max-hours-day.ts +64 -84
  288. package/src/cpsat/rules/max-hours-week.ts +74 -90
  289. package/src/cpsat/rules/max-shifts-day.ts +65 -85
  290. package/src/cpsat/rules/min-consecutive-days.ts +161 -127
  291. package/src/cpsat/rules/min-days-of-week-per-period.ts +144 -0
  292. package/src/cpsat/rules/min-days-week.ts +122 -0
  293. package/src/cpsat/rules/min-hours-day.ts +79 -58
  294. package/src/cpsat/rules/min-hours-week.ts +87 -62
  295. package/src/cpsat/rules/min-rest-between-shifts.ts +191 -178
  296. package/src/cpsat/rules/minimize-cost.ts +175 -188
  297. package/src/cpsat/rules/must-assign.ts +71 -0
  298. package/src/cpsat/rules/overtime-daily-multiplier.ts +158 -140
  299. package/src/cpsat/rules/overtime-daily-surcharge.ts +141 -126
  300. package/src/cpsat/rules/overtime-tiered-multiplier.ts +234 -253
  301. package/src/cpsat/rules/overtime-weekly-multiplier.ts +183 -175
  302. package/src/cpsat/rules/overtime-weekly-surcharge.ts +161 -150
  303. package/src/cpsat/rules/pattern-eligibility.ts +26 -0
  304. package/src/cpsat/rules/pattern-time.ts +30 -0
  305. package/src/cpsat/rules/registry.ts +140 -56
  306. package/src/cpsat/rules/resolver.ts +58 -30
  307. package/src/cpsat/rules/role-preference.ts +92 -0
  308. package/src/cpsat/rules/rules.types.ts +92 -17
  309. package/src/cpsat/rules/scope.types.ts +32 -27
  310. package/src/cpsat/rules/target-days-week.ts +105 -0
  311. package/src/cpsat/rules/target-peak-concurrent-assignments.ts +212 -0
  312. package/src/cpsat/rules/time-cost-surcharge.ts +116 -122
  313. package/src/cpsat/rules/time-off.ts +154 -163
  314. package/src/cpsat/rules/variables.ts +11 -0
  315. package/src/cpsat/rules.ts +43 -17
  316. package/src/cpsat/semantic-time.ts +29 -43
  317. package/src/cpsat/types.ts +53 -4
  318. package/src/cpsat/utils.ts +92 -20
  319. package/src/cpsat/validation-reporter.ts +170 -19
  320. package/src/cpsat/validation.types.ts +22 -11
  321. package/src/datetime.utils.ts +45 -44
  322. package/src/index.ts +72 -15
  323. package/src/schedule/cost.ts +221 -0
  324. package/src/schedule/coverage.ts +164 -0
  325. package/src/schedule/definition.ts +1447 -0
  326. package/src/schedule/index.ts +132 -0
  327. package/src/schedule/rules.ts +1028 -0
  328. package/src/schedule/shift-patterns.ts +29 -0
  329. package/src/schedule/time-periods.ts +120 -0
  330. package/src/types.ts +114 -2
  331. package/dist/llms.d.ts +0 -2
  332. package/dist/llms.d.ts.map +0 -1
  333. package/dist/llms.js +0 -3
  334. package/dist/llms.js.map +0 -1
  335. package/dist/schedule.d.ts +0 -917
  336. package/dist/schedule.d.ts.map +0 -1
  337. package/dist/schedule.js +0 -1323
  338. package/dist/schedule.js.map +0 -1
  339. package/llms.txt +0 -758
  340. package/src/llms.ts +0 -3
  341. package/src/schedule.ts +0 -1960
@@ -1,159 +1,169 @@
1
1
  import * as z from "zod";
2
+ import { schedulingDay } from "../../types.js";
3
+ import { defineRuleDescriptor } from "../rule-descriptor.js";
2
4
  import { normalizeEndMinutes, priorityToPenalty, timeOfDayToMinutes } from "../utils.js";
3
5
  import { PrioritySchema, entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
4
- const MinRestBetweenShiftsSchema = z
6
+ import { assignmentVar } from "./variables.js";
7
+ import { hardConstraint, reportValidation, softConstraint } from "./artifacts.js";
8
+ import { canAssignMemberToPattern, isPatternAvailableOnDay } from "./pattern-eligibility.js";
9
+ export const MinRestBetweenShiftsSchema = z
5
10
  .object({
6
11
  hours: z.number().min(0),
7
12
  priority: PrioritySchema,
8
13
  })
9
14
  .and(entityScope(["members", "roles", "skills"]));
10
15
  /**
11
- * Enforces a minimum rest period between any two shifts a person works.
16
+ * Low-level descriptor for the `min-rest-between-shifts` rule.
12
17
  *
13
- * @param config - See {@link MinRestBetweenShiftsConfig}
14
- * @example
15
- * ```ts
16
- * createMinRestBetweenShiftsRule({ hours: 10, priority: "MANDATORY" });
17
- * ```
18
+ * @category Rules
18
19
  */
19
- export function createMinRestBetweenShiftsRule(config) {
20
- const parsed = MinRestBetweenShiftsSchema.parse(config);
21
- const scope = parseEntityScope(parsed);
22
- const { hours, priority } = parsed;
23
- const minMinutes = hours * 60;
24
- const group = ruleGroup(`min-rest-between-shifts:${hours}`, `Min ${hours}h rest between shifts`, scope);
25
- return {
26
- compile(b) {
27
- const members = resolveMembersFromScope(scope, b.members);
28
- for (const emp of members) {
29
- for (let i = 0; i < b.days.length; i++) {
30
- const day1 = b.days[i];
31
- if (!day1)
20
+ export const minRestBetweenShiftsRuleDescriptor = defineRuleDescriptor({
21
+ name: "min-rest-between-shifts",
22
+ schema: MinRestBetweenShiftsSchema,
23
+ compile(config, ctx) {
24
+ const scope = parseEntityScope(config);
25
+ const { hours, priority } = config;
26
+ const minMinutes = hours * 60;
27
+ const group = ruleGroup(`min-rest-between-shifts:${hours}`, `Min ${hours}h rest between shifts`, scope);
28
+ const members = resolveMembersFromScope(scope, [...ctx.members]);
29
+ const artifacts = members.flatMap((member) => {
30
+ const memberArtifacts = [];
31
+ for (let dayIndex = 0; dayIndex < ctx.days.length; dayIndex++) {
32
+ const day1 = ctx.days[dayIndex];
33
+ if (!day1)
34
+ continue;
35
+ const checkDays = [day1];
36
+ const nextDay = ctx.days[dayIndex + 1];
37
+ if (nextDay)
38
+ checkDays.push(nextDay);
39
+ for (const pattern1 of ctx.shiftPatterns) {
40
+ if (!canAssignMemberToPattern(member, pattern1) ||
41
+ !isPatternAvailableOnDay(pattern1, day1)) {
32
42
  continue;
33
- const checkDays = [day1];
34
- const nextDay = b.days[i + 1];
35
- if (nextDay)
36
- checkDays.push(nextDay);
37
- for (const pattern1 of b.shiftPatterns) {
38
- if (!b.canAssign(emp, pattern1))
39
- continue;
40
- if (!b.patternAvailableOnDay(pattern1, day1))
41
- continue;
42
- const end1 = b.endMinutes(pattern1, day1);
43
- for (const day2 of checkDays) {
44
- if (!day2)
43
+ }
44
+ const end1 = patternEndMinutes(pattern1);
45
+ for (const day2 of checkDays) {
46
+ for (const pattern2 of ctx.shiftPatterns) {
47
+ if (!canAssignMemberToPattern(member, pattern2) ||
48
+ !isPatternAvailableOnDay(pattern2, day2) ||
49
+ (day1.iso === day2.iso && pattern1.id === pattern2.id)) {
45
50
  continue;
46
- for (const pattern2 of b.shiftPatterns) {
47
- if (!b.canAssign(emp, pattern2))
48
- continue;
49
- if (!b.patternAvailableOnDay(pattern2, day2))
50
- continue;
51
- if (day1 === day2 && pattern1.id === pattern2.id)
52
- continue;
53
- const start2 = b.startMinutes(pattern2, day2);
54
- const gap = start2 - end1;
55
- if (gap >= 0 && gap < minMinutes) {
56
- const var1 = b.assignment(emp.id, pattern1.id, day1);
57
- const var2 = b.assignment(emp.id, pattern2.id, day2);
58
- if (priority === "MANDATORY") {
59
- b.addLinear([
60
- { var: var1, coeff: 1 },
61
- { var: var2, coeff: 1 },
62
- ], "<=", 1);
63
- }
64
- else {
65
- const conflictVar = b.boolVar(`rest_conflict_${emp.id}_${pattern1.id}_${day1}_${pattern2.id}_${day2}`);
66
- b.addLinear([
67
- { var: var1, coeff: 1 },
68
- { var: var2, coeff: 1 },
69
- { var: conflictVar, coeff: -1 },
70
- ], "<=", 1);
71
- b.addLinear([
72
- { var: conflictVar, coeff: 1 },
73
- { var: var1, coeff: -1 },
74
- ], "<=", 0);
75
- b.addLinear([
76
- { var: conflictVar, coeff: 1 },
77
- { var: var2, coeff: -1 },
78
- ], "<=", 0);
79
- b.addPenalty(conflictVar, priorityToPenalty(priority));
80
- }
81
- }
51
+ }
52
+ const start2 = dayGapMinutes(day1, day2) + timeOfDayToMinutes(pattern2.startTime);
53
+ const gap = start2 - end1;
54
+ if (gap < 0 || gap >= minMinutes)
55
+ continue;
56
+ const description = `${member.id} needs ${hours}h rest between ${pattern1.id} on ${day1.iso} and ${pattern2.id} on ${day2.iso}`;
57
+ const context = { memberIds: [member.id], days: [day1.iso, day2.iso] };
58
+ const constraintId = `min-rest-between-shifts:${member.id}:${pattern1.id}:${day1.iso}:${pattern2.id}:${day2.iso}`;
59
+ const terms = [
60
+ { var: assignmentVar(member.id, pattern1.id, day1.iso), coeff: 1 },
61
+ { var: assignmentVar(member.id, pattern2.id, day2.iso), coeff: 1 },
62
+ ];
63
+ if (priority === "MANDATORY") {
64
+ memberArtifacts.push(hardConstraint({
65
+ group,
66
+ description,
67
+ context,
68
+ validation: reportValidation(constraintId),
69
+ terms,
70
+ comparator: "<=",
71
+ targetValue: 1,
72
+ }));
73
+ }
74
+ else {
75
+ memberArtifacts.push(softConstraint({
76
+ group,
77
+ description,
78
+ context,
79
+ validation: reportValidation(),
80
+ terms,
81
+ comparator: "<=",
82
+ targetValue: 1,
83
+ penalty: priorityToPenalty(priority),
84
+ constraintId,
85
+ }));
82
86
  }
83
87
  }
84
88
  }
85
89
  }
86
90
  }
87
- },
88
- validate(assignments, reporter, context) {
89
- if (priority === "MANDATORY")
90
- return;
91
- const members = resolveMembersFromScope(scope, context.members);
92
- if (members.length === 0)
93
- return;
94
- const memberIds = new Set(members.map((m) => m.id));
95
- // Group assignments by member, sort by day then start time
96
- const byMember = new Map();
97
- for (const a of assignments) {
98
- if (!memberIds.has(a.memberId))
99
- continue;
100
- const list = byMember.get(a.memberId) ?? [];
101
- list.push(a);
102
- byMember.set(a.memberId, list);
103
- }
104
- for (const [memberId, memberAssignments] of byMember) {
105
- const sorted = memberAssignments.toSorted((a, b) => {
106
- if (a.day !== b.day)
107
- return a.day < b.day ? -1 : 1;
108
- return timeOfDayToMinutes(a.startTime) - timeOfDayToMinutes(b.startTime);
109
- });
110
- let violated = false;
111
- for (let i = 0; i < sorted.length - 1; i++) {
112
- const current = sorted[i];
113
- const next = sorted[i + 1];
114
- const currentEndMin = timeOfDayToMinutes(current.endTime);
115
- const normalizedEnd = normalizeEndMinutes(timeOfDayToMinutes(current.startTime), currentEndMin);
116
- const nextStartMin = timeOfDayToMinutes(next.startTime);
117
- // Calculate gap considering day boundaries
118
- let gap;
119
- if (current.day === next.day) {
120
- gap = nextStartMin - normalizedEnd;
121
- }
122
- else {
123
- // Different days: account for the day boundary
124
- const dayDiff = daysBetween(current.day, next.day);
125
- gap = dayDiff * 24 * 60 - normalizedEnd + nextStartMin;
126
- }
127
- if (gap >= 0 && gap < minMinutes) {
128
- reporter.reportRuleViolation({
129
- rule: "min-rest-between-shifts",
130
- message: `${memberId} has ${Math.round((gap / 60) * 10) / 10}h rest between shifts on ${current.day} and ${next.day}, need ${hours}h`,
131
- context: { memberIds: [memberId], days: [current.day, next.day] },
132
- shortfall: minMinutes - gap,
133
- group,
134
- });
135
- violated = true;
136
- }
137
- }
138
- if (!violated && sorted.length > 1) {
139
- reporter.reportRulePassed({
140
- rule: "min-rest-between-shifts",
141
- message: `${memberId} has ${hours}h+ rest between all shifts`,
142
- context: {
143
- memberIds: [memberId],
144
- days: [...new Set(sorted.map((a) => a.day))],
145
- },
146
- group,
147
- });
148
- }
149
- }
150
- },
151
- };
91
+ return memberArtifacts;
92
+ });
93
+ const validatorArtifacts = priority === "MANDATORY"
94
+ ? []
95
+ : [
96
+ {
97
+ kind: "post-solve-feedback",
98
+ run(assignments, reporter, validationContext) {
99
+ const validatorMembers = resolveMembersFromScope(scope, [
100
+ ...validationContext.members,
101
+ ]);
102
+ if (validatorMembers.length === 0)
103
+ return;
104
+ const dayLookup = new Map(validationContext.days.map((day) => [day.iso, day]));
105
+ const memberIds = new Set(validatorMembers.map((member) => member.id));
106
+ const byMember = new Map();
107
+ for (const assignment of assignments) {
108
+ if (!memberIds.has(assignment.memberId))
109
+ continue;
110
+ const list = byMember.get(assignment.memberId) ?? [];
111
+ list.push(assignment);
112
+ byMember.set(assignment.memberId, list);
113
+ }
114
+ for (const [memberId, memberAssignments] of byMember) {
115
+ const sorted = [...memberAssignments].toSorted((left, right) => {
116
+ if (left.day !== right.day)
117
+ return left.day < right.day ? -1 : 1;
118
+ return timeOfDayToMinutes(left.startTime) - timeOfDayToMinutes(right.startTime);
119
+ });
120
+ let violated = false;
121
+ for (let index = 0; index < sorted.length - 1; index++) {
122
+ const current = sorted[index];
123
+ const next = sorted[index + 1];
124
+ const currentEnd = normalizeEndMinutes(timeOfDayToMinutes(current.startTime), timeOfDayToMinutes(current.endTime));
125
+ const nextStart = timeOfDayToMinutes(next.startTime);
126
+ const gap = current.day === next.day
127
+ ? nextStart - currentEnd
128
+ : daysBetween(current.day, next.day, dayLookup) * 24 * 60 -
129
+ currentEnd +
130
+ nextStart;
131
+ if (gap < 0 || gap >= minMinutes)
132
+ continue;
133
+ violated = true;
134
+ }
135
+ if (!violated && sorted.length > 1) {
136
+ reporter.reportRulePassed({
137
+ rule: "min-rest-between-shifts",
138
+ message: `${memberId} has ${hours}h+ rest between all shifts`,
139
+ context: {
140
+ memberIds: [memberId],
141
+ days: [...new Set(sorted.map((assignment) => assignment.day))],
142
+ },
143
+ group,
144
+ });
145
+ }
146
+ }
147
+ },
148
+ },
149
+ ];
150
+ return {
151
+ rule: "min-rest-between-shifts",
152
+ artifacts: [...artifacts, ...validatorArtifacts],
153
+ };
154
+ },
155
+ });
156
+ function patternEndMinutes(pattern) {
157
+ return normalizeEndMinutes(timeOfDayToMinutes(pattern.startTime), timeOfDayToMinutes(pattern.endTime));
158
+ }
159
+ function dayGapMinutes(day1, day2) {
160
+ return (day2.epochDay - day1.epochDay) * 24 * 60;
152
161
  }
153
- /** Compute day difference from YYYY-MM-DD strings. */
154
- function daysBetween(day1, day2) {
155
- const d1 = new Date(`${day1}T00:00:00Z`);
156
- const d2 = new Date(`${day2}T00:00:00Z`);
157
- return Math.round((d2.getTime() - d1.getTime()) / (24 * 60 * 60 * 1000));
162
+ function daysBetween(day1, day2, lookup) {
163
+ const left = lookup.get(day1);
164
+ const right = lookup.get(day2);
165
+ if (left && right)
166
+ return right.epochDay - left.epochDay;
167
+ return schedulingDay(day2).epochDay - schedulingDay(day1).epochDay;
158
168
  }
159
169
  //# sourceMappingURL=min-rest-between-shifts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"min-rest-between-shifts.js","sourceRoot":"","sources":["../../../src/cpsat/rules/min-rest-between-shifts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"min-rest-between-shifts.js","sourceRoot":"","sources":["../../../src/cpsat/rules/min-rest-between-shifts.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,7 @@
1
1
  import type * as z from "zod";
2
- import type { CompilationRule } from "../model-builder.js";
3
2
  declare const MinimizeCostSchema: z.ZodIntersection<z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>, z.ZodType<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown>>>;
4
- /** Configuration for {@link createMinimizeCostRule}. */
3
+ /** Configuration for {@link minimizeCostRuleDescriptor}. */
5
4
  export type MinimizeCostConfig = z.infer<typeof MinimizeCostSchema>;
6
- /**
7
- * Creates the minimize-cost rule.
8
- *
9
- * **Hourly members:** adds a penalty proportional to
10
- * `hourlyRate * shiftDurationMinutes / 60` for each assignment.
11
- *
12
- * **Salaried members:** zero marginal cost up to their contracted hours.
13
- * A boolean variable tracks whether the member has any assignment in a
14
- * given week. When active, their full weekly salary (`annual / 52`) is
15
- * added as a penalty. This causes the solver to load work onto salaried
16
- * members (who are "free" once activated) before hourly workers.
17
- *
18
- * Computes a normalization factor and stores it on the model builder's
19
- * `costContext` so modifier rules can use the same scale.
20
- */
21
- export declare function createMinimizeCostRule(config: MinimizeCostConfig): CompilationRule;
5
+ export declare const minimizeCostRuleDescriptor: import("../rule-descriptor.js").RuleDescriptor<"minimize-cost", import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills"> & import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">>;
22
6
  export {};
23
7
  //# sourceMappingURL=minimize-cost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"minimize-cost.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/minimize-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAe7E,QAAA,MAAM,kBAAkB,mfAEvB,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAuLlF"}
1
+ {"version":3,"file":"minimize-cost.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/minimize-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAiB9B,QAAA,MAAM,kBAAkB,mfAEvB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,0BAA0B,2PAyLrC,CAAC"}