# Resource Constraints¶

ProcessScheduler provides a set of ready-to-use resource constraints. They allow expressing common rules such as “the resource A is available only from 8 am to 12” etc. There are a set of builtin ready-to-use constraints, listed below.

## WorkLoad¶

The `WorkLoad`

constraint can be used to restrict the number of tasks which are executed during certain time periods.

This constraint applies to one resource, whether it is a single worker or a cumulative worker. It takes the time periods as a python dictionary composed of time intervals (the keys) and an integer number (the capacity). The `kind`

parameter allows to define which kind of restriction applies to the resource: `'exact'`

, `'max'`

(default value) or `'min'`

.

```
c1 = ps.WorkLoad(worker_1, {(0, 6): 2})
```

In the previous example, the resource `worker_1`

cannot be scheduled into more than 2 timeslots between instants 0 and 6.

Any number of time intervals can be passed to this class, just extend the timeslots dictionary, e.g.:

```
c1 = ps.WorkLoad(worker_1, {(0, 6): 2,
(19, 21): 6})
```

The `WorkLoad`

is not necessarily a *limitation*. Indeed you can specify that the integer number is actually an exact of minimal value to target. For example, if we need the resource `worker_1`

to be scheduled **at least** into three time slots between instants 0 and 10, then:

```
c1 = ps.WorkLoad(worker_1, {(0, 10): 3}, kind='min')
```

## DistinctWorkers¶

A `AllDifferentWorkers`

constraint applies to two `SelectWorkers`

instances, used to assign alternative resources to a task. It constraints the solver to select different workers for each `SelectWorkers`

. For instance:

```
s1 = ps.SelectWorkers([worker_1, worker_2])
s2 = ps.SelectWorkers([worker_1, worker_2])
```

could lead the solver to select worker_1 in both cases. Adding the following line:

```
cs = ps.DistinctWorkers(s1, s2)
```

let the solver selects the worker_1 for s1 and worker_2 for s2 or the opposite, worker_2 for s1 and worker_1 for s2. The cases where worker_1 is selected by both s1 and s2 or worker_2 by selected by both s1 and s2 are impossible.

## SameWorkers¶

A `AllSameWorkers`

constraint applies to two `SelectWorkers`

instances. It constraints the solver to ensure both different `SelectWorkers`

instances select the same worker. For example:

```
s1 = ps.SelectWorkers([worker_1, worker_2])
s2 = ps.SelectWorkers([worker_1, worker_2])
```

could lead the solver to select worker_1 for s1 and worker_2 for s2. Adding the following line:

```
cs = ps.SameWorkers(s1, s2)
```

ensures either worker_1 is selected by both s1 and s2, or worker_2 is selected by both s1 and s2.

## ResourceTasksDistance¶

```
worker_1 = ps.Worker("Worker1")
ps.ResourceTasksDistance(
worker_1,
distance=4,
mode="exact",
list_of_time_intervals=[[10, 20], [30, 40]])
```