Metadata-Version: 2.1
Name: optiframe
Version: 0.2.0
Summary: A modular framework for mixed integer programming.
Home-page: https://github.com/TimJentzsch/optiframe
License: MIT
Author: Tim Jentzsch
Author-email: optiframe.projects@timjen.net
Requires-Python: >=3.11.0rc1
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: pulp (>=2.7.0,<3.0.0)
Project-URL: Repository, https://github.com/TimJentzsch/optiframe
Description-Content-Type: text/markdown

# Optiframe [![PyPI Version](https://img.shields.io/pypi/v/optiframe)](https://pypi.org/project/optiframe/) [![License](https://img.shields.io/pypi/l/optiframe)](LICENSE)

Optiframe is an **opti**mization **frame**work for writing mixed integer programs (MIPs).

It allows you to structure your MIPs in a way that allows clear separation of concerns,
high modularity and testability.

## Core Concepts

- The optimization process is divided into multiple **steps** which are clearly separated:
  1. **Validation** allows you to validate the input data.
  2. **Pre-processing** allows you to optimize the provided data to reduce the size of the final model.
  3. **MIP building** allows you to modify the MIP to define the optimization problem.
  4. **Solving** is a pre-defined step that obtains an optimal solution for the problem.
  5. **Solution extraction** allows you to process the variable values of the solution into something more meaningful.
- **Tasks** are the core components that allow you to implement functionality for each step.
  - The constructor of a task allows you to define *dependencies* for that task,
    which are automatically injected by the optimizer based on their type annotation.
  - The **execute** method allows you to implement the functionality.
    It may return data which can then be used by other tasks as a dependency.
- **Packages** combine tasks that belong together.
    Each package must contain a task for building the MIP and can additionally contain tasks
    for validation, pre-processing and solution extraction.
    The packages are what makes Optiframe so modular:
    You can define extensions of a problem in a separate package and only include it if needed.
- The **optimizer** allows you to configure the packages that you need.
    Afterwards, you can initialize it with the instance data and then solve the optimization problem.

## Installation & Usage

```cli
pip install optiframe
```

Take a look at the `examples` folder for examples on how to use Optiframe!

## License

This project is available under the terms of the [MIT license](LICENSE).

