Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cpp/perspective/src/cpp/context_zero.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ t_ctx0::step_end() {
}

m_traversal->step_end();

#ifndef PSP_ENABLE_WASM
t_uindex ncols = m_config.get_num_columns();
std::vector<t_minmax> rval(ncols);

Expand Down Expand Up @@ -84,6 +84,7 @@ t_ctx0::step_end() {
#endif

m_minmax = rval;
#endif
}

// ASGGrid data interface
Expand Down
62 changes: 37 additions & 25 deletions cpp/perspective/src/cpp/flat_traversal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,38 +248,49 @@ t_ftrav::step_end() {
auto new_index = std::make_shared<std::vector<t_mselem>>();
new_index->reserve(new_size);

t_pkeyidx_map added;

for (t_uindex idx = 0, loop_end = m_index->size(); idx < loop_end; ++idx) {
t_mselem& elem = (*m_index)[idx];
if (!elem.m_deleted) {
new_index->push_back(elem);
added[elem.m_pkey] = idx;
}
}
t_uindex i = 0;
t_multisorter sorter(get_sort_orders(m_sortby));
std::vector<t_mselem> new_rows;

for (t_pkmselem_map::const_iterator pkelem_iter = m_new_elems.begin();
pkelem_iter != m_new_elems.end(); ++pkelem_iter) {

const t_mselem& elem = pkelem_iter->second;
t_pkeyidx_map::const_iterator iter = added.find(pkelem_iter->first);
if (iter == added.end()) {
new_index->push_back(elem);
} else {
(*new_index)[iter->second] = elem;
new_rows.push_back(pkelem_iter->second);
}
std::sort(new_rows.begin(), new_rows.end(), sorter);
for (auto it = new_rows.begin(); it != new_rows.end(); ++it) {
const t_mselem& new_elem = *it;
while (i < m_index->size()) {
const t_mselem& old_elem = (*m_index)[i];
if (old_elem.m_deleted) {
i++;
m_pkeyidx.erase(old_elem.m_pkey);
} else if (old_elem.m_updated) {
i++;
} else if (sorter(old_elem, new_elem)) {
m_pkeyidx[old_elem.m_pkey] = new_index->size();
new_index->push_back(old_elem);
i++;
} else {
break;
}
}

m_pkeyidx[new_elem.m_pkey] = new_index->size();
new_index->push_back(new_elem);
}
std::swap(new_index, m_index);
t_multisorter sorter(get_sort_orders(m_sortby));
std::sort(m_index->begin(), m_index->end(), sorter);

m_pkeyidx.clear();
while (i < m_index->size()) {
const t_mselem& old_elem = (*m_index)[i++];
if (old_elem.m_deleted) {
m_pkeyidx.erase(old_elem.m_pkey);
} else if (!old_elem.m_updated) {
m_pkeyidx[old_elem.m_pkey] = new_index->size();
new_index->push_back(old_elem);
}
}

std::swap(new_index, m_index);
m_new_elems.clear();

for (t_index idx = 0, loop_end = m_index->size(); idx < loop_end; ++idx) {
m_pkeyidx[(*m_index)[idx].m_pkey] = idx;
}
}

void
Expand All @@ -303,7 +314,8 @@ t_ftrav::update_row(
}
t_mselem mselem;
fill_sort_elem(state, config, pkey, mselem);
(*m_index)[pkiter->second] = mselem;
(*m_index)[pkiter->second].m_updated = true;
m_new_elems[pkey] = mselem;
}

void
Expand Down
16 changes: 12 additions & 4 deletions cpp/perspective/src/cpp/multi_sort.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,37 +19,43 @@ namespace perspective {
t_mselem::t_mselem()
: m_pkey(mknone())
, m_order(0)
, m_deleted(false) {}
, m_deleted(false)
, m_updated(false) {}

t_mselem::t_mselem(const std::vector<t_tscalar>& row)
: m_row(row)
, m_pkey(mknone())
, m_order(0)
, m_deleted(false) {}
, m_deleted(false)
, m_updated(false) {}

t_mselem::t_mselem(const std::vector<t_tscalar>& row, t_uindex order)
: m_row(row)
, m_pkey(mknone())
, m_order(order)
, m_deleted(false) {}
, m_deleted(false)
, m_updated(false) {}

t_mselem::t_mselem(const t_tscalar& pkey, const std::vector<t_tscalar>& row)
: m_row(row)
, m_pkey(pkey)
, m_order(0)
, m_deleted(false) {}
, m_deleted(false)
, m_updated(false) {}

t_mselem::t_mselem(const t_mselem& other) {
m_pkey = other.m_pkey;
m_row = other.m_row;
m_deleted = other.m_deleted;
m_updated = other.m_updated;
m_order = other.m_order;
}

t_mselem::t_mselem(t_mselem&& other) {
m_pkey = other.m_pkey;
m_row = std::move(other.m_row);
m_deleted = other.m_deleted;
m_updated = other.m_updated;
m_order = other.m_order;
}

Expand All @@ -59,6 +65,7 @@ t_mselem::operator=(const t_mselem& other) {
m_row = other.m_row;
m_deleted = other.m_deleted;
m_order = other.m_order;
m_updated = other.m_updated;
return *this;
}

Expand All @@ -67,6 +74,7 @@ t_mselem::operator=(t_mselem&& other) {
m_pkey = other.m_pkey;
m_row = std::move(other.m_row);
m_deleted = other.m_deleted;
m_updated = other.m_updated;
m_order = other.m_order;
return *this;
}
Expand Down
2 changes: 2 additions & 0 deletions cpp/perspective/src/cpp/storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,9 @@ void
t_lstore::clear() {
PSP_TRACE_SENTINEL();
PSP_VERBOSE_ASSERT(m_init, "touching uninited object");
#ifndef PSP_ENABLE_WASM
memset(m_base, 0, size_t(capacity()));
#endif
{
t_unlock_store tmp(this);
m_size = 0;
Expand Down
4 changes: 4 additions & 0 deletions cpp/perspective/src/include/perspective/multi_sort.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct PERSPECTIVE_EXPORT t_mselem {
t_tscalar m_pkey;
t_uindex m_order;
bool m_deleted;
bool m_updated;
};

} // end namespace perspective
Expand Down Expand Up @@ -96,6 +97,8 @@ cmp_mselem(const t_mselem& a, const t_mselem& b, const std::vector<t_sorttype>&
const t_tscalar& second = b.m_row[idx];

t_sorttype order = sort_order[idx];

#ifndef PSP_ENABLE_WASM
t_nancmp nancmp = nan_compare(order, first, second);

if (first.is_floating_point() && nancmp.m_active) {
Expand All @@ -110,6 +113,7 @@ cmp_mselem(const t_mselem& a, const t_mselem& b, const std::vector<t_sorttype>&
default: { continue; } break;
}
}
#endif

if (first == second)
continue;
Expand Down