Drools:基于PHREAK堆栈的评估和向后链接

前一段时间,我写了一篇有关我们新算法的博客: http : //blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html

有人问我有关新的基于堆栈的系统以及向后链接如何工作的信息。 我在电子邮件中回复了他们,但我认为其他人可能会发现它很有用,因此请将其粘贴在下面。 它是从我的大脑直接写到页面上的,因此在某些地方有点粗糙。 但我希望有人觉得它有用,无论如何。

-

评估规则时,它将从根到尖端进行评估。

对于每个节点,它评估所有可能的联接并生成一个元组集。 然后,该子元组集将传递到子节点。 传入的元组集称为srcTupleSet(用于变量名),然后将所有子级放入trgTupleSet中。 trgTupleSet传递到子节点,在此它成为srcTupleSet。

第245行显示了此循环: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L245

srcTuples = trgTuples; // previous target, is now the source

输入节点后,它具有许多评估该节点所需的变量。 节点ID,节点内存,段内存,srcTupleSet,trgTupleSet。 通过创建引用这些值的StackEntry,可以暂停和恢复任何节点(在稍后的时间进行评估)。 StackEntry放置在堆栈上。 这是StackEntry类: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/StackEntry.java

出于两个原因需要这样做,即反向链接和子网。 向后链接是通过查询节点完成的。

当传播到达查询节点时,它需要暂停对当前规则的评估-因此它创建了StackEntry并将其放置在堆栈中。

第459行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L459

查询只是没有RHS的规则,没有后果。 它收集到达终端节点的所有结果,并将其返回给调用方。 查询节点允许规则通过传入参数来调用查询。 通过插入DroolsQuery对象来完成查询,该对象与根模式匹配并触发传播:

参见第67行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java

LeftInputAdapterNode.doInsertObject(handle, pCtx, lian, wm, lm, false, dquery.isOpen());

像序言一样,参数可以绑定或不绑定。 绑定参数是一个固定变量,而未绑定参数是一个固定变量。 在实现方面,我们不对未绑定的参数施加约束。 这允许经典的序言“传递闭包”类型查询。 虽然规则可以调用查询,但是查询也可以调用查询(我们没有制表法来检测无限循环)。

query isContainedIn( String x, String y )Location( x, y; )or( Location( z, y; ) and isContainedIn( x, z; ) )
end

注意drools支持模式中的位置参数和空位参数。 这是通过将所有位置映射到插槽来完成的。

可在此处找到有关反应式和非反应式传递闭包的上述查询的逐步操作指南, 网址为 : https : //www.youtube.com/watch?v=fCjIRVSRFvA

对于评估查询,当trgTulupleSet到达终端节点时,它将迭代并将每个元组添加到“收集器”。

参见第65行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryTerminalNode.java#L65

收集器创建一个特殊的子元组,可以将其添加到调用父级。

参见第343行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/reteoo/QueryElementNode.java#L343

查询完成评估后,将返回。 然后,重新调整过程允许执行程序访问堆栈,并在其中弹出StackEntry并恢复评估-但现在查询结果可用。

参见第166和173行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java

可以反应性和非反应性地调用查询。 非反应式意味着没有剩余内存,查询也没有打开。 反应性地意味着有剩余的内存,查询保持打开状态。 反应式查询是完全增量式的,并且支持更新和删除:

参见143和169行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java#L143

我们用于元组和“嵌套”(查询结果)元组的数据结构高效且“无复制”和“无搜索” –都是双链表。 这对于使增量查询有效很有必要。

子网使用类似的技术。 在到达子网的点上,外部规则被挂起(放在堆栈上),并创建内部网络评估。

参见第593和604行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java

子网完成后,外部规则将恢复并将结果放入外部子节点的正确输入中:

第662行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L662

如前所述,当前我们提供惰性规则评估,但不提供增量规则评估。 一旦开始规则评估,就会生成所有元组。 但是,由于堆栈条目可以在任何节点中暂停和恢复,因此它也可以用于提供增量规则评估-尽管我们现在不这样做。 实际上,您在正确的输入上“获取”了X个对象-可以是1或5或25或100。该数量使您可以调整延迟与吞吐量。 如果仍然有未评估的正确输入,请创建一个StackEntry,以在当前传播完成后强制对该节点进行重新评估。

参考: Drools: Drools&jBPM博客上来自JCG合作伙伴 Geoffrey De Smet的基于PHREAK堆栈的评估和向后链接 。

翻译自: https://www.javacodegeeks.com/2014/01/drools-phreak-stack-based-evaluations-and-backward-chaining.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人月神话阅读笔记02

作者在《人月神话》中对于大型项目总是陷入焦油坑的原因给出了一些令人叹服的解释,其中广为流传的就是“人月神话”。事实上,它的意思是:人月是一个神话——通俗地讲,人月,即工作人员和时间可以替换,二者是…

java form 上传文件_java通过表单进行文件上传的几种方法

上传文件的分类:无论什么方式上传文件,都要用post提交方式一:前端:表单方式上传文件后端:使用上传技术是apache中的Commons-fileupload.jarcommons-io.jarservlet:1.在表单提交的时候把表单中的所有的数据封装给request对象2.通过commons-fileupload的api方法转换request对象中…

[18/11/24]类和对象

1、类和对象 类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。 类:class。 对象:Obj…

N76E003---看门狗

