dtrees_rs/parsers/
examples.rs1use crate::algorithms::common::types::{OptimalDepth2Policy, SearchHeuristic, SearchStepStrategy};
4use crate::tree::Tree;
5use clap::Parser;
6use serde::{Deserialize, Serialize};
7use std::fs;
8use std::fs::{remove_file, File};
9use std::io::{BufReader, BufWriter, Write};
10use std::path::PathBuf;
11
12#[derive(Debug, Parser)]
14#[clap(name = "dt-trees", version, author, about)]
15pub struct ExampleParser {
16 #[clap(short, long, value_parser)]
18 pub input: PathBuf,
19
20 #[arg(short, long, default_value_t = 5)]
22 pub support: usize,
23
24 #[arg(short, long)]
26 pub depth: usize,
27
28 #[arg(short, long, default_value_t = 300.0)]
30 pub timeout: f64,
31
32 #[arg(short, long, default_value_t = 1.0)]
34 pub metric: f64,
35
36 #[arg(long, default_value_t = 0.002)]
38 pub epsilon: f64,
39
40 #[arg(long, value_enum, default_value_t = OptimalDepth2Policy::Enabled)]
42 pub fast_d2: OptimalDepth2Policy,
43
44 #[arg(long, default_value_t = false)]
46 pub print_stats: bool,
47
48 #[arg(long, default_value_t = true)]
50 pub always_sort: bool,
51
52 #[arg(long, value_enum, default_value_t = SearchHeuristic::NoHeuristic)]
54 pub heuristic: SearchHeuristic,
55
56 #[arg(long, value_enum, default_value_t = SearchStepStrategy::Monotonic)]
58 pub step: SearchStepStrategy,
59
60 #[arg(short, long)]
62 pub result: PathBuf,
63
64 #[arg(long, default_value_t = false)]
66 pub print_tree: bool,
67
68 #[arg(long, default_value_t = false)]
70 pub overwrite: bool,
71}
72
73#[derive(Serialize, Deserialize, Clone)]
75pub struct Res {
76 pub name: String,
77 pub method: String,
78 pub depth: usize,
79 pub support: usize,
80 pub completed: bool,
81 pub one_time_sort: bool,
82 pub fast_d2: bool,
83 pub metric: Vec<f64>,
84 pub runtimes: Vec<f64>,
85 pub errors: Vec<f64>,
86 pub cache: Vec<usize>,
87 pub tree: Tree,
88}
89
90pub fn save_results(result: &Res, result_path: &PathBuf) -> std::io::Result<()> {
92 if let Some(parent) = result_path.parent() {
93 fs::create_dir_all(parent)?;
94 }
95
96 let file = File::create(result_path)?;
97 let mut writer = BufWriter::new(file);
98 serde_json::to_writer_pretty(&mut writer, result)?;
99 writer.flush()
100}
101
102pub fn load_results(result_path: &PathBuf) -> Option<Res> {
104 if !result_path.exists() {
105 return None;
106 }
107
108 File::open(result_path).ok().and_then(|file| {
109 let reader = BufReader::new(file);
110 serde_json::from_reader(reader).ok()
111 })
112}
113
114pub fn remove_results(result_path: &PathBuf) -> std::io::Result<()> {
116 if result_path.exists() {
117 remove_file(result_path)?
118 }
119 Ok(())
120}