use crate::Initializer;
use burn_core as burn;
use crate::{Linear, LinearConfig, LinearLayout};
use burn::module::Module;
use burn::tensor::{Device, Tensor};
#[derive(Module, Debug)]
pub struct GateController {
pub input_transform: Linear,
pub hidden_transform: Linear,
}
impl GateController {
pub fn new(
d_input: usize,
d_output: usize,
bias: bool,
initializer: Initializer,
device: &Device,
) -> Self {
Self {
input_transform: LinearConfig {
d_input,
d_output,
bias,
initializer: initializer.clone(),
layout: LinearLayout::Row,
}
.init(device),
hidden_transform: LinearConfig {
d_input: d_output,
d_output,
bias,
initializer,
layout: LinearLayout::Row,
}
.init(device),
}
}
pub fn gate_product(&self, input: Tensor<2>, hidden: Tensor<2>) -> Tensor<2> {
self.input_transform.forward(input) + self.hidden_transform.forward(hidden)
}
#[cfg(test)]
pub fn create_with_weights(input_transform: Linear, hidden_transform: Linear) -> Self {
Self {
input_transform,
hidden_transform,
}
}
}