perttool 0.2.0 → 0.4.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 (259) hide show
  1. package/CHANGELOG.md +81 -1
  2. package/README.md +121 -28
  3. package/dist/analysis/temporal-deadline.d.ts +59 -0
  4. package/dist/analysis/temporal-deadline.d.ts.map +1 -0
  5. package/dist/analysis/temporal-deadline.js +387 -0
  6. package/dist/analysis/temporal-deadline.js.map +1 -0
  7. package/dist/analysis/temporal-precedence.d.ts +45 -0
  8. package/dist/analysis/temporal-precedence.d.ts.map +1 -0
  9. package/dist/analysis/temporal-precedence.js +123 -0
  10. package/dist/analysis/temporal-precedence.js.map +1 -0
  11. package/dist/analysis/temporal-resource.d.ts +66 -0
  12. package/dist/analysis/temporal-resource.d.ts.map +1 -0
  13. package/dist/analysis/temporal-resource.js +292 -0
  14. package/dist/analysis/temporal-resource.js.map +1 -0
  15. package/dist/application/check.d.ts +16 -0
  16. package/dist/application/check.d.ts.map +1 -1
  17. package/dist/application/check.js +51 -0
  18. package/dist/application/check.js.map +1 -1
  19. package/dist/application/contract4.d.ts +17 -0
  20. package/dist/application/contract4.d.ts.map +1 -0
  21. package/dist/application/contract4.js +27 -0
  22. package/dist/application/contract4.js.map +1 -0
  23. package/dist/application/contract5-governance.d.ts +8 -0
  24. package/dist/application/contract5-governance.d.ts.map +1 -0
  25. package/dist/application/contract5-governance.js +12 -0
  26. package/dist/application/contract5-governance.js.map +1 -0
  27. package/dist/application/init.d.ts +3 -11
  28. package/dist/application/init.d.ts.map +1 -1
  29. package/dist/application/init.js +16 -129
  30. package/dist/application/init.js.map +1 -1
  31. package/dist/application/mutate.d.ts +19 -0
  32. package/dist/application/mutate.d.ts.map +1 -1
  33. package/dist/application/mutate.js +34 -16
  34. package/dist/application/mutate.js.map +1 -1
  35. package/dist/application/next.d.ts +2 -0
  36. package/dist/application/next.d.ts.map +1 -1
  37. package/dist/application/next.js +7 -1
  38. package/dist/application/next.js.map +1 -1
  39. package/dist/application/project.d.ts +4 -22
  40. package/dist/application/project.d.ts.map +1 -1
  41. package/dist/application/project.js +3 -51
  42. package/dist/application/project.js.map +1 -1
  43. package/dist/application/target-check.d.ts +34 -0
  44. package/dist/application/target-check.d.ts.map +1 -0
  45. package/dist/application/target-check.js +90 -0
  46. package/dist/application/target-check.js.map +1 -0
  47. package/dist/application/target-governance-init.d.ts +36 -0
  48. package/dist/application/target-governance-init.d.ts.map +1 -0
  49. package/dist/application/target-governance-init.js +185 -0
  50. package/dist/application/target-governance-init.js.map +1 -0
  51. package/dist/application/target-governance-mutation.d.ts +20 -0
  52. package/dist/application/target-governance-mutation.d.ts.map +1 -0
  53. package/dist/application/target-governance-mutation.js +175 -0
  54. package/dist/application/target-governance-mutation.js.map +1 -0
  55. package/dist/application/target-governance-project.d.ts +34 -0
  56. package/dist/application/target-governance-project.d.ts.map +1 -0
  57. package/dist/application/target-governance-project.js +80 -0
  58. package/dist/application/target-governance-project.js.map +1 -0
  59. package/dist/application/target-governance-projection.d.ts +18 -0
  60. package/dist/application/target-governance-projection.d.ts.map +1 -0
  61. package/dist/application/target-governance-projection.js +248 -0
  62. package/dist/application/target-governance-projection.js.map +1 -0
  63. package/dist/application/target-governance-write.d.ts +17 -0
  64. package/dist/application/target-governance-write.d.ts.map +1 -0
  65. package/dist/application/target-governance-write.js +55 -0
  66. package/dist/application/target-governance-write.js.map +1 -0
  67. package/dist/application/target-grammar-boundary.d.ts +22 -0
  68. package/dist/application/target-grammar-boundary.d.ts.map +1 -0
  69. package/dist/application/target-grammar-boundary.js +91 -0
  70. package/dist/application/target-grammar-boundary.js.map +1 -0
  71. package/dist/application/target-mutate.d.ts +10 -0
  72. package/dist/application/target-mutate.d.ts.map +1 -0
  73. package/dist/application/target-mutate.js +81 -0
  74. package/dist/application/target-mutate.js.map +1 -0
  75. package/dist/application/target-project.d.ts +28 -0
  76. package/dist/application/target-project.d.ts.map +1 -0
  77. package/dist/application/target-project.js +60 -0
  78. package/dist/application/target-project.js.map +1 -0
  79. package/dist/application/target-temporal-analysis.d.ts +140 -0
  80. package/dist/application/target-temporal-analysis.d.ts.map +1 -0
  81. package/dist/application/target-temporal-analysis.js +414 -0
  82. package/dist/application/target-temporal-analysis.js.map +1 -0
  83. package/dist/application/target-temporal-input.d.ts +86 -0
  84. package/dist/application/target-temporal-input.d.ts.map +1 -0
  85. package/dist/application/target-temporal-input.js +240 -0
  86. package/dist/application/target-temporal-input.js.map +1 -0
  87. package/dist/application/target-unit-migration-candidate.d.ts +60 -0
  88. package/dist/application/target-unit-migration-candidate.d.ts.map +1 -0
  89. package/dist/application/target-unit-migration-candidate.js +294 -0
  90. package/dist/application/target-unit-migration-candidate.js.map +1 -0
  91. package/dist/application/target-unit-migration-request.d.ts +35 -0
  92. package/dist/application/target-unit-migration-request.d.ts.map +1 -0
  93. package/dist/application/target-unit-migration-request.js +70 -0
  94. package/dist/application/target-unit-migration-request.js.map +1 -0
  95. package/dist/application/target-unit-migration-result.d.ts +66 -0
  96. package/dist/application/target-unit-migration-result.d.ts.map +1 -0
  97. package/dist/application/target-unit-migration-result.js +86 -0
  98. package/dist/application/target-unit-migration-result.js.map +1 -0
  99. package/dist/application/unit-migration.d.ts +16 -0
  100. package/dist/application/unit-migration.d.ts.map +1 -0
  101. package/dist/application/unit-migration.js +11 -0
  102. package/dist/application/unit-migration.js.map +1 -0
  103. package/dist/cli.js +383 -132
  104. package/dist/cli.js.map +1 -1
  105. package/dist/command/discovery.d.ts +3 -3
  106. package/dist/command/discovery.d.ts.map +1 -1
  107. package/dist/command/discovery.js +149 -22
  108. package/dist/command/discovery.js.map +1 -1
  109. package/dist/command/registry.d.ts +8 -2
  110. package/dist/command/registry.d.ts.map +1 -1
  111. package/dist/command/registry.js +14 -1
  112. package/dist/command/registry.js.map +1 -1
  113. package/dist/command/target-governance-discovery.d.ts +31 -0
  114. package/dist/command/target-governance-discovery.d.ts.map +1 -0
  115. package/dist/command/target-governance-discovery.js +390 -0
  116. package/dist/command/target-governance-discovery.js.map +1 -0
  117. package/dist/command/target-governance-usage.d.ts +22 -0
  118. package/dist/command/target-governance-usage.d.ts.map +1 -0
  119. package/dist/command/target-governance-usage.js +116 -0
  120. package/dist/command/target-governance-usage.js.map +1 -0
  121. package/dist/command/usage.d.ts +2 -0
  122. package/dist/command/usage.d.ts.map +1 -1
  123. package/dist/command/usage.js +44 -26
  124. package/dist/command/usage.js.map +1 -1
  125. package/dist/conversion/mermaid-import.d.ts.map +1 -1
  126. package/dist/conversion/mermaid-import.js +3 -2
  127. package/dist/conversion/mermaid-import.js.map +1 -1
  128. package/dist/conversion/mermaid.d.ts.map +1 -1
  129. package/dist/conversion/mermaid.js +27 -0
  130. package/dist/conversion/mermaid.js.map +1 -1
  131. package/dist/formatter/source-formatter.d.ts +12 -0
  132. package/dist/formatter/source-formatter.d.ts.map +1 -1
  133. package/dist/formatter/source-formatter.js +59 -6
  134. package/dist/formatter/source-formatter.js.map +1 -1
  135. package/dist/formatter/target-source-formatter.d.ts +9 -0
  136. package/dist/formatter/target-source-formatter.d.ts.map +1 -0
  137. package/dist/formatter/target-source-formatter.js +52 -0
  138. package/dist/formatter/target-source-formatter.js.map +1 -0
  139. package/dist/governance/authority.d.ts +21 -0
  140. package/dist/governance/authority.d.ts.map +1 -0
  141. package/dist/governance/authority.js +206 -0
  142. package/dist/governance/authority.js.map +1 -0
  143. package/dist/governance/guidance.d.ts +2 -0
  144. package/dist/governance/guidance.d.ts.map +1 -0
  145. package/dist/governance/guidance.js +2 -0
  146. package/dist/governance/guidance.js.map +1 -0
  147. package/dist/governance/source.d.ts +37 -0
  148. package/dist/governance/source.d.ts.map +1 -0
  149. package/dist/governance/source.js +103 -0
  150. package/dist/governance/source.js.map +1 -0
  151. package/dist/governance/types.d.ts +41 -0
  152. package/dist/governance/types.d.ts.map +1 -0
  153. package/dist/governance/types.js +2 -0
  154. package/dist/governance/types.js.map +1 -0
  155. package/dist/help/guide.d.ts +8 -5
  156. package/dist/help/guide.d.ts.map +1 -1
  157. package/dist/help/guide.js +1 -1
  158. package/dist/help/guide.js.map +1 -1
  159. package/dist/help/registry.d.ts.map +1 -1
  160. package/dist/help/registry.js +124 -13
  161. package/dist/help/registry.js.map +1 -1
  162. package/dist/help/target-governance-guide.d.ts +10 -0
  163. package/dist/help/target-governance-guide.d.ts.map +1 -0
  164. package/dist/help/target-governance-guide.js +57 -0
  165. package/dist/help/target-governance-guide.js.map +1 -0
  166. package/dist/index.d.ts +25 -17
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +8 -8
  169. package/dist/index.js.map +1 -1
  170. package/dist/io/safe-write.d.ts +11 -0
  171. package/dist/io/safe-write.d.ts.map +1 -1
  172. package/dist/io/safe-write.js +40 -10
  173. package/dist/io/safe-write.js.map +1 -1
  174. package/dist/io/target-safe-write.d.ts +10 -0
  175. package/dist/io/target-safe-write.d.ts.map +1 -0
  176. package/dist/io/target-safe-write.js +51 -0
  177. package/dist/io/target-safe-write.js.map +1 -0
  178. package/dist/migration/conversion.d.ts +40 -0
  179. package/dist/migration/conversion.d.ts.map +1 -0
  180. package/dist/migration/conversion.js +106 -0
  181. package/dist/migration/conversion.js.map +1 -0
  182. package/dist/migration/grammar-boundary.d.ts +20 -0
  183. package/dist/migration/grammar-boundary.d.ts.map +1 -0
  184. package/dist/migration/grammar-boundary.js +95 -0
  185. package/dist/migration/grammar-boundary.js.map +1 -0
  186. package/dist/migration/request.d.ts +79 -0
  187. package/dist/migration/request.d.ts.map +1 -0
  188. package/dist/migration/request.js +308 -0
  189. package/dist/migration/request.js.map +1 -0
  190. package/dist/model/calendar-arithmetic.d.ts +46 -0
  191. package/dist/model/calendar-arithmetic.d.ts.map +1 -0
  192. package/dist/model/calendar-arithmetic.js +236 -0
  193. package/dist/model/calendar-arithmetic.js.map +1 -0
  194. package/dist/model/calendar.d.ts +22 -0
  195. package/dist/model/calendar.d.ts.map +1 -0
  196. package/dist/model/calendar.js +83 -0
  197. package/dist/model/calendar.js.map +1 -0
  198. package/dist/model/declaration-fields.d.ts +22 -0
  199. package/dist/model/declaration-fields.d.ts.map +1 -0
  200. package/dist/model/declaration-fields.js +72 -0
  201. package/dist/model/declaration-fields.js.map +1 -0
  202. package/dist/model/exact-duration-source.d.ts +10 -0
  203. package/dist/model/exact-duration-source.d.ts.map +1 -0
  204. package/dist/model/exact-duration-source.js +69 -0
  205. package/dist/model/exact-duration-source.js.map +1 -0
  206. package/dist/model/rational.d.ts +2 -2
  207. package/dist/model/rational.d.ts.map +1 -1
  208. package/dist/model/rational.js +3 -1
  209. package/dist/model/rational.js.map +1 -1
  210. package/dist/model/syntax.d.ts +9 -2
  211. package/dist/model/syntax.d.ts.map +1 -1
  212. package/dist/model/syntax.js +20 -4
  213. package/dist/model/syntax.js.map +1 -1
  214. package/dist/model/target-calendar.d.ts +25 -0
  215. package/dist/model/target-calendar.d.ts.map +1 -0
  216. package/dist/model/target-calendar.js +56 -0
  217. package/dist/model/target-calendar.js.map +1 -0
  218. package/dist/mutation/advance.d.ts +11 -0
  219. package/dist/mutation/advance.d.ts.map +1 -1
  220. package/dist/mutation/advance.js +37 -7
  221. package/dist/mutation/advance.js.map +1 -1
  222. package/dist/mutation/milestone.d.ts +10 -1
  223. package/dist/mutation/milestone.d.ts.map +1 -1
  224. package/dist/mutation/milestone.js +77 -21
  225. package/dist/mutation/milestone.js.map +1 -1
  226. package/dist/mutation/project.d.ts +11 -1
  227. package/dist/mutation/project.d.ts.map +1 -1
  228. package/dist/mutation/project.js +117 -11
  229. package/dist/mutation/project.js.map +1 -1
  230. package/dist/mutation/target-types.d.ts +59 -0
  231. package/dist/mutation/target-types.d.ts.map +1 -0
  232. package/dist/mutation/target-types.js +2 -0
  233. package/dist/mutation/target-types.js.map +1 -0
  234. package/dist/mutation/task.d.ts +12 -1
  235. package/dist/mutation/task.d.ts.map +1 -1
  236. package/dist/mutation/task.js +108 -49
  237. package/dist/mutation/task.js.map +1 -1
  238. package/dist/mutation/types.d.ts +16 -3
  239. package/dist/mutation/types.d.ts.map +1 -1
  240. package/dist/parser/document-parser.d.ts +21 -0
  241. package/dist/parser/document-parser.d.ts.map +1 -1
  242. package/dist/parser/document-parser.js +197 -38
  243. package/dist/parser/document-parser.js.map +1 -1
  244. package/dist/recommendation/override-types.d.ts +2 -2
  245. package/dist/recommendation/override.d.ts +2 -2
  246. package/dist/recommendation/override.d.ts.map +1 -1
  247. package/dist/recommendation/override.js +49 -12
  248. package/dist/recommendation/override.js.map +1 -1
  249. package/dist/semantic/target-validator.d.ts +46 -0
  250. package/dist/semantic/target-validator.d.ts.map +1 -0
  251. package/dist/semantic/target-validator.js +130 -0
  252. package/dist/semantic/target-validator.js.map +1 -0
  253. package/dist/semantic/validator.d.ts +3 -0
  254. package/dist/semantic/validator.d.ts.map +1 -1
  255. package/dist/semantic/validator.js +78 -5
  256. package/dist/semantic/validator.js.map +1 -1
  257. package/dist/version.d.ts +1 -1
  258. package/dist/version.js +1 -1
  259. package/package.json +1 -1
