1
0
mirror of https://github.com/ellmau/adf-obdd.git synced 2025-12-20 09:39:38 +01:00

WIP: Binary for ICCMA 2025

This commit is contained in:
monsterkrampe 2025-01-09 11:55:33 +01:00
parent ca6c94f2e5
commit 7ddb013f12
No known key found for this signature in database
GPG Key ID: B8ADC1F5A5CE5057
4 changed files with 104 additions and 1 deletions

8
Cargo.lock generated
View File

@ -321,6 +321,14 @@ dependencies = [
"strum", "strum",
] ]
[[package]]
name = "adf-bdd-iccma-2025-bin"
version = "0.3.0-dev"
dependencies = [
"adf_bdd",
"clap 4.5.24",
]
[[package]] [[package]]
name = "adf-bdd-server" name = "adf-bdd-server"
version = "0.3.0" version = "0.3.0"

View File

@ -1,5 +1,5 @@
[workspace] [workspace]
members=[ "lib", "bin", "server" ] members=[ "lib", "bin", "server" , "iccma-2025-bin"]
default-members = [ "lib" ] default-members = [ "lib" ]
[profile.release] [profile.release]

10
iccma-2025-bin/Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[package]
name = "adf-bdd-iccma-2025-bin"
version = "0.3.0-dev"
authors = ["Stefan Ellmauthaler <stefan.ellmauthaler@tu-dresden.de>", "Lukas Gerlach <lukas.gerlach@tu-dresden.de>"]
edition = "2021"
[dependencies]
adf_bdd = { version="0.3.1", path="../lib", default-features = false }
clap = {version = "4.3.0", features = [ "derive", "cargo", "env" ]}

View File

@ -0,0 +1,85 @@
use std::path::PathBuf;
use std::io::BufRead;
use clap::{builder, Parser, ValueEnum};
#[derive(ValueEnum, Clone)]
enum Task {
#[value(name="DC-CO")]
DcCo,
#[value(name="DC-ST")]
DcSt,
#[value(name="DC-SST")]
DcSst,
#[value(name="DS-PR")]
DsPr,
#[value(name="DS-ST")]
DsSt,
#[value(name="DS-SST")]
DsSst,
#[value(name="SE-PR")]
SePr,
#[value(name="SE-ST")]
SeSt,
#[value(name="SE-SST")]
SeSst,
#[value(name="SE-ID")]
SeId,
}
#[derive(Parser)]
#[command(author, version, arg_required_else_help(true), help_template("{name} {version}\n{author-with-newline}"))]
struct App {
#[arg(long,exclusive(true))]
problems: bool,
#[arg(short = 'p', value_enum, required_unless_present("problems"))]
task: Option<Task>,
#[arg(short = 'f', value_parser, required_unless_present("problems"))]
input_file: Option<PathBuf>,
#[arg(short = 'a', required_if_eq_any([("task", "DC-CO"), ("task", "DC-ST"), ("task", "DC-SST"), ("task", "DS-PR"), ("task", "DS-ST"), ("task", "DS-SST")]))]
query: Option<usize>,
}
fn main() {
let app = App::parse();
if app.problems {
let possible_values: Vec<String> = Task::value_variants().into_iter().filter_map(Task::to_possible_value).map(|pv| builder::PossibleValue::get_name(&pv).to_string()).collect();
print!("[");
print!("{}", possible_values.join(","));
println!("]")
} else {
let task = app.task.expect("Task is required when \"problems\" flag is false.");
let file = app.input_file.expect("File is required when \"problems\" flag is false.");
let query = app.query;
let file = std::fs::File::open(file).expect("Error Reading File");
let mut lines = std::io::BufReader::new(file).lines();
let first_line = lines.next().expect("There must be at least one line in the file").expect("Error Reading Line");
let first_line: Vec<_> = first_line.split(" ").collect();
if first_line[0] != "p" || first_line[1] != "af" {
panic!("Expected first line to be of the form: p af <n>");
}
let num_arguments: usize = first_line[2].parse().expect("Could not convert number of arguments to u32; expected first line to be of the form: p af <n>");
let attacks: Vec<(usize, usize)> = lines.map(|line| line.expect("Error Reading Line")).filter(|line| !line.starts_with('#') || line.is_empty()).map(|line| {
let mut line = line.split(" ");
let a = line.next()?;
let b = line.next()?;
if line.next().is_some() {
None
} else {
Some((a.parse().ok()?, b.parse().ok()?))
}
}).map(|res_option| res_option.expect("Line must be of the form: n m")).collect();
// index in outer vector represents attacked element
let mut is_attacked_by: Vec<Vec<usize>> = vec![vec![]; num_arguments.try_into().unwrap()];
for (a, b) in attacks {
is_attacked_by[b-1].push(a-1); // we normalize names to be zero-indexed
}
}
//app.run();
}