#[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_depth")]
pub depth: 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)]
pub drop_path: f64,
#[serde(default = "default_norm_eps")]
pub norm_eps: f64,
}
fn default_patch_size() -> usize { 40 }
fn default_num_queries() -> usize { 4 }
fn default_embed_dim() -> usize { 64 }
fn default_depth() -> usize { 8 }
fn default_num_heads() -> usize { 2 }
fn default_mlp_ratio() -> f64 { 4.0 }
fn default_norm_eps() -> f64 { 1e-5 }
impl Default for ModelConfig {
fn default() -> Self {
Self {
patch_size: default_patch_size(),
num_queries: default_num_queries(),
embed_dim: default_embed_dim(),
depth: default_depth(),
num_heads: default_num_heads(),
mlp_ratio: default_mlp_ratio(),
num_classes: 0,
drop_path: 0.0,
norm_eps: default_norm_eps(),
}
}
}
impl ModelConfig {
pub fn hidden_dim(&self) -> usize {
self.embed_dim * self.num_queries
}
pub fn ffn_hidden_dim(&self) -> usize {
(self.hidden_dim() as f64 * self.mlp_ratio) as usize
}
pub fn head_dim(&self) -> usize {
self.hidden_dim() / (self.num_heads * self.num_queries)
}
pub fn total_heads(&self) -> usize {
self.num_heads * self.num_queries
}
}
#[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
}
}