7 #ifndef SPECTRA_SELECTION_RULE_H 
    8 #define SPECTRA_SELECTION_RULE_H 
   68 template <
typename Scalar, SortRule Rule>
 
   72     static ElemType<Scalar> 
get(
const Scalar& val)
 
   75         throw std::invalid_argument(
"incompatible selection rule");
 
   82 template <
typename Scalar>
 
   86     static ElemType<Scalar> 
get(
const Scalar& val)
 
   95 template <
typename RealType>
 
   99     static RealType 
get(
const std::complex<RealType>& val)
 
  107 template <
typename RealType>
 
  111     static RealType 
get(
const std::complex<RealType>& val)
 
  114         return -
abs(val.imag());
 
  120 template <
typename Scalar>
 
  134 template <
typename Scalar>
 
  146 template <
typename Scalar>
 
  150     static ElemType<Scalar> 
get(
const Scalar& val)
 
  159 template <
typename RealType>
 
  163     static RealType 
get(
const std::complex<RealType>& val)
 
  171 template <
typename RealType>
 
  175     static RealType 
get(
const std::complex<RealType>& val)
 
  178         return abs(val.imag());
 
  184 template <
typename Scalar>
 
  195 template <
typename T, SortRule Rule>
 
  200     using IndexArray = std::vector<Index>;
 
  213         m_evals(start), m_index(
size)
 
  219         std::sort(m_index.begin(), m_index.end(), *
this);
 
  222     inline IndexArray index()
 const { 
return m_index; }
 
  227 template <
typename Scalar>
 
  233     std::vector<Index> 
ind;
 
  238             SortEigenvalue<Scalar, SortRule::LargestMagn> sorting(
values.data(), 
len);
 
  245             SortEigenvalue<Scalar, SortRule::LargestAlge> sorting(
values.data(), 
len);
 
  251             SortEigenvalue<Scalar, SortRule::SmallestMagn> sorting(
values.data(), 
len);
 
  257             SortEigenvalue<Scalar, SortRule::SmallestAlge> sorting(
values.data(), 
len);
 
  262             throw std::invalid_argument(
"unsupported selection rule");
 
  274         std::vector<Index> ind_copy(
ind);
 
  280                 ind[
i] = ind_copy[
i / 2];
 
  290 template <
typename Scalar>
 
  293     return argsort<Scalar>(selection, 
values, 
values.size());
 
  300 #endif  // SPECTRA_SELECTION_RULE_H