about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/KPMtools/optimalMatching.m
diff options
context:
space:
mode:
authorziejd22017-09-28 15:04:40 -0500
committerziejd22017-09-28 15:04:40 -0500
commit8070dc963753142bb86c4ed698d91fd623ed28e7 (patch)
treed0f6dd8fc46a49b819aa55c1a90faa14d8448883 /sourcecodes/bnt-master/KPMtools/optimalMatching.m
parent7cc31810d53176e805532b2789955f4eedbce6bb (diff)
downloadBNW-8070dc963753142bb86c4ed698d91fd623ed28e7.tar.gz
BNW using Octave instead of Matlab.
This version of BNW should perform the same as the original version. The only difference is that it uses Octave instead of Matlab when running BayesNet Toolbox during parameter learning.

I am calling this BNW_1.02. It can be accessed at:
compbio.uthsc.edu/BNW_1.02
Diffstat (limited to 'sourcecodes/bnt-master/KPMtools/optimalMatching.m')
-rw-r--r--sourcecodes/bnt-master/KPMtools/optimalMatching.m90
1 files changed, 90 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/KPMtools/optimalMatching.m b/sourcecodes/bnt-master/KPMtools/optimalMatching.m
new file mode 100644
index 00000000..a794ba02
--- /dev/null
+++ b/sourcecodes/bnt-master/KPMtools/optimalMatching.m
@@ -0,0 +1,90 @@
+% MATCH - Solves the weighted bipartite matching (or assignment)
+%         problem.
+%
+% Usage:  a = match(C);
+%
+% Arguments:   
+%         C     - an m x n cost matrix; the sets are taken to be
+%                 1:m and 1:n; C(i, j) gives the cost of matching
+%                 items i (of the first set) and j (of the second set)
+%
+% Returns:
+%
+%         a     - an m x 1 assignment vector, which gives the
+%                 minimum cost assignment.  a(i) is the index of
+%                 the item of 1:n that was matched to item i of
+%                 1:m.  If item i (of 1:m) was not matched to any 
+%                 item of 1:n, then a(i) is zero.
+
+% Copyright (C) 2002 Mark A. Paskin
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+% USA.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function [a] = optimalMatching(C)
+
+% Trivial cases:
+[p, q] = size(C);
+if (p == 0)
+  a = []; 
+  return;
+elseif (q == 0)
+  a = zeros(p, 1);
+  return;
+end
+
+
+if  0
+% First, reduce the problem by making easy optimal matches.  If two
+% elements agree that they are the best match, then match them up.
+[x, a] = min(C, [], 2);
+[y, b] = min(C, [], 1);
+u = find(1:p ~= b(a(:)));
+a(u) = 0;
+v = find(1:q ~= a(b(:))');
+C = C(u, v);
+if (isempty(C)) return; end
+end
+
+% Get the (new) size of the two sets, u and v.
+[m, n] = size(C);
+
+%mx = realmax;
+mx = 2*max(C(:));
+mn = -2*min(C(:));
+% Pad the affinity matrix to be square
+if (m < n)
+  C = [C; mx * ones(n - m, n)];
+elseif (n < m)
+  C = [C, mx * ones(m, m - n)];
+end
+
+% Run the Hungarian method.  First replace infinite values by the
+% largest (or smallest) finite values.
+C(find(isinf(C) & (C > 0))) = mx;
+C(find(isinf(C) & (C < 0))) = mn;
+%fprintf('running hungarian\n');
+[b, cost] = hungarian(C');
+
+% Extract only the real assignments
+ap = b(1:m)';
+ap(find(ap > n)) = 0;
+
+a = ap; 
+%% Incorporate this sub-assignment into the complete assignment
+%  k = find(ap);
+%  a(u(k)) = v(ap(k));
+