use std::path::PathBuf;
use std::process::ExitCode;
use clap::{Parser, Subcommand};
use suiko::evaluation::{self, SplitFilter, SweepRule};
#[derive(Debug, Parser)]
#[command(
name = "suiko-eval",
version,
about = "Suikoの検出器を再現可能な評価集合で校正する"
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Fetch {
sources: PathBuf,
#[arg(long)]
id: Option<String>,
#[arg(long)]
limit: Option<usize>,
},
Report {
manifest: PathBuf,
#[arg(long)]
experimental: bool,
#[arg(long, value_enum)]
split: Option<SplitFilter>,
#[arg(long)]
external: bool,
},
Sweep {
manifest: PathBuf,
#[arg(long, value_enum)]
rule: SweepRule,
#[arg(long, value_delimiter = ',', required = true)]
values: Vec<f64>,
#[arg(long)]
experimental: bool,
},
LengthAnalysis {
manifest: PathBuf,
#[arg(long)]
experimental: bool,
},
Labeled { manifest: PathBuf },
Calibrate {
manifest: PathBuf,
#[arg(long, value_enum)]
rule: SweepRule,
#[arg(
long,
value_delimiter = ',',
required = true,
allow_hyphen_values = true
)]
values: Vec<f64>,
#[arg(long)]
max_human_fpr_upper: f64,
#[arg(long)]
external: bool,
#[arg(long)]
exclude_id_prefix: Option<String>,
#[arg(long)]
experimental: bool,
},
Vocab {
manifest: PathBuf,
#[arg(long)]
external: bool,
#[arg(long)]
exclude_id_prefix: Option<String>,
},
}
fn execute(cli: Cli) -> Result<String, evaluation::EvaluationError> {
match cli.command {
Command::Fetch { sources, id, limit } => {
evaluation::fetch_corpus(&sources, id.as_deref(), limit)
}
Command::Report {
manifest,
experimental,
split,
external,
} => evaluation::report(&manifest, experimental, split, external),
Command::Sweep {
manifest,
rule,
values,
experimental,
} => evaluation::sweep(&manifest, rule, &values, experimental),
Command::LengthAnalysis {
manifest,
experimental,
} => evaluation::length_analysis(&manifest, experimental),
Command::Labeled { manifest } => evaluation::labeled(&manifest),
Command::Calibrate {
manifest,
rule,
values,
max_human_fpr_upper,
external,
exclude_id_prefix,
experimental,
} => evaluation::calibrate(
&manifest,
rule,
&values,
max_human_fpr_upper,
external,
exclude_id_prefix.as_deref(),
experimental,
),
Command::Vocab {
manifest,
external,
exclude_id_prefix,
} => evaluation::vocab(&manifest, external, exclude_id_prefix.as_deref()),
}
}
fn main() -> ExitCode {
match execute(Cli::parse()) {
Ok(output) => {
print!("{output}");
ExitCode::SUCCESS
}
Err(error) => {
eprintln!("エラー: {error}");
ExitCode::from(1)
}
}
}