"""CPU-only persistent process for unchanged supplied symbolic grading."""
import json
import os
import resource
import sys

assert os.environ.get('CUDA_VISIBLE_DEVICES') == ''
import run_baseline as base


def main():
    # Bound extra virtual allocations after imports, without constraining loaded libraries.
    pages = int(open('/proc/self/statm').read().split()[0])
    current_virtual = pages * os.sysconf('SC_PAGE_SIZE')
    limit = current_virtual + 512 * 1024**2
    resource.setrlimit(resource.RLIMIT_AS, (limit, limit))
    print(json.dumps(dict(status='ready', pid=os.getpid(), address_space_limit=limit,
                          extra_address_space_bytes=512*1024**2)), flush=True)
    for line in sys.stdin:
        request = json.loads(line)
        identity = request['id']
        try:
            result = bool(base.grade_answer(request['prediction'], request['reference']))
            reply = dict(id=identity, status='graded', result=result)
        except BaseException as error:
            reply = dict(id=identity, status='unresolved', error=type(error).__name__, detail=str(error)[:200])
        print(json.dumps(reply), flush=True)
        if reply['status'] != 'graded':
            return  # Never continue a process after a resource or unexpected grading failure.


if __name__ == '__main__':
    main()
