summaryrefslogtreecommitdiff
path: root/testsuite/tests/dph/quickhull/TestData.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/dph/quickhull/TestData.hs')
-rw-r--r--testsuite/tests/dph/quickhull/TestData.hs92
1 files changed, 92 insertions, 0 deletions
diff --git a/testsuite/tests/dph/quickhull/TestData.hs b/testsuite/tests/dph/quickhull/TestData.hs
new file mode 100644
index 0000000000..6317927259
--- /dev/null
+++ b/testsuite/tests/dph/quickhull/TestData.hs
@@ -0,0 +1,92 @@
+
+module TestData
+ ( genPointsUniform
+ , genPointsDisc
+ , genPointsCombo
+ , toPArrayPoints )
+where
+
+import qualified Types as QH
+import qualified Data.Array.Parallel.Unlifted as U
+import qualified Data.Array.Parallel.Prelude as P
+import qualified Data.Array.Parallel.Prelude.Double as D
+import qualified Data.Array.Parallel.PArray as P
+import Data.Array.Parallel.PArray (PArray)
+
+import System.Random
+import Control.Exception
+
+-- Random points generation
+-- IMPORTANT: We use the same seed with the same random generator in all
+-- quickhull codes. The asymptotic work complexity of quickhull
+-- is between O (N) and O (N^2) depending on the input.
+-- To compare benchmark results, they always need to use the same
+-- input.
+seed = 42742
+
+-- | Some uniformly distributed points
+genPointsUniform
+ :: Int -- ^ number of points
+ -> Double -- ^ minimum coordinate
+ -> Double -- ^ maximum coordinate
+ -> [(Double, Double)]
+
+genPointsUniform n minXY maxXY
+ = let
+ pointMin = 10
+ pointMax = 510
+ gen = mkStdGen seed
+ in toPairs $ take (2*n) $ randomRs (pointMin, pointMax) gen
+
+toPairs [] = []
+toPairs (x:y:pts) = (x, y) : toPairs pts
+
+
+-- | Some points distributed as a disc
+genPointsDisc
+ :: Int -- ^ number of points
+ -> (Double, Double) -- ^ center of disc
+ -> Double -- ^ radius of disc
+ -> [(Double, Double)]
+
+genPointsDisc n (originX, originY) radiusMax
+ = let (genRadius, genAngle)
+ = split $ mkStdGen seed
+
+ radius = take n $ randomRs (0, radiusMax) genRadius
+ angle = take n $ randomRs (- pi, pi) genAngle
+
+ makeXY (r, a)
+ = ( originX + r * cos a
+ , originY + r * sin a)
+
+ in map makeXY $ zip radius angle
+
+
+-- | A point cloud with areas of high an low density
+genPointsCombo
+ :: Int -- ^ number of points
+ -> [(Double, Double)]
+
+genPointsCombo n
+ = genPointsDisc (n `div` 5) (250, 250) 200
+ ++ genPointsDisc (n `div` 5) (100, 100) 80
+ ++ genPointsDisc (n `div` 5) (150, 300) 30
+ ++ genPointsDisc (n `div` 5) (500, 120) 30
+ ++ genPointsDisc (n `div` 5) (300, 200) 150
+
+
+-- | Convert a list of points to a PArray
+toPArrayPoints :: [(Double, Double)] -> IO (PArray QH.Point)
+toPArrayPoints ps
+ = do let pts = QH.points (P.fromList (map fst ps))
+ (P.fromList (map snd ps))
+ evaluate $ force pts
+ return pts
+
+-- | Force points to be evaluated
+force pts
+ = P.toUArrPA (QH.xsOf pts) U.!: 0 D.+
+ P.toUArrPA (QH.ysOf pts) U.!: 0
+
+