...
Let's take the simple ndarray activation function as an example to see what the ideal state would look like:
(s/def ::ndarray ...#(instance? NDArray %))
(s/def ::act-type #{"relu" "sigmoid" ...})
(s/fdef ::activation ...)
(defn activation
...
[{:keys [data weight bias num-hidden no-bias flatten name attr]
:or {attr {}} :as opts}] ...)
...
We should also encourage the usage of Clojure data structures as function arguments:
Scala | Clojure |
---|---|
Int | Float | Double | Boolean | String | int | float | double | bool | string |
Array[Int] | Array[...] | Array[NDArray] | vec-of-ints | vec-of-... | vec-of-ndarrays |
scala.collection.immutable.Map | map (i.e. {...}) |
org.apache.mxnet.Shape | vec-of-ints (e.g. [2 3]) |
|
|
Potential Approach(es)
We can potentially use the Scala package's GeneratorBase to create the functions described above. The current challenge is that the generator cannot be called directly from within Clojure and hence we have to rely on reflection instead.
...