use clap::{Parser, Subcommand};
#[derive(Parser, Debug)]
#[command(name = "simian")]
#[command(version)]
#[command(about = "A machine learning CLI app in Rust for learning and experimentation", long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Data {
#[command(subcommand)]
command: DataCommands,
},
Fit {
#[command(subcommand)]
model: ModelFitCommands,
},
Eval {
#[command(subcommand)]
model: ModelEvalCommands,
},
Cv {
#[command(subcommand)]
model: ModelCvCommands,
},
Paper {
#[command(subcommand)]
command: PaperCommands,
},
}
#[derive(Subcommand, Debug)]
pub enum PaperCommands {
Open {
#[arg(index = 1)]
id: Option<String>,
#[arg(short, long)]
dev: bool,
},
Submit {
#[arg(index = 1)]
id: String,
#[arg(short, long, default_value_t = false)]
dry: bool,
},
Fork {
#[arg(index = 1)]
id: String,
},
}
#[derive(Subcommand, Debug)]
pub enum DataCommands {
Load {
dataset: String,
#[arg(long)]
out: Option<String>,
},
Prep {
#[command(subcommand)]
preparer: PrepCommands,
},
Split {
#[command(subcommand)]
strategy: SplitCommands,
},
Show {
dataset: Option<String>,
#[arg(short, long, default_value_t = false)]
interactive: bool,
#[arg(long, default_value_t = 10)]
limit: usize,
#[arg(long, default_value_t = 0)]
offset: usize,
#[arg(long)]
columns: Option<String>,
},
Describe { dataset: Option<String> },
Plot {
dataset: Option<String>,
#[arg(long)]
features: Option<String>,
#[arg(long)]
target: Option<String>,
},
}
#[derive(Subcommand, Debug)]
pub enum PrepCommands {
StandardScaler {
dataset: Option<String>,
#[arg(long)]
out: Option<String>,
},
Polynomial {
dataset: Option<String>,
#[arg(short, long, default_value_t = 2)]
degree: usize,
#[arg(long)]
out: Option<String>,
},
}
#[derive(Subcommand, Debug)]
pub enum SplitCommands {
Test {
dataset: Option<String>,
#[arg(long)]
train: Option<String>,
#[arg(long)]
test: Option<String>,
#[arg(long, default_value_t = 0.2)]
ratio: f32,
#[arg(long)]
seed: Option<u64>,
},
Kfold {
dataset: Option<String>,
#[arg(short, long, default_value_t = 5)]
k: usize,
},
}
#[derive(clap::Args, Debug, Clone)]
pub struct TrainArgs {
pub train_dataset: Option<String>,
#[arg(short, long)]
pub target: Option<String>,
#[arg(long)]
pub out: Option<String>,
#[arg(short, long, default_value_t = 0.0001)]
pub learning_rate: f64,
#[arg(short, long, default_value_t = 1000)]
pub epochs: usize,
#[arg(short, long, default_value_t = 10)]
pub patience: usize,
#[arg(long, default_value_t = 1e-4)]
pub tolerance: f64,
#[arg(short, long, default_value_t = 32)]
pub batch_size: usize,
}
#[derive(Subcommand, Debug)]
pub enum ModelFitCommands {
Linear {
#[command(flatten)]
args: TrainArgs,
},
Polynomial {
#[arg(short, long, default_value_t = 2)]
degree: usize,
#[command(flatten)]
args: TrainArgs,
},
Logistic {
#[command(flatten)]
args: TrainArgs,
},
}
#[derive(clap::Args, Debug, Clone)]
pub struct EvalArgs {
pub model: String,
#[arg(long)]
pub test_dataset: Option<String>,
#[arg(short, long)]
pub target: Option<String>,
}
#[derive(Subcommand, Debug)]
pub enum ModelEvalCommands {
Score {
#[command(flatten)]
args: EvalArgs,
},
Plot {
model: String,
#[arg(long)]
test_dataset: Option<String>,
#[arg(long)]
features: Option<String>,
#[arg(long)]
target: Option<String>,
},
}
#[derive(clap::Args, Debug, Clone)]
pub struct CvArgs {
pub dataset: Option<String>,
#[arg(short, long)]
pub target: Option<String>,
#[arg(short, long, default_value_t = 5)]
pub k: usize,
#[arg(short, long, default_value_t = 0.0001)]
pub learning_rate: f64,
#[arg(short, long, default_value_t = 1000)]
pub epochs: usize,
#[arg(short, long, default_value_t = 10)]
pub patience: usize,
#[arg(long, default_value_t = 1e-4)]
pub tolerance: f64,
#[arg(short, long, default_value_t = 32)]
pub batch_size: usize,
}
#[derive(Subcommand, Debug)]
pub enum ModelCvCommands {
Linear {
#[command(flatten)]
args: CvArgs,
},
Polynomial {
#[arg(short, long, default_value_t = 2)]
degree: usize,
#[command(flatten)]
args: CvArgs,
},
Logistic {
#[command(flatten)]
args: CvArgs,
},
}