67 lines
1.9 KiB
Mathematica
67 lines
1.9 KiB
Mathematica
|
|
function model = compressLifted(model)
|
||
|
|
|
||
|
|
if isempty(model.aux_variables) || isempty(model.Aeq)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
[used,liftedIndex] = ismember(setdiff(model.aux_variables,model.evalVariables),model.linearindicies);
|
||
|
|
if isempty(liftedIndex)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
linearIndex = setdiff(1:length(model.linearindicies),liftedIndex);
|
||
|
|
lift.d = [];
|
||
|
|
lift.T = [];
|
||
|
|
lift.S = [];
|
||
|
|
if ~isempty(model.Aeq)
|
||
|
|
definingLift = find(any(model.Aeq(:,liftedIndex),2));
|
||
|
|
lift.d = [lift.d;-model.beq(definingLift)];
|
||
|
|
lift.T = [lift.T;model.Aeq(definingLift,linearIndex)];
|
||
|
|
lift.S = [lift.S;-model.Aeq(definingLift,liftedIndex)];
|
||
|
|
keep = any(lift.S,1);
|
||
|
|
if ~all(keep)
|
||
|
|
% FIXME: Sort out this case
|
||
|
|
return
|
||
|
|
end
|
||
|
|
[i,j,k] = find(lift.S);
|
||
|
|
lift.T = lift.T(i,:);
|
||
|
|
lift.d = lift.d(i);
|
||
|
|
model.Aeq(definingLift,:) = [];
|
||
|
|
model.beq(definingLift,:) = [];
|
||
|
|
model.Aeq(:,liftedIndex)=[];
|
||
|
|
if isempty(model.Aeq)
|
||
|
|
model.Aeq = [];
|
||
|
|
model.beq = [];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if size(lift.S,1) == size(lift.S,2) & length(lift.S) == length(liftedIndex)
|
||
|
|
|
||
|
|
% Equalities defining the lifted variables d + Tx = y
|
||
|
|
if ~isempty(model.A)
|
||
|
|
Ax = model.A(:,linearIndex);
|
||
|
|
Ay = model.A(:,liftedIndex);
|
||
|
|
Ax = Ax + Ay*lift.T;
|
||
|
|
b = model.b - Ay*lift.d;
|
||
|
|
model.A = Ax;
|
||
|
|
model.b = b;
|
||
|
|
end
|
||
|
|
|
||
|
|
lb = model.lb(liftedIndex);model.lb(liftedIndex)=[];
|
||
|
|
ub = model.ub(liftedIndex);model.ub(liftedIndex)=[];
|
||
|
|
uselb = find(~isinf(lb));
|
||
|
|
if ~isempty(uselb)
|
||
|
|
model.A = [model.A;-lift.T(uselb,:)];
|
||
|
|
model.b = [model.b;lift.d(uselb) - lb(uselb)];
|
||
|
|
end
|
||
|
|
useub = find(~isinf(ub));
|
||
|
|
if ~isempty(useub)
|
||
|
|
model.A = [model.A;-lift.T(useub,:)];
|
||
|
|
model.b = [model.b;lift.d(useub) - lb(useub)];
|
||
|
|
end
|
||
|
|
model.x0 = model.x0(linearIndex);
|
||
|
|
lift.linearIndex = linearIndex;
|
||
|
|
lift.liftedIndex = liftedIndex;
|
||
|
|
model.lift = lift;
|
||
|
|
else
|
||
|
|
model.lift = [];
|
||
|
|
end
|