use crate::inference::inference_solver::FinishedInferenceSolver;
use crate::inference::update_fn_details::get_update_fn_variants;
use crate::sketchbook::Sketch;
use std::fs::File;
use std::io::Write;
use std::path::Path;
use zip::write::{FileOptions, ZipWriter};
pub fn export_results(
path: &str,
finished_solver: &FinishedInferenceSolver,
original_sketch: &Sketch,
) -> Result<(), String> {
let archive_path = Path::new(path);
let prefix = archive_path.parent().unwrap();
std::fs::create_dir_all(prefix).map_err(|e| format!("{e:?}"))?;
let archive = File::create(archive_path).map_err(|e| format!("{e:?}"))?;
let mut zip_writer = ZipWriter::new(archive);
let sketch_json = original_sketch.to_custom_json();
write_to_zip("original_sketch.json", &mut zip_writer, sketch_json)?;
let color_bdd = finished_solver.sat_colors.as_bdd();
let color_bdd_str = color_bdd.to_string();
write_to_zip("color_bdd.bdd", &mut zip_writer, color_bdd_str)?;
let bn_model_aeon = finished_solver.bn.to_string();
write_to_zip("derived_model.aeon", &mut zip_writer, bn_model_aeon)?;
let formatted_report = finished_solver.results.format_to_report();
write_to_zip("report.txt", &mut zip_writer, formatted_report)?;
zip_writer
.add_directory("admissible_update_functions/", FileOptions::default())
.map_err(|e| format!("{e:?}"))?;
for (var, &count) in &finished_solver.results.num_update_fns_per_var {
let variants = get_update_fn_variants_from_solver(finished_solver, var)?;
let file_name = format!(
"admissible_update_functions/{}_{}_functions.txt",
var, count
);
let variants_content = variants.into_iter().collect::<Vec<_>>().join("\n");
write_to_zip(&file_name, &mut zip_writer, variants_content)?;
}
zip_writer.finish().map_err(|e| format!("{e:?}"))?;
Ok(())
}
fn write_to_zip(
file_name: &str,
zip_writer: &mut ZipWriter<File>,
file_content: String,
) -> Result<(), String> {
zip_writer
.start_file(file_name, FileOptions::default())
.map_err(|e| format!("{e:?}"))?;
write!(zip_writer, "{file_content}").map_err(|e| format!("{e:?}"))?;
Ok(())
}
pub fn get_update_fn_variants_from_solver(
solver: &FinishedInferenceSolver,
var_name: &str,
) -> Result<Vec<String>, String> {
get_update_fn_variants(&solver.sat_colors, &solver.bn, var_name)
}