human_eval_infilling/data.py (41 lines of code) (raw):
import gzip
import json
import os
from typing import Dict, Iterable
ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "data")
def read_problems(benchmark_name: str) -> Dict[str, Dict]:
benchmark_file = {
"single-line": os.path.join(ROOT, "HumanEval-SingleLineInfilling.jsonl.gz"),
"multi-line": os.path.join(ROOT, "HumanEval-MultiLineInfilling.jsonl.gz"),
"random-span": os.path.join(ROOT, "HumanEval-RandomSpan.jsonl.gz"),
"random-span-light": os.path.join(ROOT, "HumanEval-RandomSpanLight.jsonl.gz"),
"test": os.path.join(ROOT, "example_problem.jsonl"),
}[benchmark_name]
return {task["task_id"]: task for task in stream_jsonl(benchmark_file)}
def stream_jsonl(filename: str) -> Iterable[Dict]:
"""
Parses each jsonl line and yields it as a dictionary
"""
if filename.endswith(".gz"):
with open(filename, "rb") as gzfp:
with gzip.open(gzfp, "rt") as fp:
for line in fp:
if any(not x.isspace() for x in line):
yield json.loads(line)
else:
with open(filename, "r") as fp:
for line in fp:
if any(not x.isspace() for x in line):
yield json.loads(line)
def write_jsonl(filename: str, data: Iterable[Dict], append: bool = False):
"""
Writes an iterable of dictionaries to jsonl
"""
if append:
mode = "ab"
else:
mode = "wb"
filename = os.path.expanduser(filename)
if filename.endswith(".gz"):
with open(filename, mode) as fp:
with gzip.GzipFile(fileobj=fp, mode="wb") as gzfp:
for x in data:
gzfp.write((json.dumps(x) + "\n").encode("utf-8"))
else:
with open(filename, mode) as fp:
for x in data:
fp.write((json.dumps(x) + "\n").encode("utf-8"))