use crate::abstracted::internal::TensorLike;
use crate::manual::TensorFloat;
use crate::manual::tensors::WithGrad;
#[cfg(feature = "dyntensor")]
use crate::manual::tensors::{Tensor, TensorOps};
mod dense;
pub use dense::*;
#[cfg(feature = "dyntensor")]
fn reduce_rows_sum_to_bias(dz: &Tensor<TensorFloat>, out_len: usize) -> Tensor<TensorFloat> {
let mut acc = alloc::vec![0.0; out_len]; let dz_data = dz.data();
let batch = dz_data.len() / out_len;
for i in 0..batch {
for j in 0..out_len {
acc[j] += dz_data[i * out_len + j];
}
}
Tensor::new(&[out_len], &acc) }
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
#[cfg(not(feature = "alloc"))]
use box_closure::OpaqueFnOnce;
#[cfg(feature = "alloc")]
pub type BackFn<'a, In, Out> = Box<dyn FnOnce(Out) -> In + 'a>;
#[cfg(not(feature = "alloc"))]
pub type BackFn<'a, In, Out> = OpaqueFnOnce<'a, Out, In, box_closure::Align32<1024>>;
pub trait Layer<I, O> {
type ParamA: TensorLike<TensorFloat>;
type ParamB: TensorLike<TensorFloat>;
fn run<'a>(&'a mut self, input: &'a WithGrad<I>) -> (O, BackFn<'a, I, O>);
fn params(&mut self) -> (&mut WithGrad<Self::ParamA>, &mut WithGrad<Self::ParamB>);
}
pub trait __LayoutMarker {}