#[derive(Debug, Clone, serde::Deserialize)]
pub struct ModelConfig {
#[serde(default = "default_patch_size")]
pub patch_size: usize,
#[serde(default = "default_num_queries")]
pub num_queries: usize,
#[serde(default = "default_embed_dim")]
pub embed_dim: usize,
#[serde(default = "default_num_heads")]
pub num_heads: usize,
#[serde(default = "default_mlp_ratio")]
pub mlp_ratio: f64,
#[serde(default)]
pub num_classes: usize,
#[serde(default = "default_norm_eps")]
pub norm_eps: f64,
#[serde(default = "default_expand")]
pub expand: usize,
#[serde(default = "default_num_blocks")]
pub num_blocks: usize,
#[serde(default = "default_d_state")]
pub d_state: usize,
#[serde(default = "default_d_conv")]
pub d_conv: usize,
#[serde(default = "default_bidir_strategy")]
pub bidirectional_strategy: String,
}
fn default_patch_size() -> usize { 40 }
fn default_num_queries() -> usize { 6 }
fn default_embed_dim() -> usize { 64 }
fn default_num_heads() -> usize { 2 }
fn default_mlp_ratio() -> f64 { 4.0 }
fn default_norm_eps() -> f64 { 1e-5 }
fn default_expand() -> usize { 2 }
fn default_num_blocks() -> usize { 2 }
fn default_d_state() -> usize { 16 }
fn default_d_conv() -> usize { 4 }
fn default_bidir_strategy()-> String { "add".to_string() }
impl Default for ModelConfig {
fn default() -> Self {
Self {
patch_size: default_patch_size(),
num_queries: default_num_queries(),
embed_dim: default_embed_dim(),
num_heads: default_num_heads(),
mlp_ratio: default_mlp_ratio(),
num_classes: 0,
norm_eps: default_norm_eps(),
expand: default_expand(),
num_blocks: default_num_blocks(),
d_state: default_d_state(),
d_conv: default_d_conv(),
bidirectional_strategy: default_bidir_strategy(),
}
}
}
impl ModelConfig {
pub fn hidden_dim(&self) -> usize {
self.embed_dim * self.num_queries
}
pub fn d_inner(&self) -> usize {
self.hidden_dim() * self.expand
}
pub fn dt_rank(&self) -> usize {
self.hidden_dim().div_ceil(16)
}
pub fn ffn_cross_dim(&self) -> usize {
(self.embed_dim as f64 * self.mlp_ratio) as usize
}
pub fn cross_head_dim(&self) -> usize {
self.embed_dim / self.num_heads
}
pub fn bidir_multiply(&self) -> bool {
self.bidirectional_strategy == "ew_multiply"
}
}
#[derive(Debug, Clone)]
pub struct DataConfig {
pub sample_rate: f32,
pub epoch_dur: f32,
pub xyz_min: [f32; 3],
pub xyz_max: [f32; 3],
}
impl Default for DataConfig {
fn default() -> Self {
Self {
sample_rate: 256.0,
epoch_dur: 5.0,
xyz_min: [-0.12, -0.12, -0.12],
xyz_max: [ 0.12, 0.12, 0.12],
}
}
}
impl DataConfig {
pub fn epoch_samples(&self) -> usize {
(self.sample_rate * self.epoch_dur) as usize
}
}