-
Notifications
You must be signed in to change notification settings - Fork 115
Accumulators
Baptiste Fontaine edited this page Feb 1, 2018
·
5 revisions
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.