remove prototyping script
parent
ad2342d02a
commit
8de7dbe3fd
77
matlab/lp.m
77
matlab/lp.m
|
@ -1,77 +0,0 @@
|
|||
import gtsam.*
|
||||
g = [-1; -1] % min -x1-x2
|
||||
C = [-1 0
|
||||
0 -1
|
||||
1 2
|
||||
4 2
|
||||
-1 1]';
|
||||
b =[0;0;4;12;1]
|
||||
|
||||
%% step 0
|
||||
m = length(C);
|
||||
active = zeros(1, m);
|
||||
x0 = [0;0];
|
||||
|
||||
for iter = 1:2
|
||||
% project -g onto the nullspace of active constraints in C to obtain the moving direction
|
||||
% It boils down to solving the following constrained linear least squares
|
||||
% system: min_d// || d// - d ||^2
|
||||
% s.t. C*d// = 0
|
||||
% where d = -g, the opposite direction of the objective's gradient vector
|
||||
dgraph = GaussianFactorGraph
|
||||
dgraph.push_back(JacobianFactor(1, eye(2), -g, noiseModel.Unit.Create(2)));
|
||||
for i=1:m
|
||||
if (active(i)==1)
|
||||
ci = C(:,i);
|
||||
dgraph.push_back(JacobianFactor(1, ci', 0, noiseModel.Constrained.All(1)));
|
||||
end
|
||||
end
|
||||
d = dgraph.optimize.at(1)
|
||||
|
||||
% Find the bad active constraints and remove them
|
||||
% TODO: FIXME Is this implementation correct?
|
||||
for i=1:m
|
||||
if (active(i) == 1)
|
||||
ci = C(:,i);
|
||||
if ci'*d < 0
|
||||
active(i) = 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
active
|
||||
|
||||
% We are going to jump:
|
||||
% x1 = x0 + k*d;, k>=0
|
||||
% So check all inactive constraints that block the jump to find the smallest k
|
||||
% ci*x1 - bi <=0
|
||||
% ci*(x0 + k*d) - bi <= 0
|
||||
% ci*x0-bi + ci*k*d <= 0
|
||||
% - if ci*d < 0: great, no prob (-ci and d have the same direction)
|
||||
% - if ci*d > 0: (-ci and d have opposite directions)
|
||||
% k <= -(ci*x0 - bi)/(ci*d)
|
||||
k = 100000;
|
||||
newActive = -1;
|
||||
for i=1:m
|
||||
if active(i) == 1
|
||||
continue
|
||||
end
|
||||
ci = C(:,i);
|
||||
if ci'*d > 0
|
||||
foundNewActive = true;
|
||||
if k > -(ci'*x0 - b(i))/(ci'*d)
|
||||
k = -(ci'*x0 - b(i))/(ci'*d);
|
||||
newActive = i;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% If there is no blocking constraint, the problem is unbounded
|
||||
if newActive == -1
|
||||
disp('Unbounded')
|
||||
else
|
||||
% Otherwise, make the jump, and we have a new active constraint
|
||||
x0 = x0 + k*d
|
||||
active(newActive) = 1
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue