dabke 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +120 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +42 -0
- package/dist/client.js.map +1 -0
- package/dist/client.schemas.d.ts +250 -0
- package/dist/client.schemas.d.ts.map +1 -0
- package/dist/client.schemas.js +137 -0
- package/dist/client.schemas.js.map +1 -0
- package/dist/client.types.d.ts +34 -0
- package/dist/client.types.d.ts.map +1 -0
- package/dist/client.types.js +18 -0
- package/dist/client.types.js.map +1 -0
- package/dist/cpsat/model-builder.d.ts +128 -0
- package/dist/cpsat/model-builder.d.ts.map +1 -0
- package/dist/cpsat/model-builder.js +640 -0
- package/dist/cpsat/model-builder.js.map +1 -0
- package/dist/cpsat/response.d.ts +74 -0
- package/dist/cpsat/response.d.ts.map +1 -0
- package/dist/cpsat/response.js +92 -0
- package/dist/cpsat/response.js.map +1 -0
- package/dist/cpsat/rules/assign-together.d.ts +23 -0
- package/dist/cpsat/rules/assign-together.d.ts.map +1 -0
- package/dist/cpsat/rules/assign-together.js +78 -0
- package/dist/cpsat/rules/assign-together.js.map +1 -0
- package/dist/cpsat/rules/employee-assignment-priority.d.ts +64 -0
- package/dist/cpsat/rules/employee-assignment-priority.d.ts.map +1 -0
- package/dist/cpsat/rules/employee-assignment-priority.js +151 -0
- package/dist/cpsat/rules/employee-assignment-priority.js.map +1 -0
- package/dist/cpsat/rules/index.d.ts +13 -0
- package/dist/cpsat/rules/index.d.ts.map +1 -0
- package/dist/cpsat/rules/index.js +13 -0
- package/dist/cpsat/rules/index.js.map +1 -0
- package/dist/cpsat/rules/location-preference.d.ts +29 -0
- package/dist/cpsat/rules/location-preference.d.ts.map +1 -0
- package/dist/cpsat/rules/location-preference.js +59 -0
- package/dist/cpsat/rules/location-preference.js.map +1 -0
- package/dist/cpsat/rules/max-consecutive-days.d.ts +28 -0
- package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -0
- package/dist/cpsat/rules/max-consecutive-days.js +70 -0
- package/dist/cpsat/rules/max-consecutive-days.js.map +1 -0
- package/dist/cpsat/rules/max-hours-day.d.ts +57 -0
- package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -0
- package/dist/cpsat/rules/max-hours-day.js +159 -0
- package/dist/cpsat/rules/max-hours-day.js.map +1 -0
- package/dist/cpsat/rules/max-hours-week.d.ts +62 -0
- package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -0
- package/dist/cpsat/rules/max-hours-week.js +169 -0
- package/dist/cpsat/rules/max-hours-week.js.map +1 -0
- package/dist/cpsat/rules/max-shifts-day.d.ts +69 -0
- package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -0
- package/dist/cpsat/rules/max-shifts-day.js +170 -0
- package/dist/cpsat/rules/max-shifts-day.js.map +1 -0
- package/dist/cpsat/rules/min-consecutive-days.d.ts +29 -0
- package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -0
- package/dist/cpsat/rules/min-consecutive-days.js +104 -0
- package/dist/cpsat/rules/min-consecutive-days.js.map +1 -0
- package/dist/cpsat/rules/min-hours-day.d.ts +28 -0
- package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -0
- package/dist/cpsat/rules/min-hours-day.js +61 -0
- package/dist/cpsat/rules/min-hours-day.js.map +1 -0
- package/dist/cpsat/rules/min-hours-week.d.ts +29 -0
- package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -0
- package/dist/cpsat/rules/min-hours-week.js +68 -0
- package/dist/cpsat/rules/min-hours-week.js.map +1 -0
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts +28 -0
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -0
- package/dist/cpsat/rules/min-rest-between-shifts.js +95 -0
- package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -0
- package/dist/cpsat/rules/registry.d.ts +7 -0
- package/dist/cpsat/rules/registry.d.ts.map +1 -0
- package/dist/cpsat/rules/registry.js +28 -0
- package/dist/cpsat/rules/registry.js.map +1 -0
- package/dist/cpsat/rules/resolver.d.ts +31 -0
- package/dist/cpsat/rules/resolver.d.ts.map +1 -0
- package/dist/cpsat/rules/resolver.js +124 -0
- package/dist/cpsat/rules/resolver.js.map +1 -0
- package/dist/cpsat/rules/rules.types.d.ts +32 -0
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -0
- package/dist/cpsat/rules/rules.types.js +2 -0
- package/dist/cpsat/rules/rules.types.js.map +1 -0
- package/dist/cpsat/rules/scoping.d.ts +129 -0
- package/dist/cpsat/rules/scoping.d.ts.map +1 -0
- package/dist/cpsat/rules/scoping.js +190 -0
- package/dist/cpsat/rules/scoping.js.map +1 -0
- package/dist/cpsat/rules/time-off.d.ts +78 -0
- package/dist/cpsat/rules/time-off.d.ts.map +1 -0
- package/dist/cpsat/rules/time-off.js +261 -0
- package/dist/cpsat/rules/time-off.js.map +1 -0
- package/dist/cpsat/rules.d.ts +5 -0
- package/dist/cpsat/rules.d.ts.map +1 -0
- package/dist/cpsat/rules.js +4 -0
- package/dist/cpsat/rules.js.map +1 -0
- package/dist/cpsat/semantic-time.d.ts +198 -0
- package/dist/cpsat/semantic-time.d.ts.map +1 -0
- package/dist/cpsat/semantic-time.js +222 -0
- package/dist/cpsat/semantic-time.js.map +1 -0
- package/dist/cpsat/types.d.ts +180 -0
- package/dist/cpsat/types.d.ts.map +1 -0
- package/dist/cpsat/types.js +2 -0
- package/dist/cpsat/types.js.map +1 -0
- package/dist/cpsat/utils.d.ts +47 -0
- package/dist/cpsat/utils.d.ts.map +1 -0
- package/dist/cpsat/utils.js +92 -0
- package/dist/cpsat/utils.js.map +1 -0
- package/dist/cpsat/validation-reporter.d.ts +54 -0
- package/dist/cpsat/validation-reporter.d.ts.map +1 -0
- package/dist/cpsat/validation-reporter.js +261 -0
- package/dist/cpsat/validation-reporter.js.map +1 -0
- package/dist/cpsat/validation.types.d.ts +141 -0
- package/dist/cpsat/validation.types.d.ts.map +1 -0
- package/dist/cpsat/validation.types.js +14 -0
- package/dist/cpsat/validation.types.js.map +1 -0
- package/dist/datetime.utils.d.ts +245 -0
- package/dist/datetime.utils.d.ts.map +1 -0
- package/dist/datetime.utils.js +372 -0
- package/dist/datetime.utils.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/llms.d.ts +5 -0
- package/dist/llms.d.ts.map +1 -0
- package/dist/llms.js +8 -0
- package/dist/llms.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/solver-container.d.ts +49 -0
- package/dist/testing/solver-container.d.ts.map +1 -0
- package/dist/testing/solver-container.js +127 -0
- package/dist/testing/solver-container.js.map +1 -0
- package/dist/types.d.ts +155 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +105 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +130 -0
- package/dist/validation.js.map +1 -0
- package/llms.txt +2188 -0
- package/package.json +76 -0
- package/solver/Dockerfile +31 -0
- package/solver/README.md +23 -0
- package/solver/pyproject.toml +28 -0
- package/solver/src/solver/__init__.py +1 -0
- package/solver/src/solver/app.py +24 -0
- package/solver/src/solver/models.py +120 -0
- package/solver/src/solver/solver.py +359 -0
- package/solver/tests/test_solver.py +156 -0
- package/solver/uv.lock +661 -0
- package/src/client.schemas.ts +163 -0
- package/src/client.ts +67 -0
- package/src/client.types.ts +66 -0
- package/src/cpsat/model-builder.ts +858 -0
- package/src/cpsat/response.ts +130 -0
- package/src/cpsat/rules/assign-together.ts +96 -0
- package/src/cpsat/rules/employee-assignment-priority.ts +182 -0
- package/src/cpsat/rules/index.ts +12 -0
- package/src/cpsat/rules/location-preference.ts +68 -0
- package/src/cpsat/rules/max-consecutive-days.ts +98 -0
- package/src/cpsat/rules/max-hours-day.ts +187 -0
- package/src/cpsat/rules/max-hours-week.ts +197 -0
- package/src/cpsat/rules/max-shifts-day.ts +198 -0
- package/src/cpsat/rules/min-consecutive-days.ts +140 -0
- package/src/cpsat/rules/min-hours-day.ts +69 -0
- package/src/cpsat/rules/min-hours-week.ts +77 -0
- package/src/cpsat/rules/min-rest-between-shifts.ts +121 -0
- package/src/cpsat/rules/registry.ts +49 -0
- package/src/cpsat/rules/resolver.ts +181 -0
- package/src/cpsat/rules/rules.types.ts +41 -0
- package/src/cpsat/rules/scoping.ts +340 -0
- package/src/cpsat/rules/time-off.ts +336 -0
- package/src/cpsat/rules.ts +27 -0
- package/src/cpsat/semantic-time.ts +463 -0
- package/src/cpsat/types.ts +194 -0
- package/src/cpsat/utils.ts +105 -0
- package/src/cpsat/validation-reporter.ts +366 -0
- package/src/cpsat/validation.types.ts +185 -0
- package/src/datetime.utils.ts +426 -0
- package/src/errors.ts +17 -0
- package/src/index.ts +289 -0
- package/src/llms.ts +9 -0
- package/src/testing/index.ts +12 -0
- package/src/testing/solver-container.ts +172 -0
- package/src/types.ts +191 -0
- package/src/validation.ts +188 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for CP-SAT solver transport types.
|
|
3
|
+
*
|
|
4
|
+
* These schemas define the contract between scheduling clients and the solver service.
|
|
5
|
+
* TypeScript types are derived from these schemas using z.infer to ensure they stay in sync.
|
|
6
|
+
*
|
|
7
|
+
* @see client.types.ts for the derived TypeScript types
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
|
|
12
|
+
// --------------------------------------------------------------------------
|
|
13
|
+
// Variable schemas
|
|
14
|
+
// --------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
export const SolverTermSchema = z.object({
|
|
17
|
+
var: z.string(),
|
|
18
|
+
coeff: z.number(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const BoolVariableSchema = z.object({
|
|
22
|
+
type: z.literal("bool"),
|
|
23
|
+
name: z.string(),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const IntVariableSchema = z.object({
|
|
27
|
+
type: z.literal("int"),
|
|
28
|
+
name: z.string(),
|
|
29
|
+
min: z.number(),
|
|
30
|
+
max: z.number(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const IntervalVariableSchema = z.object({
|
|
34
|
+
type: z.literal("interval"),
|
|
35
|
+
name: z.string(),
|
|
36
|
+
start: z.number(),
|
|
37
|
+
end: z.number(),
|
|
38
|
+
size: z.number(),
|
|
39
|
+
/** If present, this is an optional interval enforced by this boolean var. */
|
|
40
|
+
presenceVar: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export const SolverVariableSchema = z.union([
|
|
44
|
+
BoolVariableSchema,
|
|
45
|
+
IntVariableSchema,
|
|
46
|
+
IntervalVariableSchema,
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
// --------------------------------------------------------------------------
|
|
50
|
+
// Constraint schemas
|
|
51
|
+
// --------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
export const LinearConstraintSchema = z.object({
|
|
54
|
+
type: z.literal("linear"),
|
|
55
|
+
terms: z.array(SolverTermSchema),
|
|
56
|
+
op: z.union([z.literal("<="), z.literal(">="), z.literal("==")]),
|
|
57
|
+
rhs: z.number(),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export const SoftLinearConstraintSchema = z.object({
|
|
61
|
+
type: z.literal("soft_linear"),
|
|
62
|
+
terms: z.array(SolverTermSchema),
|
|
63
|
+
op: z.union([z.literal("<="), z.literal(">=")]),
|
|
64
|
+
rhs: z.number(),
|
|
65
|
+
penalty: z.number(),
|
|
66
|
+
id: z.string().optional(),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
export const ExactlyOneConstraintSchema = z.object({
|
|
70
|
+
type: z.literal("exactly_one"),
|
|
71
|
+
vars: z.array(z.string()),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const AtMostOneConstraintSchema = z.object({
|
|
75
|
+
type: z.literal("at_most_one"),
|
|
76
|
+
vars: z.array(z.string()),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
export const ImplicationConstraintSchema = z.object({
|
|
80
|
+
type: z.literal("implication"),
|
|
81
|
+
if: z.string(),
|
|
82
|
+
// oxlint-disable-next-line unicorn/no-thenable -- This is a schema property, not a Promise
|
|
83
|
+
then: z.string(),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
export const BoolOrConstraintSchema = z.object({
|
|
87
|
+
type: z.literal("bool_or"),
|
|
88
|
+
vars: z.array(z.string()),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export const BoolAndConstraintSchema = z.object({
|
|
92
|
+
type: z.literal("bool_and"),
|
|
93
|
+
vars: z.array(z.string()),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
export const NoOverlapConstraintSchema = z.object({
|
|
97
|
+
type: z.literal("no_overlap"),
|
|
98
|
+
intervals: z.array(z.string()),
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
export const SolverConstraintSchema = z.union([
|
|
102
|
+
LinearConstraintSchema,
|
|
103
|
+
SoftLinearConstraintSchema,
|
|
104
|
+
ExactlyOneConstraintSchema,
|
|
105
|
+
AtMostOneConstraintSchema,
|
|
106
|
+
ImplicationConstraintSchema,
|
|
107
|
+
BoolOrConstraintSchema,
|
|
108
|
+
BoolAndConstraintSchema,
|
|
109
|
+
NoOverlapConstraintSchema,
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
// --------------------------------------------------------------------------
|
|
113
|
+
// Objective schema
|
|
114
|
+
// --------------------------------------------------------------------------
|
|
115
|
+
|
|
116
|
+
export const SolverObjectiveSchema = z.object({
|
|
117
|
+
sense: z.union([z.literal("minimize"), z.literal("maximize")]),
|
|
118
|
+
terms: z.array(SolverTermSchema),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// --------------------------------------------------------------------------
|
|
122
|
+
// Options schema
|
|
123
|
+
// --------------------------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
export const SolverOptionsSchema = z.object({
|
|
126
|
+
timeLimitSeconds: z.number().optional(),
|
|
127
|
+
solutionLimit: z.number().optional(),
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// --------------------------------------------------------------------------
|
|
131
|
+
// Request/Response schemas
|
|
132
|
+
// --------------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
export const SolverRequestSchema = z.object({
|
|
135
|
+
variables: z.array(SolverVariableSchema),
|
|
136
|
+
constraints: z.array(SolverConstraintSchema),
|
|
137
|
+
objective: SolverObjectiveSchema.optional(),
|
|
138
|
+
options: SolverOptionsSchema.optional(),
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
export const SolverStatusSchema = z.enum(["OPTIMAL", "FEASIBLE", "INFEASIBLE", "TIMEOUT", "ERROR"]);
|
|
142
|
+
|
|
143
|
+
export const SolverStatisticsSchema = z.object({
|
|
144
|
+
solveTimeMs: z.number().optional(),
|
|
145
|
+
conflicts: z.number().optional(),
|
|
146
|
+
branches: z.number().optional(),
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
export const SoftConstraintViolationSchema = z.object({
|
|
150
|
+
constraintId: z.string(),
|
|
151
|
+
violationAmount: z.number(),
|
|
152
|
+
targetValue: z.number(),
|
|
153
|
+
actualValue: z.number(),
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export const SolverResponseSchema = z.object({
|
|
157
|
+
status: SolverStatusSchema,
|
|
158
|
+
values: z.record(z.string(), z.number()).optional(),
|
|
159
|
+
statistics: SolverStatisticsSchema.optional(),
|
|
160
|
+
error: z.string().optional(),
|
|
161
|
+
solutionInfo: z.string().optional(),
|
|
162
|
+
softViolations: z.array(SoftConstraintViolationSchema).optional(),
|
|
163
|
+
});
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type FetcherLike,
|
|
3
|
+
type SolverClient,
|
|
4
|
+
type SolverRequest,
|
|
5
|
+
type SolverResponse,
|
|
6
|
+
} from "./client.types.js";
|
|
7
|
+
|
|
8
|
+
export type {
|
|
9
|
+
SolverClient,
|
|
10
|
+
SolverRequest,
|
|
11
|
+
SolverResponse,
|
|
12
|
+
SolverVariable,
|
|
13
|
+
SolverConstraint,
|
|
14
|
+
SolverTerm,
|
|
15
|
+
SolverObjective,
|
|
16
|
+
FetcherLike,
|
|
17
|
+
} from "./client.types.js";
|
|
18
|
+
|
|
19
|
+
const normalizeFetch = (
|
|
20
|
+
fetcher: FetcherLike,
|
|
21
|
+
): ((input: string | URL, init?: RequestInit) => Promise<Response>) => {
|
|
22
|
+
if (typeof fetcher === "function") return fetcher;
|
|
23
|
+
return fetcher.fetch.bind(fetcher);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generic HTTP client for the solver service.
|
|
28
|
+
*/
|
|
29
|
+
export class HttpSolverClient implements SolverClient {
|
|
30
|
+
#fetch: (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
31
|
+
#baseUrl: string;
|
|
32
|
+
|
|
33
|
+
constructor(fetcher: FetcherLike, baseUrl: string = "http://localhost:8080") {
|
|
34
|
+
this.#fetch = normalizeFetch(fetcher);
|
|
35
|
+
this.#baseUrl = baseUrl.replace(/\/$/, "");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async solve(request: SolverRequest, options?: { signal?: AbortSignal }): Promise<SolverResponse> {
|
|
39
|
+
const res = await this.#fetch(`${this.#baseUrl}/solve`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: { "Content-Type": "application/json" },
|
|
42
|
+
body: JSON.stringify(request),
|
|
43
|
+
signal: options?.signal,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const bodyText = await res.text();
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const detail = bodyText ? `: ${bodyText}` : "";
|
|
49
|
+
throw new Error(`Solver returned ${res.status}${detail}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!bodyText) {
|
|
53
|
+
throw new Error("Solver returned an empty response");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return JSON.parse(bodyText) as SolverResponse;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async health(): Promise<void> {
|
|
60
|
+
const res = await this.#fetch(`${this.#baseUrl}/health`);
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
const detail = await res.text().catch(() => "");
|
|
63
|
+
const suffix = detail ? `: ${detail}` : "";
|
|
64
|
+
throw new Error(`Solver health check failed with ${res.status}${suffix}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CP-SAT solver transport types and status constants.
|
|
3
|
+
*
|
|
4
|
+
* Types are derived from Zod schemas to ensure validation and types stay in sync.
|
|
5
|
+
*
|
|
6
|
+
* @see client.schemas.ts for the source Zod schemas
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { z } from "zod";
|
|
10
|
+
import type {
|
|
11
|
+
SolverTermSchema,
|
|
12
|
+
SolverVariableSchema,
|
|
13
|
+
SolverConstraintSchema,
|
|
14
|
+
SolverObjectiveSchema,
|
|
15
|
+
SolverRequestSchema,
|
|
16
|
+
SolverResponseSchema,
|
|
17
|
+
SolverStatusSchema,
|
|
18
|
+
SoftConstraintViolationSchema,
|
|
19
|
+
} from "./client.schemas.js";
|
|
20
|
+
|
|
21
|
+
// --------------------------------------------------------------------------
|
|
22
|
+
// Types derived from Zod schemas
|
|
23
|
+
// --------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
export type SolverTerm = z.infer<typeof SolverTermSchema>;
|
|
26
|
+
|
|
27
|
+
export type SolverVariable = z.infer<typeof SolverVariableSchema>;
|
|
28
|
+
|
|
29
|
+
export type SolverConstraint = z.infer<typeof SolverConstraintSchema>;
|
|
30
|
+
|
|
31
|
+
export type SolverObjective = z.infer<typeof SolverObjectiveSchema>;
|
|
32
|
+
|
|
33
|
+
export type SolverRequest = z.infer<typeof SolverRequestSchema>;
|
|
34
|
+
|
|
35
|
+
export type SolverResponse = z.infer<typeof SolverResponseSchema>;
|
|
36
|
+
|
|
37
|
+
export type SolverStatus = z.infer<typeof SolverStatusSchema>;
|
|
38
|
+
|
|
39
|
+
export type SoftConstraintViolation = z.infer<typeof SoftConstraintViolationSchema>;
|
|
40
|
+
|
|
41
|
+
// --------------------------------------------------------------------------
|
|
42
|
+
// Status constants (for convenience)
|
|
43
|
+
// --------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
export const SOLVER_STATUS = {
|
|
46
|
+
OPTIMAL: "OPTIMAL",
|
|
47
|
+
FEASIBLE: "FEASIBLE",
|
|
48
|
+
INFEASIBLE: "INFEASIBLE",
|
|
49
|
+
TIMEOUT: "TIMEOUT",
|
|
50
|
+
ERROR: "ERROR",
|
|
51
|
+
} as const;
|
|
52
|
+
|
|
53
|
+
// --------------------------------------------------------------------------
|
|
54
|
+
// Client interface
|
|
55
|
+
// --------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
export type FetcherLike =
|
|
58
|
+
| typeof fetch
|
|
59
|
+
| {
|
|
60
|
+
fetch: typeof fetch;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export interface SolverClient {
|
|
64
|
+
solve(request: SolverRequest, options?: { signal?: AbortSignal }): Promise<SolverResponse>;
|
|
65
|
+
health?(): Promise<void>;
|
|
66
|
+
}
|