void F4Res::reorderColumns() { // Set up to sort the columns. // Result is an array 0..ncols-1, giving the new order. // Find the inverse of this permutation: place values into "ord" column fields. // Loop through every element of the matrix, changing its comp array. #if 0 std::cout << "-- rows --" << std::endl; debugOutputReducers(); std::cout << "-- columns --" << std::endl; debugOutputColumns(); std::cout << "reorderColumns" << std::endl; #endif ComponentIndex ncols = static_cast<ComponentIndex>(mColumns.size()); // sort the columns auto timeA = timer(); ComponentIndex* column_order = new ComponentIndex[ncols]; ComponentIndex* ord = new ComponentIndex[ncols]; ResColumnsSorter C(monoid(), *this, mThisLevel-1); C.reset_ncomparisons(); for (ComponentIndex i=0; i<ncols; i++) { column_order[i] = i; } if (M2_gbTrace >= 2) fprintf(stderr, " ncomparisons = "); std::sort(column_order, column_order+ncols, C); auto timeB = timer(); mFrame.timeSortMatrix += seconds(timeB-timeA); if (M2_gbTrace >= 2) fprintf(stderr, "%ld, ", C.ncomparisons0()); if (M2_gbTrace >= 2) std::cout << " sort time: " << seconds(timeB-timeA) << std::endl; timeA = timer(); //////////////////////////// for (ComponentIndex i=0; i<ncols; i++) { ord[column_order[i]] = i; } #if 0 std::cout << "column_order: "; for (ComponentIndex i=0; i<ncols; i++) std::cout << " " << column_order[i]; std::cout << std::endl; std::cout << "ord: "; for (ComponentIndex i=0; i<ncols; i++) std::cout << " " << ord[i]; std::cout << std::endl; #endif // Now move the columns into position std::vector<packed_monomial> sortedColumnArray; std::vector<Row> sortedRowArray; sortedColumnArray.reserve(ncols); sortedRowArray.reserve(ncols); for (ComponentIndex i=0; i<ncols; i++) { ComponentIndex newc = column_order[i]; sortedColumnArray.push_back(mColumns[newc]); sortedRowArray.push_back(Row()); std::swap(sortedRowArray[i], mReducers[newc]); } std::swap(mColumns, sortedColumnArray); std::swap(mReducers, sortedRowArray); #if 0 std::cout << "applying permutation to reducers" << std::endl; #endif for (ComponentIndex i=0; i<mReducers.size(); i++) { #if 0 std::cout << "reducer " << i << " before:"; for (ComponentIndex j=0; j<mReducers[i].mComponents.size(); j++) std::cout << " " << mReducers[i].mComponents[j]; std::cout << std::endl; #endif applyPermutation(ord, mReducers[i].mComponents); #if 0 std::cout << "reducer " << i << " after:"; for (ComponentIndex j=0; j<mReducers[i].mComponents.size(); j++) std::cout << " " << mReducers[i].mComponents[j]; std::cout << std::endl; #endif } #if 0 std::cout << "applying permutation to spairs" << std::endl; #endif for (ComponentIndex i=0; i<mSPairs.size(); i++) { #if 0 std::cout << "spair " << i << " before:"; for (ComponentIndex j=0; j<mSPairs[i].mComponents.size(); j++) std::cout << " " << mSPairs[i].mComponents[j]; std::cout << std::endl; #endif applyPermutation(ord, mSPairs[i].mComponents); #if 0 std::cout << "spair " << i << " after:"; for (ComponentIndex j=0; j<mSPairs[i].mComponents.size(); j++) std::cout << " " << mSPairs[i].mComponents[j]; std::cout << std::endl; #endif } timeB = timer(); mFrame.timeReorderMatrix += seconds(timeB-timeA); delete [] column_order; delete [] ord; }
void F4Res::reorderColumns() { // Set up to sort the columns. // Result is an array 0..ncols-1, giving the new order. // Find the inverse of this permutation: place values into "ord" column fields. // Loop through every element of the matrix, changing its comp array. #if 0 std::cout << "-- rows --" << std::endl; debugOutputReducers(); std::cout << "-- columns --" << std::endl; debugOutputColumns(); std::cout << "reorderColumns" << std::endl; #endif ComponentIndex ncols = static_cast<ComponentIndex>(mColumns.size()); ComponentIndex* ord = new ComponentIndex[ncols]; auto timeA = timer(); ResMonomialSorter sorter(ring().originalMonoid(), monoid(), frame().schreyerOrder(mThisLevel-2), mColumns); auto column_order = sorter.sort(); auto timeB = timer(); double nsec_sort2 = seconds(timeB - timeA); mFrame.timeSortMatrix += nsec_sort2; auto ncompares = sorter.numComparisons(); if (M2_gbTrace >= 2) std::cout << " #comparisons sorting " << ncols << " columns = " << ncompares << " "; if (M2_gbTrace >= 1) std::cout << " sort time: " << nsec_sort2 << std::endl; timeA = timer(); //////////////////////////// for (ComponentIndex i = 0; i < ncols; i++) { ord[column_order[i]] = i; } #if 0 std::cout << "column_order: "; for (ComponentIndex i=0; i<ncols; i++) std::cout << " " << column_order[i]; std::cout << std::endl; std::cout << "ord: "; for (ComponentIndex i=0; i<ncols; i++) std::cout << " " << ord[i]; std::cout << std::endl; #endif // Now move the columns into position std::vector<res_packed_monomial> sortedColumnArray; std::vector<Row> sortedRowArray; sortedColumnArray.reserve(ncols); sortedRowArray.reserve(ncols); for (ComponentIndex i = 0; i < ncols; i++) { ComponentIndex newc = column_order[i]; sortedColumnArray.push_back(mColumns[newc]); sortedRowArray.push_back(Row()); std::swap(sortedRowArray[i], mReducers[newc]); } std::swap(mColumns, sortedColumnArray); std::swap(mReducers, sortedRowArray); #if 0 std::cout << "applying permutation to reducers" << std::endl; #endif for (ComponentIndex i = 0; i < mReducers.size(); i++) { #if 0 std::cout << "reducer " << i << " before:"; for (ComponentIndex j=0; j<mReducers[i].mComponents.size(); j++) std::cout << " " << mReducers[i].mComponents[j]; std::cout << std::endl; #endif applyPermutation(ord, mReducers[i].mComponents); #if 0 std::cout << "reducer " << i << " after:"; for (ComponentIndex j=0; j<mReducers[i].mComponents.size(); j++) std::cout << " " << mReducers[i].mComponents[j]; std::cout << std::endl; #endif } #if 0 std::cout << "applying permutation to spairs" << std::endl; #endif for (ComponentIndex i = 0; i < mSPairs.size(); i++) { #if 0 std::cout << "spair " << i << " before:"; for (ComponentIndex j=0; j<mSPairs[i].mComponents.size(); j++) std::cout << " " << mSPairs[i].mComponents[j]; std::cout << std::endl; #endif applyPermutation(ord, mSPairs[i].mComponents); #if 0 std::cout << "spair " << i << " after:"; for (ComponentIndex j=0; j<mSPairs[i].mComponents.size(); j++) std::cout << " " << mSPairs[i].mComponents[j]; std::cout << std::endl; #endif } timeB = timer(); mFrame.timeReorderMatrix += seconds(timeB - timeA); delete[] ord; }