Metadata-Version: 2.4
Name: uulabscheduler
Version: 0.2.48
Summary: The python lab scheduler is an adaptive scheduler solving generalized (suited to lab demands) versions of the JSSP (Job Shop Scheduling Problem). It comes as a microservice with a SiLA and a python interface.
Project-URL: Homepage, https://gitlab.com/opensourcelab/labscheduler
Author-email: Stefan Maak <stefanmaak@freenet.de>
License: MIT
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Education
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
Classifier: Topic :: Scientific/Engineering :: Chemistry
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: Scientific/Engineering :: Visualization
Requires-Python: >=3.12
Requires-Dist: networkx>=3.1
Requires-Dist: pytz>=2023.3
Requires-Dist: pyyaml>=6.0.1
Requires-Dist: sila2==0.13.0
Provides-Extra: cpsolver
Requires-Dist: ortools==9.9.3963; extra == 'cpsolver'
Provides-Extra: dev
Requires-Dist: anyio>=4.4; extra == 'dev'
Requires-Dist: bandit>=1.0; extra == 'dev'
Requires-Dist: bump-my-version>=0.28; extra == 'dev'
Requires-Dist: coverage>=7.7; extra == 'dev'
Requires-Dist: invoke>=2.1; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: pandas; extra == 'dev'
Requires-Dist: pre-commit>=4.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
Requires-Dist: pytest-cov>6.0; extra == 'dev'
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
Requires-Dist: pytest>=8.3; extra == 'dev'
Requires-Dist: ruff==0.9.*; extra == 'dev'
Requires-Dist: safety>=1.0; extra == 'dev'
Requires-Dist: tox>=4.5; extra == 'dev'
Requires-Dist: typer; extra == 'dev'
Provides-Extra: docs
Requires-Dist: graphviz; extra == 'docs'
Requires-Dist: myst-parser>=1.0; extra == 'docs'
Requires-Dist: ortools==9.9.3963; extra == 'docs'
Requires-Dist: pandas; extra == 'docs'
Requires-Dist: prefect; extra == 'docs'
Requires-Dist: pyscipopt>=5.4.1; extra == 'docs'
Requires-Dist: python-docs-theme>=2023.3; extra == 'docs'
Requires-Dist: sphinx>=7.0; extra == 'docs'
Requires-Dist: typer; extra == 'docs'
Provides-Extra: mipsolver
Requires-Dist: pyscipopt>=5.4.1; extra == 'mipsolver'
Description-Content-Type: text/markdown

# PythonLab Scheduler

Generic Scheduler for Lab Automation Processes. 'Scheduling' in this sense means
taking a workflow description and a descriptions of a lab(also called job shop) and assigning timestamps and machines to the steps of the workflow in an intelligent way.

```mermaid
flowchart TD
A[Scheduler]--computes-->B[Schedule];
B --contains-->C[Start Times];
B --contains-->D[Machine Assignments];
E[Job Shop]--YAML-->A;
F[Workflow]--python-->A;
G[Precedences]--make up-->F;
H[Process Steps]--make up-->F;
I[Machines]--make up-->E;
```

In other words: It solves a generalization of the
[Job Shop Scheduling Problem(JSSP)](https://en.wikipedia.org/wiki/Job-shop_scheduling).
The main generalizations are

-   Jobs can have several operations on the same machine
-   There might be several machines of a kind
-   Time-constraints between Operations (soft and hard)
-   Machines can have capacities to do several operations in parallel
-   Jobs can intersect(i.e. operations can have precedence constraints to other jobs operations)

More precise information on this can be found [here](docs/architecture/problem_definition.md)

## Installation

    pip install labscheduler --index-url https://gitlab.com/api/v4/projects/70366720/packages/pypi/simple

## Scheduling Framework Overview

The framework is designed to be very generic:
The core scheduling algorithm can be exchanged by any scheduling concept that shall be developed, tested or used in a real world application.
The scheduler itself can be used via python import or as a micro service via SiLA.
More information in the framework can be found [here](docs/architecture/framework.md).

```mermaid
graph TD;
  A[User] <-- python --> B[Scheduler];
  A <-- sila_python --> C[SiLA-Client];
  C <-- SiLA --> D[SiLA-Server];
  B <--> D;
  B --> E[AlgorithmInterface];
  E -- implemented by --> F[Algorithm];
  E -- implemented by --> G[Algorithm];
  E -- implemented by --> H[Algorithm];
```

## Usage

For help in the console type

    labscheduler --help

The scheduler can be accessed via standard python import or run on a SiLA-server and accessed via a SiLA-client.
Examples can be found [here](docs/usage.rst):

## Development

    git clone https://gitlab.com/OpenLabAutomation/lab-automation-packages/lab-scheduler.git

    # create a virtual environment and activate it then run

    pip install -e .[dev]

    # run unittests

    invoke test   # use the invoke environment to manage development

    # commit changes: please install pre-commit hooks
    pre-commit install

## Documentation

The Documentation can be found here: [https://openlabautomation.gitlab.io/lab-automation-packages/lab-scheduler/
](https://openlabautomation.gitlab.io/lab-automation-packages/lab-scheduler/
)

## Credits

This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter)
and the [gitlab.com/opensourcelab/software-dev/cookiecutter-pypackage](https://gitlab.com/opensourcelab/software-dev/cookiecutter-pypackage) project template.
