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

actions

Scheduled actions with helper functions

betanode

The nodes module contains the Alpha and Beta network nodes, and holds the bulk of the process logic.

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.

datastructs

Generic Datastructures

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.

nodes

The nodes module contains the code for Alpha and Betanodes

predicates
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.

traits

Some generic traits for thealpha and betanetwork are defined here.