(ns knn.op)

Addition of two vectors

(defn add
  [first-vector second-vector]
  (map + first-vector second-vector))

Subtraction of two vectors

(defn subtract
  [first-vector second-vector]
  (map - first-vector second-vector))

Multiplication of two vectors element-wise

(defn mult
  [first-vector second-vector]
  (map * first-vector second-vector))

Division of two vectors element-wise

(defn div
  [first-vector second-vector]
  (map / first-vector second-vector))

Dot product of two vectors

(defn dot
  [first-vector second-vector]
  (reduce + (map * first-vector second-vector)))

Add a scalar to a vector

(defn scalar-add
  [v scalar]
  (map #(+ scalar %) v))

Subtract a scalar from a vector

(defn scalar-subtract
  [v scalar]
  (map #(- % scalar) v))

Multiply a scalar with a vector by element-wise

(defn scalar-mult
  [v scalar]
  (map #(* scalar %) v))

Divide a scalar with a vector by element-wise

(defn scalar-div
  [v scalar]
  (map #(/ % scalar) v))

Clamp the vector between minimum and maximum values

(defn clamp
  [cmin cmax v]
  (map #(max cmin (min cmax %)) v))

Mean of a vector

(defn mean
  [v]
  (/ (reduce + v) (count v)))

Moving average of a vector for a given window

(defn moving-average
  [v window] (map mean (partition window 1 v)))

Returns element-wise squared version of the vector

(defn squared
  [v]
  (map #(* % %) v))

Element-wise absolute operation to a vector

(defn abs
  [v]
  (map #(Math/abs %) v))

Element-wise power operation to a vector

(defn pow
  [v scalar]
  (map #(Math/pow % scalar) v))