pub fn sigmoid(x: f32, k: f32) -> f32 {
1. / (1. + (-x * k).exp())
}
pub fn to_slice_with_lifetime<T, U>(slice: &[T]) -> &[U] {
let src_size = std::mem::size_of_val(slice);
let tgt_size = std::mem::size_of::<U>();
assert!(
src_size % tgt_size == 0,
"Target type size does not divide slice size!"
);
let len = src_size / tgt_size;
unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), len) }
}