> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bijection.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Module: scheduling

> Reference for the bijection/scheduling entry point.

## Type Aliases

### TimeInterval

Ƭ **TimeInterval**: `Object`

#### Type declaration

| Name | Type |
| :- | :- |
| `start` | `bigint` |
| `end` | `bigint` |

***

### ScheduleWeights

Ƭ **ScheduleWeights**: `Readonly`\<\{ `lateness`: `Readonly`\<\{ `per_us`: `bigint` ; `weight`: `bigint`  }> ; `move`: `Readonly`\<\{ `weight`: `bigint`  }> ; `crewChange`: `Readonly`\<\{ `weight`: `bigint`  }>  }>

Integer soft-rule weights, exact and shared by every consumer.

***

### PlacementCost

Ƭ **PlacementCost**: `Object`

#### Type declaration

| Name | Type |
| :- | :- |
| `total` | `bigint` |
| `lateness` | `bigint` |
| `move` | `bigint` |
| `crew_change` | `bigint` |

***

### IntervalSource

Ƭ **IntervalSource**: `Object`

One table's interval rows: an index ending with `<interval>.start` after
the resource field, as interval constraints declare it.

#### Type declaration

| Name | Type |
| :- | :- |
| `table` | `string` |
| `index` | `string` |
| `resource` | `string` |
| `interval` | `string` |
| `where?` | `Record`\<`string`, `unknown`> |

***

### SlotCapacity

Ƭ **SlotCapacity**: `Object`

The bookings' `cumulative` constraint, as `scheduling.slots` reads it:
a fixed capacity or capacity windows whose `field` holds it, and the
declared `maxDuration`.

#### Type declaration

