drools源码分析,rete源码分析,rete算法.doc

上传人:工**** 文档编号:564580607 上传时间:2023-07-08 格式:DOC 页数:95 大小:1.44MB
返回 下载 相关 举报
drools源码分析,rete源码分析,rete算法.doc_第1页
第1页 / 共95页
drools源码分析,rete源码分析,rete算法.doc_第2页
第2页 / 共95页
drools源码分析,rete源码分析,rete算法.doc_第3页
第3页 / 共95页
drools源码分析,rete源码分析,rete算法.doc_第4页
第4页 / 共95页
drools源码分析,rete源码分析,rete算法.doc_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《drools源码分析,rete源码分析,rete算法.doc》由会员分享,可在线阅读,更多相关《drools源码分析,rete源码分析,rete算法.doc(95页珍藏版)》请在金锄头文库上搜索。

1、源码分析报告源码分析报告11.前言32.规则包格式33.规则编辑83.1AbstractRuleBase83.2ReteooRuleBase103.3ReteooBuilder103.4ReteooRuleBuilder113.5Rule133.6LogicTransformer(有待具体详细分析)133.7ReteooComponentBuilder(部分继承关系)153.8ObjectTypeNode233.9ObjectSinkPropagator263.10BuildUtils313.11NetWorkNode(部分继承关系)333.12Sink(部分继承关系)403.13Rete41

2、3.14FieldIndex414.运行时执行424.1ReteooRuleBase424.2AbstractRuleBase434.3ReteooStatefulSession444.4ReteooWorkingMemory444.5AbstractWorkingMemory/1484 row464.6ReteooFactHandleFactory524.7AbstractFactHandleFactory534.8PropagationContext534.9Rete / 678 row544.10ObjectTypeNode604.11ObjectSinkPropagator接口614.

3、12AlphaNode/370 row664.13LeftInputAdapterNode674.14TupleSinkPropagator684.15JoinNode704.16RuleTerminalNode724.17BetaNode774.18BetaMemory774.19TupleMemory784.20ClassFieldExtractor784.21ReteTuple784.22BetaConstraints804.23VariableConstraint(Beta)834.24VariableRestriction834.25AbstractHashTable874.26Pr

4、imitiveLongMap874.27PrimitiveLongStack884.28TruthMaintenanceSystem884.29DefaultFactHandle884.30DefaultAgenda894.31AgendaItem904.32BinaryHeapQueueAgendaGroup914.33DefaultExecutorService924.34PackageCompilationData924.35PatternBuilder/0.1与初始事实有关924.36ObjectTypeNode/0.1与初始事实有关934.37DefaultKnowledgeHelp

5、er934.38ClassObjectType944.39ValueType944.40AlphaNodeFieldConstraint955.总结951. 前言RETE算法一般可以分为两个部分:规则编辑和运行时执行。规则编辑描述规则库中的规则如何生成一个有效的具有分辨力的网络即RETE网络;运行时执行描述工作区中加入事实后如何在RETE网络中传递到网络的根节点。本源码分析报告仅仅分析上述的两个部分,对规则包Package的构建不予分析,只是对规则包格式加以说明。2. 规则包格式应用场景以DEMO程序中修改的两条规则为例说明JAVA规则包的格式。(应用场景将在后续版本中修改)规则例子1:whe

