# 3.1 Extend AutoOptLib
AutoOptLib follows the open-closed principle [[Mey97](../References/ref.html#Mey97), [Lar01](../References/ref.html#Lar01)]. As illustrated in [Figure 2](../UserGuide/AutoOptLib_Arch.html#figure2) and Section [2.2.3](../UserGuide/Use_AutoOptLib.html#operating-sequence), metaheuristic algorithm components and design techniques are packaged and invoked independently. This allows users easily implement their algorithm components, design objectives, and algorithm performance evaluation techniques based on the current sources, and add the implementations to the library by a uniform interface. Taking Listing 1 as an
example, new algorithmic components can be added as follows.
Listing 1: Implementation of the uniform mutation operator.
```matlab
function [output1,output2] = search_mu_uniform(varargin)
mode = varargin{end};
switch mode
case 'execute'
Parent = varargin{1};
Problem = varargin{2};
Para = varargin{3};
Aux = varargin{4};
if ~isnumeric(Parent)
Offspring = Parent.decs;
else
Offspring = Parent;
end
Prob = Para;
[N,D] = size(Offspring);
Lower = Problem.bound(1,:);
Upper = Problem.bound(2,:);
ind = rand(N,D) < Prob;
Temp = unifrnd(repmat(Lower,N,1),repmat(Upper,N,1));
Offspring(ind) = Temp(ind);
output1 = Offspring;
output2 = Aux;
case 'parameter'
output1 = [0,0.3]; % mutation probability
case 'behavior'
output1 = {'LS','small';'GS','large'}; % small probabilities perform local search
end
if ~exist('output1','var')
output1 = [];
end
if ~exist('output2','var')
output2 = [];
end
```
An algorithmic component is implemented in an independent function with three main cases.
`Case 'execute'` refers to executing the component. There are seven optional inputs:
+ Current solutions, i.e., `Parent` in line 5.
+ The problem proprieties, i.e., `Problem` in line 6.
+ The component’s inner parameters, i.e., `Para` in line 7.
+ An auxiliary structure array for saving the component’s inner parameters that are changed during iteration (e.g., the velocity in particle swarm optimization (PSO)), i.e., `Aux` in line 8.
+ The algorithm’s generation counter `G`.
+ The algorithm’s inner local search iteration counter `innerG`.
+ The target problem’s input data `Data`.
The component should be implemented from line 9. The outputs of lines 21 and 22 are mandatory, in
which output1 returns solutions processed by the component, and `output2` returns the `Aux` structure
array. If the component has inner parameters that are changed during iteration, `Aux` is updated (e.g.,
update PSO’s velocity and save it in `Aux`); otherwise, `Aux` will be the same as that in line 8.
`Case 'parameter'` defines the lower and upper bounds of the component’s inner parameter values. For
example, the mutation probability is bounded within `[0, 0.3]` in line 24. For components with multiple
inner parameters, each parameter’s lower and upper bounds should be saved in an independent row of
the matrix `output1`.
For search operators (components) with inner parameters controlling the search behavior, case
behavior defines how the inner parameters control the search behavior. For example, line 26 indicates that the uniform mutation with smaller mutation probabilities performs local search and that with
larger probabilities performs global search. For other operators, `output1` in `case 'behavior'` is left empty, i.e., `output1={}`.