packages feed

moonlight-linalg-0.1.0.0: src-spectral/Moonlight/LinAlg/Pure/Krylov/Selection.hs

{-# LANGUAGE StrictData #-}

module Moonlight.LinAlg.Pure.Krylov.Selection
  ( SpectrumEnd (..),
    sortForSpectrumBy,
    sortRawPairsForSpectrum,
  )
where

import Data.Kind (Type)
import Data.List (sortBy)
import Data.Ord (comparing)
import Prelude

type SpectrumEnd :: Type
data SpectrumEnd = SmallestEigenvalues | LargestEigenvalues
  deriving stock (Eq, Show)

sortForSpectrumBy :: Ord keyValue => SpectrumEnd -> (value -> keyValue) -> [value] -> [value]
sortForSpectrumBy spectrumEnd projectValue =
  sortBy
    ( case spectrumEnd of
        SmallestEigenvalues -> comparing projectValue
        LargestEigenvalues -> flip (comparing projectValue)
    )

sortRawPairsForSpectrum :: SpectrumEnd -> [(Double, vector)] -> [(Double, vector)]
sortRawPairsForSpectrum spectrumEnd = sortForSpectrumBy spectrumEnd fst