@@ -235,82 +235,79 @@ def _classify_nontrivial_stages(
235235 return stage_per_file
236236
237237
238- def evaluate_one (inst : dict , budget : int ) -> dict :
239- iid = inst ["instance_id" ]
238+ def _print_instance_header (
239+ inst : dict , gold_blocks : list , gold_set : set , p_set : set , added : set , deleted : set , modified : set , nontrivial : set
240+ ) -> None :
240241 print ("\n " + "=" * 78 )
241- print (f"INSTANCE: { iid } " )
242+ print (f"INSTANCE: { inst [ 'instance_id' ] } " )
242243 print (f"Repo: { inst ['repo' ]} Lang: { inst ['language' ]} " )
243244 print (f"Base: { inst ['base_commit' ][:12 ]} " )
244-
245- gold_blocks = json .loads (inst ["gold_context" ]) if isinstance (inst ["gold_context" ], str ) else inst ["gold_context" ]
246- for g in gold_blocks :
247- g ["file" ] = normalize_gold_path (g ["file" ])
248- gold_set = {g ["file" ] for g in gold_blocks }
249- added , deleted , modified = patch_files_detailed (inst ["patch" ])
250- p_set = added | deleted | modified
251- nontrivial = gold_set - p_set
252-
253245 print (f"\n [GOLD] { len (gold_set ):3d} files, { len (gold_blocks ):3d} blocks" )
254246 for f in sorted (gold_set )[:8 ]:
255247 marker = " (in patch)" if f in p_set else " (NONTRIVIAL)"
256248 print (f" { f } { marker } " )
257249 if len (gold_set ) > 8 :
258250 print (f" ... and { len (gold_set ) - 8 } more" )
259-
260251 print (f"\n [PATCH] { len (p_set ):3d} files (added={ len (added )} , deleted={ len (deleted )} , modified={ len (modified )} )" )
261252 if deleted :
262253 print (f" DELETED FILES: { sorted (deleted )} " )
263-
264254 print (f"\n [NONTRIVIAL GOLD] { len (nontrivial ):3d} files" )
265255
266- repo_dir = ensure_repo (inst ["repo_url" ], inst ["repo" ], inst ["base_commit" ], REPOS_DIR )
267- if not repo_dir :
268- return {"id" : iid , "status" : "clone_fail" }
269-
270- if not apply_as_commit (repo_dir , inst ["patch" ]):
271- run_cmd (["git" , "-C" , str (repo_dir ), "checkout" , "--force" , inst ["base_commit" ]], check = False )
272- return {"id" : iid , "status" : "apply_fail" }
273256
274- t0 = time .time ()
275- output , err = run_diffctx (repo_dir , budget )
276- elapsed = time .time () - t0
277-
278- if not output :
279- run_cmd (["git" , "-C" , str (repo_dir ), "reset" , "--hard" , "HEAD~1" ], check = False )
280- print (f" DIFFCTX FAIL: { err } " )
281- return {"id" : iid , "status" : "diffctx_fail" }
282-
283- selected = {f ["path" ] for f in output ["fragments" ]}
257+ def _print_pipeline_dump (
258+ output : dict , elapsed : float , p_set : set , deleted : set , repo_dir : Path , nontrivial : set , gold_set : set , selected : set
259+ ) -> tuple [set , set , set ]:
284260 print (f"\n [DIFFCTX] { len (selected ):3d} files, { output ['fragment_count' ]:3d} fragments, { elapsed :.1f} s" )
285-
286261 _print_patch_coverage (p_set , selected , deleted , repo_dir )
287-
288- nontrivial_hits = nontrivial & selected
289- nontrivial_missed = nontrivial - selected
290262 universe = read_dump_set ("universe.txt" )
291263 fragmented = read_dump_set ("fragmented.txt" )
292264 sel_dump = read_dump_set ("selected.txt" )
293265 candidates_info = (DUMP_DIR / "candidates.txt" ).read_text ().strip () if (DUMP_DIR / "candidates.txt" ).exists () else ""
294-
295266 print (f"\n [PIPELINE STAGES]\n { candidates_info } " )
296267 print (f" universe: { len (universe )} fragmented: { len (fragmented )} selected: { len (sel_dump )} " )
297-
298- _print_nontrivial_report (nontrivial , nontrivial_hits , nontrivial_missed , fragmented , universe , sel_dump )
299-
268+ nontrivial_hits = nontrivial & selected
269+ _print_nontrivial_report (nontrivial , nontrivial_hits , nontrivial - selected , fragmented , universe , sel_dump )
300270 extra = selected - gold_set
301271 if extra :
302272 print (f"\n [DIFFCTX EXTRA] { len (extra )} files not in gold" )
303273 for f in sorted (extra )[:5 ]:
304274 print (f" { f } ({ 'patch' if f in p_set else 'discovered' } )" )
275+ return universe , fragmented , sel_dump
305276
306- run_cmd (["git" , "-C" , str (repo_dir ), "reset" , "--hard" , "HEAD~1" ], check = False )
307277
308- file_recall = len (gold_set & selected ) / len (gold_set )
309- nt_recall = len (nontrivial_hits ) / len (nontrivial ) if nontrivial else 0.0
310- patch_coverage = len (p_set & selected ) / len (p_set ) if p_set else 0.0
278+ def evaluate_one (inst : dict , budget : int ) -> dict :
279+ iid = inst ["instance_id" ]
280+ gold_blocks = json .loads (inst ["gold_context" ]) if isinstance (inst ["gold_context" ], str ) else inst ["gold_context" ]
281+ for g in gold_blocks :
282+ g ["file" ] = normalize_gold_path (g ["file" ])
283+ gold_set = {g ["file" ] for g in gold_blocks }
284+ added , deleted , modified = patch_files_detailed (inst ["patch" ])
285+ p_set = added | deleted | modified
286+ nontrivial = gold_set - p_set
287+ _print_instance_header (inst , gold_blocks , gold_set , p_set , added , deleted , modified , nontrivial )
311288
312- stage_per_file = _classify_nontrivial_stages (nontrivial , selected , sel_dump , fragmented , universe )
289+ repo_dir = ensure_repo (inst ["repo_url" ], inst ["repo" ], inst ["base_commit" ], REPOS_DIR )
290+ if not repo_dir :
291+ return {"id" : iid , "status" : "clone_fail" }
292+ if not apply_as_commit (repo_dir , inst ["patch" ]):
293+ run_cmd (["git" , "-C" , str (repo_dir ), "checkout" , "--force" , inst ["base_commit" ]], check = False )
294+ return {"id" : iid , "status" : "apply_fail" }
295+
296+ t0 = time .time ()
297+ output , err = run_diffctx (repo_dir , budget )
298+ elapsed = time .time () - t0
299+ if not output :
300+ run_cmd (["git" , "-C" , str (repo_dir ), "reset" , "--hard" , "HEAD~1" ], check = False )
301+ print (f" DIFFCTX FAIL: { err } " )
302+ return {"id" : iid , "status" : "diffctx_fail" }
303+
304+ selected = {f ["path" ] for f in output ["fragments" ]}
305+ universe , fragmented , sel_dump = _print_pipeline_dump (
306+ output , elapsed , p_set , deleted , repo_dir , nontrivial , gold_set , selected
307+ )
308+ run_cmd (["git" , "-C" , str (repo_dir ), "reset" , "--hard" , "HEAD~1" ], check = False )
313309
310+ nontrivial_hits = nontrivial & selected
314311 return {
315312 "id" : iid ,
316313 "status" : "ok" ,
@@ -319,10 +316,10 @@ def evaluate_one(inst: dict, budget: int) -> dict:
319316 "n_patch" : len (p_set ),
320317 "n_nontrivial" : len (nontrivial ),
321318 "n_deleted_in_patch" : len (deleted ),
322- "patch_coverage" : round (patch_coverage , 3 ),
323- "file_recall" : round (file_recall , 3 ),
324- "nt_recall" : round (nt_recall , 3 ),
325- "stage_per_file" : stage_per_file ,
319+ "patch_coverage" : round (len ( p_set & selected ) / len ( p_set ) if p_set else 0.0 , 3 ),
320+ "file_recall" : round (len ( gold_set & selected ) / len ( gold_set ) , 3 ),
321+ "nt_recall" : round (len ( nontrivial_hits ) / len ( nontrivial ) if nontrivial else 0.0 , 3 ),
322+ "stage_per_file" : _classify_nontrivial_stages ( nontrivial , selected , sel_dump , fragmented , universe ) ,
326323 }
327324
328325
0 commit comments