clipsruby 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/ext/clipsruby/agenda.c +1373 -0
  3. data/ext/clipsruby/agenda.h +169 -0
  4. data/ext/clipsruby/analysis.c +1142 -0
  5. data/ext/clipsruby/analysis.h +61 -0
  6. data/ext/clipsruby/argacces.c +526 -0
  7. data/ext/clipsruby/argacces.h +77 -0
  8. data/ext/clipsruby/bload.c +884 -0
  9. data/ext/clipsruby/bload.h +94 -0
  10. data/ext/clipsruby/bmathfun.c +557 -0
  11. data/ext/clipsruby/bmathfun.h +66 -0
  12. data/ext/clipsruby/bsave.c +634 -0
  13. data/ext/clipsruby/bsave.h +130 -0
  14. data/ext/clipsruby/classcom.c +976 -0
  15. data/ext/clipsruby/classcom.h +115 -0
  16. data/ext/clipsruby/classexm.c +1376 -0
  17. data/ext/clipsruby/classexm.h +97 -0
  18. data/ext/clipsruby/classfun.c +1392 -0
  19. data/ext/clipsruby/classfun.h +164 -0
  20. data/ext/clipsruby/classinf.c +1245 -0
  21. data/ext/clipsruby/classinf.h +94 -0
  22. data/ext/clipsruby/classini.c +843 -0
  23. data/ext/clipsruby/classini.h +75 -0
  24. data/ext/clipsruby/classpsr.c +957 -0
  25. data/ext/clipsruby/classpsr.h +73 -0
  26. data/ext/clipsruby/clips.h +133 -0
  27. data/ext/clipsruby/clipsruby.c +619 -0
  28. data/ext/clipsruby/clsltpsr.c +931 -0
  29. data/ext/clipsruby/clsltpsr.h +72 -0
  30. data/ext/clipsruby/commline.c +1217 -0
  31. data/ext/clipsruby/commline.h +131 -0
  32. data/ext/clipsruby/conscomp.c +1593 -0
  33. data/ext/clipsruby/conscomp.h +150 -0
  34. data/ext/clipsruby/constant.h +264 -0
  35. data/ext/clipsruby/constrct.c +1090 -0
  36. data/ext/clipsruby/constrct.h +216 -0
  37. data/ext/clipsruby/constrnt.c +554 -0
  38. data/ext/clipsruby/constrnt.h +132 -0
  39. data/ext/clipsruby/crstrtgy.c +1088 -0
  40. data/ext/clipsruby/crstrtgy.h +85 -0
  41. data/ext/clipsruby/cstrcbin.c +185 -0
  42. data/ext/clipsruby/cstrcbin.h +61 -0
  43. data/ext/clipsruby/cstrccmp.h +43 -0
  44. data/ext/clipsruby/cstrccom.c +1791 -0
  45. data/ext/clipsruby/cstrccom.h +115 -0
  46. data/ext/clipsruby/cstrcpsr.c +835 -0
  47. data/ext/clipsruby/cstrcpsr.h +97 -0
  48. data/ext/clipsruby/cstrnbin.c +282 -0
  49. data/ext/clipsruby/cstrnbin.h +55 -0
  50. data/ext/clipsruby/cstrnchk.c +826 -0
  51. data/ext/clipsruby/cstrnchk.h +91 -0
  52. data/ext/clipsruby/cstrncmp.c +238 -0
  53. data/ext/clipsruby/cstrncmp.h +57 -0
  54. data/ext/clipsruby/cstrnops.c +1176 -0
  55. data/ext/clipsruby/cstrnops.h +47 -0
  56. data/ext/clipsruby/cstrnpsr.c +1394 -0
  57. data/ext/clipsruby/cstrnpsr.h +88 -0
  58. data/ext/clipsruby/cstrnutl.c +564 -0
  59. data/ext/clipsruby/cstrnutl.h +54 -0
  60. data/ext/clipsruby/default.c +454 -0
  61. data/ext/clipsruby/default.h +57 -0
  62. data/ext/clipsruby/defins.c +971 -0
  63. data/ext/clipsruby/defins.h +127 -0
  64. data/ext/clipsruby/developr.c +677 -0
  65. data/ext/clipsruby/developr.h +69 -0
  66. data/ext/clipsruby/dffctbin.c +477 -0
  67. data/ext/clipsruby/dffctbin.h +76 -0
  68. data/ext/clipsruby/dffctbsc.c +308 -0
  69. data/ext/clipsruby/dffctbsc.h +72 -0
  70. data/ext/clipsruby/dffctcmp.c +297 -0
  71. data/ext/clipsruby/dffctcmp.h +44 -0
  72. data/ext/clipsruby/dffctdef.c +364 -0
  73. data/ext/clipsruby/dffctdef.h +104 -0
  74. data/ext/clipsruby/dffctpsr.c +179 -0
  75. data/ext/clipsruby/dffctpsr.h +49 -0
  76. data/ext/clipsruby/dffnxbin.c +520 -0
  77. data/ext/clipsruby/dffnxbin.h +67 -0
  78. data/ext/clipsruby/dffnxcmp.c +378 -0
  79. data/ext/clipsruby/dffnxcmp.h +54 -0
  80. data/ext/clipsruby/dffnxexe.c +241 -0
  81. data/ext/clipsruby/dffnxexe.h +58 -0
  82. data/ext/clipsruby/dffnxfun.c +1192 -0
  83. data/ext/clipsruby/dffnxfun.h +155 -0
  84. data/ext/clipsruby/dffnxpsr.c +514 -0
  85. data/ext/clipsruby/dffnxpsr.h +57 -0
  86. data/ext/clipsruby/dfinsbin.c +509 -0
  87. data/ext/clipsruby/dfinsbin.h +66 -0
  88. data/ext/clipsruby/dfinscmp.c +345 -0
  89. data/ext/clipsruby/dfinscmp.h +48 -0
  90. data/ext/clipsruby/drive.c +1191 -0
  91. data/ext/clipsruby/drive.h +65 -0
  92. data/ext/clipsruby/emathfun.c +1213 -0
  93. data/ext/clipsruby/emathfun.h +99 -0
  94. data/ext/clipsruby/engine.c +1568 -0
  95. data/ext/clipsruby/engine.h +203 -0
  96. data/ext/clipsruby/entities.h +276 -0
  97. data/ext/clipsruby/envrnbld.c +514 -0
  98. data/ext/clipsruby/envrnbld.h +40 -0
  99. data/ext/clipsruby/envrnmnt.c +257 -0
  100. data/ext/clipsruby/envrnmnt.h +112 -0
  101. data/ext/clipsruby/evaluatn.c +1736 -0
  102. data/ext/clipsruby/evaluatn.h +211 -0
  103. data/ext/clipsruby/expressn.c +494 -0
  104. data/ext/clipsruby/expressn.h +154 -0
  105. data/ext/clipsruby/exprnbin.c +538 -0
  106. data/ext/clipsruby/exprnbin.h +60 -0
  107. data/ext/clipsruby/exprnops.c +564 -0
  108. data/ext/clipsruby/exprnops.h +67 -0
  109. data/ext/clipsruby/exprnpsr.c +1112 -0
  110. data/ext/clipsruby/exprnpsr.h +98 -0
  111. data/ext/clipsruby/extconf.rb +2 -0
  112. data/ext/clipsruby/extnfunc.c +1015 -0
  113. data/ext/clipsruby/extnfunc.h +157 -0
  114. data/ext/clipsruby/factbin.c +447 -0
  115. data/ext/clipsruby/factbin.h +56 -0
  116. data/ext/clipsruby/factbld.c +1035 -0
  117. data/ext/clipsruby/factbld.h +63 -0
  118. data/ext/clipsruby/factcmp.c +386 -0
  119. data/ext/clipsruby/factcmp.h +46 -0
  120. data/ext/clipsruby/factcom.c +759 -0
  121. data/ext/clipsruby/factcom.h +80 -0
  122. data/ext/clipsruby/factfile.c +1761 -0
  123. data/ext/clipsruby/factfile.h +54 -0
  124. data/ext/clipsruby/factfun.c +682 -0
  125. data/ext/clipsruby/factfun.h +77 -0
  126. data/ext/clipsruby/factgen.c +1305 -0
  127. data/ext/clipsruby/factgen.h +229 -0
  128. data/ext/clipsruby/facthsh.c +438 -0
  129. data/ext/clipsruby/facthsh.h +81 -0
  130. data/ext/clipsruby/factlhs.c +250 -0
  131. data/ext/clipsruby/factlhs.h +54 -0
  132. data/ext/clipsruby/factmch.c +905 -0
  133. data/ext/clipsruby/factmch.h +68 -0
  134. data/ext/clipsruby/factmngr.c +3373 -0
  135. data/ext/clipsruby/factmngr.h +325 -0
  136. data/ext/clipsruby/factprt.c +498 -0
  137. data/ext/clipsruby/factprt.h +60 -0
  138. data/ext/clipsruby/factqpsr.c +796 -0
  139. data/ext/clipsruby/factqpsr.h +61 -0
  140. data/ext/clipsruby/factqury.c +1267 -0
  141. data/ext/clipsruby/factqury.h +112 -0
  142. data/ext/clipsruby/factrete.c +978 -0
  143. data/ext/clipsruby/factrete.h +70 -0
  144. data/ext/clipsruby/factrhs.c +667 -0
  145. data/ext/clipsruby/factrhs.h +55 -0
  146. data/ext/clipsruby/filecom.c +353 -0
  147. data/ext/clipsruby/filecom.h +137 -0
  148. data/ext/clipsruby/filertr.c +481 -0
  149. data/ext/clipsruby/filertr.h +94 -0
  150. data/ext/clipsruby/fileutil.c +1020 -0
  151. data/ext/clipsruby/fileutil.h +50 -0
  152. data/ext/clipsruby/generate.c +1079 -0
  153. data/ext/clipsruby/generate.h +57 -0
  154. data/ext/clipsruby/genrcbin.c +902 -0
  155. data/ext/clipsruby/genrcbin.h +69 -0
  156. data/ext/clipsruby/genrccmp.c +640 -0
  157. data/ext/clipsruby/genrccmp.h +59 -0
  158. data/ext/clipsruby/genrccom.c +2017 -0
  159. data/ext/clipsruby/genrccom.h +119 -0
  160. data/ext/clipsruby/genrcexe.c +737 -0
  161. data/ext/clipsruby/genrcexe.h +73 -0
  162. data/ext/clipsruby/genrcfun.c +890 -0
  163. data/ext/clipsruby/genrcfun.h +185 -0
  164. data/ext/clipsruby/genrcpsr.c +1618 -0
  165. data/ext/clipsruby/genrcpsr.h +80 -0
  166. data/ext/clipsruby/globlbin.c +458 -0
  167. data/ext/clipsruby/globlbin.h +71 -0
  168. data/ext/clipsruby/globlbsc.c +361 -0
  169. data/ext/clipsruby/globlbsc.h +83 -0
  170. data/ext/clipsruby/globlcmp.c +330 -0
  171. data/ext/clipsruby/globlcmp.h +52 -0
  172. data/ext/clipsruby/globlcom.c +289 -0
  173. data/ext/clipsruby/globlcom.h +63 -0
  174. data/ext/clipsruby/globldef.c +1087 -0
  175. data/ext/clipsruby/globldef.h +151 -0
  176. data/ext/clipsruby/globlpsr.c +530 -0
  177. data/ext/clipsruby/globlpsr.h +59 -0
  178. data/ext/clipsruby/immthpsr.c +431 -0
  179. data/ext/clipsruby/immthpsr.h +55 -0
  180. data/ext/clipsruby/incrrset.c +530 -0
  181. data/ext/clipsruby/incrrset.h +73 -0
  182. data/ext/clipsruby/inherpsr.c +850 -0
  183. data/ext/clipsruby/inherpsr.h +52 -0
  184. data/ext/clipsruby/inscom.c +2076 -0
  185. data/ext/clipsruby/inscom.h +182 -0
  186. data/ext/clipsruby/insfile.c +1764 -0
  187. data/ext/clipsruby/insfile.h +96 -0
  188. data/ext/clipsruby/insfun.c +1451 -0
  189. data/ext/clipsruby/insfun.h +134 -0
  190. data/ext/clipsruby/insmngr.c +2550 -0
  191. data/ext/clipsruby/insmngr.h +125 -0
  192. data/ext/clipsruby/insmoddp.c +1041 -0
  193. data/ext/clipsruby/insmoddp.h +91 -0
  194. data/ext/clipsruby/insmult.c +804 -0
  195. data/ext/clipsruby/insmult.h +62 -0
  196. data/ext/clipsruby/inspsr.c +602 -0
  197. data/ext/clipsruby/inspsr.h +60 -0
  198. data/ext/clipsruby/insquery.c +1278 -0
  199. data/ext/clipsruby/insquery.h +115 -0
  200. data/ext/clipsruby/insqypsr.c +729 -0
  201. data/ext/clipsruby/insqypsr.h +63 -0
  202. data/ext/clipsruby/iofun.c +2045 -0
  203. data/ext/clipsruby/iofun.h +116 -0
  204. data/ext/clipsruby/lgcldpnd.c +644 -0
  205. data/ext/clipsruby/lgcldpnd.h +75 -0
  206. data/ext/clipsruby/main.c +112 -0
  207. data/ext/clipsruby/match.h +142 -0
  208. data/ext/clipsruby/memalloc.c +481 -0
  209. data/ext/clipsruby/memalloc.h +197 -0
  210. data/ext/clipsruby/miscfun.c +1801 -0
  211. data/ext/clipsruby/miscfun.h +132 -0
  212. data/ext/clipsruby/modulbin.c +607 -0
  213. data/ext/clipsruby/modulbin.h +84 -0
  214. data/ext/clipsruby/modulbsc.c +347 -0
  215. data/ext/clipsruby/modulbsc.h +67 -0
  216. data/ext/clipsruby/modulcmp.c +499 -0
  217. data/ext/clipsruby/modulcmp.h +54 -0
  218. data/ext/clipsruby/moduldef.c +817 -0
  219. data/ext/clipsruby/moduldef.h +271 -0
  220. data/ext/clipsruby/modulpsr.c +1150 -0
  221. data/ext/clipsruby/modulpsr.h +69 -0
  222. data/ext/clipsruby/modulutl.c +1036 -0
  223. data/ext/clipsruby/modulutl.h +84 -0
  224. data/ext/clipsruby/msgcom.c +1221 -0
  225. data/ext/clipsruby/msgcom.h +125 -0
  226. data/ext/clipsruby/msgfun.c +1076 -0
  227. data/ext/clipsruby/msgfun.h +118 -0
  228. data/ext/clipsruby/msgpass.c +1441 -0
  229. data/ext/clipsruby/msgpass.h +103 -0
  230. data/ext/clipsruby/msgpsr.c +698 -0
  231. data/ext/clipsruby/msgpsr.h +73 -0
  232. data/ext/clipsruby/multifld.c +1404 -0
  233. data/ext/clipsruby/multifld.h +130 -0
  234. data/ext/clipsruby/multifun.c +2182 -0
  235. data/ext/clipsruby/multifun.h +102 -0
  236. data/ext/clipsruby/network.h +142 -0
  237. data/ext/clipsruby/objbin.c +1522 -0
  238. data/ext/clipsruby/objbin.h +79 -0
  239. data/ext/clipsruby/objcmp.c +1507 -0
  240. data/ext/clipsruby/objcmp.h +71 -0
  241. data/ext/clipsruby/object.h +260 -0
  242. data/ext/clipsruby/objrtbin.c +701 -0
  243. data/ext/clipsruby/objrtbin.h +79 -0
  244. data/ext/clipsruby/objrtbld.c +2393 -0
  245. data/ext/clipsruby/objrtbld.h +66 -0
  246. data/ext/clipsruby/objrtcmp.c +734 -0
  247. data/ext/clipsruby/objrtcmp.h +66 -0
  248. data/ext/clipsruby/objrtfnx.c +1330 -0
  249. data/ext/clipsruby/objrtfnx.h +222 -0
  250. data/ext/clipsruby/objrtgen.c +736 -0
  251. data/ext/clipsruby/objrtgen.h +63 -0
  252. data/ext/clipsruby/objrtmch.c +1524 -0
  253. data/ext/clipsruby/objrtmch.h +160 -0
  254. data/ext/clipsruby/parsefun.c +415 -0
  255. data/ext/clipsruby/parsefun.h +67 -0
  256. data/ext/clipsruby/pattern.c +1265 -0
  257. data/ext/clipsruby/pattern.h +163 -0
  258. data/ext/clipsruby/pprint.c +328 -0
  259. data/ext/clipsruby/pprint.h +79 -0
  260. data/ext/clipsruby/prccode.c +1478 -0
  261. data/ext/clipsruby/prccode.h +145 -0
  262. data/ext/clipsruby/prcdrfun.c +640 -0
  263. data/ext/clipsruby/prcdrfun.h +95 -0
  264. data/ext/clipsruby/prcdrpsr.c +1068 -0
  265. data/ext/clipsruby/prcdrpsr.h +79 -0
  266. data/ext/clipsruby/prdctfun.c +869 -0
  267. data/ext/clipsruby/prdctfun.h +77 -0
  268. data/ext/clipsruby/prntutil.c +878 -0
  269. data/ext/clipsruby/prntutil.h +125 -0
  270. data/ext/clipsruby/proflfun.c +827 -0
  271. data/ext/clipsruby/proflfun.h +118 -0
  272. data/ext/clipsruby/reorder.c +2082 -0
  273. data/ext/clipsruby/reorder.h +172 -0
  274. data/ext/clipsruby/reteutil.c +1732 -0
  275. data/ext/clipsruby/reteutil.h +111 -0
  276. data/ext/clipsruby/retract.c +710 -0
  277. data/ext/clipsruby/retract.h +74 -0
  278. data/ext/clipsruby/router.c +737 -0
  279. data/ext/clipsruby/router.h +147 -0
  280. data/ext/clipsruby/rulebin.c +1136 -0
  281. data/ext/clipsruby/rulebin.h +153 -0
  282. data/ext/clipsruby/rulebld.c +1328 -0
  283. data/ext/clipsruby/rulebld.h +62 -0
  284. data/ext/clipsruby/rulebsc.c +517 -0
  285. data/ext/clipsruby/rulebsc.h +91 -0
  286. data/ext/clipsruby/rulecmp.c +733 -0
  287. data/ext/clipsruby/rulecmp.h +63 -0
  288. data/ext/clipsruby/rulecom.c +1583 -0
  289. data/ext/clipsruby/rulecom.h +116 -0
  290. data/ext/clipsruby/rulecstr.c +892 -0
  291. data/ext/clipsruby/rulecstr.h +53 -0
  292. data/ext/clipsruby/ruledef.c +559 -0
  293. data/ext/clipsruby/ruledef.h +179 -0
  294. data/ext/clipsruby/ruledlt.c +599 -0
  295. data/ext/clipsruby/ruledlt.h +58 -0
  296. data/ext/clipsruby/rulelhs.c +1216 -0
  297. data/ext/clipsruby/rulelhs.h +52 -0
  298. data/ext/clipsruby/rulepsr.c +1073 -0
  299. data/ext/clipsruby/rulepsr.h +61 -0
  300. data/ext/clipsruby/scanner.c +856 -0
  301. data/ext/clipsruby/scanner.h +112 -0
  302. data/ext/clipsruby/setup.h +488 -0
  303. data/ext/clipsruby/sortfun.c +433 -0
  304. data/ext/clipsruby/sortfun.h +55 -0
  305. data/ext/clipsruby/strngfun.c +1173 -0
  306. data/ext/clipsruby/strngfun.h +96 -0
  307. data/ext/clipsruby/strngrtr.c +523 -0
  308. data/ext/clipsruby/strngrtr.h +97 -0
  309. data/ext/clipsruby/symblbin.c +648 -0
  310. data/ext/clipsruby/symblbin.h +64 -0
  311. data/ext/clipsruby/symblcmp.c +893 -0
  312. data/ext/clipsruby/symblcmp.h +61 -0
  313. data/ext/clipsruby/symbol.c +1961 -0
  314. data/ext/clipsruby/symbol.h +243 -0
  315. data/ext/clipsruby/sysdep.c +894 -0
  316. data/ext/clipsruby/sysdep.h +164 -0
  317. data/ext/clipsruby/textpro.c +1388 -0
  318. data/ext/clipsruby/textpro.h +77 -0
  319. data/ext/clipsruby/tmpltbin.c +609 -0
  320. data/ext/clipsruby/tmpltbin.h +108 -0
  321. data/ext/clipsruby/tmpltbsc.c +327 -0
  322. data/ext/clipsruby/tmpltbsc.h +87 -0
  323. data/ext/clipsruby/tmpltcmp.c +450 -0
  324. data/ext/clipsruby/tmpltcmp.h +57 -0
  325. data/ext/clipsruby/tmpltdef.c +584 -0
  326. data/ext/clipsruby/tmpltdef.h +155 -0
  327. data/ext/clipsruby/tmpltfun.c +2477 -0
  328. data/ext/clipsruby/tmpltfun.h +122 -0
  329. data/ext/clipsruby/tmpltlhs.c +379 -0
  330. data/ext/clipsruby/tmpltlhs.h +50 -0
  331. data/ext/clipsruby/tmpltpsr.c +819 -0
  332. data/ext/clipsruby/tmpltpsr.h +59 -0
  333. data/ext/clipsruby/tmpltrhs.c +595 -0
  334. data/ext/clipsruby/tmpltrhs.h +55 -0
  335. data/ext/clipsruby/tmpltutl.c +637 -0
  336. data/ext/clipsruby/tmpltutl.h +82 -0
  337. data/ext/clipsruby/userdata.c +156 -0
  338. data/ext/clipsruby/userdata.h +72 -0
  339. data/ext/clipsruby/userfunctions.c +70 -0
  340. data/ext/clipsruby/usrsetup.h +7 -0
  341. data/ext/clipsruby/utility.c +1594 -0
  342. data/ext/clipsruby/utility.h +250 -0
  343. data/ext/clipsruby/watch.c +865 -0
  344. data/ext/clipsruby/watch.h +124 -0
  345. data/lib/clipsruby.rb +1 -0
  346. metadata +388 -0
