70 lines
2.4 KiB
Mathematica
70 lines
2.4 KiB
Mathematica
|
|
function solver = fiordos(self)
|
||
|
|
|
||
|
|
% The first dimin equalities are used to fix some parameters
|
||
|
|
aux = self.model.F_struc(1:self.dimin,:);
|
||
|
|
|
||
|
|
% remove these
|
||
|
|
self.model.F_struc(1:self.dimin(1),:) = [];
|
||
|
|
self.model.K.f = self.model.K.f - self.dimin(1);
|
||
|
|
|
||
|
|
% Extract all bounds and move from Ab to ub/lb
|
||
|
|
temp = presolve_bounds_from_modelbounds(self.model,1);
|
||
|
|
self.model = temp;
|
||
|
|
% Any bound constraints?
|
||
|
|
n = length(temp.lb);
|
||
|
|
bounded_ub = find(~isinf(temp.ub));
|
||
|
|
bounded_lb = find(~isinf(temp.lb));
|
||
|
|
if length(bounded_lb) == n && length(bounded_ub) == n
|
||
|
|
% All have finite bounds.
|
||
|
|
X = EssBox(n, 'l',temp.lb, 'u',temp.ub);
|
||
|
|
X = SimpleSet(X);
|
||
|
|
elseif ~isempty(bounded_ub) || ~isempty(bounded_lb)
|
||
|
|
% Only some bounds. Keep them as general constraints
|
||
|
|
X = [];
|
||
|
|
for i = 1:n
|
||
|
|
if isinf(temp.lb(i)) && isinf(temp.ub(i))
|
||
|
|
X{end+1} = EssRn(1);
|
||
|
|
elseif ~isinf(temp.lb(i)) && ~isinf(temp.ub(i))
|
||
|
|
X{end+1} = EssBox(1, 'l',temp.lb(i), 'u',temp.ub(i));
|
||
|
|
elseif isinf(temp.ub(i))
|
||
|
|
X{end+1} = EssRnplus(1, 'shift', temp.lb(i));
|
||
|
|
else
|
||
|
|
X{end+1} = EssRnplus(1, 'shift', temp.ub(i),'rot',-1);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
X = SimpleSet(X{:});
|
||
|
|
else
|
||
|
|
% No bounds
|
||
|
|
X = EssRn(n);
|
||
|
|
X = SimpleSet(X);
|
||
|
|
end
|
||
|
|
|
||
|
|
% Put back a placeholder for fixing the parameters
|
||
|
|
self.model.F_struc = [aux;self.model.F_struc];
|
||
|
|
self.model.F_struc(1:self.dimin(1),1)=0; % Now fixed to zero
|
||
|
|
self.model.K.f = self.model.K.f + self.dimin(1);
|
||
|
|
|
||
|
|
op = OptProb('H',2*full(self.model.Q), 'g',self.model.c, 'X',X, 'Ae',-self.model.F_struc(1:self.model.K.f,2:end), 'be','param');
|
||
|
|
|
||
|
|
%instantiate solver
|
||
|
|
s = Solver(op,'approach','primal-dual');
|
||
|
|
%, 'algoOuter','gm', 'algoInner','fgm');
|
||
|
|
%optionally change settings, e.g.
|
||
|
|
%-maximum number of iterations
|
||
|
|
%s.setSettings('algoOuter', 'maxit',10000);
|
||
|
|
%s.setSettings('algoInner', 'maxit',9000);
|
||
|
|
%-gradient-map stopping criterion
|
||
|
|
%s.setSettings('algoOuter', 'stopg',true, 'stopgEps',1e-3);
|
||
|
|
%s.setSettings('algoInner', 'stopg',true, 'stopgEps',1e-5);
|
||
|
|
%generate solver code
|
||
|
|
s.generateCode('prefix','demo_','forceOverwrite',1);
|
||
|
|
demo_mex_make();
|
||
|
|
|
||
|
|
compiledsolver = @(x)demo_mex(x);
|
||
|
|
b0 = self.model.F_struc(1:self.model.K.f,1);
|
||
|
|
B0 = [eye(self.dimin(1));zeros(self.model.K.f-self.dimin(1),self.dimin(1))];
|
||
|
|
map = self.map;
|
||
|
|
dimout = self.dimout;
|
||
|
|
mask = self.mask{1};
|
||
|
|
solver = @(x)(fiordos_call(compiledsolver,x,B0,b0,mask,map,dimout));
|