Skip to content

Instantly share code, notes, and snippets.

@considerate
Last active December 27, 2017 16:43
Show Gist options
  • Save considerate/b14fa091be6687c6a0e8ca6eb0a3dd13 to your computer and use it in GitHub Desktop.
Save considerate/b14fa091be6687c6a0e8ca6eb0a3dd13 to your computer and use it in GitHub Desktop.
Accelerate Crash when mapping over canPlace
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE TypeOperators #-}
module BoardAcc where
import qualified Prelude as P
import Prelude(Show(..))
import Data.Maybe(Maybe(..))
import Data.Array.Accelerate as A
import Data.Array.Accelerate.Data.Fold
import Data.Array.Accelerate.Data.Monoid
import Data.Array.Accelerate.LLVM.Native as CPU
import Data.Array.Accelerate.Array.Sugar as S
import Control.Monad.Random(MonadRandom, uniform)
import Control.Applicative
type Board = Acc (Array DIM2 Int)
numTiles :: Exp Int -> Fold (Exp Int) (Exp Int)
numTiles t = Fold p (getSum . unlift)
where
p x = ifThenElse (x == t) 1 0
numBlacks :: Fold (Exp Int) (Exp Int)
numBlacks = numTiles blackTile
numWhites :: Fold (Exp Int) (Exp Int)
numWhites = numTiles whiteTile
pairExp :: (Elt a, Elt b) => Exp a -> Exp b -> Exp (a, b)
pairExp a b = lift (a,b)
countTiles :: Acc (Array DIM2 Int) -> Exp (Int, Int)
countTiles board = the result
where
result = runFold f (flatten board) :: Acc (Scalar (Int, Int))
f = pairExp <$> numBlacks <*> numWhites
directions :: Vector DIM2
directions = fromList (Z :. 8) [(Z :. dy :. dx)
| dx <- [-1,0,1] :: [Int]
, dy <- [-1,0,1] :: [Int]
, P.not (dx P.== 0 P.&& dy P.== 0)
]
initialBoard :: Board
initialBoard = use $ fromFunction (Z :. 8 :. 8) p
where
p (Z :. 3 :. 3) = 2
p (Z :. 4 :. 4) = 2
p (Z :. 3 :. 4) = 1
p (Z :. 4 :. 3) = 1
p _ = 0
positions :: Acc (Array DIM2 DIM2)
positions = use $ fromList (Z :. 8 :. 8) [(Z :. y :. x) | y <- [0..7], x <- [0..7]]
validPositions me board
= map (canPlace me board) $ positions
getTile :: Board -> Exp DIM2 -> Exp Int
getTile board index = board A.! index
emptyTile :: Exp Int
emptyTile = constant 0
blackTile :: Exp Int
blackTile = constant 1
whiteTile :: Exp Int
whiteTile = constant 2
canPlace :: Exp Int -> Board -> Exp DIM2 -> Exp Bool
canPlace me board index = freeTile && (the canCapture)
where
freeTile = (getTile board index) == emptyTile
captureLengths = map (captureRow me board index) (use directions)
canCapture = or (map (> 0) captureLengths)
opponent :: Exp Int -> Exp Int
opponent me
= cond (me == whiteTile)
blackTile
whiteTile
add :: Exp DIM2 -> Exp DIM2 -> Exp DIM2
add ab cd = lift (Z :. a+c :. b+d)
where
(Z :. a :. b) = unlift ab :: Z :. Exp Int :. Exp Int
(Z :. c :. d) = unlift cd :: Z :. Exp Int :. Exp Int
inBoard :: Board -> Exp DIM2 -> Exp Bool
inBoard board pos
= 0 <= x && x < width
&& 0 <= y && y < height
where
(Z :. height :. width) = unlift (A.shape board)
(Z :. y :. x) = unlift pos
captureRow :: Exp Int -> Board -> Exp DIM2 -> Exp DIM2 -> Exp Int
captureRow me board pos dir
= cond (inBoard board lastPos && getTile board lastPos == me)
captured
(constant 0)
where
pos' = add pos dir
isOpponent p = inBoard board p && getTile board p == opponent me
start = (constant 0, pos') :: (Exp Int, Exp DIM2)
result = while okPos stepPos (lift start) :: Exp (Int, DIM2)
(captured, lastPos) = unlift result :: (Exp Int, Exp DIM2)
okPos :: Exp (Int, DIM2) -> Exp Bool
okPos acc = isOpponent p
where
(c, p) = unlift acc :: (Exp Int, Exp DIM2)
stepPos :: Exp (Int, DIM2) -> Exp (Int, DIM2)
stepPos acc = lift (c + 1, add p dir)
where
(c, p) = unlift acc :: (Exp Int, Exp DIM2)
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 0 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 1 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 3))
Scalar Z [True]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 2 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 2))
Scalar Z [True]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 3 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 5))
Scalar Z [True]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 4 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 4))
Scalar Z [True]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 5 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 6 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 0))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 1))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 2))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 3))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 4))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 5))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 6))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ unit $ canPlace blackTile initialBoard (constant (Z :. 7 :. 7))
Scalar Z [False]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run positions
Matrix (Z :. 8 :. 8)
[Z :. 0 :. 0,Z :. 0 :. 1,Z :. 0 :. 2,Z :. 0 :. 3,Z :. 0 :. 4,Z :. 0 :. 5,Z :. 0 :. 6,Z :. 0 :. 7,
Z :. 1 :. 0,Z :. 1 :. 1,Z :. 1 :. 2,Z :. 1 :. 3,Z :. 1 :. 4,Z :. 1 :. 5,Z :. 1 :. 6,Z :. 1 :. 7,
Z :. 2 :. 0,Z :. 2 :. 1,Z :. 2 :. 2,Z :. 2 :. 3,Z :. 2 :. 4,Z :. 2 :. 5,Z :. 2 :. 6,Z :. 2 :. 7,
Z :. 3 :. 0,Z :. 3 :. 1,Z :. 3 :. 2,Z :. 3 :. 3,Z :. 3 :. 4,Z :. 3 :. 5,Z :. 3 :. 6,Z :. 3 :. 7,
Z :. 4 :. 0,Z :. 4 :. 1,Z :. 4 :. 2,Z :. 4 :. 3,Z :. 4 :. 4,Z :. 4 :. 5,Z :. 4 :. 6,Z :. 4 :. 7,
Z :. 5 :. 0,Z :. 5 :. 1,Z :. 5 :. 2,Z :. 5 :. 3,Z :. 5 :. 4,Z :. 5 :. 5,Z :. 5 :. 6,Z :. 5 :. 7,
Z :. 6 :. 0,Z :. 6 :. 1,Z :. 6 :. 2,Z :. 6 :. 3,Z :. 6 :. 4,Z :. 6 :. 5,Z :. 6 :. 6,Z :. 6 :. 7,
Z :. 7 :. 0,Z :. 7 :. 1,Z :. 7 :. 2,Z :. 7 :. 3,Z :. 7 :. 4,Z :. 7 :. 5,Z :. 7 :. 6,Z :. 7 :. 7]
*Main Board BoardAcc Replicate CPU Data.Array.Accelerate> CPU.run $ Data.Array.Accelerate.map (canPlace blackTile initialBoard) positions
*** Exception:
*** Internal error in package accelerate ***
*** Please submit a bug report at https://github.com/AccelerateHS/accelerate/issues
./Data/Array/Accelerate/Trafo/Sharing.hs:664:9: (convertSharingExp): inconsistent valuation @ shared 'Exp' tree with stable name 357;
env' = [288,298,280]
CallStack (from HasCallStack):
error, called at ./Data/Array/Accelerate/Trafo/Sharing.hs:664:9 in accelerate-1.1.0.0-7lmA6RvdcM24Zj46B405wk:Data.Array.Accelerate.Trafo.Sharing
name: othello
version: 0.1.0.0
github: considerate/othello
license: MIT
author: Viktor Kronvall
maintainer: viktor.kronvall@gmail.com
copyright: 2017 Viktor Kronvall
dependencies:
- base >= 4.7 && < 5
- accelerate >= 1.1
- accelerate-llvm >= 1.1.0.0
- accelerate-llvm-native >= 1.1.0.0
- llvm-hs >= 0.5
- llvm-hs-pure >= 5.0
- MonadRandom >= 0.5
library:
source-dirs: src
executables:
othello:
main: Main.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- othello
tests:
othello-test:
main: Spec.hs
source-dirs: test
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- othello
resolver: lts-9.17
extra-deps:
- 'accelerate-1.1.0.0'
- 'accelerate-llvm-1.1.0.0'
- 'accelerate-llvm-native-1.1.0.0'
- 'llvm-hs-5.0.0'
- 'llvm-hs-pure-5.0.0'
- 'libffi-0.1'
- Cabal-2.0.1.1
flags:
llvm-hs:
shared-llvm: true
extra-lib-dirs: [/usr/local/opt/libffi/lib/]
packages:
- .
flags: {}
extra-package-dbs: []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment