use crate::Error;
use super::{Layer, LayerSpec, LinearSpec};
use crate::dnn::nnet::LinearLayer;
use crate::dnn::weights::WeightList;
pub const BLOB_FILE: &str = "dred_rdovae_enc.bin";
pub const ENC_DENSE1_OUT_SIZE: usize = 64;
pub const ENC_ZDENSE_OUT_SIZE: usize = 32;
pub const GDENSE2_OUT_SIZE: usize = 56;
pub const GDENSE1_OUT_SIZE: usize = 128;
pub const ENC_CONV_DENSE1_OUT_SIZE: usize = 64;
pub const ENC_CONV_DENSE2_OUT_SIZE: usize = 64;
pub const ENC_CONV_DENSE3_OUT_SIZE: usize = 64;
pub const ENC_CONV_DENSE4_OUT_SIZE: usize = 64;
pub const ENC_CONV_DENSE5_OUT_SIZE: usize = 64;
pub const ENC_GRU1_OUT_SIZE: usize = 32;
pub const ENC_GRU1_STATE_SIZE: usize = 32;
pub const ENC_GRU2_OUT_SIZE: usize = 32;
pub const ENC_GRU2_STATE_SIZE: usize = 32;
pub const ENC_GRU3_OUT_SIZE: usize = 32;
pub const ENC_GRU3_STATE_SIZE: usize = 32;
pub const ENC_GRU4_OUT_SIZE: usize = 32;
pub const ENC_GRU4_STATE_SIZE: usize = 32;
pub const ENC_GRU5_OUT_SIZE: usize = 32;
pub const ENC_GRU5_STATE_SIZE: usize = 32;
pub const ENC_CONV1_OUT_SIZE: usize = 64;
pub const ENC_CONV1_IN_SIZE: usize = 64;
pub const ENC_CONV1_STATE_SIZE: usize = 64;
pub const ENC_CONV2_OUT_SIZE: usize = 64;
pub const ENC_CONV2_IN_SIZE: usize = 64;
pub const ENC_CONV2_STATE_SIZE: usize = 64;
pub const ENC_CONV3_OUT_SIZE: usize = 64;
pub const ENC_CONV3_IN_SIZE: usize = 64;
pub const ENC_CONV3_STATE_SIZE: usize = 64;
pub const ENC_CONV4_OUT_SIZE: usize = 64;
pub const ENC_CONV4_IN_SIZE: usize = 64;
pub const ENC_CONV4_STATE_SIZE: usize = 64;
pub const ENC_CONV5_OUT_SIZE: usize = 64;
pub const ENC_CONV5_IN_SIZE: usize = 64;
pub const ENC_CONV5_STATE_SIZE: usize = 64;
pub const LAYERS: [LayerSpec; 24] = [
LayerSpec::Linear(LinearSpec {
name: "enc_dense1",
bias: Some("enc_dense1_bias"),
subias: None,
weights: None,
float_weights: Some("enc_dense1_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 40,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_zdense",
bias: Some("enc_zdense_bias"),
subias: Some("enc_zdense_subias"),
weights: Some("enc_zdense_weights_int8"),
float_weights: Some("enc_zdense_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_zdense_scale"),
nb_inputs: 544,
nb_outputs: 32,
}),
LayerSpec::Linear(LinearSpec {
name: "gdense2",
bias: Some("gdense2_bias"),
subias: Some("gdense2_subias"),
weights: Some("gdense2_weights_int8"),
float_weights: Some("gdense2_weights_float"),
weights_idx: None,
diag: None,
scale: Some("gdense2_scale"),
nb_inputs: 128,
nb_outputs: 56,
}),
LayerSpec::Linear(LinearSpec {
name: "gdense1",
bias: Some("gdense1_bias"),
subias: Some("gdense1_subias"),
weights: Some("gdense1_weights_int8"),
float_weights: Some("gdense1_weights_float"),
weights_idx: Some("gdense1_weights_idx"),
diag: None,
scale: Some("gdense1_scale"),
nb_inputs: 544,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv_dense1",
bias: Some("enc_conv_dense1_bias"),
subias: Some("enc_conv_dense1_subias"),
weights: Some("enc_conv_dense1_weights_int8"),
float_weights: Some("enc_conv_dense1_weights_float"),
weights_idx: Some("enc_conv_dense1_weights_idx"),
diag: None,
scale: Some("enc_conv_dense1_scale"),
nb_inputs: 96,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv_dense2",
bias: Some("enc_conv_dense2_bias"),
subias: Some("enc_conv_dense2_subias"),
weights: Some("enc_conv_dense2_weights_int8"),
float_weights: Some("enc_conv_dense2_weights_float"),
weights_idx: Some("enc_conv_dense2_weights_idx"),
diag: None,
scale: Some("enc_conv_dense2_scale"),
nb_inputs: 192,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv_dense3",
bias: Some("enc_conv_dense3_bias"),
subias: Some("enc_conv_dense3_subias"),
weights: Some("enc_conv_dense3_weights_int8"),
float_weights: Some("enc_conv_dense3_weights_float"),
weights_idx: Some("enc_conv_dense3_weights_idx"),
diag: None,
scale: Some("enc_conv_dense3_scale"),
nb_inputs: 288,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv_dense4",
bias: Some("enc_conv_dense4_bias"),
subias: Some("enc_conv_dense4_subias"),
weights: Some("enc_conv_dense4_weights_int8"),
float_weights: Some("enc_conv_dense4_weights_float"),
weights_idx: Some("enc_conv_dense4_weights_idx"),
diag: None,
scale: Some("enc_conv_dense4_scale"),
nb_inputs: 384,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv_dense5",
bias: Some("enc_conv_dense5_bias"),
subias: Some("enc_conv_dense5_subias"),
weights: Some("enc_conv_dense5_weights_int8"),
float_weights: Some("enc_conv_dense5_weights_float"),
weights_idx: Some("enc_conv_dense5_weights_idx"),
diag: None,
scale: Some("enc_conv_dense5_scale"),
nb_inputs: 480,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru1_input",
bias: Some("enc_gru1_input_bias"),
subias: Some("enc_gru1_input_subias"),
weights: Some("enc_gru1_input_weights_int8"),
float_weights: Some("enc_gru1_input_weights_float"),
weights_idx: Some("enc_gru1_input_weights_idx"),
diag: None,
scale: Some("enc_gru1_input_scale"),
nb_inputs: 64,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru1_recurrent",
bias: Some("enc_gru1_recurrent_bias"),
subias: Some("enc_gru1_recurrent_subias"),
weights: Some("enc_gru1_recurrent_weights_int8"),
float_weights: Some("enc_gru1_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_gru1_recurrent_scale"),
nb_inputs: 32,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru2_input",
bias: Some("enc_gru2_input_bias"),
subias: Some("enc_gru2_input_subias"),
weights: Some("enc_gru2_input_weights_int8"),
float_weights: Some("enc_gru2_input_weights_float"),
weights_idx: Some("enc_gru2_input_weights_idx"),
diag: None,
scale: Some("enc_gru2_input_scale"),
nb_inputs: 160,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru2_recurrent",
bias: Some("enc_gru2_recurrent_bias"),
subias: Some("enc_gru2_recurrent_subias"),
weights: Some("enc_gru2_recurrent_weights_int8"),
float_weights: Some("enc_gru2_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_gru2_recurrent_scale"),
nb_inputs: 32,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru3_input",
bias: Some("enc_gru3_input_bias"),
subias: Some("enc_gru3_input_subias"),
weights: Some("enc_gru3_input_weights_int8"),
float_weights: Some("enc_gru3_input_weights_float"),
weights_idx: Some("enc_gru3_input_weights_idx"),
diag: None,
scale: Some("enc_gru3_input_scale"),
nb_inputs: 256,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru3_recurrent",
bias: Some("enc_gru3_recurrent_bias"),
subias: Some("enc_gru3_recurrent_subias"),
weights: Some("enc_gru3_recurrent_weights_int8"),
float_weights: Some("enc_gru3_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_gru3_recurrent_scale"),
nb_inputs: 32,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru4_input",
bias: Some("enc_gru4_input_bias"),
subias: Some("enc_gru4_input_subias"),
weights: Some("enc_gru4_input_weights_int8"),
float_weights: Some("enc_gru4_input_weights_float"),
weights_idx: Some("enc_gru4_input_weights_idx"),
diag: None,
scale: Some("enc_gru4_input_scale"),
nb_inputs: 352,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru4_recurrent",
bias: Some("enc_gru4_recurrent_bias"),
subias: Some("enc_gru4_recurrent_subias"),
weights: Some("enc_gru4_recurrent_weights_int8"),
float_weights: Some("enc_gru4_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_gru4_recurrent_scale"),
nb_inputs: 32,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru5_input",
bias: Some("enc_gru5_input_bias"),
subias: Some("enc_gru5_input_subias"),
weights: Some("enc_gru5_input_weights_int8"),
float_weights: Some("enc_gru5_input_weights_float"),
weights_idx: Some("enc_gru5_input_weights_idx"),
diag: None,
scale: Some("enc_gru5_input_scale"),
nb_inputs: 448,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_gru5_recurrent",
bias: Some("enc_gru5_recurrent_bias"),
subias: Some("enc_gru5_recurrent_subias"),
weights: Some("enc_gru5_recurrent_weights_int8"),
float_weights: Some("enc_gru5_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_gru5_recurrent_scale"),
nb_inputs: 32,
nb_outputs: 96,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv1",
bias: Some("enc_conv1_bias"),
subias: Some("enc_conv1_subias"),
weights: Some("enc_conv1_weights_int8"),
float_weights: Some("enc_conv1_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_conv1_scale"),
nb_inputs: 128,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv2",
bias: Some("enc_conv2_bias"),
subias: Some("enc_conv2_subias"),
weights: Some("enc_conv2_weights_int8"),
float_weights: Some("enc_conv2_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_conv2_scale"),
nb_inputs: 128,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv3",
bias: Some("enc_conv3_bias"),
subias: Some("enc_conv3_subias"),
weights: Some("enc_conv3_weights_int8"),
float_weights: Some("enc_conv3_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_conv3_scale"),
nb_inputs: 128,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv4",
bias: Some("enc_conv4_bias"),
subias: Some("enc_conv4_subias"),
weights: Some("enc_conv4_weights_int8"),
float_weights: Some("enc_conv4_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_conv4_scale"),
nb_inputs: 128,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "enc_conv5",
bias: Some("enc_conv5_bias"),
subias: Some("enc_conv5_subias"),
weights: Some("enc_conv5_weights_int8"),
float_weights: Some("enc_conv5_weights_float"),
weights_idx: None,
diag: None,
scale: Some("enc_conv5_scale"),
nb_inputs: 128,
nb_outputs: 64,
}),
];
#[derive(Clone, Copy, Default)]
pub struct RdovaeEnc<'w> {
pub enc_dense1: LinearLayer<'w>,
pub enc_zdense: LinearLayer<'w>,
pub gdense2: LinearLayer<'w>,
pub gdense1: LinearLayer<'w>,
pub enc_conv_dense1: LinearLayer<'w>,
pub enc_conv_dense2: LinearLayer<'w>,
pub enc_conv_dense3: LinearLayer<'w>,
pub enc_conv_dense4: LinearLayer<'w>,
pub enc_conv_dense5: LinearLayer<'w>,
pub enc_gru1_input: LinearLayer<'w>,
pub enc_gru1_recurrent: LinearLayer<'w>,
pub enc_gru2_input: LinearLayer<'w>,
pub enc_gru2_recurrent: LinearLayer<'w>,
pub enc_gru3_input: LinearLayer<'w>,
pub enc_gru3_recurrent: LinearLayer<'w>,
pub enc_gru4_input: LinearLayer<'w>,
pub enc_gru4_recurrent: LinearLayer<'w>,
pub enc_gru5_input: LinearLayer<'w>,
pub enc_gru5_recurrent: LinearLayer<'w>,
pub enc_conv1: LinearLayer<'w>,
pub enc_conv2: LinearLayer<'w>,
pub enc_conv3: LinearLayer<'w>,
pub enc_conv4: LinearLayer<'w>,
pub enc_conv5: LinearLayer<'w>,
}
impl<'w> RdovaeEnc<'w> {
pub fn init(list: &WeightList<'w>) -> Result<Self, Error> {
Ok(RdovaeEnc {
enc_dense1: LAYERS[0].linear(list)?,
enc_zdense: LAYERS[1].linear(list)?,
gdense2: LAYERS[2].linear(list)?,
gdense1: LAYERS[3].linear(list)?,
enc_conv_dense1: LAYERS[4].linear(list)?,
enc_conv_dense2: LAYERS[5].linear(list)?,
enc_conv_dense3: LAYERS[6].linear(list)?,
enc_conv_dense4: LAYERS[7].linear(list)?,
enc_conv_dense5: LAYERS[8].linear(list)?,
enc_gru1_input: LAYERS[9].linear(list)?,
enc_gru1_recurrent: LAYERS[10].linear(list)?,
enc_gru2_input: LAYERS[11].linear(list)?,
enc_gru2_recurrent: LAYERS[12].linear(list)?,
enc_gru3_input: LAYERS[13].linear(list)?,
enc_gru3_recurrent: LAYERS[14].linear(list)?,
enc_gru4_input: LAYERS[15].linear(list)?,
enc_gru4_recurrent: LAYERS[16].linear(list)?,
enc_gru5_input: LAYERS[17].linear(list)?,
enc_gru5_recurrent: LAYERS[18].linear(list)?,
enc_conv1: LAYERS[19].linear(list)?,
enc_conv2: LAYERS[20].linear(list)?,
enc_conv3: LAYERS[21].linear(list)?,
enc_conv4: LAYERS[22].linear(list)?,
enc_conv5: LAYERS[23].linear(list)?,
})
}
pub fn layers(&self) -> [Layer<'_, 'w>; 24] {
[
Layer::Linear(&self.enc_dense1),
Layer::Linear(&self.enc_zdense),
Layer::Linear(&self.gdense2),
Layer::Linear(&self.gdense1),
Layer::Linear(&self.enc_conv_dense1),
Layer::Linear(&self.enc_conv_dense2),
Layer::Linear(&self.enc_conv_dense3),
Layer::Linear(&self.enc_conv_dense4),
Layer::Linear(&self.enc_conv_dense5),
Layer::Linear(&self.enc_gru1_input),
Layer::Linear(&self.enc_gru1_recurrent),
Layer::Linear(&self.enc_gru2_input),
Layer::Linear(&self.enc_gru2_recurrent),
Layer::Linear(&self.enc_gru3_input),
Layer::Linear(&self.enc_gru3_recurrent),
Layer::Linear(&self.enc_gru4_input),
Layer::Linear(&self.enc_gru4_recurrent),
Layer::Linear(&self.enc_gru5_input),
Layer::Linear(&self.enc_gru5_recurrent),
Layer::Linear(&self.enc_conv1),
Layer::Linear(&self.enc_conv2),
Layer::Linear(&self.enc_conv3),
Layer::Linear(&self.enc_conv4),
Layer::Linear(&self.enc_conv5),
]
}
}