use std::{
env,
fs::{self, File},
path::Path,
process::{Command, Stdio},
};
fn main() {
if let Some(uuf250) = env::args().nth(1) {
let path = Path::new(&uuf250);
for e in path
.read_dir()
.unwrap_or_else(|_| panic!("not exist {:?}", path))
{
if let Ok(cnf) = e.map(|e| e.path()) {
if let Some(target) = cnf.file_name().map(Path::new) {
let out = target.with_extension("out");
let drat = target.with_extension("drat");
let grat = target.with_extension("grat");
print!("# {}", cnf.file_name().unwrap().to_string_lossy());
if out.exists() {
fs::remove_file(&out).expect("fail to rm");
}
Command::new("splr")
.args(&["-c", "-p", &*out.to_string_lossy(), &*cnf.to_string_lossy()])
.stdout(Stdio::null())
.output()
.expect("failed to execute Splr");
if !out.exists() {
println!(
" FAIL TO CERTIFICATE: {} => {}",
cnf.file_name().unwrap().to_string_lossy(),
out.to_string_lossy(),
);
panic!("abort");
}
Command::new("egrep")
.args(&["-v", "^[cs]"])
.stdin(File::open(out).expect(""))
.stdout(File::create(&drat).expect(""))
.output()
.expect("");
Command::new("gratgen")
.args(&[
&*cnf.to_string_lossy(),
&*drat.to_string_lossy(),
"-o",
&*grat.to_string_lossy(),
"-j",
"4",
])
.stdin(Stdio::piped())
.stdout(Stdio::null())
.stderr(Stdio::null())
.output()
.unwrap();
if grat.exists() {
print!(" => {}", grat.to_string_lossy());
} else {
println!(
" FAIL TO CONVERT: {} => {}",
cnf.file_name().unwrap().to_string_lossy(),
grat.to_string_lossy(),
);
panic!("abort");
}
let mut pass = false;
if let Ok(out) = Command::new("gratchk")
.args(&["unsat", &*cnf.to_string_lossy(), &*grat.to_string_lossy()])
.stdin(Stdio::piped())
.stderr(Stdio::null())
.output()
{
let str = String::from_utf8_lossy(&out.stdout);
for l in (*str).split('\n') {
if l.contains(&"s VERIFIED UNSAT") {
pass = true;
println!(" => VERIFIED UNSAT");
break;
}
}
}
if !pass {
println!(
" FAIL TO CERTIFICATE: {} => {}",
cnf.file_name().unwrap().to_string_lossy(),
grat.to_string_lossy(),
);
panic!("abort");
}
}
}
}
}
}