Skip to content
Snippets Groups Projects
Commit 6db6e057 authored by ac 20's avatar ac 20
Browse files

added patch21, fixed patch11 target query

parent 225dbabf
Branches
No related tags found
No related merge requests found
......@@ -13,6 +13,7 @@ tProcess.tTrack1=toc(tx);
tx=tic();
Smooth.Patch.patch11(conn);
Smooth.Patch.patch12(conn);
Smooth.Patch.patch21(conn);
tProcess.tPatch=toc(tx);
tx=tic();
......
......@@ -16,12 +16,19 @@ cidList=Helpers.sqlEncodeVector(qSrc.cellID);
cmd=['select cellID_src,cellID_dst,min(cost) from tblDistCC where cellID_src in ' ...
cidList ' group by cellID_src'];
qSrcCosts=fetch(conn,cmd);
% find best incoming edge for each cell
cmd=['select * from (select cellID_src,cellID_dst,trackID as trackID_dst,min(cost),time as time_dst '...
' from tblCells inner join tblDistCC on cellID=cellID_dst group by cellID_dst)'...
' where cellID_src in ' cidList];
qPatch=fetch(conn,cmd);
qPatch(qPatch.cellID_dst~=qPatch.trackID_dst,:)=[];
cmd=['select * from (select cellID_src,cellID_dst,trackID as trackID_dst, '...
' min(cost),time as time_dst from tblCells inner join tblDistCC on '...
' cellID=cellID_dst group by cellID_dst) where cellID_src in ' cidList];
qPatch=fetch(conn,cmd);
qPatch(qPatch.cellID_dst~=qPatch.trackID_dst,:)=[];
for i=1:length(qPatch.cellID_src)
% check src costs. true love?
idxSrcCosts=find(qSrcCosts.cellID_src==qPatch.cellID_src(i));
......
......@@ -31,10 +31,16 @@ for i=1:length(qSrc.cellID_dst)
if qTarget.min_cost_(1)<qSrc.min_cost_(i)
% src(1:dst.tmin-1)->dst(1:end)
% reset src(dst.tmin:end)
cmd=['update tblCells set trackID=cellID' ...
' where trackID=' num2str(qTarget.trackID_src(1)) ...
' and time>=' num2str(qTarget.time_dst(1))];
cmd=['select cellID from tblCells where trackID=' ...
num2str(qTarget.trackID_src(1)) ' and time>='...
num2str(qTarget.time_dst(1))];
qReplace=fetch(conn,cmd);
if ~isempty(qReplace)
cidsReplace=Helpers.sqlEncodeVector(qReplace.cellID);
cmd=['update tblCells set trackID=' num2str(qReplace.cellID(1))...
' where cellID in ' cidsReplace];
exec(conn,cmd);
end
% set src(dst.tmin:end)->dst
cmd=['update tblCells set trackID=' num2str(qTarget.trackID_src(1))...
' where trackID=' num2str(qTarget.trackID_dst(1)) ...
......@@ -54,14 +60,16 @@ end
function qTarget=getPatchTarget(conn,qSrc)
cmd=['select min(time) as tminDst,trackID as trackID_dst from tblCells where trackID=(select trackID from '...
maxOverlap=4;
cmd=['select min(time) as tminDst,max(time) as tmaxDst, trackID as trackID_dst from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qSrc.cellID_dst) ')'];
q=fetch(conn,cmd);
cmd=['select max(time) as tmaxSrc, trackID as trackID_src from tblCells where trackID=(select trackID from '...
cmd=['select min(time) as tminSrc,max(time) as tmaxSrc, trackID as trackID_src from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qSrc.cellID_src) ')'];
qt=fetch(conn,cmd);
if 1==q.tminDst || q.tminDst<qt.tmaxSrc-3
if 1==q.tminDst || q.tminDst<qt.tmaxSrc-maxOverlap
qTarget=[];
return;
end
......@@ -71,7 +79,7 @@ cmd=['select dst.trackID as trackID_dst,dst.time as time_dst,src.trackID '...
' from (select tblDistCC.*,time,trackID from tblCells inner join '...
' tblDistCC on cellID=cellID_dst where trackID=(select trackID '...
' from tblCells where cellID=' num2str(qSrc.cellID_dst) ') and time>='...
num2str(qt.tmaxSrc-4) ' and time<=' num2str(qt.tmaxSrc+1) ...
num2str(qt.tmaxSrc-maxOverlap) ' and time<=' num2str(qt.tmaxSrc+1) ...
' ) inner join tblCells as dst on cellID_dst=dst.cellID '...
'inner join tblCells as src on cellID_src=src.cellID '...
'group by cellID_dst '];
......@@ -91,3 +99,5 @@ cmd=[' select min(cost),cellID_src,cellID_dst from tblDistCC inner join '...
' group by cellID_src '];
qSrc=fetch(conn,cmd);
% the second chance patcher
% here, eligible tracks can get assigned their 1st choice, even if they
% are the corresponding 2nd choice
function patch21(conn)
cmd='select cellID_child1 as cellID from tblFamilies union select cellID_child2 as cellID from tblFamilies';
qChildren=fetch(conn,cmd);
cidChildren=qChildren.cellID;
cmd='select cellID_parent from tblFamilies';
qParents=fetch(conn,cmd);
cidParents=qParents.cellID_parent;
% patch src's are leaf nodes on the tree
% patch dst's are parent nodes on the tree
qDst=getPatchCandidates(conn);
for i=1:length(qDst.cellID_dst)
if ~isempty(intersect(cidChildren,qDst.cellID_dst(i)))
continue
end
if ~isempty(intersect(cidParents,qDst.cellID_src(i)))
continue
end
qTarget=getPatchTarget(conn,qDst(i,:));
if isempty(qTarget)
continue;
end
if qTarget.min_cost_(1)>qDst.min_cost_(i)
% src(1:dst.tmin-1)->dst(1:end)
% reset src(dst.tmin:end)
cmd=['update tblCells set trackID=cellID' ...
' where trackID=' num2str(qTarget.trackID_src(1)) ...
' and time>=' num2str(qTarget.time_dst(1))];
exec(conn,cmd);
% set src(dst.tmin:end)->dst
cmd=['update tblCells set trackID=' num2str(qTarget.trackID_src(1))...
' where trackID=' num2str(qTarget.trackID_dst(1)) ...
' and time>=' num2str(qTarget.time_dst(1))];
exec(conn,cmd);
else
% src(1:end)->target(src.tmax)+1:end
cmd=['update tblCells set trackID=(select trackID from tblCells where '...
' cellID=' num2str(qDst.cellID_src(i)) ') where trackID= '...
' (select trackID from tblCells where cellID=' ...
num2str(qDst.cellID_dst(i)) ') and time>(select max(time) from '...
' tblCells where trackID=(select trackID from tblCells where cellID='...
num2str(qDst.cellID_src(i)) '))'];
exec(conn,cmd);
end
end
function qTarget=getPatchTarget(conn,qDst)
maxOverlap=4;
cmd=['select min(time) as tminDst,max(time) as tmaxDst, trackID as trackID_dst from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qDst.cellID_dst) ')'];
q=fetch(conn,cmd);
cmd=['select min(time) as tminSrc,max(time) as tmaxSrc, trackID as trackID_src from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qDst.cellID_src) ')'];
qt=fetch(conn,cmd);
if 1==q.tminDst || q.tminDst<qt.tmaxSrc-maxOverlap
qTarget=[];
return;
end
cmd=['select dst.trackID as trackID_dst,dst.time as time_dst,src.trackID '...
' as trackID_src,src.time as time_src,min(cost),cellID_src,cellID_dst '...
' from (select tblDistCC.*,time,trackID from tblCells inner join '...
' tblDistCC on cellID=cellID_dst where trackID=(select trackID '...
' from tblCells where cellID=' num2str(qDst.cellID_dst) ') and time>='...
num2str(qt.tmaxSrc-maxOverlap) ' and time<=' num2str(qt.tmaxSrc+1) ...
' ) inner join tblCells as dst on cellID_dst=dst.cellID '...
'inner join tblCells as src on cellID_src=src.cellID '...
'group by cellID_dst '];
qTarget=fetch(conn,cmd);
if ~isempty(setdiff(qTarget.trackID_src,[q.trackID_dst,qt.trackID_src])) ||...
isempty(intersect(qTarget.trackID_src,[qt.trackID_src]))
qTarget=[];
end
function qDst=getPatchCandidates(conn)
cmd=[' select min(cost),cellID_src,cellID_dst from tblDistCC inner join '...
' (select cellID as cellID1,trackID as trackID_src,min(time) as '...
' tmin from tblCells '...
' group by trackID) on tblDistCC.cellID_dst=cellID1 '...
' group by cellID_src '];
qDst=fetch(conn,cmd);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment