Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns finger-tree-stats
- (:use [clojure.data.finger-tree]))
- (defrecord stats [^double number ^double mean ^double variance])
- (def null-stats (stats. 0 0 Double/NaN))
- (defn make-stats
- [^double x]
- (stats. 1 x 0))
- (defn combine-stats
- [nmv1 nmv2]
- (let [{n1 :number m1 :mean v1 :variance} nmv1
- {n2 :number m2 :mean v2 :variance} nmv2]
- (cond
- (== n2 0) nmv1
- (== n1 0) nmv2
- :else
- (let [delta (- m2 m1)]
- (stats.
- (+ n1 n2)
- (/ (+ (* n1 m1) (* n2 m2)) (+ n1 n2))
- (+ v1 v2 (/ (* delta delta n1 n2) (+ n1 n2))))))))
- (def empty-stats-tree (finger-tree (meter make-stats null-stats combine-stats)))
- ; test
- (def st (into empty-stats-tree [9.0 3.0 4.0 5.0 1.0 1.0 1.0 0.0 99.0 99.0]))
- (println st)
- (println (measured st))
- (println (measured (pop (rest st))))
Add Comment
Please, Sign In to add comment