Compute the quality of this generated program: - Diveristy: number of API calls. - Density: number of correlated API calls. - Coverage: covered APIs in prompt.
(&self, deopt: &Deopt)
| 160 | /// - Density: number of correlated API calls. |
| 161 | /// - Coverage: covered APIs in prompt. |
| 162 | pub fn compute_quality(&self, deopt: &Deopt) -> eyre::Result<Quality> { |
| 163 | let seed_path = deopt.get_succ_seed_path_by_id(self.id)?; |
| 164 | let ast = Executor::extract_ast(&seed_path, vec![], deopt)?; |
| 165 | let visitor = Visitor::new(ast.clone()); |
| 166 | |
| 167 | // compute diversity |
| 168 | let api_calls = visitor.get_library_call_names(); |
| 169 | for call in api_calls.iter() { |
| 170 | if let Some(exec_count) = get_exec_counter_value(call) { |
| 171 | set_exec_counter_value(call.to_string(), exec_count + 1); |
| 172 | } else { |
| 173 | set_exec_counter_value(call.to_string(), 1); |
| 174 | } |
| 175 | } |
| 176 | save_exec_counter(deopt); |
| 177 | // parse critical calls |
| 178 | let cfg = crate::analysis::cfg::CFGBuilder::build_cfg(ast)?; |
| 179 | let critical_paths = cfg.visit_max_caller()?; |
| 180 | let critical_calls = if critical_paths.is_empty() { |
| 181 | vec![] |
| 182 | } else { |
| 183 | critical_paths[0].clone() |
| 184 | }; |
| 185 | // compute density |
| 186 | let builder = crate::analysis::adg::ADGBuilder::new(); |
| 187 | let adg = builder.sparse_build(cfg).context(format!( |
| 188 | "ADG build from program fialed:\n {}", |
| 189 | self.statements |
| 190 | ))?; |
| 191 | let density = adg.compute_density(); |
| 192 | |
| 193 | let quality = Quality::new(density, api_calls, critical_calls); |
| 194 | Ok(quality) |
| 195 | } |
| 196 | |
| 197 | pub fn update_quality( |
| 198 | &mut self, |
no test coverage detected