# Class Relaxation (1.15.0)

1.15.0 (latest) 1.14.0 1.13.0 1.12.0 1.11.2 1.10.0 1.9.1 1.8.5 1.7.0 1.6.0 1.5.0 1.4.3 1.3.2 1.2.0 1.1.3 1.0.1 0.1.1

    Relaxation(mapping=None, *, ignore_unknown_fields=False, **kwargs)

If `relaxations` is empty, the start time and sequence of all
visits on `routes` are fully constrained and no new visits may be
inserted or added to those routes. Also, a vehicle's start and end
time in `routes` is fully constrained, unless the vehicle is empty
(i.e., has no visits and has `used_if_route_is_empty` set to false
in the model).

`relaxations(i).level` specifies the constraint relaxation level
applied to a visit #j that satisfies:

- `route.visits(j).start_time >= relaxations(i).threshold_time` AND
- `j + 1 >= relaxations(i).threshold_visit_count`

Similarly, the vehicle start is relaxed to `relaxations(i).level`
if it satisfies:

- `vehicle_start_time >= relaxations(i).threshold_time` AND
- `relaxations(i).threshold_visit_count == 0` and the vehicle end is relaxed to `relaxations(i).level` if it satisfies:
- `vehicle_end_time >= relaxations(i).threshold_time` AND
- `route.visits_size() + 1 >= relaxations(i).threshold_visit_count`

To apply a relaxation level if a visit meets the
`threshold_visit_count` OR the `threshold_time` add two
`relaxations` with the same `level`: one with only
`threshold_visit_count` set and the other with only
`threshold_time` set. If a visit satisfies the conditions of
multiple `relaxations`, the most relaxed level applies. As a
result, from the vehicle start through the route visits in order to
the vehicle end, the relaxation level becomes more relaxed: i.e.,
the relaxation level is non-decreasing as the route progresses.

The timing and sequence of route visits that do not satisfy the
threshold conditions of any `relaxations` are fully constrained
and no visits may be inserted into these sequences. Also, if a
vehicle start or end does not satisfy the conditions of any
relaxation the time is fixed, unless the vehicle is empty.

| ## Attributes ||
|---|---|
| **Name** | **Description** |
| `level` | `https://docs.cloud.google.com/python/docs/reference/optimization/latest/google.cloud.optimization_v1.types.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level` The constraint relaxation level that applies when the conditions at or after `threshold_time` AND at least `threshold_visit_count` are satisfied. |
| `threshold_time` | `google.protobuf.timestamp_pb2.Timestamp` The time at or after which the relaxation `level` may be applied. |
| `threshold_visit_count` | `int` The number of visits at or after which the relaxation `level` may be applied. If `threshold_visit_count` is 0 (or unset), the `level` may be applied directly at the vehicle start. If it is `route.visits_size() + 1`, the `level` may only be applied to the vehicle end. If it is more than `route.visits_size() + 1`, `level` is not applied at all for that route. |

## Classes

### Level

    Level(value)

Expresses the different constraint relaxation levels, which
are applied for a visit and those that follow when it satisfies
the threshold conditions.

The enumeration below is in order of increasing relaxation.

        This value must not be explicitly used in `level`.
    RELAX_VISIT_TIMES_AFTER_THRESHOLD (1):
        Visit start times and vehicle start/end times
        will be relaxed, but each visit remains bound to
        the same vehicle and the visit sequence must be
        observed: no visit can be inserted between them
        or before them.
    RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD (2):
        Same as `RELAX_VISIT_TIMES_AFTER_THRESHOLD`, but the visit
        sequence is also relaxed: visits can only be performed by
        this vehicle, but can potentially become unperformed.
    RELAX_ALL_AFTER_THRESHOLD (3):
        Same as `RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD`,
        but the vehicle is also relaxed: visits are completely free
        at or after the threshold time and can potentially become
        unperformed.