{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}

-- |
-- Maintainer: Jeremy Nuttall <jeremy@jeremy-nuttall.com>
-- Stability : experimental
module Numeric.Noise.Cellular (
  -- * Configuration
  CellularConfig (..),
  defaultCellularConfig,
  CellularDistanceFn (..),
  CellularResult (..),

  -- * 2D Noise
  noise2,
) where

import Data.Bits
import Data.Foldable (foldl') -- redundant since GHC 9.10.1, here for compat
import Data.Primitive.PrimArray
import GHC.Generics (Generic)
import Numeric.Noise.Internal
import Numeric.Noise.Internal.Math

-- | Configuration for cellular (Worley) noise generation.
--
-- Cellular noise is based on distances to randomly distributed cell points,
-- creating a distinctive cellular or organic pattern.
data CellularConfig a = CellularConfig
  { forall a. CellularConfig a -> CellularDistanceFn
cellularDistanceFn :: CellularDistanceFn
  -- ^ Distance metric to use when computing distance to cell points.
  , forall a. CellularConfig a -> a
cellularJitter :: a
  -- ^ Amount of randomness in cell point positions.
  -- \( 0 \) creates a regular grid, \( 1 \) creates fully random positions.
  -- Values outside \( [0, 1] \) may produce unusual results.
  , forall a. CellularConfig a -> CellularResult
cellularResult :: CellularResult
  -- ^ What value to return from the noise function.
  }
  deriving ((forall x. CellularConfig a -> Rep (CellularConfig a) x)
-> (forall x. Rep (CellularConfig a) x -> CellularConfig a)
-> Generic (CellularConfig a)
forall x. Rep (CellularConfig a) x -> CellularConfig a
forall x. CellularConfig a -> Rep (CellularConfig a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (CellularConfig a) x -> CellularConfig a
forall a x. CellularConfig a -> Rep (CellularConfig a) x
$cfrom :: forall a x. CellularConfig a -> Rep (CellularConfig a) x
from :: forall x. CellularConfig a -> Rep (CellularConfig a) x
$cto :: forall a x. Rep (CellularConfig a) x -> CellularConfig a
to :: forall x. Rep (CellularConfig a) x -> CellularConfig a
Generic, Int -> CellularConfig a -> ShowS
[CellularConfig a] -> ShowS
CellularConfig a -> String
(Int -> CellularConfig a -> ShowS)
-> (CellularConfig a -> String)
-> ([CellularConfig a] -> ShowS)
-> Show (CellularConfig a)
forall a. Show a => Int -> CellularConfig a -> ShowS
forall a. Show a => [CellularConfig a] -> ShowS
forall a. Show a => CellularConfig a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> CellularConfig a -> ShowS
showsPrec :: Int -> CellularConfig a -> ShowS
$cshow :: forall a. Show a => CellularConfig a -> String
show :: CellularConfig a -> String
$cshowList :: forall a. Show a => [CellularConfig a] -> ShowS
showList :: [CellularConfig a] -> ShowS
Show)

-- | Default configuration for cellular noise generation.
defaultCellularConfig :: (RealFrac a) => CellularConfig a
defaultCellularConfig :: forall a. RealFrac a => CellularConfig a
defaultCellularConfig =
  CellularConfig
    { cellularDistanceFn :: CellularDistanceFn
cellularDistanceFn = CellularDistanceFn
DistEuclidean
    , cellularJitter :: a
cellularJitter = a
1
    , cellularResult :: CellularResult
cellularResult = CellularResult
CellValue
    }
{-# INLINEABLE defaultCellularConfig #-}

-- | Distance function for cellular noise calculations.
--
-- Different distance metrics produce different visual characteristics
-- in the cellular pattern.
data CellularDistanceFn
  = -- | \( \sqrt{dx^2 + dy^2} \) - Creates circular cells with smooth edges.
    DistEuclidean
  | -- | \( dx^2 + dy^2 \) - Faster than 'DistEuclidean' with similar appearance.
    DistEuclideanSq
  | -- | \( |dx| + |dy| \) - Creates diamond-shaped cells with sharp edges.
    DistManhattan
  | -- | Hybrid of Euclidean and Manhattan distances.
    DistHybrid
  deriving ((forall x. CellularDistanceFn -> Rep CellularDistanceFn x)
-> (forall x. Rep CellularDistanceFn x -> CellularDistanceFn)
-> Generic CellularDistanceFn
forall x. Rep CellularDistanceFn x -> CellularDistanceFn
forall x. CellularDistanceFn -> Rep CellularDistanceFn x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CellularDistanceFn -> Rep CellularDistanceFn x
from :: forall x. CellularDistanceFn -> Rep CellularDistanceFn x
$cto :: forall x. Rep CellularDistanceFn x -> CellularDistanceFn
to :: forall x. Rep CellularDistanceFn x -> CellularDistanceFn
Generic, ReadPrec [CellularDistanceFn]
ReadPrec CellularDistanceFn
Int -> ReadS CellularDistanceFn
ReadS [CellularDistanceFn]
(Int -> ReadS CellularDistanceFn)
-> ReadS [CellularDistanceFn]
-> ReadPrec CellularDistanceFn
-> ReadPrec [CellularDistanceFn]
-> Read CellularDistanceFn
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS CellularDistanceFn
readsPrec :: Int -> ReadS CellularDistanceFn
$creadList :: ReadS [CellularDistanceFn]
readList :: ReadS [CellularDistanceFn]
$creadPrec :: ReadPrec CellularDistanceFn
readPrec :: ReadPrec CellularDistanceFn
$creadListPrec :: ReadPrec [CellularDistanceFn]
readListPrec :: ReadPrec [CellularDistanceFn]
Read, Int -> CellularDistanceFn -> ShowS
[CellularDistanceFn] -> ShowS
CellularDistanceFn -> String
(Int -> CellularDistanceFn -> ShowS)
-> (CellularDistanceFn -> String)
-> ([CellularDistanceFn] -> ShowS)
-> Show CellularDistanceFn
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CellularDistanceFn -> ShowS
showsPrec :: Int -> CellularDistanceFn -> ShowS
$cshow :: CellularDistanceFn -> String
show :: CellularDistanceFn -> String
$cshowList :: [CellularDistanceFn] -> ShowS
showList :: [CellularDistanceFn] -> ShowS
Show, CellularDistanceFn -> CellularDistanceFn -> Bool
(CellularDistanceFn -> CellularDistanceFn -> Bool)
-> (CellularDistanceFn -> CellularDistanceFn -> Bool)
-> Eq CellularDistanceFn
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CellularDistanceFn -> CellularDistanceFn -> Bool
== :: CellularDistanceFn -> CellularDistanceFn -> Bool
$c/= :: CellularDistanceFn -> CellularDistanceFn -> Bool
/= :: CellularDistanceFn -> CellularDistanceFn -> Bool
Eq, Eq CellularDistanceFn
Eq CellularDistanceFn =>
(CellularDistanceFn -> CellularDistanceFn -> Ordering)
-> (CellularDistanceFn -> CellularDistanceFn -> Bool)
-> (CellularDistanceFn -> CellularDistanceFn -> Bool)
-> (CellularDistanceFn -> CellularDistanceFn -> Bool)
-> (CellularDistanceFn -> CellularDistanceFn -> Bool)
-> (CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn)
-> (CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn)
-> Ord CellularDistanceFn
CellularDistanceFn -> CellularDistanceFn -> Bool
CellularDistanceFn -> CellularDistanceFn -> Ordering
CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CellularDistanceFn -> CellularDistanceFn -> Ordering
compare :: CellularDistanceFn -> CellularDistanceFn -> Ordering
$c< :: CellularDistanceFn -> CellularDistanceFn -> Bool
< :: CellularDistanceFn -> CellularDistanceFn -> Bool
$c<= :: CellularDistanceFn -> CellularDistanceFn -> Bool
<= :: CellularDistanceFn -> CellularDistanceFn -> Bool
$c> :: CellularDistanceFn -> CellularDistanceFn -> Bool
> :: CellularDistanceFn -> CellularDistanceFn -> Bool
$c>= :: CellularDistanceFn -> CellularDistanceFn -> Bool
>= :: CellularDistanceFn -> CellularDistanceFn -> Bool
$cmax :: CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn
max :: CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn
$cmin :: CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn
min :: CellularDistanceFn -> CellularDistanceFn -> CellularDistanceFn
Ord, Int -> CellularDistanceFn
CellularDistanceFn -> Int
CellularDistanceFn -> [CellularDistanceFn]
CellularDistanceFn -> CellularDistanceFn
CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
CellularDistanceFn
-> CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
(CellularDistanceFn -> CellularDistanceFn)
-> (CellularDistanceFn -> CellularDistanceFn)
-> (Int -> CellularDistanceFn)
-> (CellularDistanceFn -> Int)
-> (CellularDistanceFn -> [CellularDistanceFn])
-> (CellularDistanceFn
    -> CellularDistanceFn -> [CellularDistanceFn])
-> (CellularDistanceFn
    -> CellularDistanceFn -> [CellularDistanceFn])
-> (CellularDistanceFn
    -> CellularDistanceFn
    -> CellularDistanceFn
    -> [CellularDistanceFn])
-> Enum CellularDistanceFn
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: CellularDistanceFn -> CellularDistanceFn
succ :: CellularDistanceFn -> CellularDistanceFn
$cpred :: CellularDistanceFn -> CellularDistanceFn
pred :: CellularDistanceFn -> CellularDistanceFn
$ctoEnum :: Int -> CellularDistanceFn
toEnum :: Int -> CellularDistanceFn
$cfromEnum :: CellularDistanceFn -> Int
fromEnum :: CellularDistanceFn -> Int
$cenumFrom :: CellularDistanceFn -> [CellularDistanceFn]
enumFrom :: CellularDistanceFn -> [CellularDistanceFn]
$cenumFromThen :: CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
enumFromThen :: CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
$cenumFromTo :: CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
enumFromTo :: CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
$cenumFromThenTo :: CellularDistanceFn
-> CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
enumFromThenTo :: CellularDistanceFn
-> CellularDistanceFn -> CellularDistanceFn -> [CellularDistanceFn]
Enum, CellularDistanceFn
CellularDistanceFn
-> CellularDistanceFn -> Bounded CellularDistanceFn
forall a. a -> a -> Bounded a
$cminBound :: CellularDistanceFn
minBound :: CellularDistanceFn
$cmaxBound :: CellularDistanceFn
maxBound :: CellularDistanceFn
Bounded)

-- | What value to return from cellular noise evaluation.
--
-- These options allow for different visual effects by returning different
-- properties of the cell structure.
data CellularResult
  = -- | Return the hash value of the nearest cell point.
    -- Creates discrete regions with constant values.
    CellValue
  | -- | Return the distance to the nearest cell point.
    -- Creates a classic Worley noise pattern with cell boundaries.
    Distance
  | -- | Return the distance to the second-nearest cell point.
    -- Creates larger, more organic-looking cells.
    Distance2
  | -- | Return the sum of distances to the two nearest cell points.
    -- Creates smooth, rounded cells.
    Distance2Add
  | -- | Return the difference between distances to the two nearest cell points.
    -- Emphasizes cell boundaries and creates sharp edges.
    Distance2Sub
  | -- | Return the product of distances to the two nearest cell points.
    -- Creates cells with varying contrast.
    Distance2Mul
  | -- | Return the ratio of nearest to second-nearest distance.
    -- Creates normalized cell patterns.
    Distance2Div
  deriving ((forall x. CellularResult -> Rep CellularResult x)
-> (forall x. Rep CellularResult x -> CellularResult)
-> Generic CellularResult
forall x. Rep CellularResult x -> CellularResult
forall x. CellularResult -> Rep CellularResult x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CellularResult -> Rep CellularResult x
from :: forall x. CellularResult -> Rep CellularResult x
$cto :: forall x. Rep CellularResult x -> CellularResult
to :: forall x. Rep CellularResult x -> CellularResult
Generic, ReadPrec [CellularResult]
ReadPrec CellularResult
Int -> ReadS CellularResult
ReadS [CellularResult]
(Int -> ReadS CellularResult)
-> ReadS [CellularResult]
-> ReadPrec CellularResult
-> ReadPrec [CellularResult]
-> Read CellularResult
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS CellularResult
readsPrec :: Int -> ReadS CellularResult
$creadList :: ReadS [CellularResult]
readList :: ReadS [CellularResult]
$creadPrec :: ReadPrec CellularResult
readPrec :: ReadPrec CellularResult
$creadListPrec :: ReadPrec [CellularResult]
readListPrec :: ReadPrec [CellularResult]
Read, Int -> CellularResult -> ShowS
[CellularResult] -> ShowS
CellularResult -> String
(Int -> CellularResult -> ShowS)
-> (CellularResult -> String)
-> ([CellularResult] -> ShowS)
-> Show CellularResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CellularResult -> ShowS
showsPrec :: Int -> CellularResult -> ShowS
$cshow :: CellularResult -> String
show :: CellularResult -> String
$cshowList :: [CellularResult] -> ShowS
showList :: [CellularResult] -> ShowS
Show, CellularResult -> CellularResult -> Bool
(CellularResult -> CellularResult -> Bool)
-> (CellularResult -> CellularResult -> Bool) -> Eq CellularResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CellularResult -> CellularResult -> Bool
== :: CellularResult -> CellularResult -> Bool
$c/= :: CellularResult -> CellularResult -> Bool
/= :: CellularResult -> CellularResult -> Bool
Eq, Eq CellularResult
Eq CellularResult =>
(CellularResult -> CellularResult -> Ordering)
-> (CellularResult -> CellularResult -> Bool)
-> (CellularResult -> CellularResult -> Bool)
-> (CellularResult -> CellularResult -> Bool)
-> (CellularResult -> CellularResult -> Bool)
-> (CellularResult -> CellularResult -> CellularResult)
-> (CellularResult -> CellularResult -> CellularResult)
-> Ord CellularResult
CellularResult -> CellularResult -> Bool
CellularResult -> CellularResult -> Ordering
CellularResult -> CellularResult -> CellularResult
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CellularResult -> CellularResult -> Ordering
compare :: CellularResult -> CellularResult -> Ordering
$c< :: CellularResult -> CellularResult -> Bool
< :: CellularResult -> CellularResult -> Bool
$c<= :: CellularResult -> CellularResult -> Bool
<= :: CellularResult -> CellularResult -> Bool
$c> :: CellularResult -> CellularResult -> Bool
> :: CellularResult -> CellularResult -> Bool
$c>= :: CellularResult -> CellularResult -> Bool
>= :: CellularResult -> CellularResult -> Bool
$cmax :: CellularResult -> CellularResult -> CellularResult
max :: CellularResult -> CellularResult -> CellularResult
$cmin :: CellularResult -> CellularResult -> CellularResult
min :: CellularResult -> CellularResult -> CellularResult
Ord, Int -> CellularResult
CellularResult -> Int
CellularResult -> [CellularResult]
CellularResult -> CellularResult
CellularResult -> CellularResult -> [CellularResult]
CellularResult
-> CellularResult -> CellularResult -> [CellularResult]
(CellularResult -> CellularResult)
-> (CellularResult -> CellularResult)
-> (Int -> CellularResult)
-> (CellularResult -> Int)
-> (CellularResult -> [CellularResult])
-> (CellularResult -> CellularResult -> [CellularResult])
-> (CellularResult -> CellularResult -> [CellularResult])
-> (CellularResult
    -> CellularResult -> CellularResult -> [CellularResult])
-> Enum CellularResult
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: CellularResult -> CellularResult
succ :: CellularResult -> CellularResult
$cpred :: CellularResult -> CellularResult
pred :: CellularResult -> CellularResult
$ctoEnum :: Int -> CellularResult
toEnum :: Int -> CellularResult
$cfromEnum :: CellularResult -> Int
fromEnum :: CellularResult -> Int
$cenumFrom :: CellularResult -> [CellularResult]
enumFrom :: CellularResult -> [CellularResult]
$cenumFromThen :: CellularResult -> CellularResult -> [CellularResult]
enumFromThen :: CellularResult -> CellularResult -> [CellularResult]
$cenumFromTo :: CellularResult -> CellularResult -> [CellularResult]
enumFromTo :: CellularResult -> CellularResult -> [CellularResult]
$cenumFromThenTo :: CellularResult
-> CellularResult -> CellularResult -> [CellularResult]
enumFromThenTo :: CellularResult
-> CellularResult -> CellularResult -> [CellularResult]
Enum, CellularResult
CellularResult -> CellularResult -> Bounded CellularResult
forall a. a -> a -> Bounded a
$cminBound :: CellularResult
minBound :: CellularResult
$cmaxBound :: CellularResult
maxBound :: CellularResult
Bounded)

distance :: (RealFrac a) => CellularDistanceFn -> a -> a -> a
distance :: forall a. RealFrac a => CellularDistanceFn -> a -> a -> a
distance = \case
  CellularDistanceFn
DistEuclidean -> \ !a
x !a
y -> a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y
  CellularDistanceFn
DistEuclideanSq -> \ !a
x !a
y -> a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y
  CellularDistanceFn
DistManhattan -> \ !a
x !a
y -> a -> a
forall a. Num a => a -> a
abs a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
forall a. Num a => a -> a
abs a
y
  CellularDistanceFn
DistHybrid -> \ !a
x !a
y -> a -> a
forall a. Num a => a -> a
abs a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
forall a. Num a => a -> a
abs a
y a -> a -> a
forall a. Num a => a -> a -> a
+ (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y)
{-# INLINE distance #-}

normDist :: (Floating a) => CellularDistanceFn -> a -> a
normDist :: forall a. Floating a => CellularDistanceFn -> a -> a
normDist = \case
  CellularDistanceFn
DistEuclidean -> a -> a
forall a. Floating a => a -> a
sqrt
  CellularDistanceFn
_ -> a -> a
forall a. a -> a
id
{-# INLINE normDist #-}

noise2 :: (RealFrac a, Floating a) => CellularConfig a -> Noise2 a
noise2 :: forall a. (RealFrac a, Floating a) => CellularConfig a -> Noise2 a
noise2 CellularConfig{a
CellularResult
CellularDistanceFn
cellularDistanceFn :: forall a. CellularConfig a -> CellularDistanceFn
cellularJitter :: forall a. CellularConfig a -> a
cellularResult :: forall a. CellularConfig a -> CellularResult
cellularDistanceFn :: CellularDistanceFn
cellularJitter :: a
cellularResult :: CellularResult
..} = (Seed -> a -> a -> a) -> Noise2' a a
forall p v. (Seed -> p -> p -> v) -> Noise2' p v
mkNoise2 ((Seed -> a -> a -> a) -> Noise2' a a)
-> (Seed -> a -> a -> a) -> Noise2' a a
forall a b. (a -> b) -> a -> b
$ \ !Seed
seed !a
x !a
y ->
  let !jitter :: a
jitter = a
cellularJitter a -> a -> a
forall a. Num a => a -> a -> a
* a
0.43701595
      !rx :: Hash
rx = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
round a
x
      !ry :: Hash
ry = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
round a
y

      dist :: a -> a -> a
dist = CellularDistanceFn -> a -> a -> a
forall a. RealFrac a => CellularDistanceFn -> a -> a -> a
distance CellularDistanceFn
cellularDistanceFn
      norm :: a -> a
norm = CellularDistanceFn -> a -> a
forall a. Floating a => CellularDistanceFn -> a -> a
normDist CellularDistanceFn
cellularDistanceFn
      coeff :: a
coeff = a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
forall a. RealFrac a => a
maxHash a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)

      {-# INLINE pointDist #-}
      pointDist :: Hash -> Hash -> (Hash, a)
pointDist !Hash
xi !Hash
yi =
        let !px :: a
px = Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
xi a -> a -> a
forall a. Num a => a -> a -> a
- a
x
            !py :: a
py = Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
yi a -> a -> a
forall a. Num a => a -> a -> a
- a
y
            !h :: Hash
h = Seed -> Hash -> Hash -> Hash
hash2 Seed
seed (Hash
primeX Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
xi) (Hash
primeY Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
yi)
            !i :: Hash
i = Hash
h Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.&. Hash
0x1FE
            !rvx :: a
rvx = Hash -> a
forall a. RealFrac a => Hash -> a
lookupRandVec2d Hash
i
            !rvy :: a
rvy = Hash -> a
forall a. RealFrac a => Hash -> a
lookupRandVec2d (Hash
i Hash -> Hash -> Hash
forall a. Bits a => a -> a -> a
.|. Hash
1)
            !d :: a
d = a -> a -> a
dist (a
px a -> a -> a
forall a. Num a => a -> a -> a
+ a
rvx a -> a -> a
forall a. Num a => a -> a -> a
* a
jitter) (a
py a -> a -> a
forall a. Num a => a -> a -> a
+ a
rvy a -> a -> a
forall a. Num a => a -> a -> a
* a
jitter)
         in (Hash
h, a
d)

      {-# INLINE points #-}
      points :: [(Hash, a)]
points = [Hash -> Hash -> (Hash, a)
pointDist (Hash
rx Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
xi) (Hash
ry Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
yi) | !Hash
xi <- [-Hash
1 .. Hash
Item [Hash]
1], !Hash
yi <- [-Hash
1 .. Hash
Item [Hash]
1]]

      {-# INLINE selectMinHash #-}
      selectMinHash :: (Hash, a)
selectMinHash =
        let minHash :: (a, b) -> (a, b) -> (a, b)
minHash (!a
hMin, !b
dMin) (!a
h, !b
d)
              | b
d b -> b -> Bool
forall a. Ord a => a -> a -> Bool
< b
dMin = (a
h, b
d)
              | Bool
otherwise = (a
hMin, b
dMin)
         in ((Hash, a) -> (Hash, a) -> (Hash, a))
-> (Hash, a) -> [(Hash, a)] -> (Hash, a)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Hash, a) -> (Hash, a) -> (Hash, a)
forall {b} {a}. Ord b => (a, b) -> (a, b) -> (a, b)
minHash (Hash
0, a
forall a. Fractional a => a
infinity) [(Hash, a)]
points

      {-# INLINE selectMinDist #-}
      selectMinDist :: a
selectMinDist =
        let minDist :: a -> (a, a) -> a
minDist !a
dMin (a
_, !a
d)
              | a
d a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
dMin = a
d
              | Bool
otherwise = a
dMin
         in (a -> (Hash, a) -> a) -> a -> [(Hash, a)] -> a
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' a -> (Hash, a) -> a
forall {a} {a}. Ord a => a -> (a, a) -> a
minDist a
forall a. Fractional a => a
infinity [(Hash, a)]
points

      {-# INLINE selectSmallestTwo #-}
      selectSmallestTwo :: (Hash, a, a)
selectSmallestTwo =
        let smallestTwo :: (a, a, a) -> (a, a) -> (a, a, a)
smallestTwo (!a
c, !a
d0, !a
d1) (!a
h, !a
d)
              | a
d a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
d0 = (a
h, a
d, a
d0)
              | a
d a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
d1 = (a
c, a
d0, a
d)
              | Bool
otherwise = (a
c, a
d0, a
d1)
         in ((Hash, a, a) -> (Hash, a) -> (Hash, a, a))
-> (Hash, a, a) -> [(Hash, a)] -> (Hash, a, a)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Hash, a, a) -> (Hash, a) -> (Hash, a, a)
forall {a} {a}. Ord a => (a, a, a) -> (a, a) -> (a, a, a)
smallestTwo (Hash
0, a
forall a. Fractional a => a
infinity, a
forall a. Fractional a => a
infinity) [(Hash, a)]
points
   in case CellularResult
cellularResult of
        CellularResult
CellValue ->
          let (!Hash
hash, !a
_) = (Hash, a)
selectMinHash
           in Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
hash a -> a -> a
forall a. Num a => a -> a -> a
* a
coeff
        CellularResult
Distance ->
          let !d0 :: a
d0 = a
selectMinDist
           in a -> a
norm a
d0 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
        CellularResult
Distance2 ->
          let (!Hash
_, !a
_, !a
d1) = (Hash, a, a)
selectSmallestTwo
           in a -> a
norm a
d1 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
        CellularResult
Distance2Add ->
          let (!Hash
_, !a
d0, !a
d1) = (Hash, a, a)
selectSmallestTwo
           in (a -> a
norm a
d1 a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
norm a
d0) a -> a -> a
forall a. Num a => a -> a -> a
* a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
        CellularResult
Distance2Sub ->
          let (!Hash
_, !a
d0, !a
d1) = (Hash, a, a)
selectSmallestTwo
           in a -> a
norm a
d1 a -> a -> a
forall a. Num a => a -> a -> a
- a -> a
norm a
d0 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
        CellularResult
Distance2Mul ->
          let (!Hash
_, !a
d0, !a
d1) = (Hash, a, a)
selectSmallestTwo
           in a -> a
norm a
d1 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
norm a
d0 a -> a -> a
forall a. Num a => a -> a -> a
* a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
        CellularResult
Distance2Div ->
          let (!Hash
_, !a
d0, !a
d1) = (Hash, a, a)
selectSmallestTwo
           in a -> a
norm a
d0 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
norm a
d1 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
{-# INLINE [2] noise2 #-}

lookupRandVec2d :: (RealFrac a) => Hash -> a
lookupRandVec2d :: forall a. RealFrac a => Hash -> a
lookupRandVec2d = 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 -> Int -> Double
forall a. Prim a => PrimArray a -> Int -> a
indexPrimArray PrimArray Double
randVecs2dd (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
{-# NOINLINE [1] lookupRandVec2d #-}

{-# RULES
"lookupRandVec2d/Float" forall h.
  lookupRandVec2d h =
    indexPrimArray randVecs2df (fromIntegral h)
"lookupRandVec2d/Double" forall h.
  lookupRandVec2d h =
    indexPrimArray randVecs2dd (fromIntegral h)
  #-}

randVecs2df :: PrimArray Float
randVecs2df :: PrimArray Float
randVecs2df = (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
randVecs2dd

-- >>> sizeofPrimArray randVecs2d == 512
-- True
{- ORMOLU_DISABLE -}
randVecs2dd :: PrimArray Double
randVecs2dd :: PrimArray Double
randVecs2dd =
  [-Double
0.2700222198,-Double
0.9628540911,Double
Item (PrimArray Double)
0.3863092627,-Double
0.9223693152,Double
Item (PrimArray Double)
0.04444859006,-Double
0.999011673,-Double
0.5992523158,-Double
0.8005602176
  ,-Double
0.7819280288,Double
Item (PrimArray Double)
0.6233687174,Double
Item (PrimArray Double)
0.9464672271,Double
Item (PrimArray Double)
0.3227999196,-Double
0.6514146797,-Double
0.7587218957,Double
Item (PrimArray Double)
0.9378472289,Double
Item (PrimArray Double)
0.347048376
  ,-Double
0.8497875957,-Double
0.5271252623,-Double
0.879042592,Double
Item (PrimArray Double)
0.4767432447,-Double
0.892300288,-Double
0.4514423508,-Double
0.379844434,-Double
0.9250503802
  ,-Double
0.9951650832,Double
Item (PrimArray Double)
0.0982163789,Double
Item (PrimArray Double)
0.7724397808,-Double
0.6350880136,Double
Item (PrimArray Double)
0.7573283322,-Double
0.6530343002,-Double
0.9928004525,-Double
0.119780055
  ,-Double
0.0532665713,Double
Item (PrimArray Double)
0.9985803285,Double
Item (PrimArray Double)
0.9754253726,-Double
0.2203300762,-Double
0.7665018163,Double
Item (PrimArray Double)
0.6422421394,Double
Item (PrimArray Double)
0.991636706,Double
Item (PrimArray Double)
0.1290606184
  ,-Double
0.994696838,Double
Item (PrimArray Double)
0.1028503788,-Double
0.5379205513,-Double
0.84299554,Double
Item (PrimArray Double)
0.5022815471,-Double
0.8647041387,Double
Item (PrimArray Double)
0.4559821461,-Double
0.8899889226
  ,-Double
0.8659131224,-Double
0.5001944266,Double
Item (PrimArray Double)
0.0879458407,-Double
0.9961252577,-Double
0.5051684983,Double
Item (PrimArray Double)
0.8630207346,Double
Item (PrimArray Double)
0.7753185226,-Double
0.6315704146
  ,-Double
0.6921944612,Double
Item (PrimArray Double)
0.7217110418,-Double
0.5191659449,-Double
0.8546734591,Double
Item (PrimArray Double)
0.8978622882,-Double
0.4402764035,-Double
0.1706774107,Double
Item (PrimArray Double)
0.9853269617
  ,-Double
0.9353430106,-Double
0.3537420705,-Double
0.9992404798,Double
Item (PrimArray Double)
0.03896746794,-Double
0.2882064021,-Double
0.9575683108,-Double
0.9663811329,Double
Item (PrimArray Double)
0.2571137995
  ,-Double
0.8759714238,-Double
0.4823630009,-Double
0.8303123018,-Double
0.5572983775,Double
Item (PrimArray Double)
0.05110133755,-Double
0.9986934731,-Double
0.8558373281,-Double
0.5172450752
  ,Double
Item (PrimArray Double)
0.09887025282,Double
Item (PrimArray Double)
0.9951003332,Double
Item (PrimArray Double)
0.9189016087,Double
Item (PrimArray Double)
0.3944867976,-Double
0.2439375892,-Double
0.9697909324,-Double
0.8121409387,-Double
0.5834613061
  ,-Double
0.9910431363,Double
Item (PrimArray Double)
0.1335421355,Double
Item (PrimArray Double)
0.8492423985,-Double
0.5280031709,-Double
0.9717838994,-Double
0.2358729591,Double
Item (PrimArray Double)
0.9949457207,Double
Item (PrimArray Double)
0.1004142068
  ,Double
Item (PrimArray Double)
0.6241065508,-Double
0.7813392434,Double
Item (PrimArray Double)
0.662910307,Double
Item (PrimArray Double)
0.7486988212,-Double
0.7197418176,Double
Item (PrimArray Double)
0.6942418282,-Double
0.8143370775,-Double
0.5803922158
  ,Double
Item (PrimArray Double)
0.104521054,-Double
0.9945226741,-Double
0.1065926113,-Double
0.9943027784,Double
Item (PrimArray Double)
0.445799684,-Double
0.8951327509,Double
Item (PrimArray Double)
0.105547406,Double
Item (PrimArray Double)
0.9944142724
  ,-Double
0.992790267,Double
Item (PrimArray Double)
0.1198644477,-Double
0.8334366408,Double
Item (PrimArray Double)
0.552615025,Double
Item (PrimArray Double)
0.9115561563,-Double
0.4111755999,Double
Item (PrimArray Double)
0.8285544909,-Double
0.5599084351
  ,Double
Item (PrimArray Double)
0.7217097654,-Double
0.6921957921,Double
Item (PrimArray Double)
0.4940492677,-Double
0.8694339084,-Double
0.3652321272,-Double
0.9309164803,-Double
0.9696606758,Double
Item (PrimArray Double)
0.2444548501
  ,Double
Item (PrimArray Double)
0.08925509731,-Double
0.996008799,Double
Item (PrimArray Double)
0.5354071276,-Double
0.8445941083,-Double
0.1053576186,Double
Item (PrimArray Double)
0.9944343981,-Double
0.9890284586,Double
Item (PrimArray Double)
0.1477251101
  ,Double
Item (PrimArray Double)
0.004856104961,Double
Item (PrimArray Double)
0.9999882091,Double
Item (PrimArray Double)
0.9885598478,Double
Item (PrimArray Double)
0.1508291331,Double
Item (PrimArray Double)
0.9286129562,-Double
0.3710498316,-Double
0.5832393863,-Double
0.8123003252
  ,Double
Item (PrimArray Double)
0.3015207509,Double
Item (PrimArray Double)
0.9534596146,-Double
0.9575110528,Double
Item (PrimArray Double)
0.2883965738,Double
Item (PrimArray Double)
0.9715802154,-Double
0.2367105511,Double
Item (PrimArray Double)
0.229981792,Double
Item (PrimArray Double)
0.9731949318
  ,Double
Item (PrimArray Double)
0.955763816,-Double
0.2941352207,Double
Item (PrimArray Double)
0.740956116,Double
Item (PrimArray Double)
0.6715534485,-Double
0.9971513787,-Double
0.07542630764,Double
Item (PrimArray Double)
0.6905710663,-Double
0.7232645452
  ,-Double
0.290713703,-Double
0.9568100872,Double
Item (PrimArray Double)
0.5912777791,-Double
0.8064679708,-Double
0.9454592212,-Double
0.325740481,Double
Item (PrimArray Double)
0.6664455681,Double
Item (PrimArray Double)
0.74555369
  ,Double
Item (PrimArray Double)
0.6236134912,Double
Item (PrimArray Double)
0.7817328275,Double
Item (PrimArray Double)
0.9126993851,-Double
0.4086316587,-Double
0.8191762011,Double
Item (PrimArray Double)
0.5735419353,-Double
0.8812745759,-Double
0.4726046147
  ,Double
Item (PrimArray Double)
0.9953313627,Double
Item (PrimArray Double)
0.09651672651,Double
Item (PrimArray Double)
0.9855650846,-Double
0.1692969699,-Double
0.8495980887,Double
Item (PrimArray Double)
0.5274306472,Double
Item (PrimArray Double)
0.6174853946,-Double
0.7865823463
  ,Double
Item (PrimArray Double)
0.8508156371,Double
Item (PrimArray Double)
0.52546432,Double
Item (PrimArray Double)
0.9985032451,-Double
0.05469249926,Double
Item (PrimArray Double)
0.1971371563,-Double
0.9803759185,Double
Item (PrimArray Double)
0.6607855748,-Double
0.7505747292
  ,-Double
0.03097494063,Double
Item (PrimArray Double)
0.9995201614,-Double
0.6731660801,Double
Item (PrimArray Double)
0.739491331,-Double
0.7195018362,-Double
0.6944905383,Double
Item (PrimArray Double)
0.9727511689,Double
Item (PrimArray Double)
0.2318515979
  ,Double
Item (PrimArray Double)
0.9997059088,-Double
0.0242506907,Double
Item (PrimArray Double)
0.4421787429,-Double
0.8969269532,Double
Item (PrimArray Double)
0.9981350961,-Double
0.061043673,-Double
0.9173660799,-Double
0.3980445648
  ,-Double
0.8150056635,-Double
0.5794529907,-Double
0.8789331304,Double
Item (PrimArray Double)
0.4769450202,Double
Item (PrimArray Double)
0.0158605829,Double
Item (PrimArray Double)
0.999874213,-Double
0.8095464474,Double
Item (PrimArray Double)
0.5870558317
  ,-Double
0.9165898907,-Double
0.3998286786,-Double
0.8023542565,Double
Item (PrimArray Double)
0.5968480938,-Double
0.5176737917,Double
Item (PrimArray Double)
0.8555780767,-Double
0.8154407307,-Double
0.5788405779
  ,Double
Item (PrimArray Double)
0.4022010347,-Double
0.9155513791,-Double
0.9052556868,-Double
0.4248672045,Double
Item (PrimArray Double)
0.7317445619,Double
Item (PrimArray Double)
0.6815789728,-Double
0.5647632201,-Double
0.8252529947
  ,-Double
0.8403276335,-Double
0.5420788397,-Double
0.9314281527,Double
Item (PrimArray Double)
0.363925262,Double
Item (PrimArray Double)
0.5238198472,Double
Item (PrimArray Double)
0.8518290719,Double
Item (PrimArray Double)
0.7432803869,-Double
0.6689800195
  ,-Double
0.985371561,-Double
0.1704197369,Double
Item (PrimArray Double)
0.4601468731,Double
Item (PrimArray Double)
0.88784281,Double
Item (PrimArray Double)
0.825855404,Double
Item (PrimArray Double)
0.5638819483,Double
Item (PrimArray Double)
0.6182366099,Double
Item (PrimArray Double)
0.7859920446
  ,Double
Item (PrimArray Double)
0.8331502863,-Double
0.553046653,Double
Item (PrimArray Double)
0.1500307506,Double
Item (PrimArray Double)
0.9886813308,-Double
0.662330369,-Double
0.7492119075,-Double
0.668598664,Double
Item (PrimArray Double)
0.743623444
  ,Double
Item (PrimArray Double)
0.7025606278,Double
Item (PrimArray Double)
0.7116238924,-Double
0.5419389763,-Double
0.8404178401,-Double
0.3388616456,Double
Item (PrimArray Double)
0.9408362159,Double
Item (PrimArray Double)
0.8331530315,Double
Item (PrimArray Double)
0.5530425174
  ,-Double
0.2989720662,-Double
0.9542618632,Double
Item (PrimArray Double)
0.2638522993,Double
Item (PrimArray Double)
0.9645630949,Double
Item (PrimArray Double)
0.124108739,-Double
0.9922686234,-Double
0.7282649308,-Double
0.6852956957
  ,Double
Item (PrimArray Double)
0.6962500149,Double
Item (PrimArray Double)
0.7177993569,-Double
0.9183535368,Double
Item (PrimArray Double)
0.3957610156,-Double
0.6326102274,-Double
0.7744703352,-Double
0.9331891859,-Double
0.359385508
  ,-Double
0.1153779357,-Double
0.9933216659,Double
Item (PrimArray Double)
0.9514974788,-Double
0.3076565421,-Double
0.08987977445,-Double
0.9959526224,Double
Item (PrimArray Double)
0.6678496916,Double
Item (PrimArray Double)
0.7442961705
  ,Double
Item (PrimArray Double)
0.7952400393,-Double
0.6062947138,-Double
0.6462007402,-Double
0.7631674805,-Double
0.2733598753,Double
Item (PrimArray Double)
0.9619118351,Double
Item (PrimArray Double)
0.9669590226,-Double
0.254931851
  ,-Double
0.9792894595,Double
Item (PrimArray Double)
0.2024651934,-Double
0.5369502995,-Double
0.8436138784,-Double
0.270036471,-Double
0.9628500944,-Double
0.6400277131,Double
Item (PrimArray Double)
0.7683518247
  ,-Double
0.7854537493,-Double
0.6189203566,Double
Item (PrimArray Double)
0.06005905383,-Double
0.9981948257,-Double
0.02455770378,Double
Item (PrimArray Double)
0.9996984141,-Double
0.65983623,Double
Item (PrimArray Double)
0.751409442
  ,-Double
0.6253894466,-Double
0.7803127835,-Double
0.6210408851,-Double
0.7837781695,Double
Item (PrimArray Double)
0.8348888491,Double
Item (PrimArray Double)
0.5504185768,-Double
0.1592275245,Double
Item (PrimArray Double)
0.9872419133
  ,Double
Item (PrimArray Double)
0.8367622488,Double
Item (PrimArray Double)
0.5475663786,-Double
0.8675753916,-Double
0.4973056806,-Double
0.2022662628,-Double
0.9793305667,Double
Item (PrimArray Double)
0.9399189937,Double
Item (PrimArray Double)
0.3413975472
  ,Double
Item (PrimArray Double)
0.9877404807,-Double
0.1561049093,-Double
0.9034455656,Double
Item (PrimArray Double)
0.4287028224,Double
Item (PrimArray Double)
0.1269804218,-Double
0.9919052235,-Double
0.3819600854,Double
Item (PrimArray Double)
0.924178821
  ,Double
Item (PrimArray Double)
0.9754625894,Double
Item (PrimArray Double)
0.2201652486,-Double
0.3204015856,-Double
0.9472818081,-Double
0.9874760884,Double
Item (PrimArray Double)
0.1577687387,Double
Item (PrimArray Double)
0.02535348474,-Double
0.9996785487
  ,Double
Item (PrimArray Double)
0.4835130794,-Double
0.8753371362,-Double
0.2850799925,-Double
0.9585037287,-Double
0.06805516006,-Double
0.99768156,-Double
0.7885244045,-Double
0.6150034663
  ,Double
Item (PrimArray Double)
0.3185392127,-Double
0.9479096845,Double
Item (PrimArray Double)
0.8880043089,Double
Item (PrimArray Double)
0.4598351306,Double
Item (PrimArray Double)
0.6476921488,-Double
0.7619021462,Double
Item (PrimArray Double)
0.9820241299,Double
Item (PrimArray Double)
0.1887554194
  ,Double
Item (PrimArray Double)
0.9357275128,-Double
0.3527237187,-Double
0.8894895414,Double
Item (PrimArray Double)
0.4569555293,Double
Item (PrimArray Double)
0.7922791302,Double
Item (PrimArray Double)
0.6101588153,Double
Item (PrimArray Double)
0.7483818261,Double
Item (PrimArray Double)
0.6632681526
  ,-Double
0.7288929755,-Double
0.6846276581,Double
Item (PrimArray Double)
0.8729032783,-Double
0.4878932944,Double
Item (PrimArray Double)
0.8288345784,Double
Item (PrimArray Double)
0.5594937369,Double
Item (PrimArray Double)
0.08074567077,Double
Item (PrimArray Double)
0.9967347374
  ,Double
Item (PrimArray Double)
0.9799148216,-Double
0.1994165048,-Double
0.580730673,-Double
0.8140957471,-Double
0.4700049791,-Double
0.8826637636,Double
Item (PrimArray Double)
0.2409492979,Double
Item (PrimArray Double)
0.9705377045
  ,Double
Item (PrimArray Double)
0.9437816757,-Double
0.3305694308,-Double
0.8927998638,-Double
0.4504535528,-Double
0.8069622304,Double
Item (PrimArray Double)
0.5906030467,Double
Item (PrimArray Double)
0.06258973166,Double
Item (PrimArray Double)
0.9980393407
  ,-Double
0.9312597469,Double
Item (PrimArray Double)
0.3643559849,Double
Item (PrimArray Double)
0.5777449785,Double
Item (PrimArray Double)
0.8162173362,-Double
0.3360095855,-Double
0.941858566,Double
Item (PrimArray Double)
0.697932075,-Double
0.7161639607
  ,-Double
0.002008157227,-Double
0.9999979837,-Double
0.1827294312,-Double
0.9831632392,-Double
0.6523911722,Double
Item (PrimArray Double)
0.7578824173,-Double
0.4302626911,-Double
0.9027037258
  ,-Double
0.9985126289,-Double
0.05452091251,-Double
0.01028102172,-Double
0.9999471489,-Double
0.4946071129,Double
Item (PrimArray Double)
0.8691166802,-Double
0.2999350194,Double
Item (PrimArray Double)
0.9539596344
  ,Double
Item (PrimArray Double)
0.8165471961,Double
Item (PrimArray Double)
0.5772786819,Double
Item (PrimArray Double)
0.2697460475,Double
Item (PrimArray Double)
0.962931498,-Double
0.7306287391,-Double
0.6827749597,-Double
0.7590952064,-Double
0.6509796216
  ,-Double
0.907053853,Double
Item (PrimArray Double)
0.4210146171,-Double
0.5104861064,-Double
0.8598860013,Double
Item (PrimArray Double)
0.8613350597,Double
Item (PrimArray Double)
0.5080373165,Double
Item (PrimArray Double)
0.5007881595,-Double
0.8655698812
  ,-Double
0.654158152,Double
Item (PrimArray Double)
0.7563577938,-Double
0.8382755311,-Double
0.545246856,Double
Item (PrimArray Double)
0.6940070834,Double
Item (PrimArray Double)
0.7199681717,Double
Item (PrimArray Double)
0.06950936031,Double
Item (PrimArray Double)
0.9975812994
  ,Double
Item (PrimArray Double)
0.1702942185,-Double
0.9853932612,Double
Item (PrimArray Double)
0.2695973274,Double
Item (PrimArray Double)
0.9629731466,Double
Item (PrimArray Double)
0.5519612192,-Double
0.8338697815,Double
Item (PrimArray Double)
0.225657487,-Double
0.9742067022
  ,Double
Item (PrimArray Double)
0.4215262855,-Double
0.9068161835,Double
Item (PrimArray Double)
0.4881873305,-Double
0.8727388672,-Double
0.3683854996,-Double
0.9296731273,-Double
0.9825390578,Double
Item (PrimArray Double)
0.1860564427
  ,Double
Item (PrimArray Double)
0.81256471,Double
Item (PrimArray Double)
0.5828709909,Double
Item (PrimArray Double)
0.3196460933,-Double
0.9475370046,Double
Item (PrimArray Double)
0.9570913859,Double
Item (PrimArray Double)
0.2897862643,-Double
0.6876655497,-Double
0.7260276109
  ,-Double
0.9988770922,-Double
0.047376731,-Double
0.1250179027,Double
Item (PrimArray Double)
0.992154486,-Double
0.8280133617,Double
Item (PrimArray Double)
0.560708367,Double
Item (PrimArray Double)
0.9324863769,-Double
0.3612051451
  ,Double
Item (PrimArray Double)
0.6394653183,Double
Item (PrimArray Double)
0.7688199442,-Double
0.01623847064,-Double
0.9998681473,-Double
0.9955014666,-Double
0.09474613458,-Double
0.81453315,Double
Item (PrimArray Double)
0.580117012
  ,Double
Item (PrimArray Double)
0.4037327978,-Double
0.9148769469,Double
Item (PrimArray Double)
0.9944263371,Double
Item (PrimArray Double)
0.1054336766,-Double
0.1624711654,Double
Item (PrimArray Double)
0.9867132919,-Double
0.9949487814,-Double
0.100383875
  ,-Double
0.6995302564,Double
Item (PrimArray Double)
0.7146029809,Double
Item (PrimArray Double)
0.5263414922,-Double
0.85027327,-Double
0.5395221479,Double
Item (PrimArray Double)
0.841971408,Double
Item (PrimArray Double)
0.6579370318,Double
Item (PrimArray Double)
0.7530729462
  ,Double
Item (PrimArray Double)
0.01426758847,-Double
0.9998982128,-Double
0.6734383991,Double
Item (PrimArray Double)
0.7392433447,Double
Item (PrimArray Double)
0.639412098,-Double
0.7688642071,Double
Item (PrimArray Double)
0.9211571421,Double
Item (PrimArray Double)
0.3891908523
  ,-Double
0.146637214,-Double
0.9891903394,-Double
0.782318098,Double
Item (PrimArray Double)
0.6228791163,-Double
0.5039610839,-Double
0.8637263605,-Double
0.7743120191,-Double
0.6328039957
  ]