Syzygy如何存储其信息?


10

通过阅读到目前为止我发现的所有内容,我知道Syzygy同时使用了win / draw / loss文件和零距离文件,但是我没有找到有关这些文件使用的内部文件格式的任何信息。我正在寻找低级的坚韧不拔的解释。

Answers:


13

由于没有单一的综合出版物,所以它是基于探测代码生成器和Ronald de Man(生成器的作者)的各种解释的


探测几乎所有表库(又称巨大的压缩哈希图)时:

  1. 位置已标准化...
  2. ...映射到整数索引。
  3. 在标识该索引属于哪个“块”的表中查找该索引。
  4. 对该块进行解压缩,直到可以检索到索引信息为止。

然后,通常在探测的“外部”有一些代码,至少可以解决遍历捕获。


从WDL的外部代码开始。Syzygy表使用基于以下观察的优化:如果一个职位的捕获达到特定值(例如,获胜),则该职位本身至少具有该值(例如,获胜)。在这种情况下,该表可以存储任意一个较低的值,无论哪个值最适合压缩,并且可以通过检查捕获的子表来轻松纠正。

要获得DTZ,首先需要完成WDL探测。如果绘制了位置,则DTZ为0,并且该表可以存储任何内容,以压缩最合适为准。如果最好的举动是捕获(我们可以从WDL探针中记住),则DTZ取决于WDL,为+/- 1或+/- 101,并且表可以再次存储任何内容,以压缩最合适为准。

典当表包含4个子表,“领先典当”的每个文件一个(标准化后)。

WDL(子)表是双面的,也就是说,它们基本上包含两个单独的表,用于最终游戏的每一面(除非材料是对称的)。

DTZ表仅存储要移动的一侧。因此,可能需要进行简短的1层搜索才能计算另一侧的DTZ。


(1)关于归一化:可以采用多种方法来完成,并且不容易预先告知哪种压缩方式会带来最佳压缩效果。生成器只是尝试不同的排列。件的最终顺序存储在表文件的标题中。

(2)一些组合。面临的挑战是,在不可能的职位之间保持不小的差距。尽管这很棘手,但我认为Syzygy在这里没有做任何特别的事情。从概念上讲,件或件组按标题中指定的顺序放置在板上。

(3)压缩值存储在块中。块大小在表头中指定。表映射到块的索引稀疏,因此它允许跳到非常接近正确的块的位置,然后需要进行短暂的向前或向后扫描以找到确切的块。一个块最多可以存储65536个位置的值。

(4)Syzygy表使用基于RE-PAIR的自定义压缩。一个重要的功能是,它实际上允许利用存储上面确定的任意值的机会。解压缩速度非常快,并且一旦所需索引的值可用就可以停止。

可选地,DTZ表可能需要另一个步骤f(wdl,存储值)=实际值。表头中引用了此额外的DTZ映射,它本身就是具有8位条目的表。(有趣的是,即使是当兵,这对于7件式最终游戏来说还是不够的,因此现在有了另一个标志,可以启用16位输入)。

对于DTZ值,如果生成器确定一张表的所有值均小于100,则不需要精确的半步计数来保证完美播放。相反,它在表标题中设置了一个标志,并将半移动到全移动以节省空间。

同样很明显,不需要存储符号,也不必存储被诅咒的残局的+/- 100偏移,因为这可以从WDL值中推断出来。

由于解压缩速度非常快,因此不需要缓存。相反,引擎可以依靠操作系统页面缓存来存储(仍压缩)块。


这6个表格包含150个千兆字节中3,787,154,440,416个唯一位置的 WDL和DTZ信息,因此每个位置约0.3位。

总而言之,Syzygy表至少在其中三个方面对以前的表库格式进行了改进,使其成为一种非常紧凑和快速的格式。令人惊讶的是,生成器也相当快。

当然,使用DTZ50是一个务实的选择,因为这足以可靠地取得进步,并且无论是否有50步规则,都可以完美发挥(击球结果)。但是,基于到目前为止已发布的Cfish更改(RdM现在正在DTM表上运行),许多技术也将适用于DTM。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.