From 6db581c10a7ce4615fd18483e9aa420197e61f5a Mon Sep 17 00:00:00 2001
From: noraabiakar <nora.abiakar@gmail.com>
Date: Mon, 17 Dec 2018 15:11:14 +0100
Subject: [PATCH] Assertion fix (#663)

Events arrive already sorted first by index then by time.
* Remove sort by event index.
* Replace assertion that events are sorted by time with assertion that they are sorted by index. Assertion that the subrange of events with the same index is sorted by time already exists.
---
 arbor/backends/multicore/multi_event_stream.hpp | 5 ++---
 test/unit/test_multi_event_stream.cpp           | 8 ++++----
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/arbor/backends/multicore/multi_event_stream.hpp b/arbor/backends/multicore/multi_event_stream.hpp
index aa0bea06..ae189364 100644
--- a/arbor/backends/multicore/multi_event_stream.hpp
+++ b/arbor/backends/multicore/multi_event_stream.hpp
@@ -62,9 +62,8 @@ public:
             throw arbor_internal_error("multicore/multi_event_stream: too many events for size type");
         }
 
-        // Sort by index (staged events should already be time-sorted).
-        arb_assert(util::is_sorted_by(staged, [](const Event& ev) { return event_time(ev); }));
-        util::stable_sort_by(staged, [](const Event& ev) { return event_index(ev); });
+        // Staged events should already be sorted by index.
+        arb_assert(util::is_sorted_by(staged, [](const Event& ev) { return event_index(ev); }));
 
         std::size_t n_ev = staged.size();
         util::assign_by(ev_data_, staged, [](const Event& ev) { return event_data(ev); });
diff --git a/test/unit/test_multi_event_stream.cpp b/test/unit/test_multi_event_stream.cpp
index d471a7ba..22e68efa 100644
--- a/test/unit/test_multi_event_stream.cpp
+++ b/test/unit/test_multi_event_stream.cpp
@@ -29,9 +29,9 @@ namespace {
     // cell_3 (handle 3) has one event at t=3
 
     std::vector<deliverable_event> common_events = {
-        deliverable_event(2.f, handle[1], 2.f),
         deliverable_event(3.f, handle[0], 1.f),
         deliverable_event(3.f, handle[3], 4.f),
+        deliverable_event(2.f, handle[1], 2.f),
         deliverable_event(5.f, handle[2], 3.f)
     };
 }
@@ -51,7 +51,7 @@ TEST(multi_event_stream, init) {
     EXPECT_EQ(n_cell, m.n_streams());
 
     auto events = common_events;
-    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_time(e); }));
+    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_index(e); }));
     m.init(events);
     EXPECT_FALSE(m.empty());
 
@@ -66,7 +66,7 @@ TEST(multi_event_stream, mark) {
     ASSERT_EQ(n_cell, m.n_streams());
 
     auto events = common_events;
-    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_time(e); }));
+    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_index(e); }));
     m.init(events);
 
     for (cell_size_type i = 0; i<n_cell; ++i) {
@@ -176,7 +176,7 @@ TEST(multi_event_stream, time_if_before) {
     ASSERT_EQ(n_cell, m.n_streams());
 
     auto events = common_events;
-    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_time(e); }));
+    ASSERT_TRUE(util::is_sorted_by(events, [](deliverable_event e) { return event_index(e); }));
     m.init(events);
 
     // Test times less than all event times (first event at t=2).
-- 
GitLab