# Introduction¶

ProcessScheduler is intended to be used in an industrial context (manufacturing, building industry, healthcare, etc.), and can be used for any related scheduling problem. It targets complex problems for which an obvious solution can not be found.

The following features are provided:

Task definition with zero, fixed or variable length, work_amount,

Resource definition including productivity and cost, assignment of resource(s) to tasks,

Temporal tasks constraints (precedence, fixed start, fixed end etc.),

Resource constraints: resource availability,

First order logic operation between tasks/resources constraints: and/or/xor/not boolean operators, implication, if/then/else,

Multi objective optimization,

Gantt chart rendering using matplotlib or plotly,

Export solution to json, SMT problem to SMTLIB.

This document explains how to write the model, run the solver, and finally analyze the solution(s).

## What’s inside¶

ProcessScheduler processes a model written using the Python programming language. It produces a schedule compliant with a set of constraints over tasks and/or resources.

The scheduling problem is solved using the Microsoft SMT Z3 Prover, a MIT licensed SMT solver. The optimization part of the solver is described in this paper: Bjorner et al. νZ - An Optimizing SMT Solver (2016). A good introduction to programming Z3 with Python can be read at z3-py-tutorial. Z3 is the only mandatory dependency of ProcessScheduler.

The solution of a scheduling problem can be rendered to a Gantt chart using the matplotlib or plotly libraries, and exported to any of the common jpg, png, pdf or svg formats. matplotlib and plotly are not installed by default, they are optional dependencies.

## Download/install¶

Use `pip`

to install the package and the required dependencies (Z3) on your machine:

```
pip install ProcessScheduler
```

and check the installation from a python3 prompt:

```
>>> import processscheduler as ps
```

## Development version¶

Create a local copy of the github repository:

```
git clone https://github.com/tpaviot/ProcessScheduler
```

Then install the development version:

```
cd ProcessScheduler
pip install -e .
```