| Name | Type |
| :- | :- |
| `capacity` | `bigint` \| [`IntervalSource`](https://docs.bijection.com/api/modules/scheduling#intervalsource) & \{ `field`: `string`  } |
| `maxDuration` | `string` \| `bigint` |

***

### Slot

Ƭ **Slot**: `Object`

#### Type declaration

| Name | Type |
| :- | :- |
| `during` | [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) |
| `score` | `bigint` |
| `reasons` | (`"late"` \| `"moved"` \| `"crew_change"`)\[] |

***

### SlotReader

Ƭ **SlotReader**: `Object`

Not exported: an exported type refers to it.

#### Type declaration

| Name | Type |
| :- | :- |
| `db` | \{ `query`: (`table`: `any`) => \{ `withIndex`: (`index`: `any`, `range`: (`q`: `any`) => `any`) => \{ `order`: (`order`: `"desc"`) => \{ `take`: (`n`: `number`) => `Promise`\<`any`\[]>  }  }  }  } |
| `db.query` | \[object Object] |

***

### JobShopProblem

Ƭ **JobShopProblem**: [`Infer`](https://docs.bijection.com/api/modules/values#infer)\<typeof [`problemValidator`](https://docs.bijection.com/api/modules/scheduling#problemvalidator)>

***

### JobShopCandidate

Ƭ **JobShopCandidate**: [`Infer`](https://docs.bijection.com/api/modules/values#infer)\<typeof `jobShop.candidate`>

## Properties

### candidate

• **candidate**: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `bookings`: \{ resource: string; job: string; during: \{ start: bigint; end: bigint; }; }\[] ; `objective`: `bigint`  }, \{ `bookings`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `job`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `job`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `job`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"job"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `objective`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"bookings"` | `"objective"`>

## Variables

### scheduling

• `Const` **scheduling**: `Readonly`\<\{ `slots`: (`ctx`: [`SlotReader`](https://docs.bijection.com/api/modules/scheduling#slotreader), `options`: \{ `job`: \{ `_id?`: [`GenericId`](https://docs.bijection.com/api/modules/values#genericid)\<`string`> ; `duration_us`: `bigint` ; `release_at`: `bigint` ; `due_at`: `bigint` ; `demand?`: `bigint`  } ; `resources`: readonly [`GenericId`](https://docs.bijection.com/api/modules/values#genericid)\<`string`>\[] ; `window`: [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) ; `bookings`: [`IntervalSource`](https://docs.bijection.com/api/modules/scheduling#intervalsource) & \{ `job`: `string` ; `demand?`: `string`  } ; `availability`: [`IntervalSource`](https://docs.bijection.com/api/modules/scheduling#intervalsource) ; `weights`: [`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights) ; `step`: `string` | `bigint` ; `limit`: `number` ; `rest?`: `string` | `bigint` ; `current?`: \{ `resource`: [`GenericId`](https://docs.bijection.com/api/modules/values#genericid)\<`string`> ; `during`: [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)  } | `null` ; `capacity?`: [`SlotCapacity`](https://docs.bijection.com/api/modules/scheduling#slotcapacity)  }) => `Promise`\<\{ `resources`: \{ `resource`: [`GenericId`](https://docs.bijection.com/api/modules/values#genericid)\<`string`> ; `slots`: [`Slot`](https://docs.bijection.com/api/modules/scheduling#slot)\[]  }\[] ; `is_complete`: `boolean`  }>  }>

***

### jobShopJob

• `Const` **jobShopJob**: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `previous`: `null` | \{ resource: string; during: \{ start: bigint; end: bigint; }; } ; `eligible`: `string`\[] ; `job`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `due_at`: `bigint` ; `duration_us`: `bigint` ; `release_at`: `bigint`  }, \{ `job`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `duration_us`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `release_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `due_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `eligible`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<`string`\[], [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`>, `"required"`> ; `uses`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string`  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"`>, `"required"`> ; `previous`: [`VUnion`](https://docs.bijection.com/api/classes/values.VUnion)\<`null` | \{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \[[`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>, [`VNull`](https://docs.bijection.com/api/classes/values.VNull)\<`null`, `"required"`>], `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>  }, `"required"`, `"previous"` | `"eligible"` | `"job"` | `"uses"` | `"due_at"` | `"duration_us"` | `"release_at"` | `"previous.resource"` | `"previous.during"` | `"previous.during.start"` | `"previous.during.end"`>

One job of the job-shop problem: duration, release, due time, eligible
resources, the units of shared pools it holds while it runs and its
current placement.

***

### jobShop

• `Const` **jobShop**: `Readonly`\<\{ `input`: \{ `problemRevision`: [`VLiteral`](https://docs.bijection.com/api/classes/values.VLiteral)\<`"job-shop/v2"`, `"required"`> ; `horizon`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `jobs`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `previous`: `null` | \{ resource: string; during: \{ start: bigint; end: bigint; }; } ; `eligible`: `string`\[] ; `job`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `due_at`: `bigint` ; `duration_us`: `bigint` ; `release_at`: `bigint`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `previous`: `null` | \{ resource: string; during: \{ start: bigint; end: bigint; }; } ; `eligible`: `string`\[] ; `job`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `due_at`: `bigint` ; `duration_us`: `bigint` ; `release_at`: `bigint`  }, \{ `job`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `duration_us`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `release_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `due_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `eligible`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<`string`\[], [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`>, `"required"`> ; `uses`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string`  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"`>, `"required"`> ; `previous`: [`VUnion`](https://docs.bijection.com/api/classes/values.VUnion)\<`null` | \{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \[[`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>, [`VNull`](https://docs.bijection.com/api/classes/values.VNull)\<`null`, `"required"`>], `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>  }, `"required"`, `"previous"` | `"eligible"` | `"job"` | `"uses"` | `"due_at"` | `"duration_us"` | `"release_at"` | `"previous.resource"` | `"previous.during"` | `"previous.during.start"` | `"previous.during.end"`>, `"required"`> ; `windows`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `fixed`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `uses`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string`  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"`>, `"required"`>  }, `"required"`, `"resource"` | `"uses"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `pools`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `weights`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `move`: `bigint` ; `lateness`: `bigint` ; `crew_change`: `bigint` ; `lateness_per_us`: `bigint`  }, \{ `lateness_per_us`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `lateness`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `move`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `crew_change`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"move"` | `"lateness"` | `"crew_change"` | `"lateness_per_us"`>  } ; `candidate`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `bookings`: \{ resource: string; job: string; during: \{ start: bigint; end: bigint; }; }\[] ; `objective`: `bigint`  }, \{ `bookings`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `job`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `job`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `job`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"job"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `objective`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"bookings"` | `"objective"`>  }>

The interval-shaped scheduling problem a customer solver receives: jobs;
each resource's working windows; fixed bookings that stay, with the pool
units they hold; each shared pool's capacity windows (a crew or equipment
pool holds `units` at once, none outside its windows), the soft rule
weights; and the horizon. Pass `jobShop.input` and `jobShop.candidate` to
the compute component's `defineProblem`; a problem that reads its jobs
from a pinned dataset declares `jobShopJob` rows instead.

***

### problemValidator

• `Const` **problemValidator**: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `fixed`: \{ resource: string; uses: \{ units: bigint; pool: string; }\[]; during: \{ start: bigint; end: bigint; }; }\[] ; `horizon`: \{ start: bigint; end: bigint; } ; `windows`: \{ resource: string; during: \{ start: bigint; end: bigint; }; }\[] ; `problemRevision`: `"job-shop/v2"` ; `jobs`: \{ previous: \{ resource: string; during: \{ start: bigint; end: bigint; }; } | null; eligible: string\[]; job: string; uses: \{ units: bigint; pool: string; }\[]; due\_at: bigint; duration\_us: bigint; release\_at: bigint; }\[] ; `pools`: \{ units: bigint; pool: string; during: \{ start: bigint; end: bigint; }; }\[] ; `weights`: \{ move: bigint; lateness: bigint; crew\_change: bigint; lateness\_per\_us: bigint; }  }, \{ `problemRevision`: [`VLiteral`](https://docs.bijection.com/api/classes/values.VLiteral)\<`"job-shop/v2"`, `"required"`> ; `horizon`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `jobs`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `previous`: `null` | \{ resource: string; during: \{ start: bigint; end: bigint; }; } ; `eligible`: `string`\[] ; `job`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `due_at`: `bigint` ; `duration_us`: `bigint` ; `release_at`: `bigint`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `previous`: `null` | \{ resource: string; during: \{ start: bigint; end: bigint; }; } ; `eligible`: `string`\[] ; `job`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `due_at`: `bigint` ; `duration_us`: `bigint` ; `release_at`: `bigint`  }, \{ `job`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `duration_us`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `release_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `due_at`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `eligible`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<`string`\[], [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`>, `"required"`> ; `uses`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string`  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"`>, `"required"`> ; `previous`: [`VUnion`](https://docs.bijection.com/api/classes/values.VUnion)\<`null` | \{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \[[`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>, [`VNull`](https://docs.bijection.com/api/classes/values.VNull)\<`null`, `"required"`>], `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>  }, `"required"`, `"previous"` | `"eligible"` | `"job"` | `"uses"` | `"due_at"` | `"duration_us"` | `"release_at"` | `"previous.resource"` | `"previous.during"` | `"previous.during.start"` | `"previous.during.end"`>, `"required"`> ; `windows`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`>  }, `"required"`, `"resource"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `fixed`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `resource`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `resource`: `string` ; `uses`: \{ units: bigint; pool: string; }\[] ; `during`: \{ start: bigint; end: bigint; }  }, \{ `resource`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `uses`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string`  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string`  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"`>, `"required"`>  }, `"required"`, `"resource"` | `"uses"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `pools`: [`VArray`](https://docs.bijection.com/api/classes/values.VArray)\<\{ `units`: `bigint` ; `pool`: `string` ; `during`: \{ start: bigint; end: bigint; }  }\[], [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `units`: `bigint` ; `pool`: `string` ; `during`: \{ start: bigint; end: bigint; }  }, \{ `pool`: [`VString`](https://docs.bijection.com/api/classes/values.VString)\<`string`, `"required"`> ; `during`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `start`: `bigint` ; `end`: `bigint`  }, \{ `start`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `end`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"start"` | `"end"`> ; `units`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"units"` | `"pool"` | `"during"` | `"during.start"` | `"during.end"`>, `"required"`> ; `weights`: [`VObject`](https://docs.bijection.com/api/classes/values.VObject)\<\{ `move`: `bigint` ; `lateness`: `bigint` ; `crew_change`: `bigint` ; `lateness_per_us`: `bigint`  }, \{ `lateness_per_us`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `lateness`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `move`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`> ; `crew_change`: [`VInt64`](https://docs.bijection.com/api/classes/values.VInt64)\<`bigint`, `"required"`>  }, `"required"`, `"move"` | `"lateness"` | `"crew_change"` | `"lateness_per_us"`>  }, `"required"`, `"fixed"` | `"horizon"` | `"windows"` | `"problemRevision"` | `"jobs"` | `"pools"` | `"weights"` | `"horizon.start"` | `"horizon.end"` | `"weights.move"` | `"weights.lateness"` | `"weights.crew_change"` | `"weights.lateness_per_us"`>

Not exported: an exported type refers to it.

## Functions

### scheduleWeights

▸ **scheduleWeights**(`rules`): [`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights)

Declare the soft rules: `scheduleWeights(\{ lateness: \{ per: "1h",
weight: 10n \}, move: \{ weight: 3n \}, crewChange: \{ weight: 1n \} \})`.
Omitted rules weigh zero.

#### Parameters

| Name | Type |
| :- | :- |
| `rules` | `Object` |
| `rules.lateness?` | `Object` |
| `rules.lateness.per` | `string` \| `bigint` |
| `rules.lateness.weight` | `bigint` |
| `rules.move?` | `Object` |
| `rules.move.weight` | `bigint` |
| `rules.crewChange?` | `Object` |
| `rules.crewChange.weight` | `bigint` |

#### Returns

[`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights)

***

### placementCost

▸ **placementCost**(`weights`, `job`, `placement`, `current`): [`PlacementCost`](https://docs.bijection.com/api/modules/scheduling#placementcost)

The weighted cost of placing a job on `resource` during `during`, given
its current booking if any.

#### Parameters

| Name | Type |
| :- | :- |
| `weights` | [`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights) |
| `job` | `Object` |
| `job.due_at` | `bigint` |
| `placement` | `Object` |
| `placement.resource` | `string` |
| `placement.during` | [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) |
| `current` | \{ `resource`: `string` ; `during`: [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)  } \| `null` |

#### Returns

[`PlacementCost`](https://docs.bijection.com/api/modules/scheduling#placementcost)

***

### mergeIntervals

▸ **mergeIntervals**(`intervals`): [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[]

Disjoint, sorted intervals: adjacent and overlapping inputs merge.

#### Parameters

| Name | Type |
| :- | :- |
| `intervals` | readonly [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[] |

#### Returns

[`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[]

***

### freeIntervals

▸ **freeIntervals**(`windows`, `busy`, `rest?`): [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[]

`windows` minus `busy`, each busy interval padded by `rest` on both
sides.

#### Parameters

| Name | Type |
| :- | :- |
| `windows` | readonly [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[] |
| `busy` | readonly [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[] |
| `rest` | `bigint` |

#### Returns

[`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[]

***

### slotStarts

▸ **slotStarts**(`free`, `options`): `Object`

Every start aligned to `step` (from the epoch) where `duration` fits in
one free interval within `window` and after `release`.

#### Parameters

| Name | Type |
| :- | :- |
| `free` | readonly [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval)\[] |
| `options` | `Object` |
| `options.duration` | `bigint` |
| `options.window` | [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) |
| `options.release` | `bigint` |
| `options.step` | `bigint` |
| `options.limit` | `number` |

#### Returns

`Object`

| Name | Type |
| :- | :- |
| `starts` | `bigint`\[] |
| `is_complete` | `boolean` |

***

### jobShopWeights

▸ **jobShopWeights**(`problem`): [`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights)

The problem's weights as `scheduleWeights`.

#### Parameters

| Name | Type |
| :- | :- |
| `problem` | [`JobShopProblem`](https://docs.bijection.com/api/modules/scheduling#jobshopproblem) |

#### Returns

[`ScheduleWeights`](https://docs.bijection.com/api/modules/scheduling#scheduleweights)

***

### capacityExceeded

▸ **capacityExceeded**(`holds`, `windows`): `bigint` | `null`

The first instant at which the summed units of `holds` exceed the
capacity of the window containing it (zero where none does), or null.
Intervals are half-open, so a hold ending when another starts never
stacks with it: the same rule the `cumulative` constraint enforces.

#### Parameters

| Name | Type |
| :- | :- |
| `holds` | readonly \{ `during`: [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) ; `units`: `bigint`  }\[] |
| `windows` | readonly \{ `during`: [`TimeInterval`](https://docs.bijection.com/api/modules/scheduling#timeinterval) ; `units`: `bigint`  }\[] |

#### Returns

`bigint` | `null`

***

### verifySchedule

▸ **verifySchedule**(`problem`, `candidate`): `Object`

Recheck a solver's candidate independently of the model that produced
it: every job placed once on an eligible resource for exactly its
duration, no earlier than its release and inside the horizon, within the
union of that resource's windows, overlapping neither another placement
nor a fixed booking, every pool within its capacity at every instant, and
an objective equal to the recomputed cost.

#### Parameters

| Name | Type |
| :- | :- |
| `problem` | [`JobShopProblem`](https://docs.bijection.com/api/modules/scheduling#jobshopproblem) |
| `candidate` | [`JobShopCandidate`](https://docs.bijection.com/api/modules/scheduling#jobshopcandidate) |

#### Returns

`Object`

| Name | Type |
| :- | :- |
| `bookings` | [`JobShopCandidate`](https://docs.bijection.com/api/modules/scheduling#jobshopcandidate)\[`"bookings"`] |
| `objective` | `bigint` |

***

### partitionJobShop

▸ **partitionJobShop**(`problem`): [`JobShopProblem`](https://docs.bijection.com/api/modules/scheduling#jobshopproblem)\[]

Split a problem into independent partitions: jobs that can share a
resource or a pool stay together, and each partition carries only its
resources' windows, its pools' capacity windows and the fixed bookings
on either. The cost is a sum over jobs, so the partitions'
optimal objectives add up to the whole problem's, and each partition can be
solved, verified and applied in its own transaction. A job no resource
admits is its own partition, which no solver can place. Partitions are
ordered by their smallest job identity.

#### Parameters

| Name | Type |
| :- | :- |
| `problem` | [`JobShopProblem`](https://docs.bijection.com/api/modules/scheduling#jobshopproblem) |

#### Returns

[`JobShopProblem`](https://docs.bijection.com/api/modules/scheduling#jobshopproblem)\[]


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.