Files
df-research/tech.ml.dataset/src/tech/v3/dataset/reductions/impl.clj
2026-02-08 11:20:43 -10:00

64 lines
2.5 KiB
Clojure
Vendored

(ns tech.v3.dataset.reductions.impl
"Helper namespace to help make reductions.clj more understandable."
(:require [tech.v3.datatype.casting :as casting]
[tech.v3.datatype :as dtype]
[tech.v3.dataset.protocols :as ds-proto]
[tech.v3.dataset.base :as ds-base]
[ham-fisted.api :as hamf]
[ham-fisted.reduce :as hamf-rf]
[ham-fisted.protocols :as hamf-proto])
(:import [clojure.lang IFn$OLO IFn$ODO]
[ham_fisted Transformables]))
(set! *warn-on-reflection* true)
(set! *unchecked-math* :warn-on-boxed)
(defn reducer->column-reducer
([reducer cname]
(reducer->column-reducer reducer nil cname))
([reducer op-space cname]
(let [merge-fn (hamf-proto/->merge-fn reducer)]
(reify
ds-proto/PDatasetReducer
(ds->reducer [this ds]
(let [rfn (hamf-proto/->rfn reducer)
op-space (or op-space
(cond
(instance? IFn$OLO rfn) :int64
(instance? IFn$ODO rfn) :float64
:else
:object))
col (dtype/->reader (ds-base/column ds cname) op-space)
init-fn (hamf-proto/->init-val-fn reducer)]
(case (casting/simple-operation-space op-space)
:int64
(let [rfn (Transformables/toLongReductionFn rfn)]
(reify
hamf-proto/Reducer
(->init-val-fn [r] init-fn)
(->rfn [r] (hamf-rf/long-accumulator
acc v (.invokePrim rfn acc (.readLong col v))))
hamf-proto/ParallelReducer
(->merge-fn [r] merge-fn)))
:float64
(let [rfn (Transformables/toDoubleReductionFn rfn)]
(reify
hamf-proto/Reducer
(->init-val-fn [r] init-fn)
(->rfn [r] (hamf-rf/long-accumulator
acc v (.invokePrim rfn acc (.readDouble col v))))
hamf-proto/ParallelReducer
(->merge-fn [r] merge-fn)))
(reify
hamf-proto/Reducer
(->init-val-fn [r] init-fn)
(->rfn [r] (hamf-rf/long-accumulator
acc v (rfn acc (.readObject col v))))
hamf-proto/ParallelReducer
(->merge-fn [r] merge-fn)))))
(merge [this lhs rhs] (merge-fn lhs rhs))
hamf-proto/Finalize
(finalize [this v] (hamf-proto/finalize reducer v))))))