42 lines
1.0 KiB
Matlab
Executable File
42 lines
1.0 KiB
Matlab
Executable File
function Fcont = logic2cont(Flogic)
|
|
|
|
Fcont = ([]);
|
|
M = 1e3;
|
|
% How many elements in this clause
|
|
Flogic = flatten(Flogic);
|
|
n = size( Flogic.clauses{1},2);
|
|
% Are all simple letters?
|
|
all_letters = 1;
|
|
j = 1;
|
|
while all_letters & j<=n
|
|
if isa(Flogic.clauses{1}{j}.data,'sdpvar')
|
|
all_letters = all_letters & is(Flogic.clauses{1}{j}.data,'logic');
|
|
else
|
|
all_letters = 0;
|
|
end
|
|
j = j + 1;
|
|
end
|
|
|
|
if all_letters
|
|
sum_or = 0;
|
|
% Ah, simple constraints, just add them
|
|
for j = 1:n
|
|
sum_or = sum_or + Flogic.clauses{i}{j};
|
|
end
|
|
else
|
|
sum_or = 0;
|
|
delta = binvar(size( Flogic.clauses{i},2),1);
|
|
for j = 1:size( Flogic.clauses{i},2)
|
|
clause_i_j = Flogic.clauses{i}{j};
|
|
if isa(clause_i_j,'constraint')
|
|
delta = binvar(1,1);
|
|
F = F + (sdpvar(clause_i_j)+M*(1-delta)>=0);
|
|
sum_or = sum_or + delta;
|
|
elseif isa(clause_i_j,'sdpvar')
|
|
F = F + (clause_i_j>=0);
|
|
sum_or = sum_or + clause_i_j;
|
|
end
|
|
end
|
|
|
|
end
|
|
Fcont = (sum_or>=1); |