{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ViewPatterns #-} module Main where import Control.Monad.Reader import Control.Concurrent.STM import Data.Default import System.Log.Heavy import Options.Applicative import Core.Types import Core.Board import AI.AlphaBeta.Types import AI.AlphaBeta.Persistent import Core.Rest import Core.Checkers import Core.CmdLine import Learn import Rules.Russian -- let stdout = LoggingSettings $ filtering defaultLogFilter defStdoutSettings -- debug = LoggingSettings $ Filtering (\m -> lmLevel m == trace_level) ((defFileSettings "trace.log") {lsFormat = "{time} {source} [{thread}]: {message}\n"}) -- settings = LoggingSettings $ ParallelLogSettings [stdout, debug] main :: IO () main = do cmd <- execParser parserInfo case cmdSpecial cmd of Nothing -> withCheckers cmd $ do cfg <- asks csConfig let fltr = [([], gcLogLevel cfg)] withLogContext (LogContextFrame [] (include fltr)) $ runRestServer Just str -> special cmd (words str) special :: CmdLine -> [String] -> IO () special cmd args = case args of ["learn", path] -> do let rules = russian eval = ai params = def { abDepth = 4 , abCombinationDepth = 9 } ai = AlphaBeta params rules (dfltEvaluator rules) withCheckers cmd $ withLogContext (LogContextFrame [] (include defaultLogFilter)) $ learnPdn ai path ["dump", path] -> checkDataFile' path ["load", path] -> do idx <- loadIndexIO path print path ["test"] -> do withCheckers cmd $ do sh <- asks csSupervisor st <- liftIO $ atomically $ readTVar sh let b = movePiece' "c3" "e5" $ board8 st b' = flipBoard b b'' = flipBoard b' liftIO $ do print b print b' print b'' print (b == b'') -- main :: IO () -- main = do -- let a3 = resolve "a3" board8 -- let b4 = resolve "b4" board8 -- let c5 = resolve "c5" board8 -- let b6 = resolve "b6" board8 -- let board8' = movePiece' "h8" "b4" $ removePiece' "a7" board8 -- let capture = simpleCapture First a3 ForwardRight -- putStrLn "1." -- print capture -- -- putStrLn "2." -- let (board', addr', p) = applyMove First capture board8' -- print $ getPiece a3 board' -- print $ getPiece b4 board' -- print $ getPiece c5 board' -- print $ getPiece b6 board' -- -- let capture' = simpleCapture First c5 -- -- putStrLn "3." -- print $ -- let addr = resolve "c5" board' -- piece = fromJust $ getPiece addr board' -- in captures1 piece board' addr -- -- putStrLn "4." -- print $ -- let addr = resolve "a3" board8' -- piece = fromJust $ getPiece addr board8' -- in manCaptures piece board8' addr -- -- putStrLn "5." -- print $ possibleMoves Russian First board8' -- -- putStrLn "6." -- let board8'' = setPiece' "b2" (Piece King First) $ -- setManyPieces' ["d4", "d6", "g7"] (Piece Man Second) $ buildBoard 8 -- print $ kingSimpleMoves First board8'' (resolve "b2" board8'') -- -- putStrLn "7." -- print $ possibleMoves Russian First board8'' -- -- putStrLn "8." -- let board = board8'' -- let moves = possibleMoves Russian Second board -- forM_ moves $ \move -> do -- print move -- let (board', addr', _) = applyMove Second move board -- moves' = possibleMoves Russian Second board' -- let score1 = evalBoard Russian First board' -- score2 = evalBoard Russian Second board' -- putStrLn $ show score1 ++ " vs " ++ show score2 -- -- putStrLn "9." -- let board = movePiece' "e3" "f4" board8 -- let moves = possibleMoves Russian Second board -- forM_ moves $ \move -> do -- let (board', addr', _) = applyMove Second move board -- moves' = possibleMoves Russian Second board' -- let score1 = evalBoard Russian First board' -- score2 = evalBoard Russian Second board' -- putStrLn $ show move ++ " => " ++ show score1 ++ " vs " ++ show score2 -- -- putStrLn "10." -- let board = setManyPieces' ["c3", "e3"] (Piece Man First) $ -- setManyPieces' ["e5", "f6"] (Piece Man Second) $ buildBoard 8 -- let ai = AlphaBeta 2 Russian Russian -- print =<< chooseMove ai Second board -- -- -- putStrLn "11." -- let board = setManyPieces' ["c3", "e3"] (Piece Man First) $ -- setManyPieces' ["e5", "f6"] (Piece Man Second) $ buildBoard 8 -- let ai = AlphaBeta 2 Russian Russian -- print =<< chooseMove ai First board -- --