看门狗的设置 比较简单,根据芯片手册上的说明进行设置。值得一提的是设置看门狗的寄存器是保护寄存器,所以在写寄存器的时候要解除保护 1 void wtd_init(void)2 {3 TA0xAA;4 TA0x55;5 6 WDCON 0x7; //根据手册 [2:0]位表示中断在多少秒后执…

具有Spring Boot的Spring Integration Standalone应用程序

我之前在博客中写过一种编写独立的Spring Integration应用程序的方法。 Spring Boot使创建此独立应用程序变得更加简单。 简单的流程是轮询USGS服务&#xff0c;以提供有关世界各地地震活动的信息并记录该信息。 使用Spring Integration描述的流程如下&#xff1a; <int:…

java设置jvm内存_浅谈设置JVM内存分配的几个妙招

一、设置JVM内存设置1. 设置JVM内存的参数有四个&#xff1a;-Xmx Java Heap***值&#xff0c;默认值为物理内存的1/4&#xff0c;***设值应该视物理内存大小及计算机内其他内存开销而定&#xff1b;-Xms Java Heap初始值&#xff0c;Server端JVM***将-Xms和-Xmx设为相同…

UITableViewCell出现动画

UITableViewCell出现动画 // 当cell 将要显示的时候调用 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{cell.transform CGAffineTransformMakeTranslation(self.view.width, 0);[UIView …

小程序如何传数组数据到vs后台中

首先小程序要跟vs运行的状态打通&#xff0c;首先要修改配置&#xff0c;也就是说调试的时候&#xff0c;小程序一使用Post请求后台的方法时就能让vs进入调试状态。 1.修改vs中的配置&#xff0c;注意这个.vs文件&#xff0c;如图&#xff1a; 找到这个文件 然后打开这个文件&a…

js实现QQ、微信、新浪微博分享功能

使用js实现QQ、微信、新浪微博分享功能。 微信分享需要手机扫描二维码&#xff0c;需要对url进行编码。在https协议下&#xff0c;扫描二维码时&#xff0c;浏览器打不开可能是没有安全证书导致的。 js代码&#xff1a; 1 var shareModel {2 3 /**4 * 分享…

使用Spring的Hibernate构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创…

java单例模式理解_快速理解Java中的五种单例模式

解法一&#xff1a;只适合单线程环境(不好)packagetest;/***authorxiaoping**/public classSingleton {private static Singleton instancenull;privateSingleton(){}public staticSingleton getInstance(){if(instancenull){instancenewSingleton();}returninstance;}}注解:Si…

201771010102 常惠琢 《面向对象程序设计(java)》第十三周学习总结

实验十三 图形界面事件处理技术 实验时间 2018-11-22 1、实验目的与要求 (1) 掌握事件处理的基本原理&#xff0c;理解其用途&#xff1b; (2) 掌握AWT事件模型的工作机制&#xff1b; (3) 掌握事件处理的基本编程模型&#xff1b; (4) 了解GUI界面组件观感设置方法&#xff1…

vue中使用codemirror

https://blog.csdn.net/oumaharuki/article/details/79268498 别人的记载&#xff0c;写的很不错&#xff0c;还有下载的方法 以下是自己使用过的&#xff0c;做出来的例子&#xff1a; 做出来的效果图&#xff1a; 记住使用之前要npm下载哦 npm install vue-codemirror --s…

使用不可序列化的属性序列化Java对象

人们可能有多种原因想要使用自定义序列化而不是依赖Java的默认序列化。 最常见的原因之一是为了提高性能&#xff0c;但是编写自定义序列化的另一个原因是不支持默认序列化机制。 具体来说&#xff0c;如本博文所述&#xff0c;自定义序列化可用于允许将较大的对象序列化&#…

洛谷 P3455 [POI2007]ZAP-Queries (莫比乌斯反演)

题意: 给定a&#xff0c;b&#xff0c;d求gcd(x,y)d的对数(1<x<a,1<y<b) 思路&#xff1a;按照套路来先设f(n)为gcd(x,y)n的对数,g(n)表示为 n | gcd(x,y)的对数,则g(n)∑n|df(d)a/n*b/n f(n)∑n|dg(d)*mu(d/n),令td/n则f(n)∑t1g(t*n)*mu(t)&#xff0c;然后求f(d…

java thread isalive_Java线程编程中isAlive()和join()的使用详解

一个线程如何知道另一线程已经结束&#xff1f;Thread类提供了回答此问题的方法。有两种方法可以判定一个线程是否结束。第一&#xff0c;可以在线程中调用isAlive()。这种方法由Thread定义&#xff0c;它的通常形式如下&#xff1a;final boolean isAlive( )如果所调用线程仍在…

Gradle sync failed: Read timed out

23:52 Gradle sync started23:54 Gradle sync failed: Read timed outConsult IDE log for more details (Help | Show Log) (2 m 29 s 815 ms) 原因是Gradle下载超时 一.下载 https://gradle.org/releases/ 二.安装 $ mkdir /opt/gradle $ unzip -d /opt/gradle gradle-…

JQuery知识点

jQueqry01--------------------------------------------------------------------------------------------------1&#xff09;$(function(){ //相当于windows.onload,等待文档加载完毕后&#xff0c;再执行 } ) 2&#xff09;jquery中的时间添加&#xff0c;全部采用现代时…

使用Spring跟踪异常–第2部分–委托模式

在上一个博客中 &#xff0c;我开始谈论需要弄清楚您的应用程序在生产环境中是否行为异常。 我说过&#xff0c;监视应用程序的一种方法是检查其日志文件是否存在异常&#xff0c;如果发现异常&#xff0c;则采取适当的措施。 显然&#xff0c;日志文件会占用数百兆的磁盘空间&…

aix java home_java程序员工作日子一(java_home 配置)

安装 JDK 和设置 JAVA_HOME如果您尚未在系统中安装 Java Development Kit (JDK) 和/或尚未设置 JAVA_HOME&#xff0c;则在尝试安装 Java CAPS 之前&#xff0c;需要安装 JDK 并设置 JAVA_HOME。以下任务提供了在 UNIX 或 Windows 系统上安装 JDK 和设置 JAVA_HOME 所需的信息。…