48 BasicSort(
const std::string &which =
"LM" );
79 void sort(std::vector<MagnitudeType> &evals, Teuchos::RCP<std::vector<int> > perm = Teuchos::null,
int n = -1)
const;
99 void sort(std::vector<MagnitudeType> &r_evals,
100 std::vector<MagnitudeType> &i_evals,
101 Teuchos::RCP<std::vector<int> > perm = Teuchos::null,
115 template <
class LTorGT>
118 bool operator()(MagnitudeType, MagnitudeType);
120 template <
class First,
class Second>
121 bool operator()(std::pair<First,Second>, std::pair<First,Second>);
124 template <
class LTorGT>
127 bool operator()(std::pair<MagnitudeType,MagnitudeType>, std::pair<MagnitudeType,MagnitudeType>);
129 template <
class First,
class Second>
130 bool operator()(std::pair<First,Second>, std::pair<First,Second>);
133 template <
class LTorGT>
136 bool operator()(MagnitudeType, MagnitudeType);
137 template <
class First,
class Second>
138 bool operator()(std::pair<First,Second>, std::pair<First,Second>);
141 template <
typename pair_type>
144 const typename pair_type::first_type &operator()(
const pair_type &v)
const;
147 template <
typename pair_type>
150 const typename pair_type::second_type &operator()(
const pair_type &v)
const;
209 TEUCHOS_TEST_FOR_EXCEPTION(n < -1, std::invalid_argument,
"Anasazi::BasicSort::sort(r): n must be n >= 0 or n == -1.");
213 TEUCHOS_TEST_FOR_EXCEPTION(evals.size() < (
unsigned int) n,
214 std::invalid_argument,
"Anasazi::BasicSort::sort(r): eigenvalue vector size isn't consistent with n.");
215 if (perm != Teuchos::null) {
216 TEUCHOS_TEST_FOR_EXCEPTION(perm->size() < (
unsigned int) n,
217 std::invalid_argument,
"Anasazi::BasicSort::sort(r): permutation vector size isn't consistent with n.");
220 typedef std::greater<MagnitudeType> greater_mt;
221 typedef std::less<MagnitudeType> less_mt;
223 if (perm == Teuchos::null) {
228 std::sort(evals.begin(),evals.begin()+n,compMag<greater_mt>());
230 else if (which_ == SM) {
231 std::sort(evals.begin(),evals.begin()+n,compMag<less_mt>());
233 else if (which_ == LR) {
234 std::sort(evals.begin(),evals.begin()+n,compAlg<greater_mt>());
236 else if (which_ == SR) {
237 std::sort(evals.begin(),evals.begin()+n,compAlg<less_mt>());
240 TEUCHOS_TEST_FOR_EXCEPTION(
true,
SortManagerError,
"Anasazi::BasicSort::sort(r): LI or SI sorting invalid for real scalar types." );
253 std::vector< std::pair<MagnitudeType,int> > pairs(n);
254 for (
int i=0; i<n; i++) {
255 pairs[i] = std::make_pair(evals[i],i);
260 std::sort(pairs.begin(),pairs.begin()+n,compMag<greater_mt>());
262 else if (which_ == SM) {
263 std::sort(pairs.begin(),pairs.begin()+n,compMag<less_mt>());
265 else if (which_ == LR) {
266 std::sort(pairs.begin(),pairs.begin()+n,compAlg<greater_mt>());
268 else if (which_ == SR) {
269 std::sort(pairs.begin(),pairs.begin()+n,compAlg<less_mt>());
272 TEUCHOS_TEST_FOR_EXCEPTION(
true,
SortManagerError,
"Anasazi::BasicSort::sort(r): LI or SI sorting invalid for real scalar types." );
276 std::transform(pairs.begin(),pairs.end(),evals.begin(),sel1st< std::pair<MagnitudeType,int> >());
277 std::transform(pairs.begin(),pairs.end(),perm->begin(),sel2nd< std::pair<MagnitudeType,int> >());
292 std::vector<MagnitudeType> &i_evals,
293 Teuchos::RCP< std::vector<int> > perm,
300 TEUCHOS_TEST_FOR_EXCEPTION(n < -1, std::invalid_argument,
"Anasazi::BasicSort::sort(r,i): n must be n >= 0 or n == -1.");
302 n = r_evals.size() < i_evals.size() ? r_evals.size() : i_evals.size();
304 TEUCHOS_TEST_FOR_EXCEPTION(r_evals.size() < (
unsigned int) n || i_evals.size() < (
unsigned int) n,
305 std::invalid_argument,
"Anasazi::BasicSort::sort(r,i): eigenvalue vector size isn't consistent with n.");
306 if (perm != Teuchos::null) {
307 TEUCHOS_TEST_FOR_EXCEPTION(perm->size() < (
unsigned int) n,
308 std::invalid_argument,
"Anasazi::BasicSort::sort(r,i): permutation vector size isn't consistent with n.");
311 typedef std::greater<MagnitudeType> greater_mt;
312 typedef std::less<MagnitudeType> less_mt;
317 if (perm == Teuchos::null) {
321 std::vector< std::pair<MagnitudeType,MagnitudeType> > pairs(n);
325 if (which_ == LR || which_ == SR || which_ == LM || which_ == SM) {
327 r_evals.begin(), r_evals.begin()+n,
328 i_evals.begin(), pairs.begin(),
329 MakePairOp<MagnitudeType,MagnitudeType>());
333 i_evals.begin(), i_evals.begin()+n,
334 r_evals.begin(), pairs.begin(),
335 MakePairOp<MagnitudeType,MagnitudeType>());
338 if (which_ == LR || which_ == LI) {
339 std::sort(pairs.begin(),pairs.end(),compAlg<greater_mt>());
341 else if (which_ == SR || which_ == SI) {
342 std::sort(pairs.begin(),pairs.end(),compAlg<less_mt>());
344 else if (which_ == LM) {
345 std::sort(pairs.begin(),pairs.end(),compMag2<greater_mt>());
348 std::sort(pairs.begin(),pairs.end(),compMag2<less_mt>());
354 if (which_ == LR || which_ == SR || which_ == LM || which_ == SM) {
355 std::transform(pairs.begin(),pairs.end(),r_evals.begin(),sel1st< std::pair<MagnitudeType,MagnitudeType> >());
356 std::transform(pairs.begin(),pairs.end(),i_evals.begin(),sel2nd< std::pair<MagnitudeType,MagnitudeType> >());
359 std::transform(pairs.begin(),pairs.end(),r_evals.begin(),sel2nd< std::pair<MagnitudeType,MagnitudeType> >());
360 std::transform(pairs.begin(),pairs.end(),i_evals.begin(),sel1st< std::pair<MagnitudeType,MagnitudeType> >());
367 std::vector< std::pair< std::pair<MagnitudeType,MagnitudeType>,
int > > pairs(n);
371 if (which_ == LR || which_ == SR || which_ == LM || which_ == SM) {
372 for (
int i=0; i<n; i++) {
373 pairs[i] = std::make_pair(std::make_pair(r_evals[i],i_evals[i]),i);
377 for (
int i=0; i<n; i++) {
378 pairs[i] = std::make_pair(std::make_pair(i_evals[i],r_evals[i]),i);
382 if (which_ == LR || which_ == LI) {
383 std::sort(pairs.begin(),pairs.end(),compAlg<greater_mt>());
385 else if (which_ == SR || which_ == SI) {
386 std::sort(pairs.begin(),pairs.end(),compAlg<less_mt>());
388 else if (which_ == LM) {
389 std::sort(pairs.begin(),pairs.end(),compMag2<greater_mt>());
392 std::sort(pairs.begin(),pairs.end(),compMag2<less_mt>());
398 if (which_ == LR || which_ == SR || which_ == LM || which_ == SM) {
399 for (
int i=0; i<n; i++) {
400 r_evals[i] = pairs[i].first.first;
401 i_evals[i] = pairs[i].first.second;
402 (*perm)[i] = pairs[i].second;
406 for (
int i=0; i<n; i++) {
407 i_evals[i] = pairs[i].first.first;
408 r_evals[i] = pairs[i].first.second;
409 (*perm)[i] = pairs[i].second;