module BishBosh.Input.CriteriaWeights(
CriteriaWeights(
getWeightOfMaterial,
getWeightOfMobility,
getWeightOfPieceSquareValue,
getWeightOfCastlingPotential,
getWeightOfDefence,
getWeightOfDoubledPawns,
getWeightOfIsolatedPawns,
getWeightOfPassedPawns
),
tag,
weightOfMaterialTag,
weightOfPieceSquareValueTag,
calculateWeightedMean,
normalise,
mkCriteriaWeights
) where
import qualified BishBosh.Data.Exception as Data.Exception
import qualified BishBosh.Metric.CriterionValue as Metric.CriterionValue
import qualified BishBosh.Metric.CriterionWeight as Metric.CriterionWeight
import qualified BishBosh.Metric.WeightedMeanAndCriterionValues as Metric.WeightedMeanAndCriterionValues
import qualified BishBosh.Property.ShowFloat as Property.ShowFloat
import qualified BishBosh.Text.ShowList as Text.ShowList
import qualified Control.Arrow
import qualified Control.DeepSeq
import qualified Control.Exception
import qualified Data.Default
import qualified Text.XML.HXT.Arrow.Pickle as HXT
tag :: String
tag :: String
tag = String
"criteriaWeights"
weightOfMaterialTag :: String
weightOfMaterialTag :: String
weightOfMaterialTag = String
"material"
weightOfMobilityTag :: String
weightOfMobilityTag :: String
weightOfMobilityTag = String
"mobility"
weightOfPieceSquareValueTag :: String
weightOfPieceSquareValueTag :: String
weightOfPieceSquareValueTag = String
"pieceSquareValue"
weightOfCastlingPotentialTag :: String
weightOfCastlingPotentialTag :: String
weightOfCastlingPotentialTag = String
"castlingPotential"
weightOfDefenceTag :: String
weightOfDefenceTag :: String
weightOfDefenceTag = String
"defence"
weightOfDoubledPawnsTag :: String
weightOfDoubledPawnsTag :: String
weightOfDoubledPawnsTag = String
"doubledPawns"
weightOfIsolatedPawnsTag :: String
weightOfIsolatedPawnsTag :: String
weightOfIsolatedPawnsTag = String
"isolatedPawns"
weightOfPassedPawnsTag :: String
weightOfPassedPawnsTag :: String
weightOfPassedPawnsTag = String
"passedPawns"
data CriteriaWeights = MkCriteriaWeights {
CriteriaWeights -> CriterionWeight
getWeightOfMaterial :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfMobility :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfPieceSquareValue :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfCastlingPotential :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfDefence :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfDoubledPawns :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfIsolatedPawns :: Metric.CriterionWeight.CriterionWeight,
CriteriaWeights -> CriterionWeight
getWeightOfPassedPawns :: Metric.CriterionWeight.CriterionWeight
} deriving (CriteriaWeights -> CriteriaWeights -> Bool
(CriteriaWeights -> CriteriaWeights -> Bool)
-> (CriteriaWeights -> CriteriaWeights -> Bool)
-> Eq CriteriaWeights
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CriteriaWeights -> CriteriaWeights -> Bool
$c/= :: CriteriaWeights -> CriteriaWeights -> Bool
== :: CriteriaWeights -> CriteriaWeights -> Bool
$c== :: CriteriaWeights -> CriteriaWeights -> Bool
Eq, Int -> CriteriaWeights -> ShowS
[CriteriaWeights] -> ShowS
CriteriaWeights -> String
(Int -> CriteriaWeights -> ShowS)
-> (CriteriaWeights -> String)
-> ([CriteriaWeights] -> ShowS)
-> Show CriteriaWeights
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CriteriaWeights] -> ShowS
$cshowList :: [CriteriaWeights] -> ShowS
show :: CriteriaWeights -> String
$cshow :: CriteriaWeights -> String
showsPrec :: Int -> CriteriaWeights -> ShowS
$cshowsPrec :: Int -> CriteriaWeights -> ShowS
Show)
mkCriteriaWeights
:: Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> Metric.CriterionWeight.CriterionWeight
-> CriteriaWeights
mkCriteriaWeights :: CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
mkCriteriaWeights CriterionWeight
a CriterionWeight
b CriterionWeight
c CriterionWeight
d CriterionWeight
e CriterionWeight
f CriterionWeight
g CriterionWeight
h
| CriteriaWeights
criteriaWeights CriteriaWeights -> CriteriaWeights -> Bool
forall a. Eq a => a -> a -> Bool
== CriteriaWeights
forall a. Bounded a => a
minBound = Exception -> CriteriaWeights
forall a e. Exception e => e -> a
Control.Exception.throw (Exception -> CriteriaWeights) -> Exception -> CriteriaWeights
forall a b. (a -> b) -> a -> b
$ String -> Exception
Data.Exception.mkInvalidDatum String
"BishBosh.Input.CriteriaWeights.mkCriteriaWeights:\tall weights are zero."
| Bool
otherwise = CriteriaWeights
criteriaWeights
where
criteriaWeights :: CriteriaWeights
criteriaWeights = CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
MkCriteriaWeights CriterionWeight
a CriterionWeight
b CriterionWeight
c CriterionWeight
d CriterionWeight
e CriterionWeight
f CriterionWeight
g CriterionWeight
h
instance Property.ShowFloat.ShowFloat CriteriaWeights where
showsFloat :: (Double -> ShowS) -> CriteriaWeights -> ShowS
showsFloat Double -> ShowS
fromDouble MkCriteriaWeights {
getWeightOfMaterial :: CriteriaWeights -> CriterionWeight
getWeightOfMaterial = CriterionWeight
weightOfMaterial,
getWeightOfMobility :: CriteriaWeights -> CriterionWeight
getWeightOfMobility = CriterionWeight
weightOfMobility,
getWeightOfPieceSquareValue :: CriteriaWeights -> CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight
weightOfPieceSquareValue,
getWeightOfCastlingPotential :: CriteriaWeights -> CriterionWeight
getWeightOfCastlingPotential = CriterionWeight
weightOfCastlingPotential,
getWeightOfDefence :: CriteriaWeights -> CriterionWeight
getWeightOfDefence = CriterionWeight
weightOfDefence,
getWeightOfDoubledPawns :: CriteriaWeights -> CriterionWeight
getWeightOfDoubledPawns = CriterionWeight
weightOfDoubledPawns,
getWeightOfIsolatedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight
weightOfIsolatedPawns,
getWeightOfPassedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfPassedPawns = CriterionWeight
weightOfPassedPawns
} = [(String, ShowS)] -> ShowS
Text.ShowList.showsAssociationList' ([(String, ShowS)] -> ShowS) -> [(String, ShowS)] -> ShowS
forall a b. (a -> b) -> a -> b
$ ((String, CriterionWeight) -> (String, ShowS))
-> [(String, CriterionWeight)] -> [(String, ShowS)]
forall a b. (a -> b) -> [a] -> [b]
map (
(CriterionWeight -> ShowS)
-> (String, CriterionWeight) -> (String, ShowS)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
Control.Arrow.second ((CriterionWeight -> ShowS)
-> (String, CriterionWeight) -> (String, ShowS))
-> (CriterionWeight -> ShowS)
-> (String, CriterionWeight)
-> (String, ShowS)
forall a b. (a -> b) -> a -> b
$ Double -> ShowS
fromDouble (Double -> ShowS)
-> (CriterionWeight -> Double) -> CriterionWeight -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CriterionWeight -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
) [
(
String
weightOfMaterialTag, CriterionWeight
weightOfMaterial
), (
String
weightOfMobilityTag, CriterionWeight
weightOfMobility
), (
String
weightOfPieceSquareValueTag, CriterionWeight
weightOfPieceSquareValue
), (
String
weightOfCastlingPotentialTag, CriterionWeight
weightOfCastlingPotential
), (
String
weightOfDefenceTag, CriterionWeight
weightOfDefence
), (
String
weightOfDoubledPawnsTag, CriterionWeight
weightOfDoubledPawns
), (
String
weightOfIsolatedPawnsTag, CriterionWeight
weightOfIsolatedPawns
), (
String
weightOfPassedPawnsTag, CriterionWeight
weightOfPassedPawns
)
]
instance Data.Default.Default CriteriaWeights where
def :: CriteriaWeights
def = MkCriteriaWeights :: CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
MkCriteriaWeights {
getWeightOfMaterial :: CriterionWeight
getWeightOfMaterial = CriterionWeight
forall a. Bounded a => a
maxBound,
getWeightOfMobility :: CriterionWeight
getWeightOfMobility = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfPieceSquareValue :: CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfCastlingPotential :: CriterionWeight
getWeightOfCastlingPotential = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfDefence :: CriterionWeight
getWeightOfDefence = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfDoubledPawns :: CriterionWeight
getWeightOfDoubledPawns = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfIsolatedPawns :: CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight
forall a. Default a => a
Data.Default.def,
getWeightOfPassedPawns :: CriterionWeight
getWeightOfPassedPawns = CriterionWeight
forall a. Default a => a
Data.Default.def
}
instance Control.DeepSeq.NFData CriteriaWeights where
rnf :: CriteriaWeights -> ()
rnf (MkCriteriaWeights CriterionWeight
a CriterionWeight
b CriterionWeight
c CriterionWeight
d CriterionWeight
e CriterionWeight
f CriterionWeight
g CriterionWeight
h) = [CriterionWeight] -> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf [CriterionWeight
a, CriterionWeight
b, CriterionWeight
c, CriterionWeight
d, CriterionWeight
e, CriterionWeight
f, CriterionWeight
g, CriterionWeight
h]
instance Bounded CriteriaWeights where
maxBound :: CriteriaWeights
maxBound = CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
MkCriteriaWeights CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound CriterionWeight
forall a. Bounded a => a
maxBound
minBound :: CriteriaWeights
minBound = CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
MkCriteriaWeights CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound CriterionWeight
forall a. Bounded a => a
minBound
instance HXT.XmlPickler CriteriaWeights where
xpickle :: PU CriteriaWeights
xpickle = CriteriaWeights -> PU CriteriaWeights -> PU CriteriaWeights
forall a. Eq a => a -> PU a -> PU a
HXT.xpDefault CriteriaWeights
forall a. Default a => a
Data.Default.def (PU CriteriaWeights -> PU CriteriaWeights)
-> (PU CriteriaWeights -> PU CriteriaWeights)
-> PU CriteriaWeights
-> PU CriteriaWeights
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PU CriteriaWeights -> PU CriteriaWeights
forall a. String -> PU a -> PU a
HXT.xpElem String
tag (PU CriteriaWeights -> PU CriteriaWeights)
-> PU CriteriaWeights -> PU CriteriaWeights
forall a b. (a -> b) -> a -> b
$ ((CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight)
-> CriteriaWeights,
CriteriaWeights
-> (CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight))
-> PU
(CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight)
-> PU CriteriaWeights
forall a b. (a -> b, b -> a) -> PU a -> PU b
HXT.xpWrap (
\(CriterionWeight
a, CriterionWeight
b, CriterionWeight
c, CriterionWeight
d, CriterionWeight
e, CriterionWeight
f, CriterionWeight
g, CriterionWeight
h) -> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
mkCriteriaWeights CriterionWeight
a CriterionWeight
b CriterionWeight
c CriterionWeight
d CriterionWeight
e CriterionWeight
f CriterionWeight
g CriterionWeight
h,
\MkCriteriaWeights {
getWeightOfMaterial :: CriteriaWeights -> CriterionWeight
getWeightOfMaterial = CriterionWeight
weightOfMaterial,
getWeightOfMobility :: CriteriaWeights -> CriterionWeight
getWeightOfMobility = CriterionWeight
weightOfMobility,
getWeightOfPieceSquareValue :: CriteriaWeights -> CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight
weightOfPieceSquareValue,
getWeightOfCastlingPotential :: CriteriaWeights -> CriterionWeight
getWeightOfCastlingPotential = CriterionWeight
weightOfCastlingPotential,
getWeightOfDefence :: CriteriaWeights -> CriterionWeight
getWeightOfDefence = CriterionWeight
weightOfDefence,
getWeightOfDoubledPawns :: CriteriaWeights -> CriterionWeight
getWeightOfDoubledPawns = CriterionWeight
weightOfDoubledPawns,
getWeightOfIsolatedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight
weightOfIsolatedPawns,
getWeightOfPassedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfPassedPawns = CriterionWeight
weightOfPassedPawns
} -> (
CriterionWeight
weightOfMaterial,
CriterionWeight
weightOfMobility,
CriterionWeight
weightOfPieceSquareValue,
CriterionWeight
weightOfCastlingPotential,
CriterionWeight
weightOfDefence,
CriterionWeight
weightOfDoubledPawns,
CriterionWeight
weightOfIsolatedPawns,
CriterionWeight
weightOfPassedPawns
)
) (PU
(CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight)
-> PU CriteriaWeights)
-> PU
(CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight)
-> PU CriteriaWeights
forall a b. (a -> b) -> a -> b
$ PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU CriterionWeight
-> PU
(CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight, CriterionWeight, CriterionWeight, CriterionWeight,
CriterionWeight)
forall a b c d e f g h.
PU a
-> PU b
-> PU c
-> PU d
-> PU e
-> PU f
-> PU g
-> PU h
-> PU (a, b, c, d, e, f, g, h)
HXT.xp8Tuple (
String -> PU CriterionWeight
xpickle' String
weightOfMaterialTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfMobilityTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfPieceSquareValueTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfCastlingPotentialTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfDefenceTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfDoubledPawnsTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfIsolatedPawnsTag
) (
String -> PU CriterionWeight
xpickle' String
weightOfPassedPawnsTag
) where
xpickle' :: String -> PU CriterionWeight
xpickle' = CriterionWeight -> PU CriterionWeight -> PU CriterionWeight
forall a. Eq a => a -> PU a -> PU a
HXT.xpDefault CriterionWeight
forall a. Default a => a
Data.Default.def (PU CriterionWeight -> PU CriterionWeight)
-> (String -> PU CriterionWeight) -> String -> PU CriterionWeight
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> PU CriterionWeight -> PU CriterionWeight
forall a. String -> PU a -> PU a
`HXT.xpAttr` PU CriterionWeight
forall a. XmlPickler a => PU a
HXT.xpickle)
calculateWeightedMean
:: CriteriaWeights
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.CriterionValue.CriterionValue
-> Metric.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues
calculateWeightedMean :: CriteriaWeights
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> WeightedMeanAndCriterionValues
calculateWeightedMean MkCriteriaWeights {
getWeightOfMaterial :: CriteriaWeights -> CriterionWeight
getWeightOfMaterial = CriterionWeight
weightOfMaterial,
getWeightOfMobility :: CriteriaWeights -> CriterionWeight
getWeightOfMobility = CriterionWeight
weightOfMobility,
getWeightOfPieceSquareValue :: CriteriaWeights -> CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight
weightOfPieceSquareValue,
getWeightOfCastlingPotential :: CriteriaWeights -> CriterionWeight
getWeightOfCastlingPotential = CriterionWeight
weightOfCastlingPotential,
getWeightOfDefence :: CriteriaWeights -> CriterionWeight
getWeightOfDefence = CriterionWeight
weightOfDefence,
getWeightOfDoubledPawns :: CriteriaWeights -> CriterionWeight
getWeightOfDoubledPawns = CriterionWeight
weightOfDoubledPawns,
getWeightOfIsolatedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight
weightOfIsolatedPawns,
getWeightOfPassedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfPassedPawns = CriterionWeight
weightOfPassedPawns
} Double
material Double
mobility Double
pieceSquareValue Double
castlingPotential Double
defence Double
doubledPawns Double
isolatedPawns Double
passedPawns = [(Double, CriterionWeight)] -> WeightedMeanAndCriterionValues
Metric.WeightedMeanAndCriterionValues.calculateWeightedMean [
(
Double
material, CriterionWeight
weightOfMaterial
), (
Double
mobility, CriterionWeight
weightOfMobility
), (
Double
pieceSquareValue, CriterionWeight
weightOfPieceSquareValue
), (
Double
castlingPotential, CriterionWeight
weightOfCastlingPotential
), (
Double
defence, CriterionWeight
weightOfDefence
), (
Double
doubledPawns, CriterionWeight
weightOfDoubledPawns
), (
Double
isolatedPawns, CriterionWeight
weightOfIsolatedPawns
), (
Double
passedPawns, CriterionWeight
weightOfPassedPawns
)
]
type Transformation = CriteriaWeights -> CriteriaWeights
normalise :: Transformation
normalise :: Transformation
normalise criteriaWeights :: CriteriaWeights
criteriaWeights@MkCriteriaWeights {
getWeightOfMaterial :: CriteriaWeights -> CriterionWeight
getWeightOfMaterial = CriterionWeight
weightOfMaterial,
getWeightOfMobility :: CriteriaWeights -> CriterionWeight
getWeightOfMobility = CriterionWeight
weightOfMobility,
getWeightOfPieceSquareValue :: CriteriaWeights -> CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight
weightOfPieceSquareValue,
getWeightOfCastlingPotential :: CriteriaWeights -> CriterionWeight
getWeightOfCastlingPotential = CriterionWeight
weightOfCastlingPotential,
getWeightOfDefence :: CriteriaWeights -> CriterionWeight
getWeightOfDefence = CriterionWeight
weightOfDefence,
getWeightOfDoubledPawns :: CriteriaWeights -> CriterionWeight
getWeightOfDoubledPawns = CriterionWeight
weightOfDoubledPawns,
getWeightOfIsolatedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight
weightOfIsolatedPawns,
getWeightOfPassedPawns :: CriteriaWeights -> CriterionWeight
getWeightOfPassedPawns = CriterionWeight
weightOfPassedPawns
} = Bool -> Transformation
forall a. (?callStack::CallStack) => Bool -> a -> a
Control.Exception.assert (
CriteriaWeights
criteriaWeights CriteriaWeights -> CriteriaWeights -> Bool
forall a. Eq a => a -> a -> Bool
/= CriteriaWeights
forall a. Bounded a => a
minBound
) MkCriteriaWeights :: CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriterionWeight
-> CriteriaWeights
MkCriteriaWeights {
getWeightOfMaterial :: CriterionWeight
getWeightOfMaterial = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfMaterial,
getWeightOfMobility :: CriterionWeight
getWeightOfMobility = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfMobility,
getWeightOfPieceSquareValue :: CriterionWeight
getWeightOfPieceSquareValue = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfPieceSquareValue,
getWeightOfCastlingPotential :: CriterionWeight
getWeightOfCastlingPotential = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfCastlingPotential,
getWeightOfDefence :: CriterionWeight
getWeightOfDefence = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfDefence,
getWeightOfDoubledPawns :: CriterionWeight
getWeightOfDoubledPawns = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfDoubledPawns,
getWeightOfIsolatedPawns :: CriterionWeight
getWeightOfIsolatedPawns = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfIsolatedPawns,
getWeightOfPassedPawns :: CriterionWeight
getWeightOfPassedPawns = CriterionWeight -> CriterionWeight
normaliseCriterionWeight CriterionWeight
weightOfPassedPawns
} where
normaliseCriterionWeight :: CriterionWeight -> CriterionWeight
normaliseCriterionWeight = (
CriterionWeight -> CriterionWeight -> CriterionWeight
forall a. Fractional a => a -> a -> a
/ [CriterionWeight] -> CriterionWeight
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [
CriterionWeight
weightOfMaterial,
CriterionWeight
weightOfMobility,
CriterionWeight
weightOfPieceSquareValue,
CriterionWeight
weightOfCastlingPotential,
CriterionWeight
weightOfDefence,
CriterionWeight
weightOfDoubledPawns,
CriterionWeight
weightOfIsolatedPawns,
CriterionWeight
weightOfPassedPawns
]
)