use crate::Error;
use super::{Conv2dSpec, Layer, LayerSpec, LinearSpec};
use crate::dnn::nnet::{Conv2dLayer, LinearLayer};
use crate::dnn::weights::WeightList;
pub const BLOB_FILE: &str = "pitchdnn.bin";
pub const DENSE_IF_UPSAMPLER_1_OUT_SIZE: usize = 64;
pub const DENSE_IF_UPSAMPLER_2_OUT_SIZE: usize = 64;
pub const DENSE_DOWNSAMPLER_OUT_SIZE: usize = 64;
pub const DENSE_FINAL_UPSAMPLER_OUT_SIZE: usize = 192;
pub const GRU_1_OUT_SIZE: usize = 64;
pub const GRU_1_STATE_SIZE: usize = 64;
pub const PITCH_DNN_MAX_RNN_UNITS: usize = 64;
pub const LAYERS: [LayerSpec; 8] = [
LayerSpec::Linear(LinearSpec {
name: "dense_if_upsampler_1",
bias: Some("dense_if_upsampler_1_bias"),
subias: Some("dense_if_upsampler_1_subias"),
weights: Some("dense_if_upsampler_1_weights_int8"),
float_weights: Some("dense_if_upsampler_1_weights_float"),
weights_idx: None,
diag: None,
scale: Some("dense_if_upsampler_1_scale"),
nb_inputs: 88,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "dense_if_upsampler_2",
bias: Some("dense_if_upsampler_2_bias"),
subias: Some("dense_if_upsampler_2_subias"),
weights: Some("dense_if_upsampler_2_weights_int8"),
float_weights: Some("dense_if_upsampler_2_weights_float"),
weights_idx: None,
diag: None,
scale: Some("dense_if_upsampler_2_scale"),
nb_inputs: 64,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "dense_downsampler",
bias: Some("dense_downsampler_bias"),
subias: Some("dense_downsampler_subias"),
weights: Some("dense_downsampler_weights_int8"),
float_weights: Some("dense_downsampler_weights_float"),
weights_idx: None,
diag: None,
scale: Some("dense_downsampler_scale"),
nb_inputs: 288,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "dense_final_upsampler",
bias: Some("dense_final_upsampler_bias"),
subias: Some("dense_final_upsampler_subias"),
weights: Some("dense_final_upsampler_weights_int8"),
float_weights: Some("dense_final_upsampler_weights_float"),
weights_idx: None,
diag: None,
scale: Some("dense_final_upsampler_scale"),
nb_inputs: 64,
nb_outputs: 192,
}),
LayerSpec::Conv2d(Conv2dSpec {
name: "conv2d_1",
bias: Some("conv2d_1_bias"),
float_weights: Some("conv2d_1_weight_float"),
in_channels: 1,
out_channels: 4,
ktime: 3,
kheight: 3,
}),
LayerSpec::Conv2d(Conv2dSpec {
name: "conv2d_2",
bias: Some("conv2d_2_bias"),
float_weights: Some("conv2d_2_weight_float"),
in_channels: 4,
out_channels: 1,
ktime: 3,
kheight: 3,
}),
LayerSpec::Linear(LinearSpec {
name: "gru_1_input",
bias: Some("gru_1_input_bias"),
subias: Some("gru_1_input_subias"),
weights: Some("gru_1_input_weights_int8"),
float_weights: Some("gru_1_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("gru_1_input_scale"),
nb_inputs: 64,
nb_outputs: 192,
}),
LayerSpec::Linear(LinearSpec {
name: "gru_1_recurrent",
bias: Some("gru_1_recurrent_bias"),
subias: Some("gru_1_recurrent_subias"),
weights: Some("gru_1_recurrent_weights_int8"),
float_weights: Some("gru_1_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("gru_1_recurrent_scale"),
nb_inputs: 64,
nb_outputs: 192,
}),
];
#[derive(Clone, Copy, Default)]
pub struct PitchDnn<'w> {
pub dense_if_upsampler_1: LinearLayer<'w>,
pub dense_if_upsampler_2: LinearLayer<'w>,
pub dense_downsampler: LinearLayer<'w>,
pub dense_final_upsampler: LinearLayer<'w>,
pub conv2d_1: Conv2dLayer<'w>,
pub conv2d_2: Conv2dLayer<'w>,
pub gru_1_input: LinearLayer<'w>,
pub gru_1_recurrent: LinearLayer<'w>,
}
impl<'w> PitchDnn<'w> {
pub fn init(list: &WeightList<'w>) -> Result<Self, Error> {
Ok(PitchDnn {
dense_if_upsampler_1: LAYERS[0].linear(list)?,
dense_if_upsampler_2: LAYERS[1].linear(list)?,
dense_downsampler: LAYERS[2].linear(list)?,
dense_final_upsampler: LAYERS[3].linear(list)?,
conv2d_1: LAYERS[4].conv2d(list)?,
conv2d_2: LAYERS[5].conv2d(list)?,
gru_1_input: LAYERS[6].linear(list)?,
gru_1_recurrent: LAYERS[7].linear(list)?,
})
}
pub fn layers(&self) -> [Layer<'_, 'w>; 8] {
[
Layer::Linear(&self.dense_if_upsampler_1),
Layer::Linear(&self.dense_if_upsampler_2),
Layer::Linear(&self.dense_downsampler),
Layer::Linear(&self.dense_final_upsampler),
Layer::Conv2d(&self.conv2d_1),
Layer::Conv2d(&self.conv2d_2),
Layer::Linear(&self.gru_1_input),
Layer::Linear(&self.gru_1_recurrent),
]
}
}