# Chạy offline

Bộ kit có sẵn một model nhỏ đã học để nhận các chữ số $0$ tới $5$ từ ảnh $8\times8$: `assets/pretrained.pt`, kèm phiếu mô tả `assets/ASSET.json`. Không cần Internet.

Model gồm `Linear(64, 32)`, `ReLU`, `Linear(32, 6)`, kiểu `float64`. Tệp `pretrained.pt` là một từ điển với các khóa `encoder_weight`, `encoder_bias`, `head_weight`, `head_bias` và `feature_divisor`.

1. Kiểm SHA-256 của `pretrained.pt` với trường `sha256` trong `ASSET.json` trước khi nạp.
2. Nạp bằng `torch.load(..., map_location="cpu", weights_only=True)`, dựng model, chép trọng số, chuyển sang `eval`.
3. Chia các điểm ảnh (từ $0$ tới $16$) cho `feature_divisor` **một lần**, rồi chạy model theo từng batch `batch_size` hàng, kể cả batch cuối nhỏ hơn.

## Dữ liệu vào

Mỗi tệp `input.json` gồm `X` (mỗi hàng $64$ điểm ảnh) và `batch_size`. Model nằm ở `assets/` trong bộ kit.

## Kết quả

Một đối tượng JSON `{"logits": [...]}`, mỗi hàng sáu số, theo đúng thứ tự hàng của `X`.

## Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng $10^{-7}$.

## Ví dụ

```input
{
  "X": [
    [
      0.0, 0.0, 6.0, 12.0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 16.0,
      15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 14.0, 2.0, 0.0, 0.0,
      0.0, 1.0, 15.0, 16.0, 11.0, 2.0, 0.0, 0.0, 0.0, 0.0, 9.0, 16.0,
      10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.0, 16.0, 14.0, 5.0, 0.0, 0.0,
      0.0, 0.0, 10.0, 16.0, 16.0, 14.0, 0.0, 0.0, 0.0, 0.0, 4.0, 11.0,
      12.0, 8.0, 0.0, 0.0
    ],
    [
      0.0, 0.0, 0.0, 1.0, 11.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.0,
      13.0, 1.0, 0.0, 0.0, 0.0, 0.0, 8.0, 15.0, 3.0, 0.0, 0.0, 0.0,
      0.0, 2.0, 16.0, 6.0, 1.0, 5.0, 2.0, 0.0, 0.0, 12.0, 13.0, 8.0,
      13.0, 16.0, 9.0, 0.0, 0.0, 16.0, 16.0, 13.0, 11.0, 16.0, 6.0,
      0.0, 0.0, 3.0, 4.0, 0.0, 11.0, 14.0, 0.0, 0.0, 0.0, 0.0, 0.0,
      1.0, 16.0, 12.0, 0.0, 0.0
    ],
    [
      0.0, 0.0, 3.0, 15.0, 16.0, 12.0, 0.0, 0.0, 0.0, 0.0, 6.0, 16.0,
      6.0, 14.0, 6.0, 0.0, 0.0, 0.0, 0.0, 3.0, 1.0, 15.0, 6.0, 0.0,
      0.0, 0.0, 0.0, 1.0, 14.0, 16.0, 3.0, 0.0, 0.0, 5.0, 8.0, 2.0,
      13.0, 16.0, 3.0, 0.0, 0.0, 5.0, 16.0, 0.0, 0.0, 9.0, 13.0, 0.0,
      0.0, 1.0, 15.0, 11.0, 8.0, 12.0, 16.0, 1.0, 0.0, 0.0, 3.0, 14.0,
      16.0, 16.0, 9.0, 0.0
    ],
    [
      0.0, 2.0, 10.0, 14.0, 11.0, 1.0, 0.0, 0.0, 0.0, 7.0, 15.0, 8.0,
      16.0, 4.0, 0.0, 0.0, 0.0, 1.0, 1.0, 6.0, 15.0, 1.0, 0.0, 0.0,
      0.0, 0.0, 0.0, 15.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 16.0,
      15.0, 9.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 6.0, 15.0, 8.0, 0.0,
      0.0, 2.0, 8.0, 4.0, 6.0, 15.0, 7.0, 0.0, 0.0, 2.0, 13.0, 16.0,
      15.0, 9.0, 0.0, 0.0
    ],
    [
      0.0, 1.0, 15.0, 16.0, 4.0, 0.0, 0.0, 0.0, 0.0, 9.0, 16.0, 11.0,
      14.0, 0.0, 0.0, 0.0, 0.0, 12.0, 10.0, 5.0, 16.0, 0.0, 0.0, 0.0,
      0.0, 4.0, 7.0, 8.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 15.0,
      6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 16.0, 2.0, 0.0, 0.0, 0.0, 0.0,
      4.0, 15.0, 14.0, 10.0, 11.0, 12.0, 1.0, 0.0, 0.0, 13.0, 16.0,
      16.0, 15.0, 11.0, 1.0
    ],
    [
      0.0, 0.0, 12.0, 16.0, 16.0, 8.0, 0.0, 0.0, 0.0, 3.0, 16.0, 13.0,
      8.0, 5.0, 0.0, 0.0, 0.0, 2.0, 16.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0,
      0.0, 16.0, 13.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 16.0, 16.0,
      7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 10.0, 13.0, 0.0, 0.0, 0.0,
      0.0, 2.0, 11.0, 16.0, 10.0, 0.0, 0.0, 0.0, 0.0, 11.0, 16.0, 12.0,
      0.0, 0.0, 0.0
    ],
    [
      0.0, 1.0, 12.0, 12.0, 12.0, 15.0, 6.0, 0.0, 0.0, 1.0, 14.0, 5.0,
      5.0, 4.0, 1.0, 0.0, 0.0, 0.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
      8.0, 16.0, 16.0, 15.0, 8.0, 0.0, 0.0, 0.0, 1.0, 4.0, 4.0, 5.0,
      12.0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.0, 4.0, 0.0, 0.0,
      2.0, 7.0, 2.0, 10.0, 12.0, 0.0, 0.0, 0.0, 2.0, 16.0, 15.0, 8.0,
      1.0, 0.0, 0.0
    ]
  ],
  "batch_size": 1
}
```

