66 lines
1.3 KiB
Matlab
Executable File
66 lines
1.3 KiB
Matlab
Executable File
function [nnz,ind,val] = pennonm_callback_dg(i,x,model_in)
|
|
|
|
global latest_G
|
|
global latest_g
|
|
global latest_x_g
|
|
|
|
persistent model
|
|
persistent G
|
|
|
|
if nargin>2
|
|
model = model_in;
|
|
return
|
|
end
|
|
|
|
x = x(:);
|
|
if ~isequal(latest_x_g,x)
|
|
% Compute the nonlinear terms in the constraints
|
|
[g,geq,dg,dgeq] = fmincon_con(x,model);
|
|
latest_x_g = x;
|
|
|
|
% Append with linear constraints
|
|
g = [g;geq];
|
|
if ~isempty(model.A)
|
|
g = [g;model.A*x - model.b];
|
|
end
|
|
if ~isempty(model.Aeq)
|
|
g = [g;model.Aeq*x - model.beq];
|
|
end
|
|
|
|
% Append with linear terms
|
|
G = [dg';dgeq'];
|
|
if ~isempty(model.A)
|
|
G = [G;model.A];
|
|
end
|
|
if ~isempty(model.Aeq)
|
|
G = [G;model.Aeq];
|
|
end
|
|
|
|
|
|
|
|
start = length(x) - sum((model.K.s).*(model.K.s+1)/2)+1;
|
|
for j = 1:length(model.K.s)
|
|
ni = model.K.s(j);
|
|
T = ones(ni);T = triu(T);
|
|
Ti = find(triu(T));
|
|
xs = x(start:start+ni*(ni+1)/2-1);
|
|
T = T*0;
|
|
T(Ti)=xs;
|
|
X = T+T'-diag(diag(T));
|
|
start = start + ni*(ni+1)/2;
|
|
end
|
|
[cc,cg] = detfun(X,6);
|
|
|
|
|
|
|
|
G(end+1,1)=0;
|
|
g(end+1)=0;
|
|
|
|
latest_G = G;
|
|
latest_g = g;
|
|
else
|
|
G = latest_G;
|
|
end
|
|
Gi = G(i+1,:);
|
|
[aux,ind,val] = find(Gi);
|
|
nnz = length(val); |