/*
Protector -- a UCI chess engine
Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _evaluation_h_
#define _evaluation_h_
#include "position.h"
#include "bitboard.h"
#include "keytable.h"
#include "io.h"
#ifndef NDEBUG
extern bool debugEval;
#endif
#define MATERIALINFO_TABLE_SIZE ( 648 * 648 )
extern MaterialInfo materialInfo[MATERIALINFO_TABLE_SIZE];
extern Bitboard companionFiles[_64_];
extern Bitboard troitzkyArea[2];
extern Bitboard pawnOpponents[2][_64_];
extern Bitboard krprkDrawFiles;
extern Bitboard A1C1, F1H1, A1B1, G1H1;
#define VALUE_TEMPO_OPENING 20
#define VALUE_TEMPO_ENDGAME 10
#define MIN_PIECE_WEIGHT_FOR_KING_ATTACK 14
void addEvalBonusForColor(EvaluationBase * base, const Color color,
const INT32 bonus);
void addEvalMalusForColor(EvaluationBase * base, const Color color,
const INT32 bonus);
Color getWinningColor(const Position * position, const int value);
Bitboard getPromotablePawns(const Position * position, const Color color);
bool oppositeColoredBishops(const Position * position);
int getKnnkpChances(const Position * position, const Color color);
bool passiveKingStopsPawn(const Square kingSquare,
const Square pawnSquare, const Color pawnColor);
int getKrppkrChances(const Position * position, const Color color);
int getKrpkrChances(const Position * position, const Color color);
int getKqppkqChances(const Position * position, const Color color);
int getKqpkqChances(const Position * position, const Color color);
int getKpkChances(const Position * position, const Color color);
int getKbpkChances(const Position * position, const Color color);
int specialPositionChances(const Position * position,
const EvaluationBase * base,
const SpecialEvalType type, const Color color);
int getChances(const Position * position, const EvaluationBase * base,
const Color winningColor);
bool hasBishopPair(const Position * position, const Color color);
int phaseValue(const INT32 value, const Position * position,
EvaluationBase * base);
INT32 materialBalance(const Position * position);
INT32 positionalBalance(const Position * position, EvaluationBase * base);
int basicPositionalBalance(Position * position);
int getValue(const Position * position,
EvaluationBase * base,
PawnHashInfo * pawnHashtable,
KingSafetyHashInfo * kingsafetyHashtable);
bool hasWinningPotential(Position * position, Color color);
Bitboard calculateKingPawnSafetyHashKey(const Position * position,
const Color color);
int getPawnWidth(const Position * position, const Color color);
int getPassedPawnWidth(const Position * position,
const EvaluationBase * base, const Color color);
int getMaterialUpPawnCountWeight(int numPawns);
/**
* Calculate the value of the specified position.
*
* @return the value of the specified position
*/
int getValue(const Position * position,
EvaluationBase * base,
PawnHashInfo * pawnHashtable,
KingSafetyHashInfo * kingsafetyHashtable);
/**
* Check if the pawn at the specified square is a passed pawn.
*/
bool pawnIsPassed(const Position * position, const Square pawnSquare,
const Color pawnColor);
/**
* Check if a pawn capture creates at least one passer.
*/
bool captureCreatesPasser(Position * position, const Square captureSquare,
const Piece capturingPiece);
/**
* Reset the pawn hashtable.
*/
void resetPawnHashtable(void);
/**
* Flip the given position and check if it yields the same result.
*
* @return FALSE if the flipped position yields a diffent result
*/
bool flipTest(Position * position, PawnHashInfo * pawnHashtable,
KingSafetyHashInfo * kingsafetyHashtable);
/**
* Initialize this module.
*
* @return 0 if no errors occurred.
*/
int initializeModuleEvaluation(void);
/**
* Test this module.
*
* @return 0 if all tests succeed.
*/
int testModuleEvaluation(void);
#endif