```output
{
  "logits": [
    [
      -5.807707779701959, 6.262389991542139, -0.1805818126488483,
      -5.405650393044603, -2.914198224595852, -4.05130910836966
    ],
    [
      -0.6624765413643406, -0.8836470824124462, -12.53123415477641,
      -6.283162381462738, 10.43438515488338, -1.9497023920343306
    ],
    [
      2.386387562913321, -5.956173236139999, 3.5783709884966277,
      8.065934096445043, -9.279591469392177, -7.129724098740805
    ],
    [
      -6.986298259044535, -3.70525622678644, -1.4967837980752114,
      11.211807528777143, -8.637818951471965, -0.11231706346611894
    ],
    [
      -5.087163543112431, -0.03251758889801304, 12.701459477358622,
      -2.283476536327855, -10.438661585057954, -3.3804756506158107
    ],
    [
      -3.75175212687943, -4.717251673102867, -9.247914182069762,
      1.794691598467062, -4.577260297076585, 7.9901169302428645
    ],
    [
      -2.759484102438518, -5.954105898463277, -11.874341775979428,
      -0.24440528644877196, -2.805945002963199, 13.154425632411423
    ]
  ]
}
```

::: goal Nộp bài
Tải bộ kit ở nút **Dữ liệu** rồi giải nén. Viết hàm `solve` trong `starter.py` hoặc `starter.ipynb` rồi chạy. Chương trình tự đi qua các thư mục `inputs/01`, `inputs/02`, … và gói kết quả thành `output/submission.zip`, gồm các tệp `01.json`, `02.json`, …, `20.json`. Nộp tệp ZIP ấy, chọn **Output**.
:::
