#![allow(clippy::excessive_precision)]
use crate::Error;
use super::{Layer, LayerSpec, LinearSpec};
use crate::dnn::nnet::LinearLayer;
use crate::dnn::weights::WeightList;
pub const BLOB_FILE: &str = "lace.bin";
pub const LACE_PREEMPH: f32 = 0.85;
pub const LACE_FRAME_SIZE: usize = 80;
pub const LACE_OVERLAP_SIZE: usize = 40;
pub const LACE_NUM_FEATURES: usize = 93;
pub const LACE_PITCH_MAX: usize = 300;
pub const LACE_PITCH_EMBEDDING_DIM: usize = 64;
pub const LACE_NUMBITS_RANGE_LOW: usize = 50;
pub const LACE_NUMBITS_RANGE_HIGH: usize = 650;
pub const LACE_NUMBITS_EMBEDDING_DIM: usize = 8;
pub const LACE_COND_DIM: usize = 128;
pub const LACE_HIDDEN_FEATURE_DIM: usize = 96;
pub const LACE_NUMBITS_SCALE_0: f32 = 1.0983514785766602;
pub const LACE_NUMBITS_SCALE_1: f32 = 2.0509142875671387;
pub const LACE_NUMBITS_SCALE_2: f32 = 3.5729939937591553;
pub const LACE_NUMBITS_SCALE_3: f32 = 4.478035926818848;
pub const LACE_NUMBITS_SCALE_4: f32 = 5.926519393920898;
pub const LACE_NUMBITS_SCALE_5: f32 = 7.152282238006592;
pub const LACE_NUMBITS_SCALE_6: f32 = 8.277412414550781;
pub const LACE_NUMBITS_SCALE_7: f32 = 8.926830291748047;
pub const LACE_PITCH_EMBEDDING_OUT_SIZE: usize = 64;
pub const LACE_FNET_CONV1_OUT_SIZE: usize = 96;
pub const LACE_FNET_CONV1_IN_SIZE: usize = 173;
pub const LACE_FNET_CONV1_STATE_SIZE: usize = 0;
pub const LACE_FNET_CONV1_DELAY: usize = 0;
pub const LACE_FNET_CONV2_OUT_SIZE: usize = 128;
pub const LACE_FNET_CONV2_IN_SIZE: usize = 384;
pub const LACE_FNET_CONV2_STATE_SIZE: usize = 384;
pub const LACE_FNET_CONV2_DELAY: usize = 0;
pub const LACE_FNET_TCONV_KERNEL_SIZE: usize = 4;
pub const LACE_FNET_TCONV_STRIDE: usize = 4;
pub const LACE_FNET_TCONV_IN_CHANNELS: usize = 128;
pub const LACE_FNET_TCONV_OUT_CHANNELS: usize = 128;
pub const LACE_FNET_GRU_OUT_SIZE: usize = 128;
pub const LACE_FNET_GRU_STATE_SIZE: usize = 128;
pub const LACE_CF1_FILTER_GAIN_A: f32 = 0.690776;
pub const LACE_CF1_FILTER_GAIN_B: f32 = 0.000000;
pub const LACE_CF1_LOG_GAIN_LIMIT: f32 = 1.151293;
pub const LACE_CF1_KERNEL_SIZE: usize = 16;
pub const LACE_CF1_LEFT_PADDING: usize = 8;
pub const LACE_CF1_FRAME_SIZE: usize = 80;
pub const LACE_CF1_OVERLAP_SIZE: usize = 40;
pub const LACE_CF1_IN_CHANNELS: usize = 1;
pub const LACE_CF1_OUT_CHANNELS: usize = 1;
pub const LACE_CF1_NORM_P: usize = 2;
pub const LACE_CF1_FEATURE_DIM: usize = 128;
pub const LACE_CF1_MAX_LAG: usize = 301;
pub const LACE_CF1_KERNEL_OUT_SIZE: usize = 16;
pub const LACE_CF1_GAIN_OUT_SIZE: usize = 1;
pub const LACE_CF1_GLOBAL_GAIN_OUT_SIZE: usize = 1;
pub const LACE_CF2_FILTER_GAIN_A: f32 = 0.690776;
pub const LACE_CF2_FILTER_GAIN_B: f32 = 0.000000;
pub const LACE_CF2_LOG_GAIN_LIMIT: f32 = 1.151293;
pub const LACE_CF2_KERNEL_SIZE: usize = 16;
pub const LACE_CF2_LEFT_PADDING: usize = 8;
pub const LACE_CF2_FRAME_SIZE: usize = 80;
pub const LACE_CF2_OVERLAP_SIZE: usize = 40;
pub const LACE_CF2_IN_CHANNELS: usize = 1;
pub const LACE_CF2_OUT_CHANNELS: usize = 1;
pub const LACE_CF2_NORM_P: usize = 2;
pub const LACE_CF2_FEATURE_DIM: usize = 128;
pub const LACE_CF2_MAX_LAG: usize = 301;
pub const LACE_CF2_KERNEL_OUT_SIZE: usize = 16;
pub const LACE_CF2_GAIN_OUT_SIZE: usize = 1;
pub const LACE_CF2_GLOBAL_GAIN_OUT_SIZE: usize = 1;
pub const LACE_AF1_FILTER_GAIN_A: f32 = 1.381551;
pub const LACE_AF1_FILTER_GAIN_B: f32 = 0.000000;
pub const LACE_AF1_SHAPE_GAIN: f32 = 1.000000;
pub const LACE_AF1_KERNEL_SIZE: usize = 16;
pub const LACE_AF1_FRAME_SIZE: usize = 80;
pub const LACE_AF1_LEFT_PADDING: usize = 15;
pub const LACE_AF1_OVERLAP_SIZE: usize = 40;
pub const LACE_AF1_IN_CHANNELS: usize = 1;
pub const LACE_AF1_OUT_CHANNELS: usize = 1;
pub const LACE_AF1_NORM_P: usize = 2;
pub const LACE_AF1_FEATURE_DIM: usize = 128;
pub const LACE_AF1_KERNEL_OUT_SIZE: usize = 16;
pub const LACE_AF1_GAIN_OUT_SIZE: usize = 1;
pub const LAYERS: [LayerSpec; 14] = [
LayerSpec::Linear(LinearSpec {
name: "lace_pitch_embedding",
bias: Some("lace_pitch_embedding_bias"),
subias: None,
weights: None,
float_weights: Some("lace_pitch_embedding_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 301,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_fnet_conv1",
bias: Some("lace_fnet_conv1_bias"),
subias: None,
weights: None,
float_weights: Some("lace_fnet_conv1_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 173,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_fnet_conv2",
bias: Some("lace_fnet_conv2_bias"),
subias: Some("lace_fnet_conv2_subias"),
weights: Some("lace_fnet_conv2_weights_int8"),
float_weights: Some("lace_fnet_conv2_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_fnet_conv2_scale"),
nb_inputs: 768,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_fnet_tconv",
bias: Some("lace_fnet_tconv_bias"),
subias: Some("lace_fnet_tconv_subias"),
weights: Some("lace_fnet_tconv_weights_int8"),
float_weights: Some("lace_fnet_tconv_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_fnet_tconv_scale"),
nb_inputs: 128,
nb_outputs: 512,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_fnet_gru_input",
bias: Some("lace_fnet_gru_input_bias"),
subias: Some("lace_fnet_gru_input_subias"),
weights: Some("lace_fnet_gru_input_weights_int8"),
float_weights: Some("lace_fnet_gru_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_fnet_gru_input_scale"),
nb_inputs: 128,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_fnet_gru_recurrent",
bias: Some("lace_fnet_gru_recurrent_bias"),
subias: Some("lace_fnet_gru_recurrent_subias"),
weights: Some("lace_fnet_gru_recurrent_weights_int8"),
float_weights: Some("lace_fnet_gru_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_fnet_gru_recurrent_scale"),
nb_inputs: 128,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf1_kernel",
bias: Some("lace_cf1_kernel_bias"),
subias: Some("lace_cf1_kernel_subias"),
weights: Some("lace_cf1_kernel_weights_int8"),
float_weights: Some("lace_cf1_kernel_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_cf1_kernel_scale"),
nb_inputs: 128,
nb_outputs: 16,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf1_gain",
bias: Some("lace_cf1_gain_bias"),
subias: None,
weights: None,
float_weights: Some("lace_cf1_gain_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 128,
nb_outputs: 1,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf1_global_gain",
bias: Some("lace_cf1_global_gain_bias"),
subias: None,
weights: None,
float_weights: Some("lace_cf1_global_gain_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 128,
nb_outputs: 1,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf2_kernel",
bias: Some("lace_cf2_kernel_bias"),
subias: Some("lace_cf2_kernel_subias"),
weights: Some("lace_cf2_kernel_weights_int8"),
float_weights: Some("lace_cf2_kernel_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_cf2_kernel_scale"),
nb_inputs: 128,
nb_outputs: 16,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf2_gain",
bias: Some("lace_cf2_gain_bias"),
subias: None,
weights: None,
float_weights: Some("lace_cf2_gain_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 128,
nb_outputs: 1,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_cf2_global_gain",
bias: Some("lace_cf2_global_gain_bias"),
subias: None,
weights: None,
float_weights: Some("lace_cf2_global_gain_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 128,
nb_outputs: 1,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_af1_kernel",
bias: Some("lace_af1_kernel_bias"),
subias: Some("lace_af1_kernel_subias"),
weights: Some("lace_af1_kernel_weights_int8"),
float_weights: Some("lace_af1_kernel_weights_float"),
weights_idx: None,
diag: None,
scale: Some("lace_af1_kernel_scale"),
nb_inputs: 128,
nb_outputs: 16,
}),
LayerSpec::Linear(LinearSpec {
name: "lace_af1_gain",
bias: Some("lace_af1_gain_bias"),
subias: None,
weights: None,
float_weights: Some("lace_af1_gain_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 128,
nb_outputs: 1,
}),
];
#[derive(Clone, Copy, Default)]
pub struct LaceLayers<'w> {
pub lace_pitch_embedding: LinearLayer<'w>,
pub lace_fnet_conv1: LinearLayer<'w>,
pub lace_fnet_conv2: LinearLayer<'w>,
pub lace_fnet_tconv: LinearLayer<'w>,
pub lace_fnet_gru_input: LinearLayer<'w>,
pub lace_fnet_gru_recurrent: LinearLayer<'w>,
pub lace_cf1_kernel: LinearLayer<'w>,
pub lace_cf1_gain: LinearLayer<'w>,
pub lace_cf1_global_gain: LinearLayer<'w>,
pub lace_cf2_kernel: LinearLayer<'w>,
pub lace_cf2_gain: LinearLayer<'w>,
pub lace_cf2_global_gain: LinearLayer<'w>,
pub lace_af1_kernel: LinearLayer<'w>,
pub lace_af1_gain: LinearLayer<'w>,
}
impl<'w> LaceLayers<'w> {
pub fn init(list: &WeightList<'w>) -> Result<Self, Error> {
Ok(LaceLayers {
lace_pitch_embedding: LAYERS[0].linear(list)?,
lace_fnet_conv1: LAYERS[1].linear(list)?,
lace_fnet_conv2: LAYERS[2].linear(list)?,
lace_fnet_tconv: LAYERS[3].linear(list)?,
lace_fnet_gru_input: LAYERS[4].linear(list)?,
lace_fnet_gru_recurrent: LAYERS[5].linear(list)?,
lace_cf1_kernel: LAYERS[6].linear(list)?,
lace_cf1_gain: LAYERS[7].linear(list)?,
lace_cf1_global_gain: LAYERS[8].linear(list)?,
lace_cf2_kernel: LAYERS[9].linear(list)?,
lace_cf2_gain: LAYERS[10].linear(list)?,
lace_cf2_global_gain: LAYERS[11].linear(list)?,
lace_af1_kernel: LAYERS[12].linear(list)?,
lace_af1_gain: LAYERS[13].linear(list)?,
})
}
pub fn layers(&self) -> [Layer<'_, 'w>; 14] {
[
Layer::Linear(&self.lace_pitch_embedding),
Layer::Linear(&self.lace_fnet_conv1),
Layer::Linear(&self.lace_fnet_conv2),
Layer::Linear(&self.lace_fnet_tconv),
Layer::Linear(&self.lace_fnet_gru_input),
Layer::Linear(&self.lace_fnet_gru_recurrent),
Layer::Linear(&self.lace_cf1_kernel),
Layer::Linear(&self.lace_cf1_gain),
Layer::Linear(&self.lace_cf1_global_gain),
Layer::Linear(&self.lace_cf2_kernel),
Layer::Linear(&self.lace_cf2_gain),
Layer::Linear(&self.lace_cf2_global_gain),
Layer::Linear(&self.lace_af1_kernel),
Layer::Linear(&self.lace_af1_gain),
]
}
}