# binpack_dataset.py
import struct, numpy as np, torch
from torch.utils.data import Dataset

MAGIC = b'BINPACK\x00'

class BinpackDataset(Dataset):
    def __init__(self, path):
        self.path = path
        with open(path, "rb") as f:
            if f.read(8) != MAGIC:
                raise RuntimeError("Not a BINPACK file")
            self.feat_n = struct.unpack("<i", f.read(4))[0]
            self.count  = struct.unpack("<q", f.read(8))[0]
            self._offset0 = f.tell()
        self._rec_bytes = self.feat_n + 4  # N bytes + float32

    def __len__(self): return self.count

    def __getitem__(self, i):
        with open(self.path, "rb") as f:
            f.seek(self._offset0 + i*self._rec_bytes)
            feats = np.frombuffer(f.read(self.feat_n), dtype=np.uint8).astype(np.float32)
            target = struct.unpack("<f", f.read(4))[0]
        x = torch.from_numpy(feats)                      # [40960]
        y = torch.tensor([target], dtype=torch.float32)  # [1]
        return x, y
