use crate::Error;
use super::{Layer, LayerSpec, LinearSpec};
use crate::dnn::nnet::LinearLayer;
use crate::dnn::weights::WeightList;
pub const BLOB_FILE: &str = "plc.bin";
pub const PLC_DENSE_IN_OUT_SIZE: usize = 128;
pub const PLC_DENSE_OUT_OUT_SIZE: usize = 20;
pub const PLC_GRU1_OUT_SIZE: usize = 192;
pub const PLC_GRU1_STATE_SIZE: usize = 192;
pub const PLC_GRU2_OUT_SIZE: usize = 192;
pub const PLC_GRU2_STATE_SIZE: usize = 192;
pub const PLC_MAX_RNN_UNITS: usize = 192;
pub const LAYERS: [LayerSpec; 6] = [
LayerSpec::Linear(LinearSpec {
name: "plc_dense_in",
bias: Some("plc_dense_in_bias"),
subias: None,
weights: None,
float_weights: Some("plc_dense_in_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 57,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "plc_dense_out",
bias: Some("plc_dense_out_bias"),
subias: None,
weights: None,
float_weights: Some("plc_dense_out_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 192,
nb_outputs: 20,
}),
LayerSpec::Linear(LinearSpec {
name: "plc_gru1_input",
bias: Some("plc_gru1_input_bias"),
subias: Some("plc_gru1_input_subias"),
weights: Some("plc_gru1_input_weights_int8"),
float_weights: Some("plc_gru1_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("plc_gru1_input_scale"),
nb_inputs: 128,
nb_outputs: 576,
}),
LayerSpec::Linear(LinearSpec {
name: "plc_gru1_recurrent",
bias: Some("plc_gru1_recurrent_bias"),
subias: Some("plc_gru1_recurrent_subias"),
weights: Some("plc_gru1_recurrent_weights_int8"),
float_weights: Some("plc_gru1_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("plc_gru1_recurrent_scale"),
nb_inputs: 192,
nb_outputs: 576,
}),
LayerSpec::Linear(LinearSpec {
name: "plc_gru2_input",
bias: Some("plc_gru2_input_bias"),
subias: Some("plc_gru2_input_subias"),
weights: Some("plc_gru2_input_weights_int8"),
float_weights: Some("plc_gru2_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("plc_gru2_input_scale"),
nb_inputs: 192,
nb_outputs: 576,
}),
LayerSpec::Linear(LinearSpec {
name: "plc_gru2_recurrent",
bias: Some("plc_gru2_recurrent_bias"),
subias: Some("plc_gru2_recurrent_subias"),
weights: Some("plc_gru2_recurrent_weights_int8"),
float_weights: Some("plc_gru2_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("plc_gru2_recurrent_scale"),
nb_inputs: 192,
nb_outputs: 576,
}),
];
#[derive(Clone, Copy, Default)]
pub struct PlcModel<'w> {
pub plc_dense_in: LinearLayer<'w>,
pub plc_dense_out: LinearLayer<'w>,
pub plc_gru1_input: LinearLayer<'w>,
pub plc_gru1_recurrent: LinearLayer<'w>,
pub plc_gru2_input: LinearLayer<'w>,
pub plc_gru2_recurrent: LinearLayer<'w>,
}
impl<'w> PlcModel<'w> {
pub fn init(list: &WeightList<'w>) -> Result<Self, Error> {
Ok(PlcModel {
plc_dense_in: LAYERS[0].linear(list)?,
plc_dense_out: LAYERS[1].linear(list)?,
plc_gru1_input: LAYERS[2].linear(list)?,
plc_gru1_recurrent: LAYERS[3].linear(list)?,
plc_gru2_input: LAYERS[4].linear(list)?,
plc_gru2_recurrent: LAYERS[5].linear(list)?,
})
}
pub fn layers(&self) -> [Layer<'_, 'w>; 6] {
[
Layer::Linear(&self.plc_dense_in),
Layer::Linear(&self.plc_dense_out),
Layer::Linear(&self.plc_gru1_input),
Layer::Linear(&self.plc_gru1_recurrent),
Layer::Linear(&self.plc_gru2_input),
Layer::Linear(&self.plc_gru2_recurrent),
]
}
}