You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: opti_cplex.m
    path of file: ./repos/OPTI/Solvers
    
    the code of the file until where you have to start completion: function [x,fval,exitflag,info] = opti_cplex(H,f,A,rl,ru,lb,ub,xint,sos,qc,x0,opts)
%OPTI_CPLEX Solve a LP/MILP/QP/MIQP/QCQP/MIQCQP using CPLEX
%
%   min 0.5*x'*H*x + f'*x      subject to:     rl <= A*x <= ru
%    x                                         qrl <= x'Q'x + l'x <= qru
%                                              lb <= x <= ub
%                                              for i = 1..n: xi in Z
%                                              for j = 1..m: xj in {0,1} 
%
%   x = opti_cplex([],f,A,rl,ru,lb,ub,xint) solves a LP/MILP where f is the 

    
function [x,fval,exitflag,info] = opti_cplex(H,f,A,rl,ru,lb,ub,xint,sos,qc,x0,opts)
%OPTI_CPLEX Solve a LP/MILP/QP/MIQP/QCQP/MIQCQP using CPLEX
%
%   min 0.5*x'*H*x + f'*x      subject to:     rl <= A*x <= ru
%    x                                         qrl <= x'Q'x + l'x <= qru
%                                              lb <= x <= ub
%                                              for i = 1..n: xi in Z
%                                              for j = 1..m: xj in {0,1} 
%
%   x = opti_cplex([],f,A,rl,ru,lb,ub,xint) solves a LP/MILP where f is the 
%   objective vector, A,rl,ru are the linear constraints, lb,ub are the
%   bounds and xint is a string of integer variables ('C', 'I', 'B').
%
%   x = opti_cplex(H,f,A,rl,ru,lb,ub,xint) solves a QP/MIQP where H is the
%   objective matrix, and the remainder of the arguments are as above.
%
%   x = opti_cplex(H,...,xint,sos) sos is a structure with fields type, 
%   index, weight for SOS.
%
%   x = opti_cplex(H,...,sos,qc) qc is structure with fields Q, l, qrl and
%   qru for quadratic constraints.
%
%   x = opti_cplex(H,...,qc,x0) supples an initial guess of the solution.
%
%   x = opti_cplex(H,f,...,x0,opts) uses opts to pass CPLEX parameters to 
%   the solver. For example to set the node limit:
%       opts.mip.limits.nodes.Cur = 1000;
%
%   [x,fval,exitflag,info] = opti_cplex(...) returns the objective value at
%   the solution, together with the solver exitflag, and an information
%   structure.

%   Copyright (C) 2013 Jonathan Currie (Control Engineering)

t = tic;

% Handle missing arguments
if nargin < 12, opts = []; end