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,185 +1,173 @@
1
+ import { defineRuleDescriptor } from "../rule-descriptor.js";
1
2
  import { COST_CATEGORY } from "../cost.js";
2
3
  import { OBJECTIVE_WEIGHTS, splitIntoWeeks } from "../utils.js";
3
- import { entityScope, timeScope, parseEntityScope, parseTimeScope, resolveMembersFromScope, resolveActiveDaysFromScope, } from "./scope.types.js";
4
- import { getHourlyRate, getSalariedPay, patternDurationMinutes } from "./cost-utils.js";
4
+ import { entityScope, parseEntityScope, parseTimeScope, resolveActiveDaysFromScope, resolveMembersFromScope, timeScope, } from "./scope.types.js";
5
+ import { getHourlyRate, getSalariedPay } from "./cost-utils.js";
6
+ import { patternDurationMinutes } from "./pattern-time.js";
5
7
  const MinimizeCostSchema = entityScope(["members", "roles", "skills"]).and(timeScope(["dateRange", "specificDates", "dayOfWeek", "recurring"]));
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 function createMinimizeCostRule(config) {
22
- const parsed = MinimizeCostSchema.parse(config);
23
- const entityScopeValue = parseEntityScope(parsed);
24
- const timeScopeValue = parseTimeScope(parsed);
25
- let resolvedWeekStartsOn = "monday";
26
- return {
27
- compile(b) {
28
- resolvedWeekStartsOn = b.weekStartsOn;
29
- const targetMembers = resolveMembersFromScope(entityScopeValue, b.members);
30
- const activeDays = resolveActiveDaysFromScope(timeScopeValue, b.days);
31
- if (targetMembers.length === 0 || activeDays.length === 0)
32
- return;
33
- // Compute normalization factor: max raw cost of any single assignment
34
- // (hourly) or weekly salary (salaried)
35
- let maxRawCost = 0;
36
- for (const member of targetMembers) {
37
- const rate = getHourlyRate(member);
38
- if (rate !== undefined) {
39
- for (const pattern of b.shiftPatterns) {
40
- if (!b.canAssign(member, pattern))
41
- continue;
42
- const duration = patternDurationMinutes(pattern);
43
- const rawCost = (rate * duration) / 60;
44
- if (rawCost > maxRawCost)
45
- maxRawCost = rawCost;
46
- }
47
- }
48
- const salaried = getSalariedPay(member);
49
- if (salaried !== undefined) {
50
- const weeklyCost = salaried.annual / 52;
51
- if (weeklyCost > maxRawCost)
52
- maxRawCost = weeklyCost;
53
- }
54
- }
55
- if (maxRawCost === 0)
56
- return;
57
- const normalizationFactor = maxRawCost / OBJECTIVE_WEIGHTS.COST;
58
- b.costContext = {
59
- normalizationFactor,
60
- active: true,
61
- };
62
- // Add penalty terms for hourly members
63
- for (const member of targetMembers) {
64
- const rate = getHourlyRate(member);
65
- if (rate !== undefined) {
66
- for (const pattern of b.shiftPatterns) {
67
- if (!b.canAssign(member, pattern))
68
- continue;
69
- for (const day of activeDays) {
70
- if (!b.patternAvailableOnDay(pattern, day))
8
+ export const minimizeCostRuleDescriptor = defineRuleDescriptor({
9
+ name: "minimize-cost",
10
+ schema: MinimizeCostSchema,
11
+ compile(config) {
12
+ const entityScopeValue = parseEntityScope(config);
13
+ const timeScopeValue = parseTimeScope(config);
14
+ let resolvedWeekStartsOn = "monday";
15
+ const costArtifact = {
16
+ kind: "cost",
17
+ validation: {
18
+ strategy: "skip",
19
+ category: "no-meaningful-feedback",
20
+ rationale: "Cost optimization influences the objective and contributes post-solve accounting, not validation feedback.",
21
+ },
22
+ compileObjective(builder) {
23
+ resolvedWeekStartsOn = builder.weekStartsOn;
24
+ const targetMembers = resolveMembersFromScope(entityScopeValue, builder.members);
25
+ const activeDays = resolveActiveDaysFromScope(timeScopeValue, builder.days);
26
+ if (targetMembers.length === 0 || activeDays.length === 0)
27
+ return;
28
+ let maxRawCost = 0;
29
+ for (const member of targetMembers) {
30
+ const rate = getHourlyRate(member);
31
+ if (rate !== undefined) {
32
+ for (const pattern of builder.shiftPatterns) {
33
+ if (!builder.canAssign(member, pattern))
71
34
  continue;
72
35
  const duration = patternDurationMinutes(pattern);
73
36
  const rawCost = (rate * duration) / 60;
74
- const normalizedPenalty = rawCost / normalizationFactor;
75
- b.addPenalty(b.assignment(member.id, pattern.id, day), Math.max(1, normalizedPenalty));
37
+ if (rawCost > maxRawCost)
38
+ maxRawCost = rawCost;
76
39
  }
77
40
  }
78
- continue;
41
+ const salaried = getSalariedPay(member);
42
+ if (salaried !== undefined) {
43
+ const weeklyCost = salaried.annual / 52;
44
+ if (weeklyCost > maxRawCost)
45
+ maxRawCost = weeklyCost;
46
+ }
79
47
  }
80
- // Salaried members: weekly fixed cost when active
81
- const salaried = getSalariedPay(member);
82
- if (salaried === undefined)
83
- continue;
84
- const weeklyCost = salaried.annual / 52;
85
- const normalizedWeeklyCost = weeklyCost / normalizationFactor;
86
- const weeks = splitIntoWeeks(activeDays, b.weekStartsOn);
87
- for (const [weekIdx, weekDays] of weeks.entries()) {
88
- // Collect all assignment vars for this member this week
89
- const weekAssignmentVars = [];
90
- for (const day of weekDays) {
91
- for (const pattern of b.shiftPatterns) {
92
- if (!b.canAssign(member, pattern))
48
+ if (maxRawCost === 0)
49
+ return;
50
+ const normalizationFactor = maxRawCost / OBJECTIVE_WEIGHTS.COST;
51
+ builder.costContext = {
52
+ normalizationFactor,
53
+ active: true,
54
+ };
55
+ for (const member of targetMembers) {
56
+ const rate = getHourlyRate(member);
57
+ if (rate !== undefined) {
58
+ for (const pattern of builder.shiftPatterns) {
59
+ if (!builder.canAssign(member, pattern))
93
60
  continue;
94
- if (!b.patternAvailableOnDay(pattern, day))
95
- continue;
96
- weekAssignmentVars.push(b.assignment(member.id, pattern.id, day));
61
+ for (const day of activeDays) {
62
+ if (!builder.patternAvailableOnDay(pattern, day))
63
+ continue;
64
+ const duration = patternDurationMinutes(pattern);
65
+ const rawCost = (rate * duration) / 60;
66
+ const normalizedPenalty = rawCost / normalizationFactor;
67
+ builder.addPenalty(builder.assignment(member.id, pattern.id, day), Math.max(1, normalizedPenalty));
68
+ }
97
69
  }
70
+ continue;
98
71
  }
99
- if (weekAssignmentVars.length === 0)
72
+ const salaried = getSalariedPay(member);
73
+ if (salaried === undefined)
100
74
  continue;
101
- // Bool var: true if this salaried member works any shift this week
102
- const activeVar = b.boolVar(`active:cost:${member.id}:w${weekIdx}`);
103
- // If any assignment is true, activeVar must be true
104
- // activeVar OR NOT(assignment_1) OR NOT(assignment_2) OR ...
105
- // This is equivalent to: for each assignment, assignment => activeVar
106
- for (const assignVar of weekAssignmentVars) {
107
- b.addImplication(assignVar, activeVar);
75
+ const weeklyCost = salaried.annual / 52;
76
+ const normalizedWeeklyCost = weeklyCost / normalizationFactor;
77
+ const weeks = splitIntoWeeks(activeDays, builder.weekStartsOn);
78
+ for (const [weekIndex, weekDays] of weeks.entries()) {
79
+ const weekAssignmentVars = [];
80
+ for (const day of weekDays) {
81
+ for (const pattern of builder.shiftPatterns) {
82
+ if (!builder.canAssign(member, pattern))
83
+ continue;
84
+ if (!builder.patternAvailableOnDay(pattern, day))
85
+ continue;
86
+ weekAssignmentVars.push(builder.assignment(member.id, pattern.id, day));
87
+ }
88
+ }
89
+ if (weekAssignmentVars.length === 0)
90
+ continue;
91
+ const activeVar = builder.boolVar(`active:cost:${member.id}:w${weekIndex}`);
92
+ for (const assignVar of weekAssignmentVars) {
93
+ builder.addLinear([
94
+ { var: activeVar, coeff: 1 },
95
+ { var: assignVar, coeff: -1 },
96
+ ], ">=", 0);
97
+ }
98
+ builder.addPenalty(activeVar, Math.max(1, Math.round(normalizedWeeklyCost)));
108
99
  }
109
- b.addPenalty(activeVar, Math.max(1, Math.round(normalizedWeeklyCost)));
110
- }
111
- }
112
- },
113
- cost(assignments, members, shiftPatterns) {
114
- const memberMap = new Map(members.map((m) => [m.id, m]));
115
- const patternMap = new Map(shiftPatterns.map((p) => [p.id, p]));
116
- const allDays = [...new Set(assignments.map((a) => a.day))].toSorted();
117
- const activeDays = new Set(resolveActiveDaysFromScope(timeScopeValue, allDays));
118
- const targetMemberIds = new Set(resolveMembersFromScope(entityScopeValue, [...members]).map((m) => m.id));
119
- const entries = [];
120
- // Track which salaried members are active per week for weekly cost
121
- const salariedWeekActive = new Map();
122
- for (const a of assignments) {
123
- if (!activeDays.has(a.day))
124
- continue;
125
- if (!targetMemberIds.has(a.memberId))
126
- continue;
127
- const member = memberMap.get(a.memberId);
128
- if (!member)
129
- continue;
130
- const pattern = patternMap.get(a.shiftPatternId);
131
- if (!pattern)
132
- continue;
133
- const duration = patternDurationMinutes(pattern);
134
- const rate = getHourlyRate(member);
135
- if (rate !== undefined) {
136
- entries.push({
137
- memberId: a.memberId,
138
- day: a.day,
139
- category: COST_CATEGORY.BASE,
140
- amount: (rate * duration) / 60,
141
- });
142
- continue;
143
100
  }
144
- // Salaried: track weeks with assignments
145
- const salaried = getSalariedPay(member);
146
- if (salaried === undefined)
147
- continue;
148
- let days = salariedWeekActive.get(a.memberId);
149
- if (!days) {
150
- days = new Set();
151
- salariedWeekActive.set(a.memberId, days);
152
- }
153
- days.add(a.day);
154
- }
155
- // Compute salaried costs: weekly salary distributed across active days
156
- for (const [memberId, activeDaysSet] of salariedWeekActive) {
157
- const member = memberMap.get(memberId);
158
- if (!member)
159
- continue;
160
- const salaried = getSalariedPay(member);
161
- if (!salaried)
162
- continue;
163
- const activeList = [...activeDaysSet].toSorted();
164
- const weeks = splitIntoWeeks(activeList, resolvedWeekStartsOn);
165
- for (const weekDays of weeks) {
166
- if (weekDays.length === 0)
101
+ },
102
+ calculateCost(assignments, costContext) {
103
+ const memberMap = new Map(costContext.members.map((member) => [member.id, member]));
104
+ const patternMap = new Map(costContext.shiftPatterns.map((pattern) => [pattern.id, pattern]));
105
+ const activeDays = new Set(resolveActiveDaysFromScope(timeScopeValue, [...costContext.days]).map((day) => day.iso));
106
+ const targetMemberIds = new Set(resolveMembersFromScope(entityScopeValue, [...costContext.members]).map((member) => member.id));
107
+ const entries = [];
108
+ const salariedWeekActive = new Map();
109
+ for (const assignment of assignments) {
110
+ if (!activeDays.has(assignment.day) || !targetMemberIds.has(assignment.memberId))
167
111
  continue;
168
- const weeklyCost = salaried.annual / 52;
169
- // Distribute evenly across days worked that week
170
- const perDay = weeklyCost / weekDays.length;
171
- for (const day of weekDays) {
112
+ const member = memberMap.get(assignment.memberId);
113
+ if (!member)
114
+ continue;
115
+ const pattern = patternMap.get(assignment.shiftPatternId);
116
+ if (!pattern)
117
+ continue;
118
+ const duration = patternDurationMinutes(pattern);
119
+ const rate = getHourlyRate(member);
120
+ if (rate !== undefined) {
172
121
  entries.push({
173
- memberId,
174
- day,
122
+ memberId: assignment.memberId,
123
+ day: assignment.day,
175
124
  category: COST_CATEGORY.BASE,
176
- amount: perDay,
125
+ amount: (rate * duration) / 60,
177
126
  });
127
+ continue;
128
+ }
129
+ const salaried = getSalariedPay(member);
130
+ if (salaried === undefined)
131
+ continue;
132
+ let memberDays = salariedWeekActive.get(assignment.memberId);
133
+ if (!memberDays) {
134
+ memberDays = new Set();
135
+ salariedWeekActive.set(assignment.memberId, memberDays);
136
+ }
137
+ memberDays.add(assignment.day);
138
+ }
139
+ for (const [memberId, activeDaysSet] of salariedWeekActive) {
140
+ const member = memberMap.get(memberId);
141
+ if (!member)
142
+ continue;
143
+ const salaried = getSalariedPay(member);
144
+ if (!salaried)
145
+ continue;
146
+ const activeDateSet = new Set(activeDaysSet);
147
+ const activeList = costContext.days.filter((day) => activeDateSet.has(day.iso));
148
+ const weeks = splitIntoWeeks(activeList, resolvedWeekStartsOn);
149
+ for (const weekDays of weeks) {
150
+ if (weekDays.length === 0)
151
+ continue;
152
+ const weeklyCost = salaried.annual / 52;
153
+ const perDay = weeklyCost / weekDays.length;
154
+ for (const day of weekDays) {
155
+ entries.push({
156
+ memberId,
157
+ day: day.iso,
158
+ category: COST_CATEGORY.BASE,
159
+ amount: perDay,
160
+ });
161
+ }
178
162
  }
179
163
  }
180
- }
181
- return { entries };
182
- },
183
- };
184
- }
164
+ return { entries };
165
+ },
166
+ };
167
+ return {
168
+ rule: "minimize-cost",
169
+ artifacts: [costArtifact],
170
+ };
171
+ },
172
+ });
185
173
  //# sourceMappingURL=minimize-cost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"minimize-cost.js","sourceRoot":"","sources":["../../../src/cpsat/rules/minimize-cost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"minimize-cost.js","sourceRoot":"","sources":["../../../src/cpsat/rules/minimize-cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as z from "zod";
2
+ export declare const MustAssignSchema: z.ZodIntersection<z.ZodObject<{
3
+ weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
4
+ }, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>;
5
+ /**
6
+ * Configuration for {@link mustAssignRuleDescriptor}.
7
+ */
8
+ export type MustAssignConfig = z.infer<typeof MustAssignSchema>;
9
+ export declare const mustAssignRuleDescriptor: import("../rule-descriptor.js").RuleDescriptor<"must-assign", {
10
+ weekStartsOn?: "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday" | "sunday" | undefined;
11
+ } & import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">>;
12
+ //# sourceMappingURL=must-assign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"must-assign.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAgBzB,eAAO,MAAM,gBAAgB;;iOAIsB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,wBAAwB;;+EA2CnC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import * as z from "zod";
2
+ import { DayOfWeekSchema } from "../../types.js";
3
+ import { defineRuleDescriptor } from "../rule-descriptor.js";
4
+ import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
5
+ import { entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
6
+ import { assignmentTermsForDays } from "./assignment-terms.js";
7
+ import { reportValidation, softConstraint } from "./artifacts.js";
8
+ /** Internally always HIGH. Not user-configurable. */
9
+ const MUST_ASSIGN_PENALTY = priorityToPenalty("HIGH");
10
+ export const MustAssignSchema = z
11
+ .object({
12
+ weekStartsOn: DayOfWeekSchema.optional(),
13
+ })
14
+ .and(entityScope(["members", "roles", "skills"]));
15
+ export const mustAssignRuleDescriptor = defineRuleDescriptor({
16
+ name: "must-assign",
17
+ schema: MustAssignSchema,
18
+ compile(config, ctx) {
19
+ const scope = parseEntityScope(config);
20
+ const { weekStartsOn } = config;
21
+ const group = ruleGroup("must-assign", "Must assign", scope);
22
+ const members = resolveMembersFromScope(scope, [...ctx.members]);
23
+ const weeks = splitIntoWeeks([...ctx.days], weekStartsOn ?? ctx.weekStartsOn);
24
+ const artifacts = members.flatMap((member) => weeks.flatMap((weekDays) => {
25
+ const weekStart = weekDays[0];
26
+ if (!weekStart)
27
+ return [];
28
+ const terms = assignmentTermsForDays(member, weekDays, ctx.shiftPatterns, () => 1);
29
+ if (terms.length === 0)
30
+ return [];
31
+ const description = `${member.id} not assigned in week starting ${weekStart.iso} (staffing obligation)`;
32
+ const context = { memberIds: [member.id], days: weekDays.map((day) => day.iso) };
33
+ const constraintId = `must-assign:${member.id}:${weekStart.iso}`;
34
+ return [
35
+ softConstraint({
36
+ group,
37
+ description,
38
+ context,
39
+ validation: reportValidation(),
40
+ terms,
41
+ comparator: ">=",
42
+ targetValue: 1,
43
+ penalty: MUST_ASSIGN_PENALTY,
44
+ constraintId,
45
+ }),
46
+ ];
47
+ }));
48
+ return {
49
+ rule: "must-assign",
50
+ artifacts,
51
+ };
52
+ },
53
+ });
54
+ //# sourceMappingURL=must-assign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"must-assign.js","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,12 @@
1
1
  import * as z from "zod";
2
- import type { CompilationRule } from "../model-builder.js";
3
- declare const OvertimeDailyMultiplierSchema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
2
+ export declare const OvertimeDailyMultiplierSchema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
4
3
  after: z.ZodNumber;
5
4
  factor: z.ZodNumber;
6
5
  }, z.core.$strip>, 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>>>;
7
- /** Configuration for {@link createOvertimeDailyMultiplierRule}. */
6
+ /** Configuration for {@link overtimeDailyMultiplierRuleDescriptor}. */
8
7
  export type OvertimeDailyMultiplierConfig = z.infer<typeof OvertimeDailyMultiplierSchema>;
9
- /**
10
- * Creates a daily overtime rate multiplier rule.
11
- *
12
- * Same as the weekly variant but the threshold is per day instead of per week.
13
- */
14
- export declare function createOvertimeDailyMultiplierRule(config: OvertimeDailyMultiplierConfig): CompilationRule;
15
- export {};
8
+ export declare const overtimeDailyMultiplierRuleDescriptor: import("../rule-descriptor.js").RuleDescriptor<"overtime-daily-multiplier", ({
9
+ after: number;
10
+ factor: number;
11
+ } & import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">) & import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">>;
16
12
  //# sourceMappingURL=overtime-daily-multiplier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overtime-daily-multiplier.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/overtime-daily-multiplier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AAoB7E,QAAA,MAAM,6BAA6B;;;mfAMwC,CAAC;AAE5E,mEAAmE;AACnE,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,6BAA6B,GACpC,eAAe,CAkIjB"}
1
+ {"version":3,"file":"overtime-daily-multiplier.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/overtime-daily-multiplier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAqBzB,eAAO,MAAM,6BAA6B;;;mfAMiC,CAAC;AAE5E,uEAAuE;AACvE,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE1F,eAAO,MAAM,qCAAqC;;;8LA2JhD,CAAC"}