# Adding a Search Step

## Implementation

Implementing a custom search strategy is relatively simple. It requires the implementation of a type that configures the step, and a corresponding function that implements it. The configuration type should inherit from `AbstractSearch`

, and the function should be an implementation of the `GenerateSearchPoints`

function that takes a `DSProblem`

and your custom type as arguments, and returns a vector of vectors.

For example, a very simple random search around the current incumbent point could be defined with the struct:

```
struct RandomLocalSearch <: AbstractSearch
# Number of points to generate
N::Int
# Maximum distance to explore
d::Float64
end
```

And then the corresponding implementation with a method of the function `GenerateSearchPoints`

:

```
function GenerateSearchPoints(p::DSProblem{T}, s::RandomLocalSearch)::Vector{Vector{T}} where T
points = []
# Generating s.N points
for i in 1:s.N
# Generate offset vector
offset = zeros(p.N)
offset[rand(1:p.N)] = rand(-s.d:s.d)
# Append to points list
push!(points, p.x + offset)
end
# Return list
return points
end
```

This can then be used as with any other search method:

`p = DSProblem(3; poll=LTMADS(), search=RandomLocalSearch(5, 0.1));`

*(Note that this search method it is unlikely to give good results due to not adapting the direction variable d to the current mesh size.)*

## Organisation

Unless it is very simple (ie, fits within a single function) please implement your search method in its own file. This ensures that extra functions that are part of the method are kept in a relevant place.

If a custom search method may be useful to other people, please consider contributing it back to the package.