# Indicator¶

## `Indicator` class¶

The `Indicator` class allows to define a criterion that quantifies the schedule so that it can be compared with other schedules. An `Indicator` instance results in a conclusion such a ‘the schedule A is better than schedule B because the indicator XXX is greater/lower’.

An `Indicator` instance is created by passing the indicator name as well as the mathematical expression to compute. For example:

```flow_time = Indicator('FlowTime', task1.end + task2.end)
duration_square = Indicator('MinTaskDuration', task1.duration ** 2 + task2.duration ** 2)
```

Indicator values are computed by the solver, and are part of the solution. If the solution is rendered as a matplotlib Gantt chart, the indicator values are displayed on the upper right corner of the chart.

Indicators can also be bounded, although it is an optional feature. It is useful if the indicator is further be maximized (or minimized) by an optimization solver, in order to reduce the computation time. For example,

```indicator1 = Indicator('Example1', task2.start - task1.end, bounds = (0,100)) # If lower and upper bounded
indicator2 = Indicator('Example2', task3.start - task2.end, bounds = (None,100)) # If only upper bounded
indicator3 = Indicator('Example3', task4.start - task3.end, bounds = (0,None)) # If only lower bounded
```

Note

There is no limit to the number of Indicators defined in the problem. The mathematical expression must be expressed in a polynomial form and using the `Sqrt()` function. Any other advanced mathematical functions such as `exp()`, `sin()`, etc. is not allowed because not supported by the solver.

## Builtin indicators : Resource cost, utilization, number of tasks assigned¶

Two usual indicators are available : the utilization and cost of a resource (or a list of resources).

Use the `add_indicator_resource_utilization()` method to insert a cost computation to your schedule. This method takes a list of resources and compute the total cost (sum of productivity * duration for all resources). The result is a percentage: an utilization of 100% means that the resource is assigned 100% of the schedule timeline. In the following example, the indicator reports the utilization percentage of the `worker_1()`.

```utilization_res_1 = problem.add_indicator_resource_utilization(worker_1)
```

The `add_indicator_resource_cost()` method returns the total cost of a resource (or a list of resource). It is computed using each cost function defined for each resource. In the following example, the indicator `cost_ind()` is the total cost for both ressources `worker_1()` and `worker_2()`.

```cost_ind = problem.add_indicator_resource_cost([worker_1, worker_2])
```

At last, the `add_indicator_number_tasks_assigned()` method returns the number of tasks assigned to a resource after the schedule is completed.

```problem.add_indicator_number_tasks_assigned(worker)
```