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