% EXAMPLE1_SDP.M % % Compares QP and SDP based relaxation methods for problem % described in paper: % "Relaxed Maximum a Posteriori Fault Identification" % by A. Zymnis, S. Boyd and D. Gorinevsky % requires CVX to run % WARNING: Augmented SDP takes a while to run clear all cvx_quiet(false); randn('state',824); rand('state',25); %% ---------------- Generate Data ----------------------------------------- m = 50; %number of sensors n = 100; %number of fault signatures pf = 0.05; %probability of fault sigma = 1.5; %noise std lambda = log((1-pf)/pf)*ones(n,1); K = 10; %ambiguity set size A = randn(m,n); %fault signatures x_true = double(rand(n,1)= 0 x <= 1 cvx_end l_min_qp = cvx_optval-(1/(2*sigma^2))*norm(y)^2 %% rounding [x_sort,ind_x] = sort(x,'descend'); x_cand = []; l_cand = []; for i = 1:n x_cur = zeros(n,1); x_cur(ind_x(1:i)) = 1; l_cur = (1/(2*sigma^2))*square_pos(norm(A*x_cur-y,2))+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; x_cand = [x_cand x_cur]; l_cand = [l_cand l_cur]; end [l_sort,ind_l] = sort(l_cand,'ascend'); X_amb_qp = x_cand(:,ind_l(1:K)); %get ambiguity set l_amb_qp = l_sort(1:K); % perform local optimization EXIT_FLAG = 0; iter = 0; while(~EXIT_FLAG) x_cur = X_amb_qp(:,1); x_best = x_cur; for i = 1:n iter = iter+1; x_cur(i) = not(x_cur(i)); l_cur = (1/(2*sigma^2))*norm(A*x_cur-y,2).^2+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; if any(l_cur= 0; z <= 1; cvx_end l_min_sdp = cvx_optval-(1/(2*sigma^2))*norm(y)^2 %% rounding [x_sort,ind_x] = sort(z,'descend'); x_cand = []; l_cand = []; for i = 1:n x_cur = zeros(n,1); x_cur(ind_x(1:i)) = 1; l_cur = (1/(2*sigma^2))*square_pos(norm(A*x_cur-y,2))+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; x_cand = [x_cand x_cur]; l_cand = [l_cand l_cur]; end [l_sort,ind_l] = sort(l_cand,'ascend'); X_amb_sdp = x_cand(:,ind_l(1:K)); %get ambiguity set l_amb_sdp = l_sort(1:K); % perform local optimization EXIT_FLAG = 0; iter = 0; while(~EXIT_FLAG) x_cur = X_amb_sdp(:,1); x_best = x_cur; for i = 1:n iter = iter+1; x_cur(i) = not(x_cur(i)); l_cur = (1/(2*sigma^2))*norm(A*x_cur-y,2).^2+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; if any(l_cur= 0; z >= 0; z <= 1; cvx_end l_min_sdp2 = cvx_optval-(1/(2*sigma^2))*norm(y)^2 %% rounding [x_sort,ind_x] = sort(z,'descend'); x_cand = []; l_cand = []; for i = 1:n x_cur = zeros(n,1); x_cur(ind_x(1:i)) = 1; l_cur = (1/(2*sigma^2))*square_pos(norm(A*x_cur-y,2))+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; x_cand = [x_cand x_cur]; l_cand = [l_cand l_cur]; end [l_sort,ind_l] = sort(l_cand,'ascend'); X_amb_sdp = x_cand(:,ind_l(1:K)); %get ambiguity set l_amb_sdp = l_sort(1:K); % perform local optimization EXIT_FLAG = 0; iter = 0; while(~EXIT_FLAG) x_cur = X_amb_sdp(:,1); x_best = x_cur; for i = 1:n iter = iter+1; x_cur(i) = not(x_cur(i)); l_cur = (1/(2*sigma^2))*norm(A*x_cur-y,2).^2+lambda'*x_cur-(1/(2*sigma^2))*norm(y)^2; if any(l_cur