import json
import subprocess
from pathlib import Path
import numpy as np
import torch
from rfdetr.models.postprocess import PostProcess
torch.set_num_threads(2)
torch.set_num_interop_threads(1)
boxes=torch.tensor([[(q%15+.5)/15,(q//15+.5)/20,.12,.13] for q in range(300)],dtype=torch.float32)
logits=torch.tensor([[(q*3+s)%17-8 for s in range(3)] for q in range(300)],dtype=torch.float32)/3
result=PostProcess(num_select=300)({'pred_boxes':boxes[None],'pred_logits':logits[None]},torch.tensor([[1,1]]))[0]
keep=result['labels']<2
expected=torch.cat((result['labels'][keep,None],result['scores'][keep,None],result['boxes'][keep].clamp(0,1)),dim=1).numpy()
text=subprocess.check_output(['/evidence/crowd_parity'],text=True,timeout=5)
actual=np.array([[float(v) for v in line.split()] for line in text.splitlines()])
assert actual.shape==expected.shape
assert np.array_equal(actual[:,0],expected[:,0])
assert np.allclose(actual[:,1:],expected[:,1:],atol=1e-6,rtol=1e-6)
print(json.dumps({'official_PostProcess_parity':'PASS','rows':len(actual),'max_abs_error':float(abs(actual-expected).max()),'accuracy':'NOT_RUN'}))
