Skip to content

Commit

Permalink
suffix_sorting: fixed termination condition in prefix quadrupling
Browse files Browse the repository at this point in the history
  • Loading branch information
kurpicz committed Apr 25, 2016
1 parent 18e5d1d commit 7d49440
Showing 1 changed file with 48 additions and 21 deletions.
69 changes: 48 additions & 21 deletions examples/suffix_sorting/prefix_quadrupling.cpp
Expand Up @@ -604,8 +604,6 @@ DIA<Index> PrefixQuadrupling(const InputDIA& input_dia, size_t input_size) {
})
.Sort();

// chars_sorted.Keep().Print("Test");

auto names =
chars_sorted
.template FlatWindow<IndexRank>(
Expand All @@ -617,13 +615,37 @@ DIA<Index> PrefixQuadrupling(const InputDIA& input_dia, size_t input_size) {
emit(IndexRank { rb[1].index, Index(0) });
else
emit(IndexRank { rb[1].index, Index(index + 2) });
});

auto number_duplicates =
names.Keep()
.Filter([](const IndexRank& ir) {
return ir.rank == Index(0);
})
.PrefixSum([](const IndexRank& a, const IndexRank& b) {
return IndexRank {
b.index,
(a.rank > b.rank ? a.rank : b.rank)
};
});
.Size();

if (number_duplicates == 0) {
if (input_dia.context().my_rank() == 0)
sLOG1 << "Finished before doubling in loop";

auto sa =
names
.Map([](const IndexRank& ir) {
return ir.index;
});

return sa.Collapse();
}

names =
names
.PrefixSum(
[](const IndexRank& a, const IndexRank& b) {
return IndexRank { b.index, std::max(a.rank, b.rank) };
});

if (debug_print)
names.Keep().Print("names before loop");

size_t iteration = 1;
while (true) {
Expand Down Expand Up @@ -680,25 +702,21 @@ DIA<Index> PrefixQuadrupling(const InputDIA& input_dia, size_t input_size) {
emit(IndexRank { rb[1].index, Index(0) });
else
emit(IndexRank { rb[1].index, Index(1) });
})
.PrefixSum([](const IndexRank& a, const IndexRank& b) {
return IndexRank { b.index, a.rank + b.rank };
});
});

auto max_rank =
number_duplicates =
names.Keep()
.Map([](const IndexRank& ir) {
return ir.rank;
})
.Max();
.Filter([](const IndexRank& ir) {
return ir.rank == Index(0);
})
.Size();

if (input_dia.context().my_rank() == 0) {
sLOG1 << "iteration" << iteration
<< "max_rank" << max_rank
<< "duplicates" << input_size - max_rank;
sLOG1 << "iteration" << iteration - 1
<< "duplicates" << number_duplicates;
}

if (max_rank == input_size) {
if (number_duplicates == 0) {
auto sa =
names
.Map([](const IndexRank& ir) {
Expand All @@ -707,6 +725,15 @@ DIA<Index> PrefixQuadrupling(const InputDIA& input_dia, size_t input_size) {

return sa.Collapse();
}

names =
names
.PrefixSum([](const IndexRank& a, const IndexRank& b) {
return IndexRank { b.index, std::max(a.rank, b.rank) };
});

if (debug_print)
names.Keep().Print("names");
}
}

Expand Down

0 comments on commit 7d49440

Please sign in to comment.