Last active
December 27, 2017 16:43
-
-
Save considerate/b14fa091be6687c6a0e8ca6eb0a3dd13 to your computer and use it in GitHub Desktop.
Accelerate Crash when mapping over canPlace
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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