@@ -0,0 +1,530 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/11/16 */
5
+ /* */
6
+ /* INCREMENTAL RESET MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functionality for the incremental */
11
+ /* reset of the pattern and join networks when a new */
12
+ /* rule is added. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
22
+ /* */
23
+ /* 6.24: Removed INCREMENTAL_RESET compilation flag. */
24
+ /* */
25
+ /* Renamed BOOLEAN macro type to intBool. */
26
+ /* */
27
+ /* 6.30: Added support for hashed alpha memories and */
28
+ /* other join network changes. */
29
+ /* */
30
+ /* Removed conditional code for unsupported */
31
+ /* compilers/operating systems (IBM_MCW and */
32
+ /* MAC_MCW). */
33
+ /* */
34
+ /* Modified EnvSetIncrementalReset to check for */
35
+ /* the existance of rules. */
36
+ /* */
37
+ /* Converted API macros to function calls. */
38
+ /* */
39
+ /* 6.31: Fix for slow incremental reset of rule with */
40
+ /* several dozen nand joins. */
41
+ /* */
42
+ /* 6.40: Added Env prefix to GetEvaluationError and */
43
+ /* SetEvaluationError functions. */
44
+ /* */
45
+ /* Pragma once and other inclusion changes. */
46
+ /* */
47
+ /* Added support for booleans with <stdbool.h>. */
48
+ /* */
49
+ /* Removed use of void pointers for specific */
50
+ /* data structures. */
51
+ /* */
52
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
53
+ /* */
54
+ /* Incremental reset is always enabled. */
55
+ /* */
56
+ /*************************************************************/
57
+
58
+ #include "setup.h"
59
+
60
+ #include <stdio.h>
61
+
62
+ #if DEFRULE_CONSTRUCT
63
+
64
+ #include "agenda.h"
65
+ #include "argacces.h"
66
+ #include "constant.h"
67
+ #include "drive.h"
68
+ #include "engine.h"
69
+ #include "envrnmnt.h"
70
+ #include "evaluatn.h"
71
+ #include "pattern.h"
72
+ #include "router.h"
73
+ #include "reteutil.h"
74
+
75
+ #include "incrrset.h"
76
+
77
+ /***************************************/
78
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
79
+ /***************************************/
80
+
81
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
82
+ static void MarkNetworkForIncrementalReset(Environment *,Defrule *,bool);
83
+ static void MarkJoinsForIncrementalReset(Environment *,struct joinNode *,bool);
84
+ static void CheckForPrimableJoins(Environment *,Defrule *,struct joinNode *);
85
+ static void PrimeJoinFromLeftMemory(Environment *,struct joinNode *);
86
+ static void PrimeJoinFromRightMemory(Environment *,struct joinNode *);
87
+ static void MarkPatternForIncrementalReset(Environment *,unsigned short,
88
+ struct patternNodeHeader *,bool);
89
+ #endif
90
+
91
+ /**************************************************************/
92
+ /* IncrementalReset: Incrementally resets the specified rule. */
93
+ /**************************************************************/
94
+ void IncrementalReset(
95
+ Environment *theEnv,
96
+ Defrule *tempRule)
97
+ {
98
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
99
+ Defrule *tempPtr;
100
+ struct patternParser *theParser;
101
+
102
+ /*=====================================================*/
103
+ /* Mark the pattern and join network data structures */
104
+ /* associated with the rule being incrementally reset. */
105
+ /*=====================================================*/
106
+
107
+ MarkNetworkForIncrementalReset(theEnv,tempRule,true);
108
+
109
+ /*==========================*/
110
+ /* Begin incremental reset. */
111
+ /*==========================*/
112
+
113
+ EngineData(theEnv)->IncrementalResetInProgress = true;
114
+
115
+ /*============================================================*/
116
+ /* If the new rule shares patterns or joins with other rules, */
117
+ /* then it is necessary to update its join network based on */
118
+ /* existing partial matches it shares with other rules. */
119
+ /*============================================================*/
120
+
121
+ for (tempPtr = tempRule;
122
+ tempPtr != NULL;
123
+ tempPtr = tempPtr->disjunct)
124
+ { CheckForPrimableJoins(theEnv,tempPtr,tempPtr->lastJoin); }
125
+
126
+ /*===============================================*/
127
+ /* Filter existing data entities through the new */
128
+ /* portions of the pattern and join networks. */
129
+ /*===============================================*/
130
+
131
+ for (theParser = PatternData(theEnv)->ListOfPatternParsers;
132
+ theParser != NULL;
133
+ theParser = theParser->next)
134
+ {
135
+ if (theParser->incrementalResetFunction != NULL)
136
+ { (*theParser->incrementalResetFunction)(theEnv); }
137
+ }
138
+
139
+ /*========================*/
140
+ /* End incremental reset. */
141
+ /*========================*/
142
+
143
+ EngineData(theEnv)->IncrementalResetInProgress = false;
144
+
145
+ /*====================================================*/
146
+ /* Remove the marks in the pattern and join networks. */
147
+ /*====================================================*/
148
+
149
+ MarkNetworkForIncrementalReset(theEnv,tempRule,false);
150
+ #endif
151
+ }
152
+
153
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
154
+
155
+ /**********************************************************************/
156
+ /* MarkNetworkForIncrementalReset: Coordinates marking the initialize */
157
+ /* flags in the pattern and join networks both before and after an */
158
+ /* incremental reset. */
159
+ /**********************************************************************/
160
+ static void MarkNetworkForIncrementalReset(
161
+ Environment *theEnv,
162
+ Defrule *tempRule,
163
+ bool value)
164
+ {
165
+ /*============================================*/
166
+ /* Loop through each of the rule's disjuncts. */
167
+ /*============================================*/
168
+
169
+ for (;
170
+ tempRule != NULL;
171
+ tempRule = tempRule->disjunct)
172
+ { MarkJoinsForIncrementalReset(theEnv,tempRule->lastJoin,value); }
173
+ }
174
+
175
+ /**********************************************************************/
176
+ /* MarkJoinsForIncrementalReset: Coordinates marking the initialize */
177
+ /* flags in the pattern and join networks both before and after an */
178
+ /* incremental reset. */
179
+ /**********************************************************************/
180
+ static void MarkJoinsForIncrementalReset(
181
+ Environment *theEnv,
182
+ struct joinNode *joinPtr,
183
+ bool value)
184
+ {
185
+ struct patternNodeHeader *patternPtr;
186
+
187
+ for (;
188
+ joinPtr != NULL;
189
+ joinPtr = GetPreviousJoin(joinPtr))
190
+ {
191
+ if (joinPtr->ruleToActivate != NULL)
192
+ {
193
+ joinPtr->marked = false;
194
+ joinPtr->initialize = value;
195
+ continue;
196
+ }
197
+
198
+ //if (joinPtr->joinFromTheRight)
199
+ // { MarkJoinsForIncrementalReset(theEnv,(struct joinNode *) joinPtr->rightSideEntryStructure,value); }
200
+
201
+ /*================*/
202
+ /* Mark the join. */
203
+ /*================*/
204
+
205
+ joinPtr->marked = false; /* GDR 6.05 */
206
+
207
+ if (joinPtr->initialize)
208
+ {
209
+ joinPtr->initialize = value;
210
+ if (joinPtr->joinFromTheRight == false)
211
+ {
212
+ patternPtr = (struct patternNodeHeader *) GetPatternForJoin(joinPtr);
213
+ if (patternPtr != NULL)
214
+ { MarkPatternForIncrementalReset(theEnv,joinPtr->rhsType,patternPtr,value); }
215
+ }
216
+ }
217
+ }
218
+ }
219
+
220
+ /*******************************************************************************/
221
+ /* CheckForPrimableJoins: Updates the joins of a rule for an incremental reset */
222
+ /* if portions of that rule are shared with other rules that have already */
223
+ /* been incrementally reset. A join for a new rule will be updated if it is */
224
+ /* marked for initialization and either its parent join or its associated */
225
+ /* entry pattern node has not been marked for initialization. The function */
226
+ /* PrimeJoin is used to update joins which meet these criteria. */
227
+ /*******************************************************************************/
228
+ static void CheckForPrimableJoins(
229
+ Environment *theEnv,
230
+ Defrule *tempRule,
231
+ struct joinNode *joinPtr)
232
+ {
233
+ /*========================================*/
234
+ /* Loop through each of the rule's joins. */
235
+ /*========================================*/
236
+
237
+ for (;
238
+ joinPtr != NULL;
239
+ joinPtr = GetPreviousJoin(joinPtr))
240
+ {
241
+ /*===============================*/
242
+ /* Update the join if necessary. */
243
+ /*===============================*/
244
+
245
+ if ((joinPtr->initialize) && (! joinPtr->marked))
246
+ {
247
+ if (joinPtr->firstJoin == true)
248
+ {
249
+ if (joinPtr->joinFromTheRight == false)
250
+ {
251
+ if ((joinPtr->rightSideEntryStructure == NULL) ||
252
+ (joinPtr->patternIsNegated) ||
253
+ (((struct patternNodeHeader *) joinPtr->rightSideEntryStructure)->initialize == false))
254
+ {
255
+ PrimeJoinFromLeftMemory(theEnv,joinPtr);
256
+ joinPtr->marked = true;
257
+ }
258
+ }
259
+ else
260
+ {
261
+ PrimeJoinFromRightMemory(theEnv,joinPtr);
262
+ joinPtr->marked = true;
263
+ }
264
+ }
265
+ else if (joinPtr->lastLevel->initialize == false)
266
+ {
267
+ PrimeJoinFromLeftMemory(theEnv,joinPtr);
268
+ joinPtr->marked = true;
269
+ }
270
+ else if ((joinPtr->joinFromTheRight) &&
271
+ (((struct joinNode *) joinPtr->rightSideEntryStructure)->initialize == false))
272
+ {
273
+ PrimeJoinFromRightMemory(theEnv,joinPtr);
274
+ joinPtr->marked = true;
275
+ }
276
+ }
277
+
278
+ //if (joinPtr->joinFromTheRight)
279
+ // { CheckForPrimableJoins(theEnv,tempRule,(struct joinNode *) joinPtr->rightSideEntryStructure); }
280
+ }
281
+ }
282
+
283
+ /****************************************************************************/
284
+ /* PrimeJoinFromLeftMemory: Updates a join in a rule for an incremental */
285
+ /* reset. Joins are updated by "priming" them only if the join (or its */
286
+ /* associated pattern) is shared with other rules that have already been */
287
+ /* incrementally reset. A join for a new rule will be updated if it is */
288
+ /* marked for initialization and either its parent join or its associated */
289
+ /* entry pattern node has not been marked for initialization. */
290
+ /****************************************************************************/
291
+ static void PrimeJoinFromLeftMemory(
292
+ Environment *theEnv,
293
+ struct joinNode *joinPtr)
294
+ {
295
+ struct partialMatch *theList, *linker;
296
+ struct alphaMemoryHash *listOfHashNodes;
297
+ unsigned long b;
298
+ unsigned long hashValue;
299
+ struct betaMemory *theMemory;
300
+ struct partialMatch *notParent;
301
+ struct joinLink *tempLink;
302
+
303
+ /*===========================================================*/
304
+ /* If the join is the first join of a rule, then send all of */
305
+ /* the partial matches from the alpha memory of the pattern */
306
+ /* associated with this join to the join for processing and */
307
+ /* the priming process is then complete. */
308
+ /*===========================================================*/
309
+
310
+ if (joinPtr->firstJoin == true)
311
+ {
312
+ if (joinPtr->rightSideEntryStructure == NULL)
313
+ { NetworkAssert(theEnv,joinPtr->rightMemory->beta[0],joinPtr); }
314
+ else if (joinPtr->patternIsNegated)
315
+ {
316
+ notParent = joinPtr->leftMemory->beta[0];
317
+
318
+ if (joinPtr->secondaryNetworkTest != NULL)
319
+ {
320
+ if (EvaluateSecondaryNetworkTest(theEnv,notParent,joinPtr) == false)
321
+ { return; }
322
+ }
323
+
324
+ for (listOfHashNodes = ((struct patternNodeHeader *) joinPtr->rightSideEntryStructure)->firstHash;
325
+ listOfHashNodes != NULL;
326
+ listOfHashNodes = listOfHashNodes->nextHash)
327
+ {
328
+ if (listOfHashNodes->alphaMemory != NULL)
329
+ {
330
+ AddBlockedLink(notParent,listOfHashNodes->alphaMemory);
331
+ return;
332
+ }
333
+ }
334
+
335
+ EPMDrive(theEnv,notParent,joinPtr,NETWORK_ASSERT);
336
+ }
337
+ else
338
+ {
339
+ for (listOfHashNodes = ((struct patternNodeHeader *) joinPtr->rightSideEntryStructure)->firstHash;
340
+ listOfHashNodes != NULL;
341
+ listOfHashNodes = listOfHashNodes->nextHash)
342
+ {
343
+ for (theList = listOfHashNodes->alphaMemory;
344
+ theList != NULL;
345
+ theList = theList->nextInMemory)
346
+ { NetworkAssert(theEnv,theList,joinPtr); }
347
+ }
348
+ }
349
+ return;
350
+ }
351
+
352
+ /*========================================*/
353
+ /* Find another beta memory from which we */
354
+ /* can retrieve the partial matches. */
355
+ /*========================================*/
356
+
357
+ tempLink = joinPtr->lastLevel->nextLinks;
358
+
359
+ while (tempLink != NULL)
360
+ {
361
+ if ((tempLink->join != joinPtr) &&
362
+ (tempLink->join->initialize == false))
363
+ { break; }
364
+
365
+ tempLink = tempLink->next;
366
+ }
367
+
368
+ if (tempLink == NULL) return;
369
+
370
+ if (tempLink->enterDirection == LHS)
371
+ { theMemory = tempLink->join->leftMemory; }
372
+ else
373
+ { theMemory = tempLink->join->rightMemory; }
374
+
375
+ /*============================================*/
376
+ /* Send all partial matches from the selected */
377
+ /* beta memory to the new join. */
378
+ /*============================================*/
379
+
380
+ for (b = 0; b < theMemory->size; b++)
381
+ {
382
+ for (theList = theMemory->beta[b];
383
+ theList != NULL;
384
+ theList = theList->nextInMemory)
385
+ {
386
+ linker = CopyPartialMatch(theEnv,theList);
387
+
388
+ if (joinPtr->leftHash != NULL)
389
+ { hashValue = BetaMemoryHashValue(theEnv,joinPtr->leftHash,linker,NULL,joinPtr); }
390
+ else
391
+ { hashValue = 0; }
392
+
393
+ UpdateBetaPMLinks(theEnv,linker,theList->leftParent,theList->rightParent,joinPtr,hashValue,LHS);
394
+
395
+ NetworkAssertLeft(theEnv,linker,joinPtr,NETWORK_ASSERT);
396
+ }
397
+ }
398
+ }
399
+
400
+ /****************************************************************************/
401
+ /* PrimeJoinFromRightMemory: Updates a join in a rule for an incremental */
402
+ /* reset. Joins are updated by "priming" them only if the join (or its */
403
+ /* associated pattern) is shared with other rules that have already been */
404
+ /* incrementally reset. A join for a new rule will be updated if it is */
405
+ /* marked for initialization and either its parent join or its associated */
406
+ /* entry pattern node has not been marked for initialization. */
407
+ /****************************************************************************/
408
+ static void PrimeJoinFromRightMemory(
409
+ Environment *theEnv,
410
+ struct joinNode *joinPtr)
411
+ {
412
+ struct partialMatch *theList, *linker;
413
+ unsigned long b;
414
+ struct betaMemory *theMemory;
415
+ unsigned long hashValue;
416
+ struct joinLink *tempLink;
417
+ struct partialMatch *notParent;
418
+
419
+ /*=======================================*/
420
+ /* This should be a join from the right. */
421
+ /*=======================================*/
422
+
423
+ if (joinPtr->joinFromTheRight == false)
424
+ { return; }
425
+
426
+ /*========================================*/
427
+ /* Find another beta memory from which we */
428
+ /* can retrieve the partial matches. */
429
+ /*========================================*/
430
+
431
+ tempLink = ((struct joinNode *) joinPtr->rightSideEntryStructure)->nextLinks;
432
+ while (tempLink != NULL)
433
+ {
434
+ if ((tempLink->join != joinPtr) &&
435
+ (tempLink->join->initialize == false))
436
+ { break; }
437
+
438
+ tempLink = tempLink->next;
439
+ }
440
+
441
+ if (tempLink == NULL)
442
+ {
443
+ if (joinPtr->firstJoin &&
444
+ (joinPtr->rightMemory->beta[0] == NULL) &&
445
+ (! joinPtr->patternIsExists))
446
+ {
447
+ notParent = joinPtr->leftMemory->beta[0];
448
+
449
+ if (joinPtr->secondaryNetworkTest != NULL)
450
+ {
451
+ if (EvaluateSecondaryNetworkTest(theEnv,notParent,joinPtr) == false)
452
+ { return; }
453
+ }
454
+
455
+ EPMDrive(theEnv,notParent,joinPtr,NETWORK_ASSERT);
456
+ }
457
+
458
+ return;
459
+ }
460
+
461
+ if (tempLink->enterDirection == LHS)
462
+ { theMemory = tempLink->join->leftMemory; }
463
+ else
464
+ { theMemory = tempLink->join->rightMemory; }
465
+
466
+ /*============================================*/
467
+ /* Send all partial matches from the selected */
468
+ /* beta memory to the new join. */
469
+ /*============================================*/
470
+
471
+ for (b = 0; b < theMemory->size; b++)
472
+ {
473
+ for (theList = theMemory->beta[b];
474
+ theList != NULL;
475
+ theList = theList->nextInMemory)
476
+ {
477
+ linker = CopyPartialMatch(theEnv,theList);
478
+
479
+ if (joinPtr->rightHash != NULL)
480
+ { hashValue = BetaMemoryHashValue(theEnv,joinPtr->rightHash,linker,NULL,joinPtr); }
481
+ else
482
+ { hashValue = 0; }
483
+
484
+ UpdateBetaPMLinks(theEnv,linker,theList->leftParent,theList->rightParent,joinPtr,hashValue,RHS);
485
+ NetworkAssert(theEnv,linker,joinPtr);
486
+ }
487
+ }
488
+
489
+ if (joinPtr->firstJoin &&
490
+ (joinPtr->rightMemory->beta[0] == NULL) &&
491
+ (! joinPtr->patternIsExists))
492
+ {
493
+ notParent = joinPtr->leftMemory->beta[0];
494
+
495
+ if (joinPtr->secondaryNetworkTest != NULL)
496
+ {
497
+ if (EvaluateSecondaryNetworkTest(theEnv,notParent,joinPtr) == false)
498
+ { return; }
499
+ }
500
+
501
+ EPMDrive(theEnv,notParent,joinPtr,NETWORK_ASSERT);
502
+ }
503
+ }
504
+
505
+ /*********************************************************************/
506
+ /* MarkPatternForIncrementalReset: Given a pattern node and its type */
507
+ /* (fact, instance, etc.), calls the appropriate function to mark */
508
+ /* the pattern for an incremental reset. Used to mark the pattern */
509
+ /* nodes both before and after an incremental reset. */
510
+ /*********************************************************************/
511
+ static void MarkPatternForIncrementalReset(
512
+ Environment *theEnv,
513
+ unsigned short rhsType,
514
+ struct patternNodeHeader *theHeader,
515
+ bool value)
516
+ {
517
+ struct patternParser *tempParser;
518
+
519
+ tempParser = GetPatternParser(theEnv,rhsType);
520
+
521
+ if (tempParser != NULL)
522
+ {
523
+ if (tempParser->markIRPatternFunction != NULL)
524
+ { (*tempParser->markIRPatternFunction)(theEnv,theHeader,value); }
525
+ }
526
+ }
527
+
528
+ #endif
529
+
530
+ #endif /* DEFRULE_CONSTRUCT */
@@ -0,0 +1,73 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/11/16 */
5
+ /* */
6
+ /* INCREMENTAL RESET HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functionality for the incremental */
11
+ /* reset of the pattern and join networks when a new */
12
+ /* rule is added. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
22
+ /* */
23
+ /* 6.24: Removed INCREMENTAL_RESET compilation flag. */
24
+ /* */
25
+ /* Renamed BOOLEAN macro type to intBool. */
26
+ /* */
27
+ /* 6.30: Added support for hashed alpha memories and */
28
+ /* other join network changes. */
29
+ /* */
30
+ /* Removed conditional code for unsupported */
31
+ /* compilers/operating systems (IBM_MCW and */
32
+ /* MAC_MCW). */
33
+ /* */
34
+ /* Modified EnvSetIncrementalReset to check for */
35
+ /* the existance of rules. */
36
+ /* */
37
+ /* Converted API macros to function calls. */
38
+ /* */
39
+ /* 6.40: Removed LOCALE definition. */
40
+ /* */
41
+ /* Pragma once and other inclusion changes. */
42
+ /* */
43
+ /* Added support for booleans with <stdbool.h>. */
44
+ /* */
45
+ /* Removed use of void pointers for specific */
46
+ /* data structures. */
47
+ /* */
48
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
49
+ /* */
50
+ /* Incremental reset is always enabled. */
51
+ /* */
52
+ /*************************************************************/
53
+
54
+ #ifndef _H_incrrset
55
+
56
+ #pragma once
57
+
58
+ #define _H_incrrset
59
+
60
+ #include "ruledef.h"
61
+
62
+ void IncrementalReset(Environment *,Defrule *);
63
+
64
+ #endif /* _H_incrrset */
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+