我只是对我的新算法进行最后的修改。 它合并了Leaps , 面向集合的Match和Left / Right取消链接的概念 ,以及我自己的一些想法。 该代码已提交,但我正在积累工作并编写更多测试。 我将在一周左右的时间内写一个完整的博客,详细介绍该博客,并希望为人们提供一个Alpha版本。 该算法解决了Rete的贪婪和浪费性质。 如果我们使用GWT进行JS移植,这将使其适用于更受限的环境,例如移动设备或浏览器。 此外,它的设计考虑了多核的使用-尽管我还没有实现。 对于那些了解术语的人,这里是我到目前为止所做的要点列表。
规则解除连结
- 用细分来保留共享。 位掩码用于正确的输入和段,以进行有效检查。
- 当所有正确的输入都设置了位时,段就将其设置了位。
- 当每个段都设置了位时,将链接一个规则。
- 在一条规则都完全链接到议程中之前,不会进行beta测试(请参阅惰性规则评估)
- 当任何正确的输入中没有数据时,可以取消链接的规则
- 保留所有的全部和部分联接数据。
- 我怀疑我们可以使用弧度一致性来设置某个位时进一步延迟,而不是简单地设置一个正确的输入
懒惰规则评估
- 链接时不会评估Rule的beta网络。 而是将其添加到优先级队列中,仅当它弹出时,我们才评估其Beta网络
面向集合的传播
- 为正确的输入暂存所有插入,更新和删除操作,直到评估规则为止。
- Beta网络评估从根本开始
- 所有插入/更新/删除操作一起处理,导致一组元组传播到下一个节点
- 确保课程粒度节点评估,非常适合多核调度。
- 单次传播而不是典型的Rete,深度搜索会影响网络。
- 请注意,我们还没有进行面向集合的匹配,这会折叠节点中的匹配空间。
- 当我们借用集合传播概念时,面向集合的匹配的碎片整理过程需要更多考虑,因为它有缺点。
就地修改/差异更新
- 修改是真实的,而不是撤消+断言
- 允许补偿“撤消”操作,因为我们知道真正删除了什么,更新了什么。
- 保留对象,以避免GC命中。
物业反应
- 模式可以侦听并对特定的属性更改做出反应
- 将其视为属性更改侦听器,而不是当前类更改侦听器
基于树的图
- 撤回只需要迭代图
- 允许有效的“就地修改”
子网支持
- 不存在,积累可以支持的嵌套组和模式
- 作为单程网络评估的一部分得到支持
- 我们的元组集到达左输入,然后递归地评估subetnworks。
虽然还不完整,但我可以想到以下一些TODO项目,以提出近期和长期的想法:
更有效的子网
- 新的设计允许子网内更有效的执行,但是我们尚未利用这一优势。
GC加盟
- 如果不使用联接,则允许在一段时间后进行GC联接,但还必须在不使规则执行顺序无效的情况下支持重新创建(即,如果已触发,则不能再次触发该规则)
不同的网络拓扑
- Rete网络始终从左到右连接,这并不总是有效的。 Treat和Gator网络着眼于不同的拓扑结构如何减少加入尝试的次数,也可以改善与我们新的基于分段的网络的共享。
多核工作
- 该设计现在已经基于队列,并且支持粗粒度的工作单元。 现在,我们需要开始创建线程模型,并更好地隔离和分离alpha网络传播过程。 这涉及重构我们现有的锁定模型。
- 需要对重叠规则进行有效测试-即一个规则与另一条规则共享段。 这将使我们能够评估规则,而无需同步点。
智能链接
- 当正确的输入接收到单个事实时,通过设置位完成链接。 弧度一致性可用于进一步延迟此链接过程,仅在实现弧度一致性时才在规则段以及规则中进行链接。
MVCC和交易
- 传播模型应支持多版本并行控制。 这对于获得更好的多核支持是必不可少的,它将使事务支持成为可能。
RIP
RETE 2013 :)
参考: Drools&jBPM博客上来自JCG合作伙伴 Geoffrey De-Smet的《超越Rete的生活– RIP Rete 2013:》 。
翻译自: https://www.javacodegeeks.com/2013/04/life-beyond-rete-r-i-p-rete-2013.html