pub(crate) const FILM_KEYS: &[(&str, usize)] = &[
("conv_pre_film", 0),
("conv_post_film", 1),
("input_mixin_pre_film", 2),
("input_mixin_post_film", 3),
("activation_pre_film", 4),
("activation_post_film", 5),
("layer1x1_post_film", 6),
("head1x1_post_film", 7),
];
pub(crate) fn film_weight_count(
groups: u32,
cond_size: usize,
channels: usize,
shift: bool,
) -> usize {
let g = groups as usize;
let ch_per_group = channels / g;
let cond_per_group = cond_size / g;
let out_per_group = if shift {
ch_per_group * 2
} else {
ch_per_group
};
g * out_per_group * cond_per_group
}
pub(crate) fn film_weight_count_generic(
groups: u32,
cond_size: usize,
channels: usize,
shift: bool,
) -> usize {
let g = groups as usize;
let mult = if shift { 2 } else { 1 };
channels * mult * cond_size / g
}
pub(crate) fn film_bias_count(channels: usize, shift: bool) -> usize {
if shift { channels * 2 } else { channels }
}
pub(crate) fn film_bias_count_generic(channels: usize) -> usize {
channels
}
#[inline]
pub(crate) fn transpose_dense_f32(
raw: &[f32],
weights: &mut [f32],
in_size: usize,
out_size: usize,
) {
for out_c in 0..out_size {
for in_c in 0..in_size {
weights[in_c * out_size + out_c] = raw[out_c * in_size + in_c];
}
}
}
#[inline]
pub(crate) fn transpose_conv1d_interleaved_4wide(
raw: &[f32],
weights: &mut [f32],
in_ch: usize,
out_ch: usize,
kernel: usize,
) {
let num_blocks = out_ch.div_ceil(4);
for b in 0..num_blocks {
for k in 0..kernel {
for in_c in 0..in_ch {
for lane in 0..4 {
let out_c = b * 4 + lane;
let target_idx = b * (kernel * in_ch * 4) + k * (in_ch * 4) + in_c * 4 + lane;
if out_c < out_ch {
let raw_idx = (out_c * in_ch + in_c) * kernel + k;
weights[target_idx] = raw[raw_idx];
}
}
}
}
}
}
#[inline]
pub(crate) fn transpose_head_w(raw: &[f32], head: &mut [f32], channels: usize, kernel: usize) {
for tap in 0..kernel {
for ch in 0..channels {
head[tap * channels + ch] = raw[ch * kernel + tap];
}
}
}