Skip to content

Commit 1c75079

Browse files
HanSur94claude
andcommitted
fix: handle Octave classdef array ops — avoid transpose and [] concat
Octave cannot transpose or horzcat classdef objects with []. Use if-isempty guards for typed array initialization. Loop-append in EventStore.append instead of transpose. Skip timer test on Octave. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b978563 commit 1c75079

4 files changed

Lines changed: 31 additions & 10 deletions

File tree

libs/EventDetection/EventStore.m

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424

2525
function append(obj, newEvents)
2626
if isempty(newEvents); return; end
27-
if isempty(obj.events_)
28-
obj.events_ = newEvents(:).';
29-
else
30-
obj.events_ = [obj.events_, newEvents(:).'];
27+
for i = 1:numel(newEvents)
28+
if isempty(obj.events_)
29+
obj.events_ = newEvents(i);
30+
else
31+
obj.events_(end+1) = newEvents(i);
32+
end
3133
end
3234
end
3335

libs/EventDetection/IncrementalEventDetector.m

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@
100100
for i = 1:numel(allEvents)
101101
ev = allEvents(i);
102102
if ev.EndTime >= sliceStartTime
103-
relevantEvents = [relevantEvents, ev];
103+
if isempty(relevantEvents)
104+
relevantEvents = ev;
105+
else
106+
relevantEvents(end+1) = ev;
107+
end
104108
end
105109
end
106110
end
@@ -127,9 +131,17 @@
127131
idx2 = find(st.fullX <= ev.EndTime, 1, 'last');
128132
window = st.fullY(idx1:idx2);
129133
merged = obj.computeAndSetStats(merged, window, ev.Direction);
130-
completedEvents = [completedEvents, merged];
134+
if isempty(completedEvents)
135+
completedEvents = merged;
136+
else
137+
completedEvents(end+1) = merged;
138+
end
131139
elseif ~obj.isOldEvent(ev, st.lastProcessedTime)
132-
completedEvents = [completedEvents, ev];
140+
if isempty(completedEvents)
141+
completedEvents = ev;
142+
else
143+
completedEvents(end+1) = ev;
144+
end
133145
end
134146
end
135147
end
@@ -141,8 +153,7 @@
141153
% Still open, carry forward
142154
else
143155
% Open event ended
144-
completedEvents = [completedEvents, st.openEvent];
145-
end
156+
completedEvents = st.openEvent;
146157
end
147158

148159
% Escalate severity

libs/EventDetection/LiveEventPipeline.m

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ function runCycle(obj)
9595
[newEvents, gotData] = obj.processSensor(key);
9696
hasNewData = hasNewData || gotData;
9797
if ~isempty(newEvents)
98-
allNewEvents = [allNewEvents, newEvents];
98+
if isempty(allNewEvents)
99+
allNewEvents = newEvents;
100+
else
101+
allNewEvents = [allNewEvents, newEvents];
102+
end
99103
end
100104
catch ex
101105
fprintf('[PIPELINE WARNING] Sensor "%s" failed: %s\n', key, ex.message);

tests/test_live_pipeline.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ function test_notification_triggered()
9494
end
9595

9696
function test_start_stop()
97+
if exist('OCTAVE_VERSION', 'builtin')
98+
fprintf(' SKIPPED (timer not implemented in Octave)\n');
99+
return;
100+
end
97101
[p, f] = makePipeline();
98102
p.start();
99103
assert(strcmp(p.Status, 'running'), 'running');

0 commit comments

Comments
 (0)