I wish to know if this TT-move Singular Extension helps and for how much ELO.
Below is the implementation in my Xiangqi engine :-
Code: Select all
//Relaxed Singular extension
if (depth >= 6 //pv singular ext depth
&& tempmove.table.move==this_pv_move // this is hashmove
&& nSingular == 1
&& depth - nBetaDepth <= 3 // recent hash entry
&& newdepth < depth // not yet Ext
&& abs(nBetaVal) < WIN_VALUE
)
{
/*
int b = nBetaVal - SINGULAR_MARGIN;
int v = AlphaBeta(sstack, b-1, depth/2, NULL_NO);
if (v < b)
*/
int sing_size, sing_ncapsize, sing_val, sing_beta, sing_best;
MoveTabStruct sing_tempmove;
sing_ncapsize = 0;
sing_best = -INFINITY;
sing_beta = nBetaVal - SINGULAR_MARGIN;
sing_size=board.GenCap(&movetab[0], &ncapmovetab[0], sing_ncapsize);
memcpy(&movetab[sing_size], &ncapmovetab[0], sing_ncapsize * 4);
sing_size += sing_ncapsize;
sing_ncapsize=board.GenNonCap(&movetab[sing_size]);
sing_size += sing_ncapsize;
for (int i = 0; i < sing_size; i++)
{
sing_tempmove.tabentry = movetab[i].tabentry;
if (sing_tempmove.table.move == this_pv_move)
continue; // skip hashmove
if (makemove<1>(sing_tempmove.table) < 0)
continue; // skip illegal move
sing_val = -quiesCheck<0>(-sing_beta, -(sing_beta-1), 0, qcheck_depth);
unmakemove();
if (sing_val > sing_best)
{
sing_best = sing_val;
}
} //next i
if (sing_best != -INFINITY && sing_best < sing_beta)
{
//printf("info relaxed singular extension at pv, newdepth=%d, depth=%d, nBetaDepth=%d\n", newdepth, depth, nBetaDepth);
//fflush(stdout);
pv_singular_cnt ++;
newdepth = depth; //relaxed singleext 1 ply
}
}
Code: Select all
// val >= best >= val >= best2nd >= val
if (val <= best)
{
if (val > best2nd)
best2nd = val;
}
else
//if (val > best)
{
best2nd = best;
best = val;
if (val >= beta)
{
if (nSingular == 0)
{
if (best - best2nd >= SINGULAR_MARGIN) // && best2nd != -INFINITY) //64
nSingular = 1;
}
else
{
nSingular = 0; //reset
}
RecordHash(HASH_BETA, depth, val, tempmove.table.move, nSingular);