Guest User

Untitled

a guest
Jun 21st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.80 KB | None | 0 0
  1. (ns finger-tree-stats
  2. (:use [clojure.data.finger-tree]))
  3.  
  4. (defrecord stats [^double number ^double mean ^double variance])
  5.  
  6. (def null-stats (stats. 0 0 Double/NaN))
  7.  
  8. (defn make-stats
  9. [^double x]
  10. (stats. 1 x 0))
  11.  
  12. (defn combine-stats
  13. [nmv1 nmv2]
  14. (let [{n1 :number m1 :mean v1 :variance} nmv1
  15. {n2 :number m2 :mean v2 :variance} nmv2]
  16. (cond
  17. (== n2 0) nmv1
  18. (== n1 0) nmv2
  19. :else
  20. (let [delta (- m2 m1)]
  21. (stats.
  22. (+ n1 n2)
  23. (/ (+ (* n1 m1) (* n2 m2)) (+ n1 n2))
  24. (+ v1 v2 (/ (* delta delta n1 n2) (+ n1 n2))))))))
  25.  
  26. (def empty-stats-tree (finger-tree (meter make-stats null-stats combine-stats)))
  27.  
  28. ; test
  29.  
  30. (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]))
  31.  
  32. (println st)
  33. (println (measured st))
  34. (println (measured (pop (rest st))))
Add Comment
Please, Sign In to add comment