test_add.py 997 Bytes
Newer Older
rusty1s's avatar
rusty1s committed
1
2
3
from nose.tools import assert_equal

import torch
rusty1s's avatar
rusty1s committed
4
from torch.autograd import Variable
rusty1s's avatar
rusty1s committed
5
from torch_scatter import scatter_add_, scatter_add
rusty1s's avatar
rusty1s committed
6
7


rusty1s's avatar
rusty1s committed
8
def test_scatter_add():
rusty1s's avatar
rusty1s committed
9
10
11
12
13
14
15
    input = [[2, 0, 1, 4, 3], [0, 2, 1, 3, 4]]
    index = [[4, 5, 4, 2, 3], [0, 0, 2, 2, 1]]
    input = torch.FloatTensor(input)
    index = torch.LongTensor(index)
    output = input.new(2, 6).fill_(0)
    expected_output = [[0, 0, 4, 3, 3, 0], [2, 4, 4, 0, 0, 0]]

rusty1s's avatar
rusty1s committed
16
17
18
19
    scatter_add_(output, index, input, dim=1)
    assert_equal(output.tolist(), expected_output)

    output = scatter_add(index, input, dim=1)
rusty1s's avatar
rusty1s committed
20
    assert_equal(output.tolist(), expected_output)
rusty1s's avatar
rusty1s committed
21

rusty1s's avatar
rusty1s committed
22
    output = Variable(output).fill_(0)
rusty1s's avatar
rusty1s committed
23
24
    index = Variable(index)
    input = Variable(input, requires_grad=True)
rusty1s's avatar
rusty1s committed
25
    scatter_add_(output, index, input, dim=1)
rusty1s's avatar
rusty1s committed
26

rusty1s's avatar
rusty1s committed
27
28
    grad_output = [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]
    grad_output = torch.FloatTensor(grad_output)
rusty1s's avatar
rusty1s committed
29

rusty1s's avatar
rusty1s committed
30
31
    output.backward(grad_output)
    assert_equal(index.data.tolist(), input.grad.data.tolist())