module Math.Algebra.Jack.HypergeoPQ
  ( hypergeoPQ, _allPartitions
  ) where
import           Math.Algebra.Jack              ( zonal )

gpochhammer :: Fractional a => a -> [Int] -> a -> a
gpochhammer :: forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
a [Int]
kappa a
alpha = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map
  (\Int
i -> forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map
    (\Int
j -> a
a forall a. Num a => a -> a -> a
- (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i forall a. Num a => a -> a -> a
- a
1) forall a. Fractional a => a -> a -> a
/ a
alpha forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
j forall a. Num a => a -> a -> a
- a
1)
    [Int
1 .. [Int]
kappa forall a. [a] -> Int -> a
!! (Int
i forall a. Num a => a -> a -> a
- Int
1)]
  )
  [Int
1 .. forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
kappa]

hcoeff :: Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff :: forall a. Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff [a]
a [a]
b [Int]
kappa a
alpha = a
numerator forall a. Fractional a => a -> a -> a
/ a
denominator forall a. Fractional a => a -> a -> a
/ 
  forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall {a}. (Num a, Enum a) => a -> a
factorial (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Int]
kappa))
 where
  factorial :: a -> a
factorial a
n = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product [a
1 .. a
n]
  numerator :: a
numerator   = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\a
x -> forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
x [Int]
kappa a
alpha) [a]
a
  denominator :: a
denominator = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\a
x -> forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
x [Int]
kappa a
alpha) [a]
b

_allPartitions :: Int -> [[Int]]
_allPartitions :: Int -> [[Int]]
_allPartitions Int
m = [[]] forall a. [a] -> [a] -> [a]
++ (forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[[Int]]]
ps))
 where
  ps :: [[[Int]]]
ps      = [] forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map Int -> [[Int]]
parts [Int
1 .. Int
m]
  parts :: Int -> [[Int]]
parts Int
n = [Int
n] forall a. a -> [a] -> [a]
: [ Int
x forall a. a -> [a] -> [a]
: [Int]
p | Int
x <- [Int
1 .. Int
n], [Int]
p <- [[[Int]]]
ps forall a. [a] -> Int -> a
!! (Int
n forall a. Num a => a -> a -> a
- Int
x), Int
x forall a. Ord a => a -> a -> Bool
<= forall a. [a] -> a
head [Int]
p ]

-- | Inefficient hypergeometric function of a matrix argument
hypergeoPQ :: (Fractional a, Ord a) => Int -> [a] -> [a] -> [a] -> a
hypergeoPQ :: forall a. (Fractional a, Ord a) => Int -> [a] -> [a] -> [a] -> a
hypergeoPQ Int
m [a]
a [a]
b [a]
x = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\[Int]
kappa -> [Int] -> a
coeff [Int]
kappa forall a. Num a => a -> a -> a
* forall a. (Fractional a, Ord a) => [a] -> [Int] -> a
zonal [a]
x [Int]
kappa) [[Int]]
kappas
 where
  kappas :: [[Int]]
kappas      = forall a. (a -> Bool) -> [a] -> [a]
filter (\[Int]
kap -> forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
kap forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
x) (Int -> [[Int]]
_allPartitions Int
m)
  coeff :: [Int] -> a
coeff [Int]
kappa = forall a. Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff [a]
a [a]
b [Int]
kappa a
2