1pub fn sigmoid(x: f32, k: f32) -> f32 {
2 1. / (1. + (-x * k).exp())
3}
4
5pub fn write_to_bin<T>(
6 item: &[T],
7 size: usize,
8 output_path: &str,
9 pad: bool,
10) -> std::io::Result<()> {
11 use std::io::Write;
12
13 let mut file = std::fs::File::create(output_path)?;
14
15 let size = std::mem::size_of::<T>() * size;
16
17 unsafe {
18 let slice_ptr: *const u8 = item.as_ptr().cast();
19 let slice = std::slice::from_raw_parts(slice_ptr, size);
20 file.write_all(slice)?;
21 }
22
23 if pad {
24 let padding = vec![0u8; (64 - size % 64) % 64];
25 file.write_all(&padding)?;
26 }
27
28 Ok(())
29}
30
31pub fn boxed_and_zeroed<T>() -> Box<T> {
32 unsafe {
33 let layout = std::alloc::Layout::new::<T>();
34 let ptr = std::alloc::alloc_zeroed(layout);
35 if ptr.is_null() {
36 std::alloc::handle_alloc_error(layout);
37 }
38 Box::from_raw(ptr.cast())
39 }
40}
41
42pub fn to_slice_with_lifetime<T, U>(slice: &[T]) -> &[U] {
43 let src_size = std::mem::size_of_val(slice);
44 let tgt_size = std::mem::size_of::<U>();
45
46 assert!(
47 src_size % tgt_size == 0,
48 "Target type size does not divide slice size!"
49 );
50
51 let len = src_size / tgt_size;
52 unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), len) }
53}
54
55pub fn to_slice_with_lifetime_mut<T, U>(slice: &mut [T]) -> &mut [U] {
56 let src_size = std::mem::size_of_val(slice);
57 let tgt_size = std::mem::size_of::<U>();
58
59 assert!(
60 src_size % tgt_size == 0,
61 "Target type size does not divide slice size!"
62 );
63
64 let len = src_size / tgt_size;
65 unsafe { std::slice::from_raw_parts_mut(slice.as_mut_ptr().cast(), len) }
66}