#pragma once #include #include #include // setw #include #include #include #include // swap() #include ///** //* Output of a vector of @p v. //* //* @param[in,out] s output stream //* @param[in] v vector //* @return output stream //*/ //template //std::ostream& operator<<(std::ostream &s, const std::vector &v) //{ //for (auto it: v) { std::cout << " " << std::setw(5) << it; } //return s; //} /** * Determines the permutation vector for sorting @p v ascending with operator< . * * @param[in] v vector to permute * @return index vector for permutation, * @p v[idx[0]] denotes the smallest element of original data. */ template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); iota(begin(idx),end(idx),0); // sort indexes based on comparing values in v sort(idx.begin(), idx.end(), [&v](int i1, int i2) -> bool { return v[i1] < v[i2]; } ); return idx; } /** * Determines the permutation vector for sorting @p v descending with operator> . * * @param[in] v vector to permute * @return index vector for permutation, * @p v[idx[0]] denotes the smallest element of original data. */ template std::vector sort_indexes_desc(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); iota(begin(idx),end(idx),0); // sort indexes based on comparing values in v sort(idx.begin(), idx.end(), [&v](int i1, int i2) -> bool { return v[i1] > v[i2]; } ); return idx; } /** * Generates the inverse permutation vector of @p idx. * * @param[in] idx permutation vector * @return inverse permutation, */ template std::vector inverse_indexes(const std::vector &idx) { static_assert(std::is_integral(),"Vector elements have to be integral numbers."); return sort_indexes(idx); } /** * Resort elements of vector @p x according to permutation @p old2new. * * @param[in] old2new permutation vector * @param[in,out] x vector[] */ template void permute(std::vector const& old2new, std::vector & x) { assert(x.size()==old2new.size()); auto old(x); for (size_t k=0; k void permute_2(std::vector const& old2new, std::vector & x) { assert(x.size()==2*old2new.size()); auto old(x); for (size_t k=0; k void reNumberEntries(std::vector const& old2new, std::vector & x) { static_assert(std::is_integral(),"Vector elements have to be integral numbers."); assert( *max_element(cbegin(x),cend(x)) < static_cast(old2new.size()) ); auto old(x); auto const n2o = inverse_indexes(old2new); for (size_t k=0; k void reNumberEntries(std::vector const& old2new, std::map & x) { static_assert(std::is_integral(),"Vector elements have to be integral numbers."); assert( max_element(cbegin(x),cend(x))->second < static_cast(old2new.size()) ); auto old(x); auto const n2o = inverse_indexes(old2new); for ( auto &[key,val] : x) { val = n2o[val]; } } /** * Sort the two entries per element of vector @p x ascending. * * @param[in] x vector[][2] */ template void sortAscending_2(std::vector & x) { static_assert(std::is_integral(),"Vector elements have to be integral numbers."); //for (auto it=begin(x); it!=end(x); it += 2) // general solution //{ //sort(it,it+1); //} for (size_t k=0; kx[k+1]) { std::swap(x[k],x[k+1]); } } } #include // contains timing routines typedef std::chrono::system_clock Time; typedef std::chrono::milliseconds ms; typedef std::chrono::duration dsec; class MyTimer { public: MyTimer() : _tstart(Time::now()) {} void tic() { _tstart = Time::now(); } auto toc() { dsec timed = Time::now() - _tstart; return timed.count(); } private: std::chrono::time_point