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:
parent
ca6c94f2e5
commit
7ddb013f12
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -321,6 +321,14 @@ dependencies = [
|
||||
"strum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adf-bdd-iccma-2025-bin"
|
||||
version = "0.3.0-dev"
|
||||
dependencies = [
|
||||
"adf_bdd",
|
||||
"clap 4.5.24",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adf-bdd-server"
|
||||
version = "0.3.0"
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
[workspace]
|
||||
members=[ "lib", "bin", "server" ]
|
||||
members=[ "lib", "bin", "server" , "iccma-2025-bin"]
|
||||
default-members = [ "lib" ]
|
||||
|
||||
[profile.release]
|
||||
|
||||
10
iccma-2025-bin/Cargo.toml
Normal file
10
iccma-2025-bin/Cargo.toml
Normal 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" ]}
|
||||
|
||||
85
iccma-2025-bin/src/main.rs
Normal file
85
iccma-2025-bin/src/main.rs
Normal 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();
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user