- bool specialized_eval_exists() const { return evaluationFunction != NULL; }
- Value evaluate(const Position& p) const { return (*evaluationFunction)(p); }
- ScaleFactor scale_factor(const Position& pos, Color c) const;
+ bool specialized_eval_exists() const { return evaluationFunction != nullptr; }
+ Value evaluate(const Position& pos) const { return (*evaluationFunction)(pos); }
+
+ // scale_factor takes a position and a color as input and returns a scale factor
+ // for the given color. We have to provide the position in addition to the color
+ // because the scale factor may also be a function which should be applied to
+ // the position. For instance, in KBP vs K endgames, the scaling function looks
+ // for rook pawns and wrong-colored bishops.
+ ScaleFactor scale_factor(const Position& pos, Color c) const {
+ return !scalingFunction[c]
+ || (*scalingFunction[c])(pos) == SCALE_FACTOR_NONE ? ScaleFactor(factor[c])
+ : (*scalingFunction[c])(pos);
+ }