Files
microsoft--unilm/PFPO/scripts/apps/extract_pseudo_outputs_as_label.py
2026-07-13 13:24:13 +08:00

111 lines
4.1 KiB
Python

import argparse
import collections
import json
import sys
sys.set_int_max_str_digits(0)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--use_sc", default=False, action="store_true")
parser.add_argument("--problem_id_field", type=str, default="problem_id")
parser.add_argument("--test_case_field", type=str, default="input_output")
parser.add_argument("--cover", default=False, action="store_true")
args = parser.parse_args()
data = json.load(open(args.input_file))
pseudo_test_cases = []
unaligned = 0
total = 0
for item in data:
problem_id = item[args.problem_id_field]
if not item[args.test_case_field]:
continue
if "res" not in item or (not item["res"]):
continue
if len(item["res"]) != len(item["outputs"]):
unaligned += 1
continue
input_outputs = collections.defaultdict(list)
for i, (r, outputs) in enumerate(zip(item["res"], item["outputs"])):
if r in [-1, -2]:
continue
for j, o in enumerate(outputs):
if o:
# _input = item["input_output"]["inputs"][j]
input_outputs[j].append(o)
if args.use_sc:
test_cases = {
"inputs": [],
"outputs": []
}
for _input_index, outputs in input_outputs.items():
pairs = {str(o): o for o in outputs}
cnt = collections.Counter(list(pairs.keys()))
cnt = sorted(cnt.items(), key=lambda x: x[1], reverse=True)
_output = cnt[0][0]
_output = pairs[_output]
test_cases["inputs"].append(item[args.test_case_field]["inputs"][_input_index])
test_cases["outputs"].append(_output)
else:
test_cases = {
"inputs": [],
"outputs": [],
}
for _input, outputs in input_outputs.items():
test_cases["inputs"].append(_input)
test_cases["outputs"].append(outputs[0])
total += len(test_cases["inputs"])
if len(test_cases["inputs"]) == 0:
continue
if args.cover:
item.pop("res")
item.pop("outputs")
item.pop("full_res")
item.pop("errors")
if "fn_name" in item[args.test_case_field]:
test_cases["fn_name"] = item[args.test_case_field]["fn_name"]
item["input_output"] = test_cases
pseudo_test_cases.append(item)
else:
pseudo_test_cases.append({
"problem_id": problem_id,
"input_output": test_cases
})
print(f"Unaligned: {unaligned}")
print(f"Total number of pseudo test cases: {len(pseudo_test_cases)}")
print(f"Average number of test cases: {total} / {len(pseudo_test_cases)} = {total / len(pseudo_test_cases)}")
json.dump(pseudo_test_cases, open(args.output_file, "w"), indent=2)
if __name__ == "__main__":
main()
"""
>>> python scripts/apps/extract_pseudo_outputs_as_label.py --input_file outputs/apps/apps.train.r2c.vanilla.gpt-4o.tem1.0.n11.pure_outputs.json --output_file outputs/apps/apps.train.r2c.vanilla.gpt-4o.tem1.0.n11.pseudo_test_cases.json --use_sc
Unaligned: 582
Total number of pseudo test cases: 4223
Average number of test cases: 13674 / 4223 = 3.2379824769121477
>>> python scripts/apps/extract_pseudo_outputs_as_label.py --input_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.s43.run_outputs.json --output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.s43.run_outputs.pseudo_cases.sc.json --use_sc --problem_id_field id --test_case_field test_cases
Unaligned: 87
Total number of pseudo test cases: 4715
Average number of test cases: 17551 / 4715 = 3.72237539766702
"""