@@ -124,7 +124,7 @@ def convert_run(r: ET.Element) -> Run | None:
124124 parts = r .attrib ["name" ].split ("/" )
125125 logic = defs .Logic (parts [- 2 ])
126126 benchmark_yml = parts [- 1 ]
127- benchmark_file = int ( benchmark_yml . split ( "_" , 1 )[ 0 ] )
127+ benchmark_file = smtcomp . scramble_benchmarks . unscramble_yml_basename ( benchmark_yml )
128128 cputime_s : Optional [float ] = None
129129 memory_B : Optional [int ] = None
130130 answer : Optional [defs .Answer ] = None
@@ -367,17 +367,17 @@ def parse_mapping(p: Path) -> pl.LazyFrame:
367367 return pl .LazyFrame (
368368 (
369369 (
370- smtcomp . scramble_benchmarks . unscramble_yml_basename ( Path ( k ). name ),
370+ int ( file ),
371371 sorted (v ["core" ]),
372372 smtcomp .scramble_benchmarks .unscramble_yml_basename (Path (v ["file" ]).name ),
373373 )
374- for k , l in d .items ()
375- for v in l
374+ for file , cores in d .items ()
375+ for v in cores
376376 ),
377377 {
378- "scramble_id_orig " : pl .Int64 ,
378+ "orig_file " : pl .Int64 ,
379379 "unsat_core" : pl .List (pl .Int64 ),
380- "scramble_id " : pl .Int64 ,
380+ "file " : pl .Int64 ,
381381 },
382382 )
383383
@@ -402,35 +402,44 @@ def parse_dir(dir: Path, no_cache: bool) -> pl.LazyFrame:
402402 l_parsed = list (track ((parse_to_pl (f , no_cache ) for f in l ), total = len (l )))
403403 results = pl .concat (l_parsed )
404404
405- ucvr = dir / "../unsat_core_validation_results" / "parsed.feather"
406- if ( dir . name ). endswith ( "unsatcore" ):
407- json = dir / json_mapping_name
408- if not json .exists ():
409- raise ( ValueError ( f"No file { json !s } in the directory" ))
405+ uc_validation_results = dir / "../unsat_core_validation_results" / "parsed.feather"
406+
407+ json = dir / json_mapping_name
408+ if json .exists ():
409+ # add information about the original benchmark to each UC validation run
410410 lf = parse_mapping (json )
411- defaults = {"unsat_core" : [], "scramble_id_orig " : - 1 }
411+ results = add_columns ( results . drop ( "unsat_core" ), lf , on = [ "file" ], defaults = {"unsat_core" : [], "orig_file " : - 1 })
412412
413- if ucvr .is_file ():
414- vr = pl .read_ipc (ucvr ).lazy ()
413+ if (dir .name ).endswith ("unsatcore" ):
414+ if uc_validation_results .is_file ():
415+ # compute stats of validated and refuted cores
416+ vr = pl .read_ipc (uc_validation_results ).lazy ()
415417 vr = (
416- vr .select ("answer" , "unsat_core" , scramble_id = "scramble_id_orig " )
417- .group_by ("scramble_id " , "unsat_core" )
418+ vr .select ("answer" , "unsat_core" , file = "orig_file " )
419+ .group_by ("file " , "unsat_core" )
418420 .agg (
419- sat = (pl .col ("answer" ) == int (defs .Answer .Sat )).count (),
420- unsat = (pl .col ("answer" ) == int (defs .Answer .Unsat )).count (),
421+ sat = (pl .col ("answer" ) == int (defs .Answer .Sat )).sum (),
422+ unsat = (pl .col ("answer" ) == int (defs .Answer .Unsat )).sum (),
421423 validation_attempted = True ,
422424 )
423425 )
426+
424427 results = add_columns (
425428 results ,
426429 vr ,
427- on = ["scramble_id " , "unsat_core" ],
430+ on = ["file " , "unsat_core" ],
428431 defaults = {"sat" : 0 , "unsat" : 0 , "validation_attempted" : False },
429432 )
433+
434+ # change answer according to the validity of the core
430435 results = results .with_columns (
431- answer = pl .when ((pl .col ("answer" ) == int (defs .Answer .Unsat )) & (pl .col ("sat" ) > pl .col ("unsat" )))
432- .then (int (defs .Answer .UnsatCoreInvalidated ))
433- .otherwise ("answer" )
436+ answer = pl .when ((pl .col ("answer" ) == int (defs .Answer .Unsat )) & (pl .col ("sat" ) >= pl .col ("unsat" )))
437+ .then (
438+ pl .when (pl .col ("sat" ) == 0 )
439+ .then (int (defs .Answer .Unknown )) # sat == unsat == 0
440+ .otherwise (int (defs .Answer .UnsatCoreInvalidated ))
441+ )
442+ .otherwise ("answer" ) # sat < unsat
434443 ).drop ("sat" , "unsat" , "unsat_core" )
435444 else :
436445 results = results .with_columns (validation_attempted = False )
0 commit comments