-
Notifications
You must be signed in to change notification settings - Fork 14
/
isClusterLegal.m
53 lines (46 loc) · 1.58 KB
/
isClusterLegal.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function [legal] = isClusterLegal (cluster_1, cluster_2, detectedGroups)
% 1) check if there is only one group detected, if this is the case, then
% any two clusters are allowed to be merged.
if size(detectedGroups, 2) == 1
legal = true;
return;
end
% otherwise keep checking
legal = false;
% 2) check if every possible combination of elements form an existing couple
couples = cat(1, detectedGroups{:});
myCouples = combnk(unique(cat(1, cluster_1(:), cluster_2(:))), 2);
if ~sum(ismember(myCouples, couples, 'rows')) == size(myCouples, 1)
return;
end
% 3) check if the groups are two singletons: if this is the case, since the
% couple exists, it will be legal
if size(cluster_1, 2) == 1 && size(cluster_2, 2) == 1
legal = true;
return;
end
% 4) otherwise at least one cluster will have more than one element in it.
% we want to be sure to choose that kind of cluster since it will surely
% give us the position of a couple inside a cluster that we want to fix as
% the correct one.
if size(cluster_1, 2) > 1
for i = 1 : size(detectedGroups, 2)
if ismember([cluster_1(1), cluster_1(2)], detectedGroups{i}, 'rows')
index = i;
break;
end
end
else
for i = 1 : size(detectedGroups, 2)
if ismember([cluster_2(1), cluster_2(2)], detectedGroups{i}, 'rows')
index = i;
break;
end
end
end
% 5) now that we have the index, we just have to check if every couple is
% in that detected group!
if sum(ismember(myCouples, detectedGroups{index}, 'rows')) == size(myCouples, 1)
legal = true;
end
return