838{
840 std::vector<int> columnIndices;
841 std::vector<Word> tempWords;
842
843 tempWords.reserve(sz);
844 columnIndices.resize(sz);
845 std::iota(columnIndices.begin(), columnIndices.end(), 0);
846
847
848
850 tempWords.emplace_back(i.first);
851
852
853 MonomSort<std::vector<Word>> monomialSorter(&
freeAlgebra().monoid(),&tempWords);
854
855
857 mtbb::parallel_sort(columnIndices.begin(),columnIndices.end(),monomialSorter);
858 else
859 std::stable_sort(columnIndices.begin(),columnIndices.end(),monomialSorter);
860
861 auto applyLabelingColumns = [&](const mtbb::blocked_range<int>& r) {
862 for (auto count = r.begin(); count != r.end(); ++count)
863 {
865 val.first = count;
866 mColumns[count].word = tempWords[columnIndices[count]];
868 }
869 };
870
871
874 mtbb::parallel_for(mtbb::blocked_range<int>{0,(int)sz}, applyLabelingColumns);
875 else
876 applyLabelingColumns(mtbb::blocked_range<int>{0,(int)sz});
877
878 auto applyLabelingRows = [&](const mtbb::blocked_range<int>& r) {
879 for (auto i = r.begin(); i != r.end(); ++i)
880 {
881 auto& comps =
mRows[i].columnIndices;
882 auto& words =
mRows[i].columnWords;
883
885 {
888 }
889 for (int j = 0; j < words.size(); ++j)
891 }
892 };
893
894
896 mtbb::parallel_for(mtbb::blocked_range<int>{0,(int)
mRows.size()},applyLabelingRows);
897 else
898 applyLabelingRows(mtbb::blocked_range<int>{0,(int)
mRows.size()});
899}
MonomialHash mColumnMonomials
const FreeAlgebra & freeAlgebra() const