122 |
123 |
124 |

125 |
126 |
127 | {{content|safe}}
128 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/src/bench/com/yetanalytics/xapipe/bench/maths.clj:
--------------------------------------------------------------------------------
1 | (ns com.yetanalytics.xapipe.bench.maths
2 | (:require [clojure.spec.alpha :as s]
3 | [clojure.spec.gen.alpha :as sgen]
4 | [clojure.set :as cset]))
5 |
6 | ;; Origninally Cribbed from Avery and Jean
7 | ;; https://github.com/clojure-cookbook/clojure-cookbook/blob/master/01_primitive-data/1-20_simple-statistics.asciidoc
8 |
9 | (defn mean ^Double [coll]
10 | (let [[sum count] (reduce (fn [[s c] x]
11 | [(+ s x) (inc c)])
12 | [0.0 0]
13 | coll)]
14 | (if (pos? count)
15 | (double (/ sum count))
16 | 0.0)))
17 |
18 | (s/fdef mean
19 | :args (s/cat :coll (s/coll-of number?))
20 | :ret double?)
21 |
22 | (defn median ^Double [coll]
23 | (let [sorted (sort coll)
24 | cnt (count sorted)]
25 | (when (< 0 cnt)
26 | (let [halfway (quot cnt 2)]
27 | (double (if (odd? cnt)
28 | (nth sorted halfway)
29 | (let [bottom (dec halfway)
30 | bottom-val (nth sorted bottom)
31 | top-val (nth sorted halfway)]
32 | (mean [bottom-val top-val]))))))))
33 |
34 | (s/fdef median
35 | :args (s/cat :coll (s/coll-of number?))
36 | :ret (s/nilable double?))
37 |
38 | (defn mode [coll]
39 | (if-let [coll (not-empty coll)]
40 | (let [freqs (frequencies coll)
41 | occurrences (group-by val freqs)
42 | modes (last (sort occurrences))
43 | modes (->> modes
44 | val
45 | (map key))]
46 | modes)
47 | (list)))
48 |
49 | (s/fdef mode
50 | :args (s/cat :coll (s/coll-of any?))
51 | :ret (s/coll-of any?)
52 | :fn (fn [{{:keys [coll]} :args
53 | ret :ret}]
54 | (cond
55 | (= 1 (count coll))
56 | (= coll ret)
57 |
58 | (seq coll)
59 | (not-empty (cset/intersection
60 | (set ret)
61 | (set coll)))
62 |
63 | (empty? coll)
64 | (empty? ret)
65 | :else (println coll ret))))
66 |
67 |
68 | (defn stddev ^Double [coll & {:keys [complete-population?]
69 | :or {complete-population? false}}]
70 | (let [total (count coll)]
71 | (if (< 1 total)
72 | (let [avg (mean coll)
73 | squares (for [x coll]
74 | (let [x-avg (- x avg)]
75 | (* x-avg x-avg)))]
76 | (double
77 | (-> (/ (apply + squares)
78 | (if complete-population?
79 | total
80 | (- total 1)))
81 | (Math/sqrt))))
82 | 0.0)))
83 |
84 | (s/def ::complete-population?
85 | boolean?)
86 |
87 | (s/fdef stddev
88 | :args (s/cat :coll (s/coll-of number?)
89 | :kwargs (s/? (s/keys* :opt-un [::complete-population?])))
90 | :ret double?)
91 |
--------------------------------------------------------------------------------
/src/build/com/yetanalytics/xapipe/build.clj:
--------------------------------------------------------------------------------
1 | (ns com.yetanalytics.xapipe.build
2 | (:require [clojure.tools.build.api :as b]))
3 |
4 | (def lib 'com.yetanalytics/xapipe)
5 |
6 | (def class-dir "target/classes")
7 |
8 | (def basis
9 | (b/create-basis
10 | {:project "deps.edn"
11 | :aliases [:cli]}))
12 |
13 | (def uber-file (format "target/bundle/%s.jar" (name lib)))
14 |
15 | (defn uber [_]
16 | (b/copy-dir {:src-dirs ["src/lib" "src/cli" "resources"]
17 | :target-dir class-dir})
18 | (b/compile-clj {:basis basis
19 | :src-dirs ["src/lib" "src/cli"]
20 | :class-dir class-dir})
21 | (b/uber {:class-dir class-dir
22 | :uber-file uber-file
23 | :basis basis
24 | :main 'com.yetanalytics.xapipe.main}))
25 |
--------------------------------------------------------------------------------
/src/cli/com/yetanalytics/xapipe/main.clj:
--------------------------------------------------------------------------------
1 | (ns com.yetanalytics.xapipe.main
2 | (:require [clojure.spec.alpha :as s]
3 | [clojure.tools.logging :as log]
4 | [com.yetanalytics.xapipe.cli :as cli]
5 | [com.yetanalytics.xapipe.cli.options :as opts]
6 | [com.yetanalytics.xapipe.job :as job]
7 | [com.yetanalytics.xapipe.job.json :as jj]
8 | [com.yetanalytics.xapipe.job.state :as state]
9 | [com.yetanalytics.xapipe.store :as store])
10 | (:gen-class))
11 |
12 | (def usage
13 | "
14 | Run a new job:
15 | --source-url http://0.0.0.0:8080/xapi --target-url http://0.0.0.0:8081/xapi
16 |
17 | Resume a paused job:
18 | --job-id