# Configuration

Verteego facilitates powerful optimization under various constraints, supporting a range of optimization types and constraint models. The configuration process is structured into clear steps, detailed below, to guide you through setting up and executing an optimization pipeline.

## Overall Operation

The optimization process involves three key steps:

1. **Choosing the Variable to Optimize:**
   * Identify the specific variable that needs optimization. Each variable is uniquely identified, often by a multi-dimensional key. For example, pricing might be indexed by category, rate, and duration.
2. **Generating an Input File:**
   * Construct an input file where each line represents a potential optimization scenario, complete with constraint values. This file is crucial as it defines the "optimization space." Use a configuration file to preprocess and compute all necessary values for the optimization.
3. **Solving the Problem:**
   * Define a comprehensive set of constraints using data from the preprocessed input file and decide on the objective to optimize. The solution process involves applying these constraints to find the optimal configuration.

#### Example configuration

Here a price is indexed by a category, a rate and a duration.

```yaml
variables:
- name: price
variable_types: int
variable_keys:
- category
- rate
- duration
```

## Objective

The objective defines what Verteego aims to optimize, represented as a real number indicating a global business indicator, such as total revenue or costs. Verteego supports various methods to compute this objective:

* Direct sum of values from a given column.
* Weighted sum where one column serves as a weight and another as the value.

You can choose to either maximize or minimize this objective based on your business needs.

* **Objective Configuration Example:**

```yaml
objective_method: max
weighted_objective_columns:
- price
```

## Constraints

Verteego supports diverse types of constraints to fine-tune the optimization process:

[**Unary Constraint**](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/unary-constraint)

Applies a single condition to a variable.

[**Binary Constraint**](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/binary-constraint)

Involves conditions between two variables.

[**Aggregation Constraint**](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/aggregation-constraint)

Conditions applied on aggregated data.

[**Order Constraint**](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/order-constraint)

Ensures a specific order among variables.

[**Multiplicative Equality Constraint**](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/multiplicative-equality-constraint)

Equality condition involving products of variables.

#### Generate constraints from a Dataset

Additionally, Verteego offers the capability to dynamically [generate constraints from datasets](https://doc.verteego.com/verteego-doc/pipelines/optimization-pipelines/constraints/generate-constraints-from-a-dataset), enhancing the adaptability of the optimization to real-world data and scenarios.
