-
Notifications
You must be signed in to change notification settings - Fork 2
/
slidingWindow.m
145 lines (121 loc) · 6.04 KB
/
slidingWindow.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
function results = slidingWindow(startFrame, endFrame, individualFrames, logSpace, ...
allowOverlaps, windowSize, absoluteMaxWindowSize, reverseSlidingWindowBool)
%allowOverlaps = true allows competing solutions; false performs surround suppression
%windowSize = 50; % starting window size
%absoluteMaxWindowSize = false; % don't allow windows larger than this; false ignores this
thresh = 0.000001; % added onto 1/7 for threshold for overlap case
nonOverlapThresh = .7; %only used if ~allowOverlaps
vectorOfFrames = arrayfun(@(foo) foo.frame_ind, individualFrames);
results = [0;0;0;0];
% start, end, action, prob
maxFrameWidth = windowSize*floor((endFrame - startFrame)/windowSize);
if absoluteMaxWindowSize
maxFrameWidth = min(absoluteMaxWindowSize, maxFrameWidth);
end
%for frameWidth = 5:5:40
% TODO: if there was overlap, then it deleted the lower
% probability one. and then the next one might overlap the
% 2nd (with higher probability), but not the first. so should
% have kept the first. does running the window size in reverse
% order fix that? maybe so... do it, run diff/compare
% results.
if reverseSlidingWindowBool
slidingWindowFrameWidths = maxFrameWidth:-windowSize:windowSize;
else
slidingWindowFrameWidths = windowSize:windowSize:maxFrameWidth;
end
%for frameWidth = windowSize:windowSize:maxFrameWidth %FOR SLIDING WINDOW
%for frameWidth = maxFrameWidth:-windowSize:windowSize %FOR REVERSE SLIDING WINDOW
for frameWidth = slidingWindowFrameWidths
disp(frameWidth); %CHANGED THIS
for tryingWindowStart = startFrame:(endFrame-frameWidth+1)
% gather the frames
tryingWindowEnd = tryingWindowStart+frameWidth-1;
frameInds = tryingWindowStart:tryingWindowEnd;
indicesOfArray = arrayfun(@(foo) ismember(foo,frameInds), vectorOfFrames);
% calculate the probability (multiply) and renormalize
if any(indicesOfArray) > 0
if ~logSpace
probs = arrayfun(@(foo) foo.act_prob, individualFrames(indicesOfArray));
prob = 1;
for probIndex = 1:numel(probs)
%disp(probs(probIndex).prob)
prob = prob .* probs(probIndex).prob;
%disp('---')
end
prob = prob/sum(prob);
[maxprob action] = max(prob);
else
%convert to logs
probs = arrayfun(@(foo) foo.act_prob, individualFrames(indicesOfArray));
prob = 0;
for probIndex = 1:numel(probs)
%disp(probs(probIndex).prob)
prob = prob + log(probs(probIndex).prob);
%disp('---')
end
%prob = prob/sum(prob);
[maxprob action] = max(prob);
maxprob = exp(maxprob)/sum(exp(prob));
end
overLap1 = tryingWindowStart >= results(1,:) & tryingWindowEnd <= results(2,:);
overLap2 = tryingWindowStart >= results(1,:) & tryingWindowStart <= results(2,:);
overLap3 = tryingWindowEnd >= results(1,:) & tryingWindowEnd <= results(2,:);
overLap4 = tryingWindowStart <= results(1,:) & tryingWindowEnd >= results(2,:);
noOverLap = tryingWindowEnd < results(1,:) | tryingWindowStart > results(2,:);
overlaps = overLap1 | overLap2 | overLap3 | overLap4;
if any(noOverLap ~= (~overlaps))
error('problem with my logic')
end
if ~allowOverlaps
addResult = false;
deleteResult = false;
if all(noOverLap)
% if doesn't overlap, and has "high enough" probability, keep it
addResult = true;
else % there is an overlap
% if has higher probability than something in our stored results
% and overlaps, keep it and ditch the other (surround suppression)
if maxprob > results(4,overlaps)
% find where that happens
entriesToDelete = (maxprob > results(4,:)) & overlaps;
deleteResult = true;
addResult = true;
end
% if it has equal probability and overlaps, keep both
%if maxprob - results(4,overlaps) > thresh % then maxprob bigger
if maxprob == results(4,overlaps)
entriesToDelete = (maxprob == results(4,:)) & overlaps;
deleteResult = true;
addResult = true;
end
% if overlap is equality, pass
if tryingWindowStart == results(1,:) & tryingWindowEnd == results(2,:)
addResult = false;
asdf3
end
end
if deleteResult
%results
results(:,entriesToDelete) = []; %CHANGED THIS
%results
%asdf1
end
if addResult && (maxprob > 1/7 + thresh)
results = [results [tryingWindowStart tryingWindowEnd action maxprob]'];
%disp(results);
end
else
if (maxprob > nonOverlapThresh)
results = [results [tryingWindowStart tryingWindowEnd action maxprob]'];
%disp(results);
end
end
% TODO: clean up results (only keep top N performers)
% either keep this in the loop, or move it to the end (probably
% move to the end)
end
end
end
% drop initializing 0 from results
results(:,1) = [];