test_pack.py 1.31 KB
Newer Older
1
2
3
import pytest
import torch

Ruilong Li(李瑞龙)'s avatar
Ruilong Li(李瑞龙) committed
4
from nerfacc import pack_data, pack_info, unpack_data, unpack_info
5
6
7
8
9
10

device = "cuda:0"
batch_size = 32
eps = 1e-6


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@pytest.mark.skipif(not torch.cuda.is_available, reason="No CUDA device")
def test_pack_data():
    n_rays = 2
    n_samples = 3
    data = torch.rand((n_rays, n_samples, 2), device=device, requires_grad=True)
    mask = torch.rand((n_rays, n_samples), device=device) > 0.5
    packed_data, packed_info = pack_data(data, mask)
    unpacked_data = unpack_data(packed_info, packed_data, n_samples)
    unpacked_data.sum().backward()
    assert (data.grad[mask] == 1).all()
    assert torch.allclose(
        unpacked_data.sum(dim=1), (data * mask[..., None]).sum(dim=1)
    )


26
27
28
29
30
31
32
33
@pytest.mark.skipif(not torch.cuda.is_available, reason="No CUDA device")
def test_unpack_info():
    packed_info = torch.tensor(
        [[0, 1], [1, 0], [1, 4]], dtype=torch.int32, device=device
    )
    ray_indices_tgt = torch.tensor(
        [0, 2, 2, 2, 2], dtype=torch.int64, device=device
    )
Ruilong Li(李瑞龙)'s avatar
Ruilong Li(李瑞龙) committed
34
35
36
    ray_indices = unpack_info(packed_info, n_samples=5)
    packed_info_2 = pack_info(ray_indices, n_rays=packed_info.shape[0])
    assert torch.allclose(packed_info.int(), packed_info_2.int())
37
38
39
40
    assert torch.allclose(ray_indices, ray_indices_tgt)


if __name__ == "__main__":
41
    test_pack_data()
42
    test_unpack_info()