summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/setnumcapabilities001.hs
blob: 1927cd8a62677cc1ce205746490498cf2ba21842 (plain)
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
import GHC.Conc
import Control.Parallel
import Control.Parallel.Strategies
import System.Environment
import System.IO
import Control.Monad
import Text.Printf
import Data.Time.Clock

main = do
  [n,q,t] <- fmap (fmap read) getArgs
  forkIO $ do
    forM_ (cycle ([n,n-1..1] ++ [2..n-1])) $ \m -> do
      setNumCapabilities m
      threadDelay t
  printf "%d" (nqueens q)

nqueens :: Int -> Int
nqueens nq = length (pargen 0 [])
 where
    safe :: Int -> Int -> [Int] -> Bool
    safe x d []    = True
    safe x d (q:l) = x /= q && x /= q+d && x /= q-d && safe x (d+1) l

    gen :: [[Int]] -> [[Int]]
    gen bs = [ (q:b) | b <- bs, q <- [1..nq], safe q 1 b ]

    pargen :: Int -> [Int] -> [[Int]]
    pargen n b
       | n >= threshold = iterate gen [b] !! (nq - n)
       | otherwise      = concat bs 
       where bs = map (pargen (n+1)) (gen [b]) `using` parList rdeepseq

    threshold = 3