# Domain Reduction

## Duality-Based Bound Tightening

Variable bound tightening based on the duality multipliers are supported.

`EAGO.variable_dbbt!`

— Function```
variable_dbbt!(
n::NodeBB,
mult_lo::Vector{Float64},
mult_hi::Vector{Float64},
LBD::Float64,
UBD::Float64,
nx::Int64
)
```

Tighten the bounds of the `_current_node`

using the current global upper bound and the duality information obtained from the relaxation.

## Special Forms

Bound tightening for linear forms, univariate quadratic forms, and bivariate quadratic forms are also supported.

`EAGO.fbbt!`

— Function`fbbt!(m::GlobalOptimizer, f::T)`

Performs feasibility-based bound tightening on a back-end constraint and returns `true`

if it is feasible or `false`

if it is infeasible.

**Options for T (all are subtypes of AbstractEAGOConstraint):**

- AffineFunctionIneq
- AffineFunctionEq

## Constraint Propagation

EAGO contains a constraint propagation architecture that supported forward and reverse evaluation of set-valued functions on the directed acyclic graph. The interval contractor and reverse McCormick relaxation-based contractors are currently available.

`EAGO.set_constraint_propagation_fbbt!`

— Function```
set_constraint_propagation_fbbt!(
m::GlobalOptimizer{R, S, Q<:ExtensionType}
) -> Bool
```

Performs bound tightening based on forward/reverse interval and/or McCormick passes. This routine resets the current node with new interval bounds.

## Optimization-Based Bound Tightening

EAGO makes use of an optimization-based bound tightening scheme using filtering and greedy ordering as detailed in [1].

`EAGO.obbt!`

— Function```
obbt!(m::GlobalOptimizer{R, S, Q<:ExtensionType}) -> Bool
```

Performs OBBT with filtering and greedy ordering as detailed in: Gleixner, A.M., Berthold, T., Müller, B. et al. J Glob Optim (2017) 67: 731. https://doi.org/10.1007/s10898-016-0450-4

`EAGO.trivial_filtering!`

— Method```
trivial_filtering!(
m::GlobalOptimizer{R, S, Q<:ExtensionType},
n::NodeBB
)
```

Excludes OBBT on variable indices that are tight for the solution of the relaxation.

`EAGO.aggressive_filtering!`

— Method```
aggressive_filtering!(
m::GlobalOptimizer{R, S, Q<:ExtensionType},
n::NodeBB
) -> Bool
```

Excludes OBBT on variable indices after a search in a filtering direction.

`EAGO.bool_indx_diff!`

— Method```
bool_indx_diff!(
z::Vector{Bool},
x::Vector{Bool},
y::Vector{Bool}
) -> Vector{Bool}
```

Utility function used to set vector of booleans z to x & ~y. Avoids the generation of conversion of the BitArray created by broadcasting logical operators.

## References

- Gleixner, A.M., Berthold, T., Müller, B. et al. J Glob Optim (2017) 67: 731. https://doi.org/10.1007/s10898-016-0450-4