Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Clone this wiki locally
Clara's accumulators are designed to compute a summary over a collection of matched facts. Examples include:
- Identifying the minimum or maximum of a value
- Performing a summarization, such as an average or histogram
- Perform some arbitrary transformation or selection of data for a domain-specific need.
Accumulators are implemented using Clojure's reducers library. An accumulator is defined by four parts:
- reduce-fn - A reduce function, in the style of clojure.core.reducers, which reduces a collection of values into a single output
- combine-fn - A combine function, in the style of clojure.core.reducers, which combines the outputs of two reduce-fn operations into a new, single output.
- initial-value - an optional parameter that will be passed to the reduce-fn if provided
- retract-fn - An optional function that accepts a previously reduced output and a fact, and returns a new reduced output with the given fact retracted.
- convert-return-fn - an operation that performs some conversion on the reduce/combine value before returning it to the caller
Accumulators can be created with the accumulate function in the clara.rules namespace. A set of common accumulators is also pre-defined for convenience.
Here's an example of an accumulator in action:
;; Creates an accumulator that selects the item with the newest timestamp field. (def newest-temp (acc/max :timestamp :returns-fact true)) (defrule get-current-temperature [?current-temp <- newest-temp :from [Temperature (== ?location location)]] => ; Do something. )
- Common accumulators pre-defined in Clara.