File: Graph.hs

package info (click to toggle)
haskell-vector 0.13.1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 996 kB
  • sloc: haskell: 11,004; ansic: 6; makefile: 3
file content (41 lines) | stat: -rw-r--r-- 1,077 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module TestData.Graph
  ( randomGraph
  ) where

import System.Random.Stateful
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector.Unboxed as U

randomGraph
  :: (StatefulGen g m, MV.PrimMonad m)
  => g
  -> Int
  -> m (Int, U.Vector Int, U.Vector Int)
randomGraph g edges = do
  let vertices = edges `div` 10
  marr <- MV.replicate vertices []
  addRandomEdges g vertices marr edges
  arr <- V.unsafeFreeze marr
  let (as, bs) = unzip [ (i, j) | i <- [0 .. vertices - 1], j <- arr V.! i ]
  return (vertices, U.fromList as, U.fromList bs)

addRandomEdges
  :: (StatefulGen g m, MV.PrimMonad m)
  => g
  -> Int
  -> MV.MVector (MV.PrimState m) [Int]
  -> Int
  -> m ()
addRandomEdges g vertices arr = fill
  where
    fill 0 = return ()
    fill e = do
      m1 <- uniformRM (0, vertices - 1) g
      m2 <- uniformRM (0, vertices - 1) g
      let lo = min m1 m2
          hi = max m1 m2
      ns <- MV.read arr lo
      if lo == hi || hi `elem` ns
        then fill e
        else MV.write arr lo (hi : ns) >> fill (e - 1)