BARON compatible functions

BARON is a sophisticated global optimizer which requires an algebraic description of the model in order to optimize it. This means that user supplied functions (objective, constraints) must be pre-processed to an algebraic form BARON can process. Based on this requirement, user supplied functions must meet the criteria set out below.

Scalar functions

A simple objective function is a written as function of indexed (scalar) decision variables, such as:

obj = @(x) 3*x(1)^2 - 2*x(2);

If your objective is a function of one variable only (single variable optimization), you may drop the index:

obj = @(x) 3*x^2;

Alternatively if your objective does not contain any variables, you must still write it as a function of x:

obj = @(x) -3;

Vectorized functions

The MATLAB - BARON Interface also supports vector and a subset of matrix operations. For the following examples, assume x is a 3 x 1 column vector:

a = [1;2;3];
H = eye(3);

objV = @(x) sum(a.*x); % element wise multiply summed

objD = @(x) a'*x; % equivalent to above but via inner product

objM = @(x) x'*H*x; % quadratic term

The interface implements indexing identical to MATLAB so you can use logical or position based indexing:

objI = @(x) sum(a(a>1).*x(a>1)); % logical indexing

objI2 = @(x) sum(a(1:2).*x(2:3)); % position based indexing

objI3 = @(x) sum(a(1)*x); % scalar expansion is also supported

Remember your objective function must always result in a scalar.

MATLAB functions and anonymous functions

Both MATLAB functions and anonymous functions are supported, for example:

obj = @(x) 3*x(1)^2 - 2*x(2)^3 + 3*x(1)*x(2);

OR

function fx = objective(x)
    fx = 3*x(1)^2 - 2*x(2)^3 + 3*x(1)*x(2);
end

however both functions must be a function of one argument (x) only. If your function requires multiple parameters you can wrap it as follows:

function fx = objective(x,a,b)
    fx = 3*x(1)^2 - a*x(2)^3 + b*x(1)*x(2);
end

a = 2; b = 3;
obj = @(x) objective(x,a,b); %now only a function of x

Multiline MATLAB functions including loops are supported, however the function must be deterministic. This means no matter what value x is, the function executes the same code path.

Nonlinear constraint function

The nonlinear constraint function should return a column vector of values, for example:

nlcon = @(x) [-(x(1)*x(2));
              3*x(1) + 2*x(2)];

OR

function cx = nlconstraints(x)
    cx(1,1) = -(x(1)*x(2));
    cx(2,1) = 3*x(1) + 2*x(2);
end

However you may also return a matrix of values, in which case it will be internally converted to a column vector. This process assumes column major, so ensure your nonlinear constraint bounds are set in the same order. All operations (vector, matrix, etc) that are supported by the objective are also supported by the nonlinear constraint function.

MATLAB/BARON interface supported functions

Function name Typical usage Function Name Typical  usage
+ plus a+b prod Product prod(a)
- minus a-b diff Difference diff(a)
./ rdivide Elementwise a./b diag Diagonal diag(a)
/ mrdivide Elementwise a./b if b is a scalar triu Tri upper triu(a)
.* times Elementwise a.*b tril Tri lower tril(a)
* mtimes Matrix and vector products +inner and outer products fliplr Flip LR fliplr(a)
.^ power Elementwise a.^b flipud Flip UD flipud(a)
^ mpower a^b if a is square and b is an integer rot90 Rotate 90 rot90(a)
- uminus Elementwise -a repmat Replicate matrix repmat(a,m,n)
.' ctranspose a' reshape Reshape reshape(a,m,n)
' transpose a' length Length length(a)
exp Exponential exp(a) size Size size(a)
log Natural Log log(a) ndims # Dimensions ndims(a)
log10 Log Base 10 log10(a) isscalar Is scalar isscalar(a)
dot Dot Product dot(a,b) vertcat V concatenate [a; b]
sqrt Square Root sqrt(a) horzcat H concatenate [a b]
norm Norm norm(a) [Vector = 2 norm, Matrix = Frobenius Norm] subsref Subs reference a(1), a(1:2), a(1:end), a(1,1), a(1,:), a(:)
sum Sum sum(a) subsasgn Subs assign c(1) = a, c(1:2) = a, c(1,:) = a;

Checking the processed function

By default, baron.m will compare the result of the original function and that of the generated BARON function when both are subjected to the same random x0. This process ensures the problem BARON solves is identical to that you described in MATLAB. If you wish to skip this check (for efficiency reasons), you can disable it via the option 'chkfun' in baronset.

Alternatively, you can manually inspect the resulting equations using the following code snippet (assuming you have defined fun as the objective, nlcon as the constraints, and x0 as initial guess):

x = barvec(size(x0)); % BARON Vector Variable

fval = fun(x) % Objective Function Equation

cval = nlcon(x) % Constraint Function Equation(s)

For example, consider the following code:

% Problem
a = [1;2;3];
fun = @(x) sum(a.*x);
x0 = zeros(3,1);

% Test
x = barvec(size(x0));
fval = fun(x)

The above code results in the following equation:

Scalar BARVEC Object
Eq [+]: 1*x1 + 2*x2 + 3*x3