6、nFeeList(userType = 01 )or FeeList(userType = 04 , callType = 32)and FeeList(userType = 03 , callType = 32)thenSystem.out.println(启动测试规则);规则例子2:when($feeList : FeeList(callStartTime 6)and FeeList(callEndTime 22)$basicfeePlan : BasicfeePlan()$longfeePlan : LongfeePlan();thenSystem.out.print(获得从忙时跨越到闲

7、时的通话时长 : );System.out.print(忙时时长+$basicfeePlan.getBusyTime()+s + ; );System.out.println(闲时时长+$basicfeePlan.getIdleTime()+s);经过编译后,产生的 Package对象结构如下:其中rules为存放规则的HashMap,其中键为规则的名字,值为Rule对象:在进行 addPackage 并建立 Rete 网络阶段,我们重点关注 lhsRoot 属性,对于规则例子1 ,只有一个children其类型为GroupElement,其结构如下:默认情况下,所有 GroupElement

8、.type 属性都是 AndType, 即此 GroupElement 内元素之间的逻辑关系为 AND继续细分顶层 GroupElement 结构如下:FeeList(userType = 01 ) 已经是一个独立的 Pattern , 而由于后面的两个模式有 AND 的逻辑关系,所以两个模式又都被归并到一个 GroupElement 中,而当前元素之间是 OR 的逻辑关系 type 为 OrType继续对后半部分 GroupElement 继续细分则结构如下:FeeList(userType = 04 , callType = 32)and FeeList(userType = 03 , c

9、allType = 32) 两个模式分别用两个 Pattern 保存,关系为逻辑 AND同理,对于规则例子2,lhsRoot含有3个孩子,其类型为Pattern,结构如下:对于规则例子2 中 Pattern 具体分析:($feeList : FeeList(callStartTime 6)and FeeList(callEndTime 22)$basicfeePlan : BasicfeePlan()$longfeePlan : LongfeePlan();Pattern(194) 包装模式 $feeList : FeeList(callStartTime 6)其中有两个约束 callStar

10、tTime 6 分别包装在 LiteralConstraint(224,226)中,只针对 callStartTime 22 分析其包装,主要是 restriction 属性描述了这个模式约束 ,结构如下:注意: 此处要重点分析模式中真正的约束条件是怎么包装的。 LiteralRestriction(269).extractor(267) 对于提取同一个类(FeeList)的某一个属性值(callStartTime)是共享的,从extractor(267).clazz 属性看出提取的那一个类 ,从extractor(267).fieldName 看出提取的类域名,而extractor(267)

11、.extractor(286)则针对 FeeList 中某一个属性(CallStartTime)值进行提取,在 extractor(286) 中可以看到要提取的 callStartTime 值是一个 int 类型; LiteralRestriction.evaluator 表示运算符( 22)注意: 1. 后面会分析小括号归属于 GroupElement 中,并会打包,去掉冗余逻辑的过程,并把 OR 逻辑提取到最外层2. FeeList 类信息的共享,提取器的构造。Clazz(284)Pattern (187) 包装模式 $basicfeePlan : BasicfeePlan()由于模式中没

12、有定义约束,所以 constraint 属性为 Collection$EmptyList(489)模式$longfeePlan : LongfeePlan() 同理,不再具体描述。分析 Drools 执行 addPackage(Package) 的具体过程:为了能够比较全面的分析整个过程,包括:节点共享,提取 OR 逻辑,使用 $Declaration 这些功能,编写了以下规则:此例子的 Package 包装形式在 (六) LogicTransformer 可见以下文档整个 addPackage 过程所产生的 Rete 网络也都以这个例子规则说明。/规则初始化化部分rule startTest

13、no-loop true /执行一次后,是否能被再次激活 salience 100 /优先级别when / 此处特意写了 ( A and B ) and C 的逻辑冗余形式,主要是观察等价转化为 A and B and C 的过程( FeeList(userType = 01 , callType = 00 ) and $basic : BasicfeePlan(basicFeeTime 10) )and FeeList(userRoamArea = 1003)or FeeList(userType = 03 , roamType = 32)FeeList(roamType = 03)thenSystem.out.println(启动测试规则 . BasicFee is : + $basic.getBasicFee() );System.out.println(使用 function getAmoutTime 让 BasiceFee + 9 结果为 : + (9 + $basic.getBasicFee() );end代码中构造出的对象:FeeList 对象 = userType = “01” , callType = “00” , userRoamArea = 1003 , roamT

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号