[][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.