@@ -0,0 +1,387 @@
1
+ import { projectRelativeCalendarValue, subtractCalendarValues, } from "../model/calendar-arithmetic.js";
2
+ import { ZERO, compare, divide, maximum, multiply, rational, } from "../model/rational.js";
3
+ import { fieldNamed } from "../model/syntax.js";
4
+ export const DEADLINE_EVALUATION_IDENTITY = Object.freeze({
5
+ id: "perttool.deadline-evaluation",
6
+ version: 1,
7
+ });
8
+ function exactValue(value, unit) {
9
+ return Object.freeze({
10
+ numerator: value.numerator,
11
+ denominator: value.denominator,
12
+ unit,
13
+ });
14
+ }
15
+ function differenceValue(value) {
16
+ return Object.freeze({
17
+ kind: value.kind,
18
+ exact: Object.freeze({
19
+ numerator: value.exact.numerator,
20
+ denominator: value.exact.denominator,
21
+ }),
22
+ });
23
+ }
24
+ function deadlineCause(cause, underlyingCause, subject, taskId = null) {
25
+ return Object.freeze({
26
+ cause,
27
+ underlyingCause,
28
+ subjectKind: subject.kind,
29
+ subjectId: subject.id,
30
+ taskId,
31
+ });
32
+ }
33
+ function declaredCalendar(value) {
34
+ if (value.kind === "date") {
35
+ return {
36
+ kind: "date",
37
+ sourceText: value.sourceText ?? "",
38
+ year: value.year,
39
+ month: value.month,
40
+ day: value.day,
41
+ };
42
+ }
43
+ return {
44
+ kind: "date_time",
45
+ sourceText: value.sourceText ?? "",
46
+ year: value.year,
47
+ month: value.month,
48
+ day: value.day,
49
+ hour: value.hour,
50
+ minute: value.minute,
51
+ second: rational(BigInt(value.second.numerator), BigInt(value.second.denominator)),
52
+ offsetMinutes: value.offsetMinutes,
53
+ };
54
+ }
55
+ function velocityFromProjection(projection) {
56
+ const value = projection.velocity;
57
+ return value === null
58
+ ? null
59
+ : {
60
+ points: {
61
+ numerator: value.points.numerator,
62
+ denominator: value.points.denominator,
63
+ },
64
+ period: {
65
+ numerator: value.period.numerator,
66
+ denominator: value.period.denominator,
67
+ },
68
+ periodUnit: value.period.unit,
69
+ };
70
+ }
71
+ function baseUnitValue(difference, projection) {
72
+ if (difference.kind === "calendar_days" &&
73
+ projection.effectiveUnit === "hour") {
74
+ return { value: null, cause: "date_anchor_has_no_clock" };
75
+ }
76
+ const effective = difference.kind === "calendar_days"
77
+ ? difference.exact
78
+ : divide(difference.exact, rational(projection.effectiveUnit === "day" ? 86400n : 3600n));
79
+ const velocity = velocityFromProjection(projection);
80
+ return {
81
+ value: projection.baseUnit === "point"
82
+ ? multiply(effective, divide(velocity.points, velocity.period))
83
+ : effective,
84
+ cause: null,
85
+ };
86
+ }
87
+ function effectiveRelative(relative, projection) {
88
+ if (projection.baseUnit !== "point")
89
+ return relative;
90
+ const velocity = velocityFromProjection(projection);
91
+ return multiply(relative, divide(velocity.period, velocity.points));
92
+ }
93
+ function currentState(subject, anchor, projection) {
94
+ if (subject.input.completionState === "complete_actual_time_unavailable") {
95
+ return Object.freeze({
96
+ state: "not_applicable",
97
+ signedWindow: null,
98
+ baseUnitWindow: null,
99
+ unavailableCauses: Object.freeze([
100
+ deadlineCause("complete_actual_time_unavailable", null, subject, subject.kind === "task" ? subject.id : null),
101
+ ]),
102
+ });
103
+ }
104
+ if (anchor === null) {
105
+ return Object.freeze({
106
+ state: "unavailable",
107
+ signedWindow: null,
108
+ baseUnitWindow: null,
109
+ unavailableCauses: Object.freeze([
110
+ deadlineCause("missing_temporal_anchor", null, subject, subject.kind === "task" ? subject.id : null),
111
+ ]),
112
+ });
113
+ }
114
+ const relationship = subtractCalendarValues(declaredCalendar(subject.input.deadline), declaredCalendar(anchor));
115
+ if (relationship.state === "unavailable") {
116
+ return Object.freeze({
117
+ state: "unavailable",
118
+ signedWindow: null,
119
+ baseUnitWindow: null,
120
+ unavailableCauses: Object.freeze([
121
+ deadlineCause(relationship.cause, null, subject, subject.kind === "task" ? subject.id : null),
122
+ ]),
123
+ });
124
+ }
125
+ const conversion = baseUnitValue(relationship.difference, projection);
126
+ const order = compare(relationship.difference.exact, ZERO);
127
+ return Object.freeze({
128
+ state: order > 0 ? "not_due" : order < 0 ? "overdue" : "due_now",
129
+ signedWindow: differenceValue(relationship.difference),
130
+ baseUnitWindow: conversion.value === null
131
+ ? null
132
+ : exactValue(conversion.value, projection.baseUnit),
133
+ unavailableCauses: conversion.cause === null
134
+ ? Object.freeze([])
135
+ : Object.freeze([
136
+ deadlineCause("margin_unit_unavailable", conversion.cause, subject, subject.kind === "task" ? subject.id : null),
137
+ ]),
138
+ });
139
+ }
140
+ function notApplicableView(subject, blockedTaskIds, optimal) {
141
+ return Object.freeze({
142
+ state: "not_applicable",
143
+ projectedCompletion: null,
144
+ forecastRelation: null,
145
+ signedMargin: null,
146
+ baseUnitMargin: null,
147
+ remainingMargin: null,
148
+ lateness: null,
149
+ assessment: null,
150
+ optimal,
151
+ conditionalOnBlocksResolved: blockedTaskIds.length > 0,
152
+ blockedTaskIds,
153
+ unavailableCauses: Object.freeze([
154
+ deadlineCause("complete_actual_time_unavailable", null, subject, subject.kind === "task" ? subject.id : null),
155
+ ]),
156
+ });
157
+ }
158
+ function unavailableView(subject, blockedTaskIds, view, underlyingCause) {
159
+ return Object.freeze({
160
+ state: "unavailable",
161
+ projectedCompletion: null,
162
+ forecastRelation: null,
163
+ signedMargin: null,
164
+ baseUnitMargin: null,
165
+ remainingMargin: null,
166
+ lateness: null,
167
+ assessment: null,
168
+ optimal: view === "resource" ? false : null,
169
+ conditionalOnBlocksResolved: blockedTaskIds.length > 0,
170
+ blockedTaskIds,
171
+ unavailableCauses: Object.freeze([
172
+ deadlineCause(view === "precedence"
173
+ ? "precedence_projection_unavailable"
174
+ : "resource_projection_unavailable", underlyingCause, subject, subject.kind === "task" ? subject.id : null),
175
+ ]),
176
+ });
177
+ }
178
+ function deadlineView(subject, relative, schedule, view, anchor, projection, blockedTaskIds) {
179
+ if (subject.input.completionState === "complete_actual_time_unavailable") {
180
+ return notApplicableView(subject, blockedTaskIds, view === "resource" ? false : null);
181
+ }
182
+ if (schedule.state === "unavailable" || relative === null || anchor === null) {
183
+ return unavailableView(subject, blockedTaskIds, view, schedule.unavailableCauses[0]?.cause ??
184
+ (anchor === null ? "missing_temporal_anchor" : null));
185
+ }
186
+ const projected = projectRelativeCalendarValue(declaredCalendar(anchor), projection.effectiveUnit, effectiveRelative(relative, projection));
187
+ if (projected.state === "unavailable") {
188
+ return unavailableView(subject, blockedTaskIds, view, projected.unavailableCauses[0] ?? null);
189
+ }
190
+ const margin = subtractCalendarValues(declaredCalendar(subject.input.deadline), declaredCalendar(projected.value));
191
+ if (margin.state === "unavailable") {
192
+ return unavailableView(subject, blockedTaskIds, view, margin.cause);
193
+ }
194
+ const conversion = baseUnitValue(margin.difference, projection);
195
+ const sign = compare(margin.difference.exact, ZERO);
196
+ const relation = sign > 0
197
+ ? "before_deadline"
198
+ : sign < 0
199
+ ? "after_deadline"
200
+ : "on_deadline";
201
+ const base = conversion.value;
202
+ const causes = [];
203
+ for (const cause of projected.unavailableCauses) {
204
+ causes.push(deadlineCause(cause, null, subject, subject.kind === "task" ? subject.id : null));
205
+ }
206
+ if (conversion.cause !== null) {
207
+ causes.push(deadlineCause("margin_unit_unavailable", conversion.cause, subject, subject.kind === "task" ? subject.id : null));
208
+ }
209
+ return Object.freeze({
210
+ state: "available",
211
+ projectedCompletion: projected.value,
212
+ forecastRelation: relation,
213
+ signedMargin: differenceValue(margin.difference),
214
+ baseUnitMargin: base === null
215
+ ? null
216
+ : exactValue(base, projection.baseUnit),
217
+ remainingMargin: base === null
218
+ ? null
219
+ : exactValue(maximum(base, ZERO), projection.baseUnit),
220
+ lateness: base === null
221
+ ? null
222
+ : exactValue(maximum({
223
+ numerator: -base.numerator,
224
+ denominator: base.denominator,
225
+ }, ZERO), projection.baseUnit),
226
+ assessment: view === "precedence"
227
+ ? sign < 0
228
+ ? "lower_bound_late"
229
+ : "lower_bound_on_time"
230
+ : sign < 0
231
+ ? "heuristic_late"
232
+ : "heuristic_on_time",
233
+ optimal: view === "resource" ? false : null,
234
+ conditionalOnBlocksResolved: blockedTaskIds.length > 0,
235
+ blockedTaskIds,
236
+ unavailableCauses: Object.freeze(causes),
237
+ });
238
+ }
239
+ function predecessorBlockedTaskIds(document, subject) {
240
+ const incoming = new Map();
241
+ for (const declaration of document.declarations) {
242
+ if (declaration.kind === "task" || declaration.kind === "gate") {
243
+ const list = incoming.get(declaration.to) ?? [];
244
+ list.push(declaration);
245
+ incoming.set(declaration.to, list);
246
+ }
247
+ }
248
+ const blocked = new Set();
249
+ const visited = new Set();
250
+ const visit = (milestoneId) => {
251
+ if (visited.has(milestoneId))
252
+ return;
253
+ visited.add(milestoneId);
254
+ for (const edge of incoming.get(milestoneId) ?? []) {
255
+ if (edge.kind === "task" &&
256
+ fieldNamed(edge, "status")?.value === "blocked") {
257
+ blocked.add(edge.id);
258
+ }
259
+ visit(edge.from);
260
+ }
261
+ };
262
+ if (subject.kind === "task") {
263
+ if (fieldNamed(subject.declaration, "status")?.value === "blocked") {
264
+ blocked.add(subject.id);
265
+ }
266
+ visit(subject.declaration.from);
267
+ }
268
+ else {
269
+ visit(subject.id);
270
+ }
271
+ return Object.freeze([...blocked].sort());
272
+ }
273
+ function completionRelative(subject, schedule) {
274
+ if (schedule.state !== "available")
275
+ return null;
276
+ if (subject.kind === "task") {
277
+ return schedule.tasks.find(({ id }) => id === subject.id)?.finish ?? null;
278
+ }
279
+ return schedule.milestones.find(({ id }) => id === subject.id)?.reach ?? null;
280
+ }
281
+ function destinationRelationship(subject, milestoneDeadlineById) {
282
+ if (subject.kind !== "task")
283
+ return null;
284
+ const milestoneId = subject.declaration.to;
285
+ const destination = milestoneDeadlineById.get(milestoneId);
286
+ if (destination === undefined) {
287
+ return Object.freeze({ milestoneId, relation: "deadline_absent" });
288
+ }
289
+ const relationship = subtractCalendarValues(declaredCalendar(subject.input.deadline), declaredCalendar(destination.deadline));
290
+ if (relationship.state === "unavailable") {
291
+ return Object.freeze({ milestoneId, relation: "unavailable" });
292
+ }
293
+ const order = compare(relationship.difference.exact, ZERO);
294
+ return Object.freeze({
295
+ milestoneId,
296
+ relation: order < 0
297
+ ? "task_deadline_before_milestone"
298
+ : order > 0
299
+ ? "task_deadline_after_milestone"
300
+ : "same_deadline",
301
+ });
302
+ }
303
+ function combined(completionState, current, precedence, resource) {
304
+ if (completionState === "complete_actual_time_unavailable") {
305
+ return "not_applicable";
306
+ }
307
+ if (current.state === "overdue")
308
+ return "overdue";
309
+ if (precedence.assessment === "lower_bound_late") {
310
+ return "forecast_infeasible";
311
+ }
312
+ if (resource.assessment === "heuristic_late")
313
+ return "at_risk";
314
+ if (resource.assessment === "heuristic_on_time") {
315
+ return "forecast_on_time";
316
+ }
317
+ if (precedence.assessment === "lower_bound_on_time") {
318
+ return "not_proven_late";
319
+ }
320
+ return "unavailable";
321
+ }
322
+ export function evaluateTemporalDeadlines(validated, inputs, precedenceSchedule, resourceSchedule) {
323
+ if (validated.document.declarations.find(({ kind }) => kind === "project")
324
+ ?.id !== inputs.documentId ||
325
+ validated.grammarVersion !== inputs.grammarVersion) {
326
+ throw new TypeError("temporal input projection does not match the validated document");
327
+ }
328
+ const declarationById = new Map(validated.document.declarations.map((declaration) => [
329
+ `${declaration.kind}:${declaration.id}`,
330
+ declaration,
331
+ ]));
332
+ const subjects = [
333
+ ...inputs.tasks.flatMap((task) => {
334
+ if (task.deadline === null)
335
+ return [];
336
+ return [{
337
+ declaration: declarationById.get(`task:${task.taskId}`),
338
+ kind: "task",
339
+ id: task.taskId,
340
+ input: task.deadline,
341
+ }];
342
+ }),
343
+ ...inputs.milestoneDeadlines.map((milestone) => ({
344
+ declaration: declarationById.get(`milestone:${milestone.milestoneId}`),
345
+ kind: "milestone",
346
+ id: milestone.milestoneId,
347
+ input: milestone.deadline,
348
+ })),
349
+ ];
350
+ const project = validated.document.declarations.find(({ kind }) => kind === "project");
351
+ const finishId = fieldNamed(project, "finish").value;
352
+ const milestoneDeadlineById = new Map(inputs.milestoneDeadlines.map((item) => [
353
+ item.milestoneId,
354
+ item.deadline,
355
+ ]));
356
+ return Object.freeze(subjects.map((subject) => {
357
+ const blockedTaskIds = predecessorBlockedTaskIds(validated.document, subject);
358
+ const current = currentState(subject, inputs.anchor, inputs.effectiveProjection);
359
+ const precedence = deadlineView(subject, completionRelative(subject, precedenceSchedule), precedenceSchedule, "precedence", inputs.anchor, inputs.effectiveProjection, blockedTaskIds);
360
+ const resource = deadlineView(subject, completionRelative(subject, resourceSchedule), resourceSchedule, "resource", inputs.anchor, inputs.effectiveProjection, blockedTaskIds);
361
+ const roles = subject.kind === "task"
362
+ ? ["task"]
363
+ : [
364
+ "milestone",
365
+ ...(subject.id === finishId
366
+ ? ["project_finish"]
367
+ : []),
368
+ ];
369
+ return Object.freeze({
370
+ subject: Object.freeze({
371
+ kind: subject.kind,
372
+ id: subject.id,
373
+ roles: Object.freeze(roles),
374
+ }),
375
+ deadline: subject.input.deadline,
376
+ completionState: subject.input.completionState,
377
+ current,
378
+ precedence,
379
+ resource,
380
+ combinedAssessment: combined(subject.input.completionState, current, precedence, resource),
381
+ conditionalOnBlocksResolved: blockedTaskIds.length > 0,
382
+ blockedTaskIds,
383
+ destinationRelationship: destinationRelationship(subject, milestoneDeadlineById),
384
+ });
385
+ }));
386
+ }
387
+ //# sourceMappingURL=temporal-deadline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-deadline.js","sourceRoot":"","sources":["../../src/analysis/temporal-deadline.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GAGvB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,IAAI,EACJ,OAAO,EACP,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAchD,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,EAAE,EAAE,8BAAuC;IAC3C,OAAO,EAAE,CAAU;CACpB,CAAC,CAAC;AA+FH,SAAS,UAAU,CACjB,KAAe,EACf,IAAkB;IAElB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACtB,KAAyB;IAEzB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS;YAChC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;SACrC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CACpB,KAAoB,EACpB,eAA8B,EAC9B,OAAwB,EACxB,MAAM,GAAkB,IAAI;IAE5B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK;QACL,eAAe;QACf,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA0B;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,QAAQ,CACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CACjC;QACD,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAqC;IAErC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;IAClC,OAAO,KAAK,KAAK,IAAI;QACnB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,MAAM,EAAE;gBACN,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;gBACjC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;aACtC;YACD,MAAM,EAAE;gBACN,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;gBACjC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;aACtC;YACD,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;SAC9B,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CACpB,UAA8B,EAC9B,UAAqC;IAErC,IACE,UAAU,CAAC,IAAI,KAAK,eAAe;QACnC,UAAU,CAAC,aAAa,KAAK,MAAM,EACnC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,KAAK,eAAe;QACnD,CAAC,CAAC,UAAU,CAAC,KAAK;QAClB,CAAC,CAAC,MAAM,CACJ,UAAU,CAAC,KAAK,EAChB,QAAQ,CAAC,UAAU,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,MAAO,CAAC,CAAC,CAAC,KAAM,CAAC,CAChE,CAAC;IACN,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,QAAQ,KAAK,OAAO;YACpC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,QAAS,CAAC,MAAM,EAAE,QAAS,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAkB,EAClB,UAAqC;IAErC,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAE,CAAC;IACrD,OAAO,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,YAAY,CACnB,OAAwB,EACxB,MAAkC,EAClC,UAAqC;IAErC,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,kCAAkC,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,gBAAgB;YACvB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC/B,aAAa,CACX,kCAAkC,EAClC,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,aAAa;YACpB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC/B,aAAa,CACX,yBAAyB,EACzB,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IACD,MAAM,YAAY,GAAG,sBAAsB,CACzC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EACxC,gBAAgB,CAAC,MAAM,CAAC,CACzB,CAAC;IACF,IAAI,YAAY,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,aAAa;YACpB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC/B,aAAa,CACX,YAAY,CAAC,KAAK,EAClB,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAChE,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC;QACtD,cAAc,EAAE,UAAU,CAAC,KAAK,KAAK,IAAI;YACvC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC;QACrD,iBAAiB,EAAE,UAAU,CAAC,KAAK,KAAK,IAAI;YAC1C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACZ,aAAa,CACX,yBAAyB,EACzB,UAAU,CAAC,KAAK,EAChB,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;aACF,CAAC;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAwB,EACxB,cAAiC,EACjC,OAAuB;IAEvB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,gBAAgB;QACvB,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,OAAO;QACP,2BAA2B,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;QACtD,cAAc;QACd,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;YAC/B,aAAa,CACX,kCAAkC,EAClC,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACtB,OAAwB,EACxB,cAAiC,EACjC,IAA+B,EAC/B,eAA8B;IAE9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,aAAa;QACpB,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC3C,2BAA2B,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;QACtD,cAAc;QACd,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;YAC/B,aAAa,CACX,IAAI,KAAK,YAAY;gBACnB,CAAC,CAAC,mCAAmC;gBACrC,CAAC,CAAC,iCAAiC,EACrC,eAAe,EACf,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,OAAwB,EACxB,QAAyB,EACzB,QAA+D,EAC/D,IAA+B,EAC/B,MAAkC,EAClC,UAAqC,EACrC,cAAiC;IAEjC,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,kCAAkC,EAAE,CAAC;QACzE,OAAO,iBAAiB,CACtB,OAAO,EACP,cAAc,EACd,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACnC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,aAAa,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC7E,OAAO,eAAe,CACpB,OAAO,EACP,cAAc,EACd,IAAI,EACJ,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,KAAK;YAClC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,CACvD,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,4BAA4B,CAC5C,gBAAgB,CAAC,MAAM,CAAC,EACxB,UAAU,CAAC,aAAa,EACxB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CACxC,CAAC;IACF,IAAI,SAAS,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACtC,OAAO,eAAe,CACpB,OAAO,EACP,cAAc,EACd,IAAI,EACJ,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,CACvC,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,sBAAsB,CACnC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EACxC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAClC,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,eAAe,CACpB,OAAO,EACP,cAAc,EACd,IAAI,EACJ,MAAM,CAAC,KAAK,CACb,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;QACvB,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,IAAI,GAAG,CAAC;YACR,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;IAC9B,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CACT,aAAa,CACX,KAAK,EACL,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C,CACF,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CACT,aAAa,CACX,yBAAyB,EACzB,UAAU,CAAC,KAAK,EAChB,OAAO,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5C,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,WAAW;QAClB,mBAAmB,EAAE,SAAS,CAAC,KAAK;QACpC,gBAAgB,EAAE,QAAQ;QAC1B,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC;QAChD,cAAc,EAAE,IAAI,KAAK,IAAI;YAC3B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;QACzC,eAAe,EAAE,IAAI,KAAK,IAAI;YAC5B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC;QACxD,QAAQ,EAAE,IAAI,KAAK,IAAI;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,UAAU,CACR,OAAO,CACL;gBACE,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,EACD,IAAI,CACL,EACD,UAAU,CAAC,QAAQ,CACpB;QACL,UAAU,EAAE,IAAI,KAAK,YAAY;YAC/B,CAAC,CAAC,IAAI,GAAG,CAAC;gBACR,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,qBAAqB;YACzB,CAAC,CAAC,IAAI,GAAG,CAAC;gBACR,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,mBAAmB;QACzB,OAAO,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC3C,2BAA2B,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;QACtD,cAAc;QACd,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KACzC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,QAE+C,EAC/C,OAAwB;IAExB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAG,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAG,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,WAAmB,EAAQ,EAAE;QAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO;QACrC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YACnD,IACE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACpB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,EAC/C,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAK,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAwB,EACxB,QAA+D;IAE/D,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IAC5E,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AAChF,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAwB,EACxB,qBAA+D;IAE/D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,EAAG,CAAC;IAC5C,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,YAAY,GAAG,sBAAsB,CACzC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EACxC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CACvC,CAAC;IACF,IAAI,YAAY,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW;QACX,QAAQ,EAAE,KAAK,GAAG,CAAC;YACjB,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,KAAK,GAAG,CAAC;gBACT,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,eAAe;KACtB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CACf,eAAsD,EACtD,OAA6B,EAC7B,UAAwB,EACxB,QAAsB;IAEtB,IAAI,eAAe,KAAK,kCAAkC,EAAE,CAAC;QAC3D,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,UAAU,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACjD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,KAAK,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAC/D,IAAI,QAAQ,CAAC,UAAU,KAAK,mBAAmB,EAAE,CAAC;QAChD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,KAAK,qBAAqB,EAAE,CAAC;QACpD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAEmC,EACnC,MAAqC,EACrC,kBAA8C,EAC9C,gBAA0C;IAE1C,IACE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;QACpE,EAAE,EAAE,KAAK,MAAM,CAAC,UAAU;QAC5B,SAAS,CAAC,cAAc,KAAK,MAAM,CAAC,cAAc,EAClD,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnD,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE;QACvC,WAAW;KACZ,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAsB;QAClC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAAE,OAAO,EAAE,CAAC;YACtC,OAAO,CAAC;oBACN,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAE;oBACxD,IAAI,EAAE,MAAe;oBACrB,EAAE,EAAE,IAAI,CAAC,MAAM;oBACf,KAAK,EAAE,IAAI,CAAC,QAAQ;iBACrB,CAAC,CAAC;QACL,CAAC,CAAC;QACF,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC/C,WAAW,EAAE,eAAe,CAAC,GAAG,CAC9B,aAAa,SAAS,CAAC,WAAW,EAAE,CACpC;YACF,IAAI,EAAE,WAAoB;YAC1B,EAAE,EAAE,SAAS,CAAC,WAAW;YACzB,KAAK,EAAE,SAAS,CAAC,QAAQ;SAC1B,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAClD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAChC,CAAC;IACH,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAE,CAAC,KAAe,CAAC;IAChE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACnC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW;QAChB,IAAI,CAAC,QAAQ;KACd,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAsB,EAAE;QAChE,MAAM,cAAc,GAAG,yBAAyB,CAC9C,SAAS,CAAC,QAAQ,EAClB,OAAO,CACR,CAAC;QACF,MAAM,OAAO,GAAG,YAAY,CAC1B,OAAO,EACP,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,mBAAmB,CAC3B,CAAC;QACF,MAAM,UAAU,GAAG,YAAY,CAC7B,OAAO,EACP,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAC/C,kBAAkB,EAClB,YAAY,EACZ,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,mBAAmB,EAC1B,cAAc,CACf,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAC3B,OAAO,EACP,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAC7C,gBAAgB,EAChB,UAAU,EACV,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,mBAAmB,EAC1B,cAAc,CACf,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM;YACnC,CAAC,CAAC,CAAC,MAAe,CAAC;YACnB,CAAC,CAAC;gBACE,WAAoB;gBACpB,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ;oBACzB,CAAC,CAAC,CAAC,gBAAyB,CAAC;oBAC7B,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACN,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;aAC5B,CAAC;YACF,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;YAChC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe;YAC9C,OAAO;YACP,UAAU;YACV,QAAQ;YACR,kBAAkB,EAAE,QAAQ,CAC1B,OAAO,CAAC,KAAK,CAAC,eAAe,EAC7B,OAAO,EACP,UAAU,EACV,QAAQ,CACT;YACD,2BAA2B,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;YACtD,cAAc;YACd,uBAAuB,EAAE,uBAAuB,CAC9C,OAAO,EACP,qBAAqB,CACtB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { TargetTemporalCause, TargetTemporalInputProjection } from "../application/target-temporal-input.js";
2
+ import type { Rational } from "../model/rational.js";
3
+ import type { TargetGrammar3ValidatedDocument, TargetGrammar4ValidatedDocument } from "../semantic/target-validator.js";
4
+ import { type TaskStatus } from "./graph.js";
5
+ export declare const TEMPORAL_PRECEDENCE_PROJECTION_IDENTITY: Readonly<{
6
+ id: "perttool.temporal-precedence-earliest";
7
+ version: 1;
8
+ optimal: null;
9
+ }>;
10
+ export interface TemporalPrecedenceTask {
11
+ readonly id: string;
12
+ readonly status: TaskStatus;
13
+ readonly expected: Rational;
14
+ readonly sourceReached: Rational;
15
+ readonly releaseBound: Rational | null;
16
+ readonly start: Rational;
17
+ readonly finish: Rational;
18
+ readonly conditionalBlocked: boolean;
19
+ }
20
+ export interface TemporalPrecedenceMilestone {
21
+ readonly id: string;
22
+ readonly reach: Rational;
23
+ }
24
+ interface TemporalPrecedenceCommon {
25
+ readonly algorithm: typeof TEMPORAL_PRECEDENCE_PROJECTION_IDENTITY;
26
+ readonly conditionalOnBlocksResolved: boolean;
27
+ readonly blockedTaskIds: readonly string[];
28
+ readonly unavailableCauses: readonly TargetTemporalCause[];
29
+ }
30
+ export interface AvailableTemporalPrecedenceSchedule extends TemporalPrecedenceCommon {
31
+ readonly state: "available";
32
+ readonly makespan: Rational;
33
+ readonly tasks: readonly TemporalPrecedenceTask[];
34
+ readonly milestones: readonly TemporalPrecedenceMilestone[];
35
+ }
36
+ export interface UnavailableTemporalPrecedenceSchedule extends TemporalPrecedenceCommon {
37
+ readonly state: "unavailable";
38
+ readonly makespan: null;
39
+ readonly tasks: readonly TemporalPrecedenceTask[];
40
+ readonly milestones: readonly TemporalPrecedenceMilestone[];
41
+ }
42
+ export type TemporalPrecedenceSchedule = AvailableTemporalPrecedenceSchedule | UnavailableTemporalPrecedenceSchedule;
43
+ export declare function analyzeTemporalPrecedenceSchedule(validated: TargetGrammar3ValidatedDocument | TargetGrammar4ValidatedDocument, inputs: TargetTemporalInputProjection): TemporalPrecedenceSchedule;
44
+ export {};
45
+ //# sourceMappingURL=temporal-precedence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-precedence.d.ts","sourceRoot":"","sources":["../../src/analysis/temporal-precedence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC9B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EACV,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,uCAAuC;QAC9C,uCAAuC;aAClC,CAAC;;EAEV,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,uCAAuC,CAAC;IACnE,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,mCACf,SAAQ,wBAAwB;IAChC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,qCACf,SAAQ,wBAAwB;IAChC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC7D;AAED,MAAM,MAAM,0BAA0B,GAClC,mCAAmC,GACnC,qCAAqC,CAAC;AAoH1C,wBAAgB,iCAAiC,CAC/C,SAAS,EACL,+BAA+B,GAC/B,+BAA+B,EACnC,MAAM,EAAE,6BAA6B,GACpC,0BAA0B,CAoC5B"}
@@ -0,0 +1,123 @@
1
+ import { ZERO, add, maximum } from "../model/rational.js";
2
+ import { buildResidualGraph, } from "./graph.js";
3
+ export const TEMPORAL_PRECEDENCE_PROJECTION_IDENTITY = Object.freeze({
4
+ id: "perttool.temporal-precedence-earliest",
5
+ version: 1,
6
+ optimal: null,
7
+ });
8
+ function releaseInputs(graph, inputs) {
9
+ const inputById = new Map(inputs.tasks.map((task) => [task.taskId, task]));
10
+ const bounds = new Map();
11
+ const unavailableCauses = [];
12
+ for (const edge of graph.edges) {
13
+ if (edge.kind !== "task" ||
14
+ edge.status === "active" ||
15
+ edge.status === "done") {
16
+ continue;
17
+ }
18
+ const input = inputById.get(edge.id);
19
+ if (input === undefined) {
20
+ throw new Error(`temporal input projection omitted task ${edge.id}`);
21
+ }
22
+ if (input.release.state === "unavailable") {
23
+ unavailableCauses.push(...input.release.unavailableCauses);
24
+ continue;
25
+ }
26
+ if (input.release.state !== "available" || input.release.bound === null) {
27
+ throw new Error(`unfinished task ${edge.id} has no temporal release bound`);
28
+ }
29
+ bounds.set(edge.id, {
30
+ numerator: input.release.bound.numerator,
31
+ denominator: input.release.bound.denominator,
32
+ });
33
+ }
34
+ return {
35
+ bounds,
36
+ unavailableCauses: Object.freeze(unavailableCauses),
37
+ };
38
+ }
39
+ function schedule(graph, releaseBounds) {
40
+ const milestoneTimes = new Map();
41
+ const satisfaction = new Map();
42
+ const taskRecords = new Map();
43
+ for (const vertex of graph.topologicalOrder) {
44
+ let reach;
45
+ if (graph.frontier.includes(vertex)) {
46
+ reach = ZERO;
47
+ }
48
+ else {
49
+ const incoming = graph.incoming.get(vertex);
50
+ if (incoming.length === 0) {
51
+ throw new Error(`temporal precedence root ${vertex} is not frontier`);
52
+ }
53
+ reach = incoming.reduce((result, edge) => maximum(result, satisfaction.get(edge.id)), ZERO);
54
+ }
55
+ milestoneTimes.set(vertex, reach);
56
+ for (const edge of graph.outgoing.get(vertex)) {
57
+ if (edge.kind === "gate") {
58
+ satisfaction.set(edge.id, reach);
59
+ continue;
60
+ }
61
+ const status = edge.status;
62
+ const releaseBound = status === "planned" || status === "blocked"
63
+ ? releaseBounds.get(edge.id)
64
+ : null;
65
+ const start = status === "active" || status === "done"
66
+ ? ZERO
67
+ : maximum(reach, releaseBound);
68
+ const finish = status === "done" ? ZERO : add(start, edge.expected);
69
+ satisfaction.set(edge.id, finish);
70
+ taskRecords.set(edge.id, Object.freeze({
71
+ id: edge.id,
72
+ status,
73
+ expected: edge.expected,
74
+ sourceReached: reach,
75
+ releaseBound,
76
+ start,
77
+ finish,
78
+ conditionalBlocked: status === "blocked",
79
+ }));
80
+ }
81
+ }
82
+ return {
83
+ makespan: milestoneTimes.get(graph.finish),
84
+ tasks: Object.freeze(graph.topologicalOrder.flatMap((vertex) => graph.outgoing.get(vertex)
85
+ .filter(({ kind }) => kind === "task")
86
+ .map((edge) => taskRecords.get(edge.id)))),
87
+ milestones: Object.freeze(graph.topologicalOrder.map((id) => Object.freeze({ id, reach: milestoneTimes.get(id) }))),
88
+ };
89
+ }
90
+ export function analyzeTemporalPrecedenceSchedule(validated, inputs) {
91
+ if (validated.document.declarations.find(({ kind }) => kind === "project")
92
+ ?.id !== inputs.documentId ||
93
+ validated.grammarVersion !== inputs.grammarVersion) {
94
+ throw new TypeError("temporal input projection does not match the validated document");
95
+ }
96
+ const graph = buildResidualGraph(validated.document);
97
+ const releases = releaseInputs(graph, inputs);
98
+ const common = {
99
+ algorithm: TEMPORAL_PRECEDENCE_PROJECTION_IDENTITY,
100
+ conditionalOnBlocksResolved: graph.blockedTaskIds.length > 0,
101
+ blockedTaskIds: Object.freeze([...graph.blockedTaskIds]),
102
+ };
103
+ if (releases.unavailableCauses.length > 0) {
104
+ return Object.freeze({
105
+ ...common,
106
+ state: "unavailable",
107
+ makespan: null,
108
+ tasks: Object.freeze([]),
109
+ milestones: Object.freeze([]),
110
+ unavailableCauses: releases.unavailableCauses,
111
+ });
112
+ }
113
+ const result = schedule(graph, releases.bounds);
114
+ return Object.freeze({
115
+ ...common,
116
+ state: "available",
117
+ makespan: result.makespan,
118
+ tasks: result.tasks,
119
+ milestones: result.milestones,
120
+ unavailableCauses: Object.freeze([]),
121
+ });
122
+ }
123
+ //# sourceMappingURL=temporal-precedence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-precedence.js","sourceRoot":"","sources":["../../src/analysis/temporal-precedence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { TargetTemporalCause, TargetTemporalInputProjection } from "../application/target-temporal-input.js";
2
+ import type { Rational } from "../model/rational.js";
3
+ import type { RequirementValue } from "../model/syntax.js";
4
+ import type { TargetGrammar3ValidatedDocument, TargetGrammar4ValidatedDocument } from "../semantic/target-validator.js";
5
+ import { type TaskStatus } from "./graph.js";
6
+ export declare const TEMPORAL_RESOURCE_PROJECTION_IDENTITY: Readonly<{
7
+ id: "perttool.temporal-parallel-sgs";
8
+ version: 1;
9
+ optimal: false;
10
+ }>;
11
+ export interface TemporalResourceCapacity {
12
+ readonly id: string;
13
+ readonly declared: number;
14
+ readonly override: number | null;
15
+ readonly effective: number;
16
+ }
17
+ export interface TemporalResourceTask {
18
+ readonly id: string;
19
+ readonly status: TaskStatus;
20
+ readonly expected: Rational;
21
+ readonly sourceReached: Rational;
22
+ readonly releaseBound: Rational | null;
23
+ readonly eligibleTime: Rational;
24
+ readonly start: Rational;
25
+ readonly finish: Rational;
26
+ readonly resourceWait: Rational;
27
+ readonly requirements: readonly RequirementValue[];
28
+ readonly conditionalBlocked: boolean;
29
+ }
30
+ export interface TemporalResourceMilestone {
31
+ readonly id: string;
32
+ readonly reach: Rational;
33
+ }
34
+ interface TemporalResourceCommon {
35
+ readonly algorithm: typeof TEMPORAL_RESOURCE_PROJECTION_IDENTITY;
36
+ readonly scheduler: {
37
+ readonly id: "parallel-sgs";
38
+ readonly version: 1;
39
+ readonly optimal: false;
40
+ };
41
+ readonly conditionalOnBlocksResolved: boolean;
42
+ readonly blockedTaskIds: readonly string[];
43
+ readonly unavailableCauses: readonly TargetTemporalCause[];
44
+ }
45
+ export interface AvailableTemporalResourceSchedule extends TemporalResourceCommon {
46
+ readonly state: "available";
47
+ readonly capacities: readonly TemporalResourceCapacity[];
48
+ readonly makespan: Rational;
49
+ readonly tasks: readonly TemporalResourceTask[];
50
+ readonly milestones: readonly TemporalResourceMilestone[];
51
+ }
52
+ export interface UnavailableTemporalResourceSchedule extends TemporalResourceCommon {
53
+ readonly state: "unavailable";
54
+ readonly capacities: readonly TemporalResourceCapacity[];
55
+ readonly makespan: null;
56
+ readonly tasks: readonly TemporalResourceTask[];
57
+ readonly milestones: readonly TemporalResourceMilestone[];
58
+ }
59
+ export type TemporalResourceSchedule = AvailableTemporalResourceSchedule | UnavailableTemporalResourceSchedule;
60
+ export interface TemporalResourceOptions {
61
+ readonly capacityOverrides?: ReadonlyMap<string, number>;
62
+ readonly maxPaths?: number;
63
+ }
64
+ export declare function analyzeTemporalResourceSchedule(validated: TargetGrammar3ValidatedDocument | TargetGrammar4ValidatedDocument, inputs: TargetTemporalInputProjection, options?: TemporalResourceOptions): TemporalResourceSchedule;
65
+ export {};
66
+ //# sourceMappingURL=temporal-resource.d.ts.map