protected Eval storeQXP(Eval mValue, EvalType et, Move moveBest = Move.Undefined) { Trace.Assert(EvalUndefined < mValue, "storeQXP(EvalUndefined)"); traceVal("storeQXP", mValue, et); //[Conditional] State.IncEvalType(et); var mAdjusted = creditMate(mValue, SearchPly); if (IsFinal()) { Trace.Assert(!isDefined(moveBest), "moveBest defined in a Final position."); moveBest = Move.EmptyMove; } #if DebugMoveColor if (isDefinite(moveBest)) { var bWTM = WTM(); var bWhiteMove = (moveBest & Move.WTM) != 0; if (bWTM != bWhiteMove) { Debug.Assert(bWTM == bWhiteMove, "WTM != WhiteMove [storeQXP]"); DisplayCurrent("storeQXP()"); } } #endif #if QXPHash128 var store = new QuietPosition(Hash, State.MovePly, HashPawn, mAdjusted, et, moveBest); #else var store = new QuietPosition(Hash, State.MovePly, mAdjusted, et, moveBest); #endif State.QXPTank.Save(store); return(mValue); }
protected Boolean probeQXP(Eval mAlpha, Eval mBeta, out Move moveFound, out Eval mValue, out EvalType etFound) { #if QXPHash128 var match = new QuietPosition(Hash, State.MovePly, HashPawn); #else var match = new QuietPosition(Hash, State.MovePly); #endif var bValid = State.QXPTank.LoadFirst(ref match); var moveBest = adjustEmptyMove(match.BestMove); moveFound = isDefined(moveBest) ? moveBest | Move.Qxnt : moveBest; //[out]3 etFound = match.Type; //[out]2 //[Note]Mate values are suspect because quiet moves were not considered var mValueFound = match.Value; mValue = adjustValue(mAlpha, mBeta, mValueFound, etFound, SearchPly); //[out]1 traceVal("probeQXP", mValue, etFound); //[Conditional] var bValueDefined = EvalUndefined < mValue; return(bValid && bValueDefined); }