Blunderのハッシュでwindowを狭める処理

LowerとUpperの部分は通常ですが、
どっちも該当しない場合にWindowを狭めている。

					if (depth <= trans.Depth) {
						if (beta <= trans.Lower) {
							context.Local.HCSuccess[0]++;
							SetLeafTransMove(context, trans.BestMove);
							return trans.Lower; // cut off
						}
						if (trans.Upper <= alpha) {
							context.Local.HCSuccess[1]++;
							SetLeafTransMove(context, trans.BestMove);
							return trans.Upper; // cut off
						}
						//αβの範囲を狭める
						alpha = Math.Max(trans.Lower, alpha);
						beta = Math.Min(trans.Upper, beta);
						Debug.Assert(alpha < beta);

これって、昔、Java版のGA将!さんのライブラリをを読んでたらやってて、
ブログに書いたんですよ。
で、実際にやってみたら、どうもおかしくて、
GA勝!さんはMTDだから上手く行ってるのかも?って書いてたかな。
たしかマイムーブ西村さんも「ハッシュにはまだまだ知らない世界がある」って驚かれてて、

http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi?no=388

alpha と beta の値をハッシュに保存した評価値で狭くする手法は、ちょっと試してみたのですが上手くいきませんでした。

(アベントというのは昔のGA将!さんの名前)


でもやってみると有効じゃなかったんですが、
Blunderで上手く行ってるなら凄いと思う。


asser(alpha < beta)
ですけど、これってalpha==betaになる場合が出てこないですか?
って思って、置換表のストア部分を見ると、Exactlyで[value,value]にしてないみたいで、
それなら一致しないですね。このへんもあって上手く行ってるのかなあ?
逆にBona4は、

		case value_lower:
		  if ( value_hash >= beta )
		    {
		      HASH_VALUE = value_hash;
		      ptree->ntrans_lower++;
		      return value_lower;
		    }
		  break;
		case value_upper:
		  if ( value_hash <= alpha )
		    {
		      HASH_VALUE = value_hash;
		      ptree->ntrans_upper++;
		      return value_upper;
		    }
		  break;
		case value_exact:
		  HASH_VALUE = value_hash;
		  ptree->ntrans_exact++;
		  return value_exact;
		}

windowを狭めるどころか、return value_exactしちゃってて、これが上手く行くならいいと思うんですが、
コンピュータ将棋ではハッシュのexactは捨てるってのが今までは定跡とおもったんですけど、
できればこれを活用したいな〜