use crate::dsp::mirror_buf::MirroredBuffer;
use crate::models::a2::params::{
A2_DILATIONS, A2_HEAD_KERNEL_SIZE, A2_KERNEL_SIZES, A2_NUM_LAYERS,
};
#[cfg(test)]
use crate::models::wavenet::common::WAVENET_MAX_NUM_FRAMES;
#[inline]
pub const fn a2_receptive_field() -> usize {
let mut rf = 0usize;
let mut i = 0;
while i < A2_NUM_LAYERS {
rf += (A2_KERNEL_SIZES[i] - 1) * A2_DILATIONS[i];
i += 1;
}
rf + (A2_HEAD_KERNEL_SIZE - 1)
}
#[expect(
clippy::too_many_arguments,
reason = "A2 model constructor requiring many topology and buffer parameters for neural network initialization"
)]
#[cold]
pub(crate) fn a2_prewarm_common(
num_layers: usize,
receptive_field_size: usize,
layer_buffers: &mut [MirroredBuffer<f32>],
layer_ring_sizes: &[usize],
layer_buffer_starts: &mut [usize],
layer_in: &mut [f32],
head_accum: &mut [f32],
head_write_pos: &mut usize,
) {
for buf in layer_buffers.iter_mut() {
let len = buf.size();
buf[..len].fill(0.0);
}
layer_buffer_starts[..num_layers].copy_from_slice(&layer_ring_sizes[..num_layers]);
layer_in.fill(0.0);
head_accum.fill(0.0);
*head_write_pos = receptive_field_size;
}
#[path = "static/mod.rs"]
pub mod static_mod;
pub use static_mod::WaveNetA2;
pub mod cascade;
pub mod dynamic;
mod set_weights;
#[cfg(test)]
#[path = "../model_test.rs"]
mod tests;