You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
6.6 KiB
150 lines
6.6 KiB
% w: width of connection needs
|
|
% thred: if CI<thred -> connect
|
|
function [CI,dCI] = connectConstraint(microx,microy,xi,connEle,allx,w,thred)
|
|
|
|
xi = reshape(xi,microy,microx);
|
|
|
|
CI = zeros(4,1);
|
|
dCI = zeros(4,microy*microx);
|
|
|
|
% down, right, up, left
|
|
for i = 1:4
|
|
conn = zeros(microy,microx);
|
|
dconn = zeros(microy,microx);
|
|
connMeas = zeros(microy,microx);
|
|
dconnMeas = zeros(microy,microx);
|
|
|
|
if connEle(i)>0
|
|
xj = reshape(allx(:,connEle(i)),microy,microx);
|
|
|
|
switch i
|
|
case 1 % down
|
|
for ii = 1:microx
|
|
for jj = (microy-w+1):microy
|
|
% opposite
|
|
jj1 = microy-jj+1;
|
|
ii1 = ii;
|
|
% orthog, 45 degree left and right,
|
|
% NOTE: don't forget border
|
|
ii2 = ii-(microy-jj)*2; ii2(ii2<1) = 1;
|
|
ii3 = ii+(microy-jj)*2; ii3(ii3>microx) = microx;
|
|
|
|
tmp = xj(jj1,ii1);
|
|
% tmp = max(xj(jj1,ii1), max(xj(jj1,ii2), xj(jj1,ii3)));
|
|
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
|
|
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))*(1-tmp);
|
|
end
|
|
end
|
|
connMeas((microy-w+1):microy,1:microx) = exp(xi((microy-w+1):microy,1:microx));
|
|
CI(i,1) = sum(sum(conn((microy-w+1):microy,1:microx)))/...
|
|
(sum(sum(connMeas((microy-w+1):microy,1:microx)))+1e-9);
|
|
|
|
% if CI(i,1)>thred
|
|
% bad connection
|
|
dconnMeas((microy-w+1):microy,1:microx) = exp(xi((microy-w+1):microy,1:microx));
|
|
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
|
|
dCI(i,:) = tmp(:);
|
|
% else
|
|
% CI(i,1) = 0;
|
|
% end
|
|
|
|
case 2 % right
|
|
for ii = (microx-w+1):microx
|
|
for jj = 1:microy
|
|
% opposite
|
|
jj1 = jj;
|
|
ii1 = microx-ii+1;
|
|
% orthog, 45 degree left and right,
|
|
% NOTE: don't forget border
|
|
jj2 = jj-(microx-ii)*2; jj2(jj2<1) = 1;
|
|
jj3 = jj+(microx-ii)*2; jj3(jj3>microy) = microy;
|
|
|
|
tmp = xj(jj1,ii1);
|
|
% tmp = max(xj(jj1,ii1), max(xj(jj2,ii1), xj(jj3,ii1)));
|
|
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
|
|
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))*(1-tmp);
|
|
end
|
|
end
|
|
connMeas(1:microy,(microx-w+1):microx) = exp(xi(1:microy,(microx-w+1):microx));
|
|
CI(i,1) = sum(sum(conn(1:microy,(microx-w+1):microx)))/...
|
|
(sum(sum(connMeas(1:microy,(microx-w+1):microx)))+1e-9);
|
|
|
|
% if CI(i,1)>thred
|
|
% bad connection
|
|
dconnMeas(1:microy,(microx-w+1):microx) = exp(xi(1:microy,(microx-w+1):microx));
|
|
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
|
|
dCI(i,:) = tmp(:);
|
|
% else
|
|
% CI(i,1) = 0;
|
|
% end
|
|
|
|
case 3 % up
|
|
for ii = 1:microx
|
|
for jj = 1:w
|
|
% opposite
|
|
jj1 = microy-jj+1;
|
|
ii1 = ii;
|
|
% orthog, 45? left and right,
|
|
% NOTE: don't forget border
|
|
ii2 = ii-jj*2; ii2(ii2<1) = 1;
|
|
ii3 = ii+jj*2; ii3(ii3>microx) = microx;
|
|
|
|
tmp = xj(jj1,ii1);
|
|
% tmp = max(xj(jj1,ii1), max(xj(jj1,ii2), xj(jj1,ii3)));
|
|
% conn(jj,ii) = xi(jj,ii) .* (1-tmp);
|
|
% dconn(jj,ii) = xi(jj,ii)*(1-tmp);
|
|
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
|
|
dconn(jj,ii) = exp(xi(jj,ii) .* (1-tmp))*(1-tmp);
|
|
|
|
% connMeas(jj,ii) = tmp;
|
|
end
|
|
end
|
|
connMeas(1:w,1:microx) = exp(xi(1:w,1:microx));
|
|
% connMeas(1:w,1:microx) = xi(1:w,1:microx).^2;
|
|
CI(i,1) = (sum(sum(conn(1:w,1:microx)))/...
|
|
(sum(sum(connMeas(1:w,1:microx)))+1e-9));
|
|
|
|
% if CI(i,1)>thred
|
|
% bad connection
|
|
% dconnMeas(1:w,1:microx) = xi(1:w,1:microx);
|
|
dconnMeas(1:w,1:microx) = exp(xi(1:w,1:microx));
|
|
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
|
|
dCI(i,:) = tmp(:);
|
|
% else
|
|
% CI(i,1) = 0;
|
|
% end
|
|
|
|
case 4 % left
|
|
for ii = 1:w
|
|
for jj = 1:microy
|
|
% opposite
|
|
jj1 = jj;
|
|
ii1 = microx-ii+1;
|
|
% orthog, 45 degree left and right,
|
|
% NOTE: don't forget border
|
|
jj2 = jj-ii*2; jj2(jj2<1) = 1;
|
|
jj3 = jj+ii*2; jj3(jj3>microy) = microy;
|
|
|
|
tmp = xj(jj1,ii1);
|
|
% tmp = max(xj(jj1,ii1), max(xj(jj2,ii1), xj(jj3,ii1)));
|
|
conn(jj,ii) = exp(xi(jj,ii) .* (1-tmp));
|
|
dconn(jj,ii) = exp(xi(jj,ii)*(1-tmp))* (1-tmp);
|
|
end
|
|
end
|
|
connMeas(1:microy,1:w) = exp(xi(1:microy,1:w));
|
|
CI(i,1) = sum(sum(conn(1:microy,1:w)))/...
|
|
(sum(sum(connMeas(1:microy,1:w)))+1e-9);
|
|
|
|
% if CI(i,1)>thred
|
|
% bad connection
|
|
dconnMeas(1:microy,1:w) = exp(xi(1:microy,1:w));
|
|
tmp = (dconn*sum(connMeas(:)) - sum(conn(:))*dconnMeas)/(sum(connMeas(:))+1e-9)^2;
|
|
dCI(i,:) = tmp(:);
|
|
% else
|
|
% CI(i,1) = 0;
|
|
% end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|