Osipov Jury wrote: Yes, the PST weights in Houdini are multiplied by 2 as compared to Ippo/Robbo.
It is very easy to check that every weight is identical with the PST values of Robbolito with factor 2.
I have verified with Hex Rays, Jury's post is accurate...Osipov Jury wrote:Houdini use more complex formula for recalculation of eval for output:lkaufman wrote: Could it be that that the piece square table numbers are doubled (as you say), but later the entire eval is divided by 2? This would at least come close to explaining much of the eval, though it doesn't seem to me to be a complete explanation.
For simple case (true_eval in range [-150;+150]) we can use:Code: Select all
if ((true_eval + 899) > 1798 ) { output_eval = 16 * true_eval; } else { if ( true_eval > -300 ) { if ( true_eval > -150 ) { if ( true_eval > 150 ) { if ( true_eval > 300 ) output_eval = 2 * (9 * true_eval - 900); else output_eval = 14 * true_eval - 600; } else { output_eval = 10 * true_eval; } } else { output_eval = 14 * true_eval + 600; } } else { output_eval = 2 * (9 * true_eval + 900); } } sprintf(output_eval_string, "cp %d", output_eval / 32);
output_eval = (true_eval * 10) / 32;
all Houdini's eval values are doubled, and score output is obfuscated with a cascading/scaling 'if else' statement as folows:
PS-
in Robbo 0.09,
28976 = VALUE_MATE - depth_maximum
Here is Robbolito 0.09:
Code: Select all
//----- (00493D20) --------------------------------------------------------
char *__cdecl cp_mate(int value, char *s)
{
char v3; // [sp+Ch] [bp-C0h]@1
memset(&v3, -858993460, 0xC0u);
if ( value <= 28976 )
{
if ( value >= -28976 )
j__sprintf(s, "cp %d");
else
j__sprintf(s, "mate %d");
}
else
{
j__sprintf(s, "mate %d");
}
return (char *)j___RTC_CheckEsp();
}
Code: Select all
int __fastcall sub_41E7F0(signed int a1)
{
int result; // eax@2
signed int v2; // eax@7
if ( a1 <= 28976 )
{
if ( a1 >= -28976 )
{
if ( (unsigned int)(a1 + 899) > 0x706 )
{
v2 = 16 * a1;
}
else
{
if ( a1 > -300 )
{
if ( a1 > -150 )
{
if ( a1 > 150 )
{
if ( a1 > 300 )
v2 = 2 * (9 * a1 - 900);
else
v2 = 14 * a1 - 600;
}
else
{
v2 = 10 * a1;
}
}
else
{
v2 = 14 * a1 + 600;
}
}
else
{
v2 = 2 * (9 * a1 + 900);
}
}
sprintf(byte_585340, "cp %d", v2 / 32);
result = (int)byte_585340;
}
else
{
sprintf(byte_585340, "mate %d", (-30000 - a1) / 2);
result = (int)byte_585340;
}
}
else
{
sprintf(byte_585340, "mate %d", (30001 - a1) / 2);
result = (int)byte_585340;
}
return result;
}