use crate::Error;
use super::{Layer, LayerSpec, LinearSpec};
use crate::dnn::nnet::LinearLayer;
use crate::dnn::weights::WeightList;
pub const BLOB_FILE: &str = "fargan.bin";
pub const COND_NET_PEMBED_OUT_SIZE: usize = 12;
pub const COND_NET_FDENSE1_OUT_SIZE: usize = 64;
pub const COND_NET_FCONV1_OUT_SIZE: usize = 128;
pub const COND_NET_FCONV1_IN_SIZE: usize = 64;
pub const COND_NET_FCONV1_STATE_SIZE: usize = 128;
pub const COND_NET_FCONV1_DELAY: usize = 1;
pub const COND_NET_FDENSE2_OUT_SIZE: usize = 320;
pub const SIG_NET_COND_GAIN_DENSE_OUT_SIZE: usize = 1;
pub const SIG_NET_FWC0_CONV_OUT_SIZE: usize = 192;
pub const SIG_NET_FWC0_GLU_GATE_OUT_SIZE: usize = 192;
pub const SIG_NET_GRU1_OUT_SIZE: usize = 160;
pub const SIG_NET_GRU1_STATE_SIZE: usize = 160;
pub const SIG_NET_GRU2_OUT_SIZE: usize = 128;
pub const SIG_NET_GRU2_STATE_SIZE: usize = 128;
pub const SIG_NET_GRU3_OUT_SIZE: usize = 128;
pub const SIG_NET_GRU3_STATE_SIZE: usize = 128;
pub const SIG_NET_GRU1_GLU_GATE_OUT_SIZE: usize = 160;
pub const SIG_NET_GRU2_GLU_GATE_OUT_SIZE: usize = 128;
pub const SIG_NET_GRU3_GLU_GATE_OUT_SIZE: usize = 128;
pub const SIG_NET_SKIP_GLU_GATE_OUT_SIZE: usize = 128;
pub const SIG_NET_SKIP_DENSE_OUT_SIZE: usize = 128;
pub const SIG_NET_SIG_DENSE_OUT_OUT_SIZE: usize = 40;
pub const SIG_NET_GAIN_DENSE_OUT_OUT_SIZE: usize = 4;
pub const LAYERS: [LayerSpec; 20] = [
LayerSpec::Linear(LinearSpec {
name: "cond_net_pembed",
bias: Some("cond_net_pembed_bias"),
subias: None,
weights: None,
float_weights: Some("cond_net_pembed_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 224,
nb_outputs: 12,
}),
LayerSpec::Linear(LinearSpec {
name: "cond_net_fdense1",
bias: Some("cond_net_fdense1_bias"),
subias: None,
weights: None,
float_weights: Some("cond_net_fdense1_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 32,
nb_outputs: 64,
}),
LayerSpec::Linear(LinearSpec {
name: "cond_net_fconv1",
bias: Some("cond_net_fconv1_bias"),
subias: Some("cond_net_fconv1_subias"),
weights: Some("cond_net_fconv1_weights_int8"),
float_weights: Some("cond_net_fconv1_weights_float"),
weights_idx: None,
diag: None,
scale: Some("cond_net_fconv1_scale"),
nb_inputs: 192,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "cond_net_fdense2",
bias: Some("cond_net_fdense2_bias"),
subias: Some("cond_net_fdense2_subias"),
weights: Some("cond_net_fdense2_weights_int8"),
float_weights: Some("cond_net_fdense2_weights_float"),
weights_idx: None,
diag: None,
scale: Some("cond_net_fdense2_scale"),
nb_inputs: 128,
nb_outputs: 320,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_cond_gain_dense",
bias: Some("sig_net_cond_gain_dense_bias"),
subias: None,
weights: None,
float_weights: Some("sig_net_cond_gain_dense_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 80,
nb_outputs: 1,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_fwc0_conv",
bias: Some("sig_net_fwc0_conv_bias"),
subias: Some("sig_net_fwc0_conv_subias"),
weights: Some("sig_net_fwc0_conv_weights_int8"),
float_weights: Some("sig_net_fwc0_conv_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_fwc0_conv_scale"),
nb_inputs: 328,
nb_outputs: 192,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_fwc0_glu_gate",
bias: Some("sig_net_fwc0_glu_gate_bias"),
subias: Some("sig_net_fwc0_glu_gate_subias"),
weights: Some("sig_net_fwc0_glu_gate_weights_int8"),
float_weights: Some("sig_net_fwc0_glu_gate_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_fwc0_glu_gate_scale"),
nb_inputs: 192,
nb_outputs: 192,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru1_input",
bias: None,
subias: Some("sig_net_gru1_input_subias"),
weights: Some("sig_net_gru1_input_weights_int8"),
float_weights: Some("sig_net_gru1_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru1_input_scale"),
nb_inputs: 272,
nb_outputs: 480,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru1_recurrent",
bias: None,
subias: Some("sig_net_gru1_recurrent_subias"),
weights: Some("sig_net_gru1_recurrent_weights_int8"),
float_weights: Some("sig_net_gru1_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru1_recurrent_scale"),
nb_inputs: 160,
nb_outputs: 480,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru2_input",
bias: None,
subias: Some("sig_net_gru2_input_subias"),
weights: Some("sig_net_gru2_input_weights_int8"),
float_weights: Some("sig_net_gru2_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru2_input_scale"),
nb_inputs: 240,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru2_recurrent",
bias: None,
subias: Some("sig_net_gru2_recurrent_subias"),
weights: Some("sig_net_gru2_recurrent_weights_int8"),
float_weights: Some("sig_net_gru2_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru2_recurrent_scale"),
nb_inputs: 128,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru3_input",
bias: None,
subias: Some("sig_net_gru3_input_subias"),
weights: Some("sig_net_gru3_input_weights_int8"),
float_weights: Some("sig_net_gru3_input_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru3_input_scale"),
nb_inputs: 208,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru3_recurrent",
bias: None,
subias: Some("sig_net_gru3_recurrent_subias"),
weights: Some("sig_net_gru3_recurrent_weights_int8"),
float_weights: Some("sig_net_gru3_recurrent_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru3_recurrent_scale"),
nb_inputs: 128,
nb_outputs: 384,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru1_glu_gate",
bias: Some("sig_net_gru1_glu_gate_bias"),
subias: Some("sig_net_gru1_glu_gate_subias"),
weights: Some("sig_net_gru1_glu_gate_weights_int8"),
float_weights: Some("sig_net_gru1_glu_gate_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru1_glu_gate_scale"),
nb_inputs: 160,
nb_outputs: 160,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru2_glu_gate",
bias: Some("sig_net_gru2_glu_gate_bias"),
subias: Some("sig_net_gru2_glu_gate_subias"),
weights: Some("sig_net_gru2_glu_gate_weights_int8"),
float_weights: Some("sig_net_gru2_glu_gate_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru2_glu_gate_scale"),
nb_inputs: 128,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gru3_glu_gate",
bias: Some("sig_net_gru3_glu_gate_bias"),
subias: Some("sig_net_gru3_glu_gate_subias"),
weights: Some("sig_net_gru3_glu_gate_weights_int8"),
float_weights: Some("sig_net_gru3_glu_gate_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_gru3_glu_gate_scale"),
nb_inputs: 128,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_skip_glu_gate",
bias: Some("sig_net_skip_glu_gate_bias"),
subias: Some("sig_net_skip_glu_gate_subias"),
weights: Some("sig_net_skip_glu_gate_weights_int8"),
float_weights: Some("sig_net_skip_glu_gate_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_skip_glu_gate_scale"),
nb_inputs: 128,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_skip_dense",
bias: Some("sig_net_skip_dense_bias"),
subias: Some("sig_net_skip_dense_subias"),
weights: Some("sig_net_skip_dense_weights_int8"),
float_weights: Some("sig_net_skip_dense_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_skip_dense_scale"),
nb_inputs: 688,
nb_outputs: 128,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_sig_dense_out",
bias: Some("sig_net_sig_dense_out_bias"),
subias: Some("sig_net_sig_dense_out_subias"),
weights: Some("sig_net_sig_dense_out_weights_int8"),
float_weights: Some("sig_net_sig_dense_out_weights_float"),
weights_idx: None,
diag: None,
scale: Some("sig_net_sig_dense_out_scale"),
nb_inputs: 128,
nb_outputs: 40,
}),
LayerSpec::Linear(LinearSpec {
name: "sig_net_gain_dense_out",
bias: Some("sig_net_gain_dense_out_bias"),
subias: None,
weights: None,
float_weights: Some("sig_net_gain_dense_out_weights_float"),
weights_idx: None,
diag: None,
scale: None,
nb_inputs: 192,
nb_outputs: 4,
}),
];
#[derive(Clone, Copy, Default)]
pub struct Fargan<'w> {
pub cond_net_pembed: LinearLayer<'w>,
pub cond_net_fdense1: LinearLayer<'w>,
pub cond_net_fconv1: LinearLayer<'w>,
pub cond_net_fdense2: LinearLayer<'w>,
pub sig_net_cond_gain_dense: LinearLayer<'w>,
pub sig_net_fwc0_conv: LinearLayer<'w>,
pub sig_net_fwc0_glu_gate: LinearLayer<'w>,
pub sig_net_gru1_input: LinearLayer<'w>,
pub sig_net_gru1_recurrent: LinearLayer<'w>,
pub sig_net_gru2_input: LinearLayer<'w>,
pub sig_net_gru2_recurrent: LinearLayer<'w>,
pub sig_net_gru3_input: LinearLayer<'w>,
pub sig_net_gru3_recurrent: LinearLayer<'w>,
pub sig_net_gru1_glu_gate: LinearLayer<'w>,
pub sig_net_gru2_glu_gate: LinearLayer<'w>,
pub sig_net_gru3_glu_gate: LinearLayer<'w>,
pub sig_net_skip_glu_gate: LinearLayer<'w>,
pub sig_net_skip_dense: LinearLayer<'w>,
pub sig_net_sig_dense_out: LinearLayer<'w>,
pub sig_net_gain_dense_out: LinearLayer<'w>,
}
impl<'w> Fargan<'w> {
pub fn init(list: &WeightList<'w>) -> Result<Self, Error> {
Ok(Fargan {
cond_net_pembed: LAYERS[0].linear(list)?,
cond_net_fdense1: LAYERS[1].linear(list)?,
cond_net_fconv1: LAYERS[2].linear(list)?,
cond_net_fdense2: LAYERS[3].linear(list)?,
sig_net_cond_gain_dense: LAYERS[4].linear(list)?,
sig_net_fwc0_conv: LAYERS[5].linear(list)?,
sig_net_fwc0_glu_gate: LAYERS[6].linear(list)?,
sig_net_gru1_input: LAYERS[7].linear(list)?,
sig_net_gru1_recurrent: LAYERS[8].linear(list)?,
sig_net_gru2_input: LAYERS[9].linear(list)?,
sig_net_gru2_recurrent: LAYERS[10].linear(list)?,
sig_net_gru3_input: LAYERS[11].linear(list)?,
sig_net_gru3_recurrent: LAYERS[12].linear(list)?,
sig_net_gru1_glu_gate: LAYERS[13].linear(list)?,
sig_net_gru2_glu_gate: LAYERS[14].linear(list)?,
sig_net_gru3_glu_gate: LAYERS[15].linear(list)?,
sig_net_skip_glu_gate: LAYERS[16].linear(list)?,
sig_net_skip_dense: LAYERS[17].linear(list)?,
sig_net_sig_dense_out: LAYERS[18].linear(list)?,
sig_net_gain_dense_out: LAYERS[19].linear(list)?,
})
}
pub fn layers(&self) -> [Layer<'_, 'w>; 20] {
[
Layer::Linear(&self.cond_net_pembed),
Layer::Linear(&self.cond_net_fdense1),
Layer::Linear(&self.cond_net_fconv1),
Layer::Linear(&self.cond_net_fdense2),
Layer::Linear(&self.sig_net_cond_gain_dense),
Layer::Linear(&self.sig_net_fwc0_conv),
Layer::Linear(&self.sig_net_fwc0_glu_gate),
Layer::Linear(&self.sig_net_gru1_input),
Layer::Linear(&self.sig_net_gru1_recurrent),
Layer::Linear(&self.sig_net_gru2_input),
Layer::Linear(&self.sig_net_gru2_recurrent),
Layer::Linear(&self.sig_net_gru3_input),
Layer::Linear(&self.sig_net_gru3_recurrent),
Layer::Linear(&self.sig_net_gru1_glu_gate),
Layer::Linear(&self.sig_net_gru2_glu_gate),
Layer::Linear(&self.sig_net_gru3_glu_gate),
Layer::Linear(&self.sig_net_skip_glu_gate),
Layer::Linear(&self.sig_net_skip_dense),
Layer::Linear(&self.sig_net_sig_dense_out),
Layer::Linear(&self.sig_net_gain_dense_out),
]
}
}