use std::path::PathBuf;
use clap::Parser;
use super::version_string;
#[derive(Parser)]
#[command(
name = "holos synthesize",
version = version_string(),
about = "Synthesize a minimum-cost plan for finite cohomology rank bounds",
after_help = "Each state uses the full canonical cohomology space as a subspace. Check the result with: holos-check ARTIFACT"
)]
pub(crate) struct SynthesisCli {
pub(crate) output: PathBuf,
#[arg(long = "state", value_name = "GRAPH", required = true)]
pub(crate) states: Vec<PathBuf>,
#[arg(long, value_name = "N")]
pub(crate) vertices: usize,
#[arg(long = "at", value_name = "T")]
pub(crate) scale: f64,
#[arg(long = "homology-dim", value_name = "D")]
pub(crate) dimension: usize,
#[arg(long, value_name = "R", default_value_t = 0)]
pub(crate) max_rank: usize,
#[arg(long = "candidate", value_names = ["U", "V", "COST"], num_args = 3)]
pub(crate) candidates: Vec<usize>,
#[arg(long, value_name = "N")]
pub(crate) max_edits: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) oracle_limit: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) node_limit: usize,
#[arg(long, value_name = "P", default_value_t = 2)]
pub(crate) modulus: u32,
#[arg(long, value_name = "N", default_value_t = 1)]
pub(crate) threads: usize,
}
#[derive(Parser)]
#[command(
name = "holos synthesize-kinetic",
version = version_string(),
about = "Synthesize a minimum-cost plan over an exact affine threshold schedule",
after_help = "This command certifies a Rips cohomology rank condition. It does not certify physical sensor coverage. Check the result with: holos-check ARTIFACT"
)]
pub(crate) struct KineticSynthesisCli {
pub(crate) input: PathBuf,
pub(crate) output: PathBuf,
#[arg(long, value_name = "N")]
pub(crate) vertices: usize,
#[arg(long)]
pub(crate) start: f64,
#[arg(long)]
pub(crate) end: f64,
#[arg(long = "at", value_name = "T")]
pub(crate) scale: f64,
#[arg(long = "homology-dim", value_name = "D", default_value_t = 1)]
pub(crate) dimension: usize,
#[arg(long, value_name = "R", default_value_t = 0)]
pub(crate) max_rank: usize,
#[arg(long = "candidate", value_names = ["U", "V", "COST"], num_args = 3)]
pub(crate) candidates: Vec<usize>,
#[arg(long, value_name = "N")]
pub(crate) max_edits: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) oracle_limit: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) node_limit: usize,
#[arg(long, value_name = "P", default_value_t = 2)]
pub(crate) modulus: u32,
#[arg(long, value_name = "BYTES", default_value_t = 1usize << 30)]
pub(crate) max_artifact_bytes: usize,
}