Something went wrong. Try again.
A functional toolkit for authoring resource-leveling algorithms — compose constraint and scoring blocks, enumerate feasible schedules
Something went wrong. Try again.
1.5 kB · 43 lines
TypeScript
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344// Deadline — Constraint block.//// The task must finish on or before `latestFinish` (a day index in the// resolved calendar frame). Hard form: a placement that would overrun the// deadline is rejected and the run fails with an attributed explanation.//// MiniZinc compile contract: harness supplies `finish_day[t]`.
import { z } from "zod";
import type { DeadlineConstraint } from "../level-core/types.ts";
import type { ConstraintBlock, MiniZincFragment } from "./types.ts";
export const DeadlineInputSchema = z.object({ taskUniqueId: z.number().int(), latestFinish: z.number().int().nonnegative(),});
export type DeadlineInput = z.infer<typeof DeadlineInputSchema>;
const DeadlineOutputSchema: z.ZodType<DeadlineConstraint> = z.object({ kind: z.literal("Deadline"), taskUniqueId: z.number().int(), latestFinish: z.number().int().nonnegative(),});
export const DeadlineBlock: ConstraintBlock<DeadlineInput> = { id: "Deadline", schema: { input: DeadlineInputSchema, output: DeadlineOutputSchema }, apply: ({ taskUniqueId, latestFinish }): DeadlineConstraint => ({ kind: "Deadline", taskUniqueId, latestFinish, }), toMiniZinc: ({ taskUniqueId, latestFinish }): MiniZincFragment => ({ text: `constraint finish_day[${String(taskUniqueId)}] <= ${String(latestFinish)};`, }), doc: { nl: "The task must finish on or before the given day index; later placements are rejected.", pseudocode: "finish(task) <= latestFinish", },};