module BishBosh.Search.DynamicMoveData(
Transformation,
KillerMoveKey(),
DynamicMoveData(
getKillerMoves,
getTranspositions
),
mkKillerMoveKeyFromTurn,
updateKillerMoves,
updateTranspositions
) where
import Control.Arrow((&&&))
import qualified BishBosh.Attribute.Rank as Attribute.Rank
import qualified BishBosh.Component.Move as Component.Move
import qualified BishBosh.Component.QualifiedMove as Component.QualifiedMove
import qualified BishBosh.Component.Turn as Component.Turn
import qualified BishBosh.Property.Empty as Property.Empty
import qualified BishBosh.Search.EphemeralData as Search.EphemeralData
import qualified BishBosh.Search.KillerMoves as Search.KillerMoves
import qualified BishBosh.Search.Transpositions as Search.Transpositions
import qualified BishBosh.Type.Count as Type.Count
import qualified Data.Maybe
data KillerMoveKey = MkKillerMoveKey Component.Move.Move Attribute.Rank.Rank deriving (KillerMoveKey -> KillerMoveKey -> Bool
(KillerMoveKey -> KillerMoveKey -> Bool)
-> (KillerMoveKey -> KillerMoveKey -> Bool) -> Eq KillerMoveKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KillerMoveKey -> KillerMoveKey -> Bool
$c/= :: KillerMoveKey -> KillerMoveKey -> Bool
== :: KillerMoveKey -> KillerMoveKey -> Bool
$c== :: KillerMoveKey -> KillerMoveKey -> Bool
Eq, Eq KillerMoveKey
Eq KillerMoveKey
-> (KillerMoveKey -> KillerMoveKey -> Ordering)
-> (KillerMoveKey -> KillerMoveKey -> Bool)
-> (KillerMoveKey -> KillerMoveKey -> Bool)
-> (KillerMoveKey -> KillerMoveKey -> Bool)
-> (KillerMoveKey -> KillerMoveKey -> Bool)
-> (KillerMoveKey -> KillerMoveKey -> KillerMoveKey)
-> (KillerMoveKey -> KillerMoveKey -> KillerMoveKey)
-> Ord KillerMoveKey
KillerMoveKey -> KillerMoveKey -> Bool
KillerMoveKey -> KillerMoveKey -> Ordering
KillerMoveKey -> KillerMoveKey -> KillerMoveKey
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KillerMoveKey -> KillerMoveKey -> KillerMoveKey
$cmin :: KillerMoveKey -> KillerMoveKey -> KillerMoveKey
max :: KillerMoveKey -> KillerMoveKey -> KillerMoveKey
$cmax :: KillerMoveKey -> KillerMoveKey -> KillerMoveKey
>= :: KillerMoveKey -> KillerMoveKey -> Bool
$c>= :: KillerMoveKey -> KillerMoveKey -> Bool
> :: KillerMoveKey -> KillerMoveKey -> Bool
$c> :: KillerMoveKey -> KillerMoveKey -> Bool
<= :: KillerMoveKey -> KillerMoveKey -> Bool
$c<= :: KillerMoveKey -> KillerMoveKey -> Bool
< :: KillerMoveKey -> KillerMoveKey -> Bool
$c< :: KillerMoveKey -> KillerMoveKey -> Bool
compare :: KillerMoveKey -> KillerMoveKey -> Ordering
$ccompare :: KillerMoveKey -> KillerMoveKey -> Ordering
$cp1Ord :: Eq KillerMoveKey
Ord, Int -> KillerMoveKey -> ShowS
[KillerMoveKey] -> ShowS
KillerMoveKey -> String
(Int -> KillerMoveKey -> ShowS)
-> (KillerMoveKey -> String)
-> ([KillerMoveKey] -> ShowS)
-> Show KillerMoveKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KillerMoveKey] -> ShowS
$cshowList :: [KillerMoveKey] -> ShowS
show :: KillerMoveKey -> String
$cshow :: KillerMoveKey -> String
showsPrec :: Int -> KillerMoveKey -> ShowS
$cshowsPrec :: Int -> KillerMoveKey -> ShowS
Show)
mkKillerMoveKeyFromTurn :: Component.Turn.Turn -> KillerMoveKey
mkKillerMoveKeyFromTurn :: Turn -> KillerMoveKey
mkKillerMoveKeyFromTurn = (Move -> Rank -> KillerMoveKey) -> (Move, Rank) -> KillerMoveKey
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Move -> Rank -> KillerMoveKey
MkKillerMoveKey ((Move, Rank) -> KillerMoveKey)
-> (Turn -> (Move, Rank)) -> Turn -> KillerMoveKey
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (QualifiedMove -> Move
Component.QualifiedMove.getMove (QualifiedMove -> Move) -> (Turn -> QualifiedMove) -> Turn -> Move
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Turn -> QualifiedMove
Component.Turn.getQualifiedMove (Turn -> Move) -> (Turn -> Rank) -> Turn -> (Move, Rank)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Turn -> Rank
Component.Turn.getRank)
data DynamicMoveData positionHash = MkDynamicMoveData {
DynamicMoveData positionHash -> KillerMoves KillerMoveKey
getKillerMoves :: Search.KillerMoves.KillerMoves KillerMoveKey,
DynamicMoveData positionHash
-> Transpositions QualifiedMove positionHash
getTranspositions :: Search.Transpositions.Transpositions Component.QualifiedMove.QualifiedMove positionHash
}
instance Property.Empty.Empty (DynamicMoveData positionHash) where
empty :: DynamicMoveData positionHash
empty = MkDynamicMoveData :: forall positionHash.
KillerMoves KillerMoveKey
-> Transpositions QualifiedMove positionHash
-> DynamicMoveData positionHash
MkDynamicMoveData {
getKillerMoves :: KillerMoves KillerMoveKey
getKillerMoves = KillerMoves KillerMoveKey
forall a. Empty a => a
Property.Empty.empty,
getTranspositions :: Transpositions QualifiedMove positionHash
getTranspositions = Transpositions QualifiedMove positionHash
forall a. Empty a => a
Property.Empty.empty
}
type Transformation positionHash = DynamicMoveData positionHash -> DynamicMoveData positionHash
updateKillerMoves :: Search.KillerMoves.Transformation KillerMoveKey -> Transformation positionHash
updateKillerMoves :: Transformation KillerMoveKey -> Transformation positionHash
updateKillerMoves Transformation KillerMoveKey
f dynamicMoveData :: DynamicMoveData positionHash
dynamicMoveData@MkDynamicMoveData { getKillerMoves :: forall positionHash.
DynamicMoveData positionHash -> KillerMoves KillerMoveKey
getKillerMoves = KillerMoves KillerMoveKey
killerMoves } = DynamicMoveData positionHash
dynamicMoveData { getKillerMoves :: KillerMoves KillerMoveKey
getKillerMoves = Transformation KillerMoveKey
f KillerMoves KillerMoveKey
killerMoves }
updateTranspositions :: Search.Transpositions.Transformation Component.QualifiedMove.QualifiedMove positionHash -> Transformation positionHash
updateTranspositions :: Transformation QualifiedMove positionHash
-> Transformation positionHash
updateTranspositions Transformation QualifiedMove positionHash
f dynamicMoveData :: DynamicMoveData positionHash
dynamicMoveData@MkDynamicMoveData { getTranspositions :: forall positionHash.
DynamicMoveData positionHash
-> Transpositions QualifiedMove positionHash
getTranspositions = Transpositions QualifiedMove positionHash
transpositions } = DynamicMoveData positionHash
dynamicMoveData { getTranspositions :: Transpositions QualifiedMove positionHash
getTranspositions = Transformation QualifiedMove positionHash
f Transpositions QualifiedMove positionHash
transpositions }
instance Search.EphemeralData.MaybeEphemeralData (DynamicMoveData positionHash) where
maybeEuthanise :: Int
-> MaybeRetireAfterNMoves
-> MaybeRetireAfterNMoves
-> DynamicMoveData positionHash
-> DynamicMoveData positionHash
maybeEuthanise Int
nPlies MaybeRetireAfterNMoves
maybeRetireKillerMovesAfter MaybeRetireAfterNMoves
maybeRetireTranspositionsAfter MkDynamicMoveData {
getKillerMoves :: forall positionHash.
DynamicMoveData positionHash -> KillerMoves KillerMoveKey
getKillerMoves = KillerMoves KillerMoveKey
killerMoves,
getTranspositions :: forall positionHash.
DynamicMoveData positionHash
-> Transpositions QualifiedMove positionHash
getTranspositions = Transpositions QualifiedMove positionHash
transpositions
} = MkDynamicMoveData :: forall positionHash.
KillerMoves KillerMoveKey
-> Transpositions QualifiedMove positionHash
-> DynamicMoveData positionHash
MkDynamicMoveData {
getKillerMoves :: KillerMoves KillerMoveKey
getKillerMoves = Transformation KillerMoveKey
-> (Int -> Transformation KillerMoveKey)
-> MaybeRetireAfterNMoves
-> Transformation KillerMoveKey
forall b a. b -> (a -> b) -> Maybe a -> b
Data.Maybe.maybe Transformation KillerMoveKey
forall a. a -> a
id (
Int -> Transformation KillerMoveKey
forall a. EphemeralData a => Int -> a -> a
Search.EphemeralData.euthanise (Int -> Transformation KillerMoveKey)
-> (Int -> Int) -> Int -> Transformation KillerMoveKey
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
reduceNPlies
) MaybeRetireAfterNMoves
maybeRetireKillerMovesAfter KillerMoves KillerMoveKey
killerMoves,
getTranspositions :: Transpositions QualifiedMove positionHash
getTranspositions = (Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash)
-> (Int
-> Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash)
-> MaybeRetireAfterNMoves
-> Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash
forall b a. b -> (a -> b) -> Maybe a -> b
Data.Maybe.maybe Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash
forall a. a -> a
id (
Int
-> Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash
forall a. EphemeralData a => Int -> a -> a
Search.EphemeralData.euthanise (Int
-> Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash)
-> (Int -> Int)
-> Int
-> Transpositions QualifiedMove positionHash
-> Transpositions QualifiedMove positionHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
reduceNPlies
) MaybeRetireAfterNMoves
maybeRetireTranspositionsAfter Transpositions QualifiedMove positionHash
transpositions
} where
reduceNPlies :: Type.Count.NMoves -> Type.Count.NPlies
reduceNPlies :: Int -> Int
reduceNPlies = (Int -> Int -> Int
forall a. Num a => a -> a -> a
`subtract` Int
nPlies) (Int -> Int) -> (Int -> Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
Component.Move.nPliesPerMove) (Int -> Int) -> (Int -> Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral