use crate::tensor::Tensor;
use super::module::{Module, scoped};
use super::param::{Buffer, Param};
#[derive(Default)]
pub struct Sequential {
layers: Vec<Box<dyn Module>>,
}
impl Sequential {
pub fn new() -> Sequential {
Sequential::default()
}
#[allow(clippy::should_implement_trait)]
pub fn add(mut self, layer: impl Module + 'static) -> Sequential {
self.layers.push(Box::new(layer));
self
}
pub fn push(&mut self, layer: impl Module + 'static) {
self.layers.push(Box::new(layer));
}
pub fn len(&self) -> usize {
self.layers.len()
}
pub fn is_empty(&self) -> bool {
self.layers.is_empty()
}
}
impl Module for Sequential {
fn forward(&self, input: &Tensor) -> Tensor {
self.layers
.iter()
.fold(input.clone(), |x, layer| layer.forward(&x))
}
fn named_parameters(&self) -> Vec<(String, Param)> {
self.layers
.iter()
.enumerate()
.flat_map(|(i, layer)| scoped(i, layer.named_parameters()))
.collect()
}
fn named_buffers(&self) -> Vec<(String, Buffer)> {
self.layers
.iter()
.enumerate()
.flat_map(|(i, layer)| scoped(i, layer.named_buffers()))
.collect()
}
fn set_training(&self, training: bool) {
for layer in &self.layers {
layer.set_training(training);
}
}
}