# Adding Stopping Conditions

The software runs the optimization process until one of the stopping conditions is met. There are five stopping conditions defined in the package, and the ability for custom stopping conditions to be defined.

## Implementation

Each stopping condition is defined as a concrete type of the abstract type `AbstractStoppingCondition`

. Two functions are required to be defined to successfully use the stopping condition - `CheckStoppingCondition`

and `StoppingConditionStatus`

.

`CheckStoppingCondition`

is used to check if the optimization proccess should continue. `s`

is the instance of the concrete stopping condtion type. If the optimization process needs to stop, the function should return `false`

, otherwise return `true`

.

`(CheckStoppingCondition(p::DSProblem, s::T) where T <: AbstractStoppingCondition)::Bool`

`StoppingConditionStatus`

defines the textual representation of the stopping condition, which is used in reporting. It takes as an argument the instance of the concrete stopping condition type and should return a `string`

. If this function is ommited, then the stopping condition status will be represented as "Unknown stopping condition status".

`(StoppingConditionStatus(::T) where T <: AbstractStoppingCondition)::String`

When the stopping condition type and functions are defined, they can be added to the problem using the function `AddStoppingCondition`

, which takes as the first argument the `DSProblem`

instance, and as the second argument the stopping condition instance.

```
function AddStoppingCondition(p::DSProblem, c::T) where T <: AbstractStoppingCondition
push!(p.stoppingconditions, c)
end
```

## Native

There are currently five stopping conditions implemented in the package:

- Iteration Limit (
`IterationStoppingCondition`

) - Function Evaluation Limit (
`FunctionEvaluationStoppingCondition`

) - Mesh Precision (
`MeshPrecisionStoppingCondition`

) - Poll Precision (
`PollPrecisionStoppingCondition`

) - Runtime Limit (
`RuntimeStoppingCondition`

)

The first four stopping conditions are automatically included in each problem instance, and the runtime limit can be added using `AddStoppingCondition`

.