kranium wrote:150 is certainly not an 'original' or 'brilliant' idea,
Ippolit, Robbolito, Igorrit, and IvanHoe all use 150, exactly in the manner Richard described above for Critter...
from common.c:
#define LazyValue 150
#define LazyValue2 300
They're also found in Robbolito's comune.h:
Code: Select all
#define valu_pigro 150
#define valu_pigro2 300
The search passes these values to a "chiamata_valu_pigra" macro, which I guess is used for evaluation:
Code: Select all
#define chiamata_valu_piena(m)\
valutazione (POSIZIONE, -0x7fff0000, 0x7fff0000, m)
#define chiamata_valu_pigra(B, A, p, m)\
valutazione (POSIZIONE, (B) - (p), (A) + (p), m)
The 0x7fff0000 stuff looks familiar from the similar Ippolit code. It passes those as the min/max for most eval calls.
Code: Select all
evaluation_scoring (-0x7fff0000, 0x7fff0000, 0);
But for some eval calls, Ippolit uses smaller bounds. e.g. in white_cut/black_cut (and several others):
Code: Select all
evaluation_scoring (notch - 300, notch + 300, move);
In white_slide_check/black_slide_check (and several others):
Code: Select all
evaluation_scoring (notch - 150, notch + 150, move);
If you search Robbolito for "valu_pigro" you'll find the equivalent evaluation calls, with the same bounds, in its search code:
Code: Select all
D:\wylie\chess\robbolito\RobboLito-0.085f1a\cerca_fine.c/104: chiamata_valu_pigra (VALU, VALU, valu_pigro, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\cerca_fine.c/132: chiamata_valu_pigra (VALU, VALU, valu_pigro, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\cerca_fine.c/258: chiamata_valu_pigra (VALU, VALU, valu_pigro, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\cerca_mezzo.c/144: chiamata_valu_pigra (VALU, VALU, valu_pigro, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\cerca_mezzo.c/289: chiamata_valu_pigra (VALU, VALU, valu_pigro, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\escludo.c/148: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\escludo.c/326: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\nodo_tagliato.c/166: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\nodo_tagliato.c/386: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\nodo_totale.c/144: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
D:\wylie\chess\robbolito\RobboLito-0.085f1a\nodo_totale.c/316: chiamata_valu_pigra (VALU, VALU, valu_pigro2, mossa);
So I'm convinced (for now) that Robbolito does not really differ from Ippolit in that respect.
Next, one might wonder what all of these different Ippolit clones do with those evaluation bounds? Turns out they do the obvious thing--compare against them, and take an early exit from eval.
e.g. from the middle of ippolit's evaluation_scoring method:
Code: Select all
void
evaluation_scoring (int mini, int maximum, int move)
{
// <a bunch of stuff removed..>
if (position_fixed.white_engine)
{
// <a bunch of stuff removed..>
score = (endings * negative_phase + opening * phase) / 32;
raz += score;
itog = raz + material_valuations;
if (itog < -maximum - 16 * (int) (tower_dynamics - 1)->sleepy || itog > -mini + 16 * (int) (tower_dynamics - 1)->sleepy)
{
tower_dynamics->sleepy = (tower_dynamics - 1)->sleepy + 1;
tower_dynamics->score_value = itog;
tower_dynamics->positional = raz;
evaluation_mobility ();
return; // <line 5404 or so>
}
Robbolito of course contains identical code in valu.c, around line 673 for example:
Code: Select all
valu = (finale * anti_fase + apertura * fase) / 32;
posizionale += valu;
v = posizionale + materiale_valu;
if (v < -massimo - 16 * (int) (DINAMICO - 1)->pigro
|| v > -minimo + 16 * (int) (DINAMICO - 1)->pigro)
{
DINAMICO->pigro = (DINAMICO - 1)->pigro + 1;
DINAMICO->valu = v;
DINAMICO->valu_posizionale = posizionale;
mobilita (POSIZIONE);
return;
}
So you'll forgive me if I'm inclined not to take Houdart's claim (that Houdini is different and magical with respect to 150 lazy margin in eval) at face value. After a quick skim of their sources, it looks more to me as if Houdini inherited that behaviour directly from Robbolito.
---------------
Edit: In case it isn't clear, this post is a reaction to the following comment from Houdart earlier in the thread:
Houdini wrote:rvida wrote:Also, when the absolute value of positional component from ply-1 eval is greater than 150 cp, lazy eval is not used.
What a coincidence, Houdini does exactly the same...
LOL.
I was annoyed by his cheap shot at Richard who as I understand it, acknowledges that his engine is derived from the ippolit family. He reverse-engineered an early Houdini using robbolito as a road map. Apparently it was not too difficult since Houdini started life as an exact clone of robbolito. What annoys me is that Robert Houdart will not acknowledge this, and dances around the issue in his posts to try and mislead people into believing that Houdini is largely or entirely his original work. When the evidence we've seen so far makes it vanishingly unlikely that is the case.
------
Edit 2: Okay, it looks like Houdart is claiming that Houdini uses that 150 threshold for a different thing entirely (to avoid taking lazy exit when the score is unbalanced in one player's favor). I might be ranting about the wrong thing then (and this post might be entirely beside the point). Sorry!