Minimize seed programs by unique branches
(deopt: &Deopt)
| 5 | |
| 6 | /// Minimize seed programs by unique branches |
| 7 | pub fn minimize(deopt: &Deopt) -> Result<()> { |
| 8 | let seeds_dir = deopt.get_library_succ_seed_dir()?; |
| 9 | // first sort seeds by coverge. |
| 10 | let mut program_coverage: Vec<(PathBuf, f32)> = Vec::new(); |
| 11 | for file in crate::deopt::utils::read_sort_dir(&seeds_dir)? { |
| 12 | let program = Program::load_from_path(&file)?; |
| 13 | let coverage_rate = Observer::compute_coverage_for_program(program.id, deopt)?; |
| 14 | program_coverage.push((file, coverage_rate)); |
| 15 | } |
| 16 | program_coverage.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); |
| 17 | |
| 18 | // iterate the sorted seeds, only the seeds still triger unique branch(s) are retained. |
| 19 | let mut observer = Observer::new(deopt); |
| 20 | for (program_path, _) in program_coverage { |
| 21 | let program = Program::load_from_path(&program_path)?; |
| 22 | let seed = deopt.get_seed_path_by_id(program.id)?; |
| 23 | let coverage = deopt.get_seed_coverage(program.id)?; |
| 24 | let unique_branches = observer.has_unique_branch(&coverage); |
| 25 | if unique_branches.is_empty() { |
| 26 | if seed.exists() { |
| 27 | log::info!( |
| 28 | "Program Seed triggers no unique branch and has been removed: {program_path:?}" |
| 29 | ); |
| 30 | std::fs::remove_file(seed)?; |
| 31 | } |
| 32 | continue; |
| 33 | } |
| 34 | log::info!("{program_path:?} is an unique seed"); |
| 35 | if !seed.exists() { |
| 36 | std::fs::copy(program_path, seed)?; |
| 37 | } |
| 38 | let new_exp_branches = observer.has_new_branch(&coverage); |
| 39 | observer.merge_new_branch(&new_exp_branches); |
| 40 | } |
| 41 | |
| 42 | log::info!("{}", observer.dump_global_states()); |
| 43 | Ok(()) |
| 44 | } |
no test coverage detected