{-# LANGUAGE OverloadedLists #-}

-- |
-- Maintainer: Jeremy Nuttall <jeremy@jeremy-nuttall.com>
-- License: BSD-3-Clause
-- Stability : experimental
module Numeric.Noise.Internal.Math (
  Seed,
  Hash,
  lerp,
  cubicInterp,
  hermiteInterp,
  quinticInterp,
  clamp,
  primeX,
  primeY,
  primeZ,
  hash2,
  hash3,
  infinity,
  g2,
  sqrt3,
  valCoord2,
  valCoord3,
  gradCoord2,
  gradCoord3,
  maxHash,
) where

import Data.Bits
import Data.Int
import Data.Primitive.PrimArray
import Data.Word

-- | Seed value for deterministic noise generation.
--
-- Using the same 'Seed' value will produce the same noise pattern,
-- allowing for reproducible results. Different seed values produce
-- different, independent noise patterns.
type Seed = Word64

-- | Internal hash value type used in noise calculations.
type Hash = Int32

-- | Linear interpolation between two values.
--
-- Monotonic lerp
lerp
  :: (Num a)
  => a
  -- ^ start
  -> a
  -- ^ end
  -> a
  -- ^ parameter in range [0, 1]
  -> a
lerp :: forall a. Num a => a -> a -> a -> a
lerp a
v0 a
v1 a
t = a
v0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
v1 a -> a -> a
forall a. Num a => a -> a -> a
- a
v0)
{-# INLINE [1] lerp #-}

{-# RULES
"lerp/Float/0" forall (a :: Float) b.
  lerp a b 0 =
    a
"lerp/Double/0" forall (a :: Double) b.
  lerp a b 0 =
    a
"lerp/Float/1" forall (a :: Float) b.
  lerp a b 1 =
    b
"lerp/Double/1" forall (a :: Double) b.
  lerp a b 1 =
    b
"lerp/id" forall a t. lerp a a t = a
"lerp/compose/start" forall a b t u.
  lerp (lerp a b u) b t =
    lerp a b (u + t - t * u)
"lerp/compose/end" forall a b t u.
  lerp a (lerp a b u) t =
    lerp a b (t * u)
  #-}

-- | cubic interpolation
cubicInterp :: (Num a) => a -> a -> a -> a -> a -> a
cubicInterp :: forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp a
a !a
b a
c a
d !a
t =
  let !c' :: a
c' = a
c a -> a -> a
forall a. Num a => a -> a -> a
- a
a
      !a' :: a
a' = a
a a -> a -> a
forall a. Num a => a -> a -> a
- a
b
      !p :: a
p = (a
d a -> a -> a
forall a. Num a => a -> a -> a
- a
c) a -> a -> a
forall a. Num a => a -> a -> a
- a
a'
      !b' :: a
b' = a
a' a -> a -> a
forall a. Num a => a -> a -> a
- a
p
   in a
b a -> a -> a
forall a. Num a => a -> a -> a
+ a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
c' a -> a -> a
forall a. Num a => a -> a -> a
+ a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
b' a -> a -> a
forall a. Num a => a -> a -> a
+ a
t a -> a -> a
forall a. Num a => a -> a -> a
* a
p))
{-# INLINE [1] cubicInterp #-}

{-# RULES
"cubicInterp/Float/0" forall (a :: Float) b c d.
  cubicInterp a b c d 0 =
    b
"cubicInterp/Double/0" forall (a :: Double) b c d.
  cubicInterp a b c d 0 =
    b
"cubicInterp/Float/1" forall (a :: Float) b c d.
  cubicInterp a b c d 1 =
    c
"cubicInterp/Double/1" forall (a :: Double) b c d.
  cubicInterp a b c d 1 =
    c
"cubicInterp/Float/0.5" forall (a :: Float) b c d.
  cubicInterp a b c d (0.5 :: Float) =
    0.125 * (-a + 5 * b + 5 * c - d)
"cubicInterp/Double/0.5" forall (a :: Double) b c d.
  cubicInterp a b c d (0.5 :: Double) =
    0.125 * (-a + 5 * b + 5 * c - d)
  #-}

-- | hermite interpolation
hermiteInterp :: (Num a) => a -> a
hermiteInterp :: forall a. Num a => a -> a
hermiteInterp a
t = a
t a -> a -> a
forall a. Num a => a -> a -> a
* a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
3 a -> a -> a
forall a. Num a => a -> a -> a
- a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
t)
{-# INLINE [1] hermiteInterp #-}

{-# RULES
"hermiteInterp/Float/0" hermiteInterp (0 :: Float) = 0
"hermiteInterp/Double/0" hermiteInterp (0 :: Double) = 0
"hermiteInterp/Float/1" hermiteInterp (1 :: Float) = 1
"hermiteInterp/Double/1" hermiteInterp (1 :: Double) = 1
  #-}

-- | quintic interpolation
quinticInterp :: (Num a) => a -> a
quinticInterp :: forall a. Num a => a -> a
quinticInterp a
t = a
t a -> a -> a
forall a. Num a => a -> a -> a
* a
t a -> a -> a
forall a. Num a => a -> a -> a
* a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
t a -> a -> a
forall a. Num a => a -> a -> a
* (a
t a -> a -> a
forall a. Num a => a -> a -> a
* a
6 a -> a -> a
forall a. Num a => a -> a -> a
- a
15) a -> a -> a
forall a. Num a => a -> a -> a
+ a
10)
{-# INLINE [1] quinticInterp #-}

{-# RULES
"quinticInterp/Float/0"
  quinticInterp (0 :: Float) =
    0
"quinticInterp/Double/0"
  quinticInterp (0 :: Double) =
    0
"quinticInterp/Float/1"
  quinticInterp (1 :: Float) =
    1
"quinticInterp/Double/1"
  quinticInterp (1 :: Double) =
    1
  #-}

-- | Clamp a value to a specified range.
--
-- Returns the value if it's within bounds, otherwise returns
-- the nearest boundary.
clamp
  :: (Ord a)
  => a
  -- ^ lower bound
  -> a
  -- ^ upper bound
  -> a
  -- ^ value
  -> a
clamp :: forall a. Ord a => a -> a -> a -> a
clamp a
l a
u a
v = a -> a -> a
forall a. Ord a => a -> a -> a
min (a -> a -> a
forall a. Ord a => a -> a -> a
max a
v a
l) a
u
{-# INLINE clamp #-}

primeX, primeY, primeZ :: Hash
primeX :: Hash
primeX = Hash
501125321
{-# INLINE primeX #-}
primeY :: Hash
primeY = Hash
1136930381
{-# INLINE primeY #-}
primeZ :: Hash
primeZ = Hash
1720413743
{-# INLINE primeZ #-}

hash2 :: Seed -> Hash -> Hash -> Hash
hash2 :: Seed -> Hash -> Hash -> Hash
hash2 Seed
seed Hash
xPrimed Hash
yPrimed =
  (Seed -> Hash
forall a b. (Integral a, Num b) => a -> b
fromIntegral Seed
seed Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` Hash
xPrimed Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` Hash
yPrimed)
    Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
0x27d4eb2d
{-# INLINE hash2 #-}

hash3 :: Seed -> Hash -> Hash -> Hash -> Hash
hash3 :: Seed -> Hash -> Hash -> Hash -> Hash
hash3 Seed
seed Hash
xPrimed Hash
yPrimed Hash
zPrimed =
  (Seed -> Hash
forall a b. (Integral a, Num b) => a -> b
fromIntegral Seed
seed Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` Hash
xPrimed Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` Hash
yPrimed Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` Hash
zPrimed)
    Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
0x27d4eb2d
{-# INLINE hash3 #-}

infinity :: (Fractional a) => a
infinity :: forall a. Fractional a => a
infinity = a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
0
{-# INLINE infinity #-}

g2 :: (Fractional a) => a
g2 :: forall a. Fractional a => a
g2 = (a
3 a -> a -> a
forall a. Num a => a -> a -> a
- a
forall a. Fractional a => a
sqrt3) a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
6
{-# INLINE g2 #-}

sqrt3 :: (Fractional a) => a
sqrt3 :: forall a. Fractional a => a
sqrt3 = a
1.7320508075688772935274463415059
{-# INLINE sqrt3 #-}

valCoord2 :: (RealFrac a) => Seed -> Hash -> Hash -> a
valCoord2 :: forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
xPrimed Hash
yPrimed =
  let !hash :: Hash
hash = Seed -> Hash -> Hash -> Hash
hash2 Seed
seed Hash
xPrimed Hash
yPrimed
      !val :: Hash
val = (Hash
hash Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
hash) Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` (Hash
hash Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
19)
   in Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
val a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Fractional a => a -> a
recip (a
forall a. RealFrac a => a
maxHash a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
{-# INLINE valCoord2 #-}

valCoord3 :: (RealFrac a) => Seed -> Hash -> Hash -> Hash -> a
valCoord3 :: forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
xPrimed Hash
yPrimed Hash
zPrimed =
  let !hash :: Hash
hash = Seed -> Hash -> Hash -> Hash -> Hash
hash3 Seed
seed Hash
xPrimed Hash
yPrimed Hash
zPrimed
      !val :: Hash
val = (Hash
hash Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
hash) Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` (Hash
hash Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
19)
   in Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
val a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Fractional a => a -> a
recip (a
forall a. RealFrac a => a
maxHash a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
{-# INLINE valCoord3 #-}

gradCoord2 :: (RealFrac a) => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 :: forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
xPrimed Hash
yPrimed a
xd a
yd =
  let !hash :: Hash
hash = Seed -> Hash -> Hash -> Hash
hash2 Seed
seed Hash
xPrimed Hash
yPrimed
      !ix :: Hash
ix = (Hash
hash Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` (Hash
hash Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftR` Int
15)) Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.&. Hash
0xFE
      !xg :: a
xg = Hash -> a
forall a. RealFrac a => Hash -> a
lookupGrad2 Hash
ix
      !yg :: a
yg = Hash -> a
forall a. RealFrac a => Hash -> a
lookupGrad2 (Hash
ix Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.|. Hash
1)
   in a
xd a -> a -> a
forall a. Num a => a -> a -> a
* a
xg a -> a -> a
forall a. Num a => a -> a -> a
+ a
yd a -> a -> a
forall a. Num a => a -> a -> a
* a
yg
-- Phase 2 inlining ensures specialization happens after hash computation
-- but before gradient lookup, allowing REWRITE RULES to fire effectively
{-# INLINE [2] gradCoord2 #-}

gradCoord3 :: (RealFrac a) => Seed -> Hash -> Hash -> Hash -> a -> a -> a -> a
gradCoord3 :: forall a.
RealFrac a =>
Seed -> Hash -> Hash -> Hash -> a -> a -> a -> a
gradCoord3 Seed
seed Hash
xPrimed Hash
yPrimed Hash
zPrimed a
xd a
yd a
zd =
  let !hash :: Hash
hash = Seed -> Hash -> Hash -> Hash -> Hash
hash3 Seed
seed Hash
xPrimed Hash
yPrimed Hash
zPrimed
      !ix :: Hash
ix = (Hash
hash Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
`xor` (Hash
hash Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftR` Int
15)) Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.&. Hash
0xFC
      !xg :: a
xg = Hash -> a
forall a. RealFrac a => Hash -> a
lookupGrad3 Hash
ix
      !yg :: a
yg = Hash -> a
forall a. RealFrac a => Hash -> a
lookupGrad3 (Hash
ix Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.|. Hash
1)
      !zg :: a
zg = Hash -> a
forall a. RealFrac a => Hash -> a
lookupGrad3 (Hash
ix Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.|. Hash
2)
   in a
xd a -> a -> a
forall a. Num a => a -> a -> a
* a
xg a -> a -> a
forall a. Num a => a -> a -> a
+ a
yd a -> a -> a
forall a. Num a => a -> a -> a
* a
yg a -> a -> a
forall a. Num a => a -> a -> a
+ a
zd a -> a -> a
forall a. Num a => a -> a -> a
* a
zg
{-# INLINE gradCoord3 #-}

maxHash :: (RealFrac a) => a
maxHash :: forall a. RealFrac a => a
maxHash = Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Bounded a => a
maxBound @Hash)
{-# INLINE maxHash #-}

lookupGrad2 :: (RealFrac a) => Hash -> a
lookupGrad2 :: forall a. RealFrac a => Hash -> a
lookupGrad2 = Double -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> a) -> (Hash -> Double) -> Hash -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrimArray Double
grad2dd PrimArray Double -> Int -> Double
forall a. Prim a => PrimArray a -> Int -> a
`indexPrimArray`) (Int -> Double) -> (Hash -> Int) -> Hash -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hash -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE [0] lookupGrad2 #-}

{-# RULES
"lookupGrad2/Float" forall (i :: Hash).
  lookupGrad2 i =
    indexPrimArray grad2df (fromIntegral i)
"lookupGrad2/Double" forall (i :: Hash).
  lookupGrad2 i =
    indexPrimArray grad2dd (fromIntegral i)
  #-}

grad2df :: PrimArray Float
grad2df :: PrimArray Float
grad2df = (Double -> Float) -> PrimArray Double -> PrimArray Float
forall a b.
(Prim a, Prim b) =>
(a -> b) -> PrimArray a -> PrimArray b
mapPrimArray Double -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac PrimArray Double
grad2dd

{- ORMOLU_DISABLE -}
-- >>> sizeofPrimArray grad2d == 256
-- True
grad2dd :: PrimArray Double
grad2dd :: PrimArray Double
grad2dd =
  [ Double
Item (PrimArray Double)
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721,
    Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051,  Double
Item (PrimArray Double)
0.99144486137381 , -Double
0.130526192220051,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509,
    Double
Item (PrimArray Double)
0.793353340291235, -Double
0.60876142900872 ,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.130526192220052, -Double
0.99144486137381,
   -Double
0.130526192220052, -Double
0.99144486137381 , -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.608761429008721, -Double
0.793353340291235, -Double
0.793353340291235, -Double
0.608761429008721,
   -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.99144486137381 , -Double
0.130526192220052, -Double
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051, -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509,
   -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381,
    Double
Item (PrimArray Double)
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721,
    Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051,  Double
Item (PrimArray Double)
0.99144486137381 , -Double
0.130526192220051,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509,
    Double
Item (PrimArray Double)
0.793353340291235, -Double
0.60876142900872 ,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.130526192220052, -Double
0.99144486137381,
   -Double
0.130526192220052, -Double
0.99144486137381 , -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.608761429008721, -Double
0.793353340291235, -Double
0.793353340291235, -Double
0.608761429008721,
   -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.99144486137381 , -Double
0.130526192220052, -Double
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051, -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509,
   -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381,
    Double
Item (PrimArray Double)
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721,
    Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051,  Double
Item (PrimArray Double)
0.99144486137381 , -Double
0.130526192220051,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509,
    Double
Item (PrimArray Double)
0.793353340291235, -Double
0.60876142900872 ,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.130526192220052, -Double
0.99144486137381,
   -Double
0.130526192220052, -Double
0.99144486137381 , -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.608761429008721, -Double
0.793353340291235, -Double
0.793353340291235, -Double
0.608761429008721,
   -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.99144486137381 , -Double
0.130526192220052, -Double
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051, -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509,
   -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381,
    Double
Item (PrimArray Double)
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721,
    Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051,  Double
Item (PrimArray Double)
0.99144486137381 , -Double
0.130526192220051,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509,
    Double
Item (PrimArray Double)
0.793353340291235, -Double
0.60876142900872 ,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.130526192220052, -Double
0.99144486137381,
   -Double
0.130526192220052, -Double
0.99144486137381 , -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.608761429008721, -Double
0.793353340291235, -Double
0.793353340291235, -Double
0.608761429008721,
   -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.99144486137381 , -Double
0.130526192220052, -Double
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051, -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509,
   -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381,
    Double
Item (PrimArray Double)
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721,
    Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051,  Double
Item (PrimArray Double)
0.99144486137381 , -Double
0.130526192220051,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509,
    Double
Item (PrimArray Double)
0.793353340291235, -Double
0.60876142900872 ,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.130526192220052, -Double
0.99144486137381,
   -Double
0.130526192220052, -Double
0.99144486137381 , -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.608761429008721, -Double
0.793353340291235, -Double
0.793353340291235, -Double
0.608761429008721,
   -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.99144486137381 , -Double
0.130526192220052, -Double
0.99144486137381 ,  Double
Item (PrimArray Double)
0.130526192220051, -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509,
   -Double
0.793353340291235,  Double
Item (PrimArray Double)
0.608761429008721, -Double
0.608761429008721,  Double
Item (PrimArray Double)
0.793353340291235, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.130526192220052,  Double
Item (PrimArray Double)
0.99144486137381,
    Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287, -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.923879532511287,
   -Double
0.38268343236509 , -Double
0.923879532511287, -Double
0.923879532511287, -Double
0.38268343236509 , -Double
0.923879532511287,  Double
Item (PrimArray Double)
0.38268343236509 , -Double
0.38268343236509 ,  Double
Item (PrimArray Double)
0.923879532511287
  ]

{- ORMOLU_ENABLE -}

lookupGrad3 :: (RealFrac a) => Hash -> a
lookupGrad3 :: forall a. RealFrac a => Hash -> a
lookupGrad3 = Double -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> a) -> (Hash -> Double) -> Hash -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrimArray Double
grad3dd PrimArray Double -> Int -> Double
forall a. Prim a => PrimArray a -> Int -> a
`indexPrimArray`) (Int -> Double) -> (Hash -> Int) -> Hash -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hash -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE [0] lookupGrad3 #-}

{-# RULES
"lookupGrad3/Float" forall (i :: Hash).
  lookupGrad3 i =
    indexPrimArray grad3df (fromIntegral i)
"lookupGrad3/Double" forall (i :: Hash).
  lookupGrad3 i =
    indexPrimArray grad3dd (fromIntegral i)
  #-}

grad3df :: PrimArray Float
grad3df :: PrimArray Float
grad3df = (Double -> Float) -> PrimArray Double -> PrimArray Float
forall a b.
(Prim a, Prim b) =>
(a -> b) -> PrimArray a -> PrimArray b
mapPrimArray Double -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac PrimArray Double
grad3dd

{- ORMOLU_DISABLE -}
-- >>> sizeofPrimArray grad3d == 256
-- True
grad3dd :: PrimArray Double
grad3dd :: PrimArray Double
grad3dd =
  [ Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0
  , Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, -Double
1, Double
Item (PrimArray Double)
1, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, Double
Item (PrimArray Double)
0, -Double
1, -Double
1, Double
Item (PrimArray Double)
0
  ]