use ndarray::{Array1, Array2, ArrayBase, Dim, ViewRepr};
pub fn sigmoid(x: f32) -> f32 {
1.0 / (1.0 + (-x).exp())
}
pub fn softmax(arr: Array1<f32>) -> Array1<f32> {
let mut sm: f32 = 0.0;
for i in 0..arr.shape()[0] {
sm += arr[[i]].exp();
}
let mut out = Array1::<f32>::zeros(arr.len());
for i in 0..out.shape()[0] {
out[[i]] = arr[[i]].exp() / sm;
}
out
}
pub fn max_arr1(arr: ArrayBase<ViewRepr<&f32>, Dim<[usize; 1]>>) -> usize {
let mut mx: f32 = 0.0;
let mut ind = 0;
for i in 0..arr.shape()[0] {
if mx < arr[[i]] {
mx = arr[[i]];
ind = i;
}
}
ind
}
pub fn sigmoid_arr1(arr: ArrayBase<ViewRepr<&f32>, Dim<[usize; 1]>>) -> Array1<f32> {
let mut out = Array1::<f32>::zeros(arr.shape()[0]);
for i in 0..arr.shape()[0] {
out[[i]] = sigmoid(arr[i]);
}
out
}
pub fn tanh_arr1(arr: ArrayBase<ViewRepr<&f32>, Dim<[usize; 1]>>) -> Array1<f32> {
let mut out = Array1::<f32>::zeros(arr.shape()[0]);
for i in 0..arr.shape()[0] {
out[i] = arr[i].tanh();
}
out
}
pub fn change_row(mut arr: Array2<f32>, row_id: usize, new_row: &Array1<f32>) -> Array2<f32> {
for i in 0..new_row.shape()[0] {
arr[[row_id, i]] = new_row[i];
}
arr
}
pub fn concatenate_arr1(
arr1: ArrayBase<ViewRepr<&f32>, Dim<[usize; 1]>>,
arr2: ArrayBase<ViewRepr<&f32>, Dim<[usize; 1]>>,
) -> Array1<f32> {
let mut out = Array1::<f32>::zeros(arr1.len() + arr2.len());
for i in 0..arr1.len() {
out[i] = arr1[i]
}
for i in 0..arr2.len() {
out[arr1.len() + i] = arr2[[i]]
}
out
}