{-# LANGUAGE BangPatterns, FlexibleContexts #-}
module Languages.UniquenessPeriods.Vector.General.Simplified (
maximumElBy
, maximumElByAll
, maximumElGBy
, maximumElByVec
, maximumElByVecAll
) where
import Data.Foldable
import Data.Monoid
import Data.SubG
import qualified Data.Vector as VB
import Languages.UniquenessPeriods.Vector.AuxiliaryG
import Languages.UniquenessPeriods.Vector.StrictVG
import Languages.UniquenessPeriods.Vector.DataG
import Languages.UniquenessPeriods.Vector.General.DebugG (uniquenessVariantsGN, equalSnDs)
maximumElBy ::
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)), Foldable t2, Ord b) => Int
-> VB.Vector (t2 b -> b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy :: Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy Int
k Vector (t2 b -> b)
vN Vector (UniquenessG1T2 t t2 a b)
v
| Vector (UniquenessG1T2 t t2 a b) -> Bool
forall a. Vector a -> Bool
VB.null Vector (UniquenessG1T2 t t2 a b)
v = [Char] -> UniquenessG1T2 t t2 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.Simplified.maximumElBy: undefined for the empty second element in the tuple. "
| Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k (Vector (t2 b -> b) -> Int
forall a. Vector a -> Int
VB.length Vector (t2 b -> b)
vN) Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = [Char] -> UniquenessG1T2 t t2 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.Simplified.maximumElBy: undefined for that amount of norms. "
| Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT =
let !maxK :: UniquenessG1T2 t t2 a b
maxK = (UniquenessG1T2 t t2 a b -> UniquenessG1T2 t t2 a b -> Ordering)
-> Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
VB.maximumBy (\(t2 b
_,Vector b
vN0,t a
_) (t2 b
_,Vector b
vN1,t a
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))) Vector (UniquenessG1T2 t t2 a b)
v
vK :: Vector (UniquenessG1T2 t t2 a b)
vK = (UniquenessG1T2 t t2 a b -> Bool)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
forall a. (a -> Bool) -> Vector a -> Vector a
VB.filter (\(t2 b
_,Vector b
vN2,t a
_) -> Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex (UniquenessG1T2 t t2 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1T2 t t2 a b
maxK) (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) Vector (UniquenessG1T2 t t2 a b)
v in
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
forall a (t :: * -> *) (t2 :: * -> *) b.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b) =>
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int -> Int -> Vector (t2 b -> b) -> Vector (t2 b -> b)
forall a. Int -> Int -> Vector a -> Vector a
VB.unsafeSlice Int
0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector (t2 b -> b)
vN) Vector (UniquenessG1T2 t t2 a b)
vK
| Bool
otherwise = (UniquenessG1T2 t t2 a b -> UniquenessG1T2 t t2 a b -> Ordering)
-> Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
VB.maximumBy (\(t2 b
_,Vector b
vN0,t a
_) (t2 b
_,Vector b
vN1,t a
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN0 Int
0) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN1 Int
0)) Vector (UniquenessG1T2 t t2 a b)
v
{-# NOINLINE maximumElBy #-}
maximumElByAll ::
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)), Foldable t2, Ord b, Show a, Show b) => VB.Vector (t2 b -> b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElByAll :: Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b
maximumElByAll Vector (t2 b -> b)
vN = Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
forall a (t :: * -> *) (t2 :: * -> *) b.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b) =>
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy (Vector (t2 b -> b) -> Int
forall a. Vector a -> Int
VB.length Vector (t2 b -> b)
vN) Vector (t2 b -> b)
vN
{-# INLINE maximumElByAll #-}
maximumElGBy ::
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)), Foldable t2, UGG1 t (PreApp t a) a, Ord b, Show a, Show b) => t a
-> a
-> PreApp t a
-> (t a -> VB.Vector a)
-> ((t (t a)) -> VB.Vector (VB.Vector a))
-> (VB.Vector a -> t a)
-> VB.Vector (VB.Vector Int)
-> Int
-> VB.Vector (t2 b -> b)
-> FuncRep (t a) (VB.Vector c) (t2 b)
-> t a
-> UniquenessG1T2 t t2 a b
maximumElGBy :: t a
-> a
-> PreApp t a
-> (t a -> Vector a)
-> (t (t a) -> Vector (Vector a))
-> (Vector a -> t a)
-> Vector (Vector Int)
-> Int
-> Vector (t2 b -> b)
-> FuncRep (t a) (Vector c) (t2 b)
-> t a
-> UniquenessG1T2 t t2 a b
maximumElGBy t a
whspss a
hd PreApp t a
rr t a -> Vector a
f1 t (t a) -> Vector (Vector a)
f2 Vector a -> t a
f3 Vector (Vector Int)
perms Int
k Vector (t2 b -> b)
vN FuncRep (t a) (Vector c) (t2 b)
frep t a
v
| Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k (Vector (t2 b -> b) -> Int
forall a. Vector a -> Int
VB.length Vector (t2 b -> b)
vN) Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = [Char] -> UniquenessG1T2 t t2 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.DebugG.maximumElGBy: undefined for that amount of norms. "
| Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT =
let vM :: Vector (UniquenessG1T2 t t2 a b)
vM = t a
-> t a
-> a
-> (t a -> Vector a)
-> (t (t a) -> Vector (Vector a))
-> (Vector a -> t a)
-> Vector (Vector Int)
-> Vector (t2 b -> b)
-> FuncRep (t a) (Vector c) (t2 b)
-> t (t a)
-> Vector (UniquenessG1T2 t t2 a b)
forall a (t :: * -> *) b (t2 :: * -> *) c.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Ord b, Foldable t2) =>
t a
-> t a
-> a
-> (t a -> Vector a)
-> (t (t a) -> Vector (Vector a))
-> (Vector a -> t a)
-> Vector (Vector Int)
-> Vector (t2 b -> b)
-> FuncRep (t a) (Vector c) (t2 b)
-> t (t a)
-> Vector (t2 b, Vector b, t a)
uniquenessVariants2GNPB (PreApp t a -> t a
forall (t :: * -> *) a b. UGG1 t a b => a -> t b
get1m PreApp t a
rr) (PreApp t a -> t a
forall (t :: * -> *) a b. UGG1 t a b => a -> t b
get2m PreApp t a
rr) a
hd t a -> Vector a
f1 t (t a) -> Vector (Vector a)
f2 Vector a -> t a
f3 Vector (Vector Int)
perms Vector (t2 b -> b)
vN FuncRep (t a) (Vector c) (t2 b)
frep (t a -> t a -> t (t a)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a), Monoid (t (t a))) =>
t a -> t a -> t (t a)
subG t a
whspss t a
v)
maxK :: UniquenessG1T2 t t2 a b
maxK = (UniquenessG1T2 t t2 a b -> UniquenessG1T2 t t2 a b -> Ordering)
-> Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
VB.maximumBy (\(t2 b
_,Vector b
vN0,t a
_) (t2 b
_,Vector b
vN1,t a
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))) Vector (UniquenessG1T2 t t2 a b)
vM
vK :: Vector (UniquenessG1T2 t t2 a b)
vK = (UniquenessG1T2 t t2 a b -> Bool)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
forall a. (a -> Bool) -> Vector a -> Vector a
VB.filter (\(t2 b
_,Vector b
vN2,t a
_) -> Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex (UniquenessG1T2 t t2 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1T2 t t2 a b
maxK) (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) Vector (UniquenessG1T2 t t2 a b)
vM in
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
forall a (t :: * -> *) (t2 :: * -> *) b.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b) =>
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int -> Int -> Vector (t2 b -> b) -> Vector (t2 b -> b)
forall a. Int -> Int -> Vector a -> Vector a
VB.unsafeSlice Int
0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector (t2 b -> b)
vN) Vector (UniquenessG1T2 t t2 a b)
vK
| Bool
otherwise = (UniquenessG1T2 t t2 a b -> UniquenessG1T2 t t2 a b -> Ordering)
-> Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
VB.maximumBy (\(t2 b
_,Vector b
vN0,t a
_) (t2 b
_,Vector b
vN1,t a
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN0 Int
0) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector b
vN1 Int
0)) (Vector (UniquenessG1T2 t t2 a b) -> UniquenessG1T2 t t2 a b)
-> (t a -> Vector (UniquenessG1T2 t t2 a b))
-> t a
-> UniquenessG1T2 t t2 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a
-> t a
-> (t a -> Vector a)
-> (t (t a) -> Vector (Vector a))
-> (Vector a -> t a)
-> Vector (Vector Int)
-> PreApp t a
-> Vector (t2 b -> b)
-> FuncRep (t a) (Vector c) (t2 b)
-> t a
-> Vector (UniquenessG1T2 t t2 a b)
forall a (t :: * -> *) (t2 :: * -> *) b c.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b, Show a, Show b) =>
a
-> t a
-> (t a -> Vector a)
-> (t (t a) -> Vector (Vector a))
-> (Vector a -> t a)
-> Vector (Vector Int)
-> PreApp t a
-> Vector (t2 b -> b)
-> FuncRep (t a) (Vector c) (t2 b)
-> t a
-> Vector (UniquenessG1T2 t t2 a b)
uniquenessVariantsGN a
hd t a
whspss t a -> Vector a
f1 t (t a) -> Vector (Vector a)
f2 Vector a -> t a
f3 Vector (Vector Int)
perms PreApp t a
rr Vector (t2 b -> b)
vN FuncRep (t a) (Vector c) (t2 b)
frep (t a -> UniquenessG1T2 t t2 a b) -> t a -> UniquenessG1T2 t t2 a b
forall a b. (a -> b) -> a -> b
$ t a
v
maximumElByVec ::
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)), Foldable t2, Ord b, Show a, Show b) => Int
-> VB.Vector (t2 b -> b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
maximumElByVec :: Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
maximumElByVec Int
k Vector (t2 b -> b)
vN Vector (UniquenessG1T2 t t2 a b)
v
| Vector (UniquenessG1T2 t t2 a b) -> Bool
forall a. Vector a -> Bool
VB.null Vector (UniquenessG1T2 t t2 a b)
v = Vector (UniquenessG1T2 t t2 a b)
forall a. Vector a
VB.empty
| Bool
otherwise = let !uniq :: UniquenessG1T2 t t2 a b
uniq = Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
forall a (t :: * -> *) (t2 :: * -> *) b.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b) =>
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> UniquenessG1T2 t t2 a b
maximumElBy Int
k Vector (t2 b -> b)
vN Vector (UniquenessG1T2 t t2 a b)
v in let !snD :: Vector b
snD = UniquenessG1T2 t t2 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1T2 t t2 a b
uniq in (UniquenessG1T2 t t2 a b -> Bool)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
forall a. (a -> Bool) -> Vector a -> Vector a
VB.filter (Vector b -> Vector b -> Bool
forall b. Ord b => Vector b -> Vector b -> Bool
equalSnDs Vector b
snD (Vector b -> Bool)
-> (UniquenessG1T2 t t2 a b -> Vector b)
-> UniquenessG1T2 t t2 a b
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1T2 t t2 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) Vector (UniquenessG1T2 t t2 a b)
v
{-# NOINLINE maximumElByVec #-}
maximumElByVecAll ::
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)), Foldable t2, Ord b, Show a, Show b) => VB.Vector (t2 b -> b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
-> VB.Vector (UniquenessG1T2 t t2 a b)
maximumElByVecAll :: Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
maximumElByVecAll Vector (t2 b -> b)
vN = Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
forall a (t :: * -> *) (t2 :: * -> *) b.
(Eq a, Foldable t, InsertLeft t a, Monoid (t a), Monoid (t (t a)),
Foldable t2, Ord b, Show a, Show b) =>
Int
-> Vector (t2 b -> b)
-> Vector (UniquenessG1T2 t t2 a b)
-> Vector (UniquenessG1T2 t t2 a b)
maximumElByVec (Vector (t2 b -> b) -> Int
forall a. Vector a -> Int
VB.length Vector (t2 b -> b)
vN) Vector (t2 b -> b)
vN
{-# INLINE maximumElByVecAll #-}