module BishBosh.Search.DynamicMoveData(
Transformation,
KillerMoveKey(),
DynamicMoveData(
getKillerMoves,
getTranspositions
),
mkKillerMoveKeyFromTurn,
updateKillerMoves,
updateTranspositions,
euthanise
) 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.Input.SearchOptions as Input.SearchOptions
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 Data.Maybe
data KillerMoveKey x y = MkKillerMoveKey (Component.Move.Move x y) Attribute.Rank.Rank deriving (Eq, Ord, Show)
mkKillerMoveKeyFromTurn :: Component.Turn.Turn x y -> KillerMoveKey x y
mkKillerMoveKeyFromTurn = uncurry MkKillerMoveKey . (Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove &&& Component.Turn.getRank)
data DynamicMoveData x y positionHash = MkDynamicMoveData {
getKillerMoves :: Search.KillerMoves.KillerMoves (KillerMoveKey x y),
getTranspositions :: Search.Transpositions.Transpositions (Component.Move.Move x y) positionHash
}
instance Property.Empty.Empty (DynamicMoveData x y positionHash) where
empty = MkDynamicMoveData {
getKillerMoves = Property.Empty.empty,
getTranspositions = Property.Empty.empty
}
type Transformation x y positionHash = DynamicMoveData x y positionHash -> DynamicMoveData x y positionHash
updateKillerMoves :: Search.KillerMoves.Transformation (KillerMoveKey x y) -> Transformation x y positionHash
updateKillerMoves f dynamicMoveData@MkDynamicMoveData { getKillerMoves = killerMoves } = dynamicMoveData { getKillerMoves = f killerMoves }
updateTranspositions :: Search.Transpositions.Transformation (Component.Move.Move x y) positionHash -> Transformation x y positionHash
updateTranspositions f dynamicMoveData@MkDynamicMoveData { getTranspositions = transpositions } = dynamicMoveData { getTranspositions = f transpositions }
euthanise
:: Component.Move.NPlies
-> Input.SearchOptions.MaybeRetireAfterNMoves
-> Input.SearchOptions.MaybeRetireAfterNMoves
-> Transformation x y positionHash
euthanise nPlies maybeRetireKillerMovesAfter maybeRetireTranspositionsAfter MkDynamicMoveData {
getKillerMoves = killerMoves,
getTranspositions = transpositions
} = MkDynamicMoveData {
getKillerMoves = Data.Maybe.maybe id (
Search.EphemeralData.euthanise . reduceNPlies
) maybeRetireKillerMovesAfter killerMoves,
getTranspositions = Data.Maybe.maybe id (
Search.EphemeralData.euthanise . reduceNPlies
) maybeRetireTranspositionsAfter transpositions
} where
reduceNPlies = (`subtract` nPlies) . (* 2)