[−][src]Crate phreak_engine
The Phreak algorithm is a Rule matching algorithm, based upon the Rete algorithm, as described in the paper "Production Matching for Large Learning Systems" by Robert B. Doorenbos, January 31, 1995, CMU-CS-95-113
The algorithm is used to match facts against a number of rules to see if any combination triggers the rule. A rule is called a production, and when a combination of facts matches the rule, it is called an activation.
The phreak algorithm is implemented by the Drools project. We are not trying to create a java to rust port, but instead we are building an algorithm from scratch with the ideas from the Drools documentation.
We aim to use only safe rust code.
We are trying to obtain a good performance by focusing on the following concepts:
-
Lazy evaluation
The fasted code is code you don't execute.
-
Cache friendly evaluation
By grouping data evaluation, we try to optimize cache usage for the CPU.
-
Minimize data allocations
Allocations are slow, so they should be avoided. We use the rust ownership model to safely pass around data instead of passing on copies.
Re-exports
pub use crate::core::Phreak; |
Modules
condition | The conditions module holds the structures for composing a low level rule definition |
core | The core module contains the main api of the phreak algorithm, as well as the central data storage. |
jointest | The jointest module contains the logic for performing test evaluation. Whenever two facts need to be compared, we say that they are joined if the tests for this combination of facts succeeds. |
memory | The memory module contains structures for storing information about the execution of the rules. We have Memory structures that represent the information about a field, and Work Memory Entities that store information about a matching fact. |
multiset | Multiset is used as a set with multiple occurances of items. |
nodes | The nodes module contains the Alpha and Beta network nodes, and holds the bulk of the process logic. |
segment | The segments module contains a structure for independent network segments. Segments are independent if none of the nodes in the segment are shared with an other segment. |