module BishBosh.Search.TranspositionValue (
IsOptimal,
FindFitness,
TranspositionValue (
getIsOptimal,
getNPlies,
getQualifiedMoves
),
inferSearchDepth,
mkTranspositionValue,
isBetter
) where
import qualified BishBosh.Data.Exception as Data.Exception
import qualified BishBosh.Type.Count as Type.Count
import qualified BishBosh.Type.Mass as Type.Mass
import qualified Control.Exception
import qualified Data.Ord
type IsOptimal = Bool
data TranspositionValue qualifiedMove = MkTranspositionValue {
TranspositionValue qualifiedMove -> IsOptimal
getIsOptimal :: IsOptimal,
TranspositionValue qualifiedMove -> NPlies
getNPlies :: Type.Count.NPlies,
TranspositionValue qualifiedMove -> [qualifiedMove]
getQualifiedMoves :: [qualifiedMove]
} deriving NPlies -> TranspositionValue qualifiedMove -> ShowS
[TranspositionValue qualifiedMove] -> ShowS
TranspositionValue qualifiedMove -> String
(NPlies -> TranspositionValue qualifiedMove -> ShowS)
-> (TranspositionValue qualifiedMove -> String)
-> ([TranspositionValue qualifiedMove] -> ShowS)
-> Show (TranspositionValue qualifiedMove)
forall qualifiedMove.
Show qualifiedMove =>
NPlies -> TranspositionValue qualifiedMove -> ShowS
forall qualifiedMove.
Show qualifiedMove =>
[TranspositionValue qualifiedMove] -> ShowS
forall qualifiedMove.
Show qualifiedMove =>
TranspositionValue qualifiedMove -> String
forall a.
(NPlies -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TranspositionValue qualifiedMove] -> ShowS
$cshowList :: forall qualifiedMove.
Show qualifiedMove =>
[TranspositionValue qualifiedMove] -> ShowS
show :: TranspositionValue qualifiedMove -> String
$cshow :: forall qualifiedMove.
Show qualifiedMove =>
TranspositionValue qualifiedMove -> String
showsPrec :: NPlies -> TranspositionValue qualifiedMove -> ShowS
$cshowsPrec :: forall qualifiedMove.
Show qualifiedMove =>
NPlies -> TranspositionValue qualifiedMove -> ShowS
Show
mkTranspositionValue
:: IsOptimal
-> Type.Count.NPlies
-> [qualifiedMove]
-> TranspositionValue qualifiedMove
mkTranspositionValue :: IsOptimal
-> NPlies -> [qualifiedMove] -> TranspositionValue qualifiedMove
mkTranspositionValue IsOptimal
_ NPlies
_ [] = Exception -> TranspositionValue qualifiedMove
forall a e. Exception e => e -> a
Control.Exception.throw (Exception -> TranspositionValue qualifiedMove)
-> Exception -> TranspositionValue qualifiedMove
forall a b. (a -> b) -> a -> b
$ String -> Exception
Data.Exception.mkNullDatum String
"BishBosh.Search.TranspositionValue.mkTranspositionValue:\tnull list of qualifiedMoves."
mkTranspositionValue IsOptimal
isOptimal NPlies
nPlies [qualifiedMove]
qualifiedMoves
| NPlies
nPlies NPlies -> NPlies -> IsOptimal
forall a. Ord a => a -> a -> IsOptimal
< NPlies
0 = Exception -> TranspositionValue qualifiedMove
forall a e. Exception e => e -> a
Control.Exception.throw (Exception -> TranspositionValue qualifiedMove)
-> (String -> Exception)
-> String
-> TranspositionValue qualifiedMove
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Exception
Data.Exception.mkOutOfBounds (String -> Exception) -> ShowS -> String -> Exception
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"BishBosh.Search.TranspositionValue.mkTranspositionValue:\tnPlies=" (String -> TranspositionValue qualifiedMove)
-> String -> TranspositionValue qualifiedMove
forall a b. (a -> b) -> a -> b
$ NPlies -> ShowS
forall a. Show a => a -> ShowS
shows NPlies
nPlies String
" can't be negative."
| IsOptimal
otherwise = MkTranspositionValue :: forall qualifiedMove.
IsOptimal
-> NPlies -> [qualifiedMove] -> TranspositionValue qualifiedMove
MkTranspositionValue {
getIsOptimal :: IsOptimal
getIsOptimal = IsOptimal
isOptimal,
getNPlies :: NPlies
getNPlies = NPlies
nPlies,
getQualifiedMoves :: [qualifiedMove]
getQualifiedMoves = [qualifiedMove]
qualifiedMoves
}
inferSearchDepth :: TranspositionValue qualifiedMove -> Type.Count.NPlies
inferSearchDepth :: TranspositionValue qualifiedMove -> NPlies
inferSearchDepth = NPlies -> NPlies
forall a b. (Integral a, Num b) => a -> b
fromIntegral (NPlies -> NPlies)
-> (TranspositionValue qualifiedMove -> NPlies)
-> TranspositionValue qualifiedMove
-> NPlies
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [qualifiedMove] -> NPlies
forall (t :: * -> *) a. Foldable t => t a -> NPlies
length ([qualifiedMove] -> NPlies)
-> (TranspositionValue qualifiedMove -> [qualifiedMove])
-> TranspositionValue qualifiedMove
-> NPlies
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TranspositionValue qualifiedMove -> [qualifiedMove]
forall qualifiedMove.
TranspositionValue qualifiedMove -> [qualifiedMove]
getQualifiedMoves
type FindFitness qualifiedMove = TranspositionValue qualifiedMove -> Type.Mass.WeightedMean
isBetter
:: FindFitness qualifiedMove
-> TranspositionValue qualifiedMove
-> TranspositionValue qualifiedMove
-> Bool
isBetter :: FindFitness qualifiedMove
-> TranspositionValue qualifiedMove
-> TranspositionValue qualifiedMove
-> IsOptimal
isBetter FindFitness qualifiedMove
findFitness TranspositionValue qualifiedMove
proposedValue TranspositionValue qualifiedMove
incumbentValue = case (TranspositionValue qualifiedMove -> NPlies)
-> TranspositionValue qualifiedMove
-> TranspositionValue qualifiedMove
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
Data.Ord.comparing TranspositionValue qualifiedMove -> NPlies
forall qualifiedMove. TranspositionValue qualifiedMove -> NPlies
inferSearchDepth TranspositionValue qualifiedMove
proposedValue TranspositionValue qualifiedMove
incumbentValue of
Ordering
GT -> IsOptimal
True
Ordering
EQ -> TranspositionValue qualifiedMove -> IsOptimal
forall qualifiedMove. TranspositionValue qualifiedMove -> IsOptimal
getIsOptimal TranspositionValue qualifiedMove
proposedValue IsOptimal -> IsOptimal -> IsOptimal
|| FindFitness qualifiedMove
-> TranspositionValue qualifiedMove
-> TranspositionValue qualifiedMove
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
Data.Ord.comparing FindFitness qualifiedMove
findFitness TranspositionValue qualifiedMove
proposedValue TranspositionValue qualifiedMove
incumbentValue Ordering -> Ordering -> IsOptimal
forall a. Eq a => a -> a -> IsOptimal
== Ordering
GT
Ordering
_ -> IsOptimal
False