def test_derivatives(): left_interp_indices = Variable(torch.LongTensor([[2, 3], [3, 4], [4, 5]])).repeat(5, 3, 1) left_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]])).repeat(5, 3, 1) right_interp_indices = Variable(torch.LongTensor([[2, 3], [3, 4], [4, 5]])).repeat(5, 3, 1) right_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]])).repeat(5, 3, 1) base_lazy_variable_mat = torch.randn(5, 6, 6) base_lazy_variable_mat = base_lazy_variable_mat.transpose(1, 2).matmul(base_lazy_variable_mat) test_matrix = Variable(torch.randn(1, 9, 4)) base_lazy_variable = NonLazyVariable(Variable(base_lazy_variable_mat, requires_grad=True)) interp_lazy_var = InterpolatedLazyVariable(base_lazy_variable, left_interp_indices, left_interp_values, right_interp_indices, right_interp_values) res = interp_lazy_var.matmul(test_matrix) res.sum().backward() base_lazy_variable2 = Variable(base_lazy_variable_mat, requires_grad=True) left_matrix = torch.Tensor([ [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], ]).repeat(5, 1, 1) actual = Variable(left_matrix).matmul(base_lazy_variable2).matmul(Variable(left_matrix).transpose(-1, -2)) actual = actual.matmul(test_matrix) actual.sum().backward() assert approx_equal(base_lazy_variable.var.grad.data, base_lazy_variable2.grad.data)
def test_batch_matmul(): left_interp_indices = Variable( torch.LongTensor([[2, 3], [3, 4], [4, 5]]).repeat(5, 3, 1)) left_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]]).repeat(5, 3, 1), requires_grad=True) left_interp_values_copy = Variable(left_interp_values.data, requires_grad=True) right_interp_indices = Variable( torch.LongTensor([[0, 1], [1, 2], [2, 3]]).repeat(5, 3, 1)) right_interp_values = Variable(torch.Tensor([[1, 2], [2, 0.5], [1, 3]]).repeat(5, 3, 1), requires_grad=True) right_interp_values_copy = Variable(right_interp_values.data, requires_grad=True) base_lazy_variable_mat = torch.randn(5, 6, 6) base_lazy_variable_mat = base_lazy_variable_mat.transpose( -1, -2).matmul(base_lazy_variable_mat) base_variable = Variable(base_lazy_variable_mat, requires_grad=True) base_variable_copy = Variable(base_lazy_variable_mat, requires_grad=True) base_lazy_variable = NonLazyVariable(base_variable) test_matrix = torch.randn(5, 9, 4) interp_lazy_var = InterpolatedLazyVariable(base_lazy_variable, left_interp_indices, left_interp_values, right_interp_indices, right_interp_values) res = interp_lazy_var.matmul(Variable(test_matrix)) left_matrix_comps = [] right_matrix_comps = [] for i in range(5): left_matrix_comp = Variable(torch.zeros(9, 6)) right_matrix_comp = Variable(torch.zeros(9, 6)) left_matrix_comp.scatter_(1, left_interp_indices[i], left_interp_values_copy[i]) right_matrix_comp.scatter_(1, right_interp_indices[i], right_interp_values_copy[i]) left_matrix_comps.append(left_matrix_comp.unsqueeze(0)) right_matrix_comps.append(right_matrix_comp.unsqueeze(0)) left_matrix = torch.cat(left_matrix_comps) right_matrix = torch.cat(right_matrix_comps) actual = left_matrix.matmul(base_variable_copy).matmul( right_matrix.transpose(-1, -2)) actual = actual.matmul(Variable(test_matrix)) assert approx_equal(res.data, actual.data) res.sum().backward() actual.sum().backward() assert approx_equal(base_variable.grad.data, base_variable_copy.grad.data) assert approx_equal(left_interp_values.grad.data, left_interp_values_copy.grad.data)
def test_matmul(self): left_interp_indices = Variable( torch.LongTensor([[2, 3], [3, 4], [4, 5]]).repeat(3, 1)) left_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]]).repeat(3, 1), requires_grad=True) left_interp_values_copy = Variable(left_interp_values.data, requires_grad=True) right_interp_indices = Variable( torch.LongTensor([[0, 1], [1, 2], [2, 3]]).repeat(3, 1)) right_interp_values = Variable(torch.Tensor([[1, 2], [2, 0.5], [1, 3]]).repeat(3, 1), requires_grad=True) right_interp_values_copy = Variable(right_interp_values.data, requires_grad=True) base_lazy_variable_mat = torch.randn(6, 6) base_lazy_variable_mat = ( base_lazy_variable_mat.t().matmul(base_lazy_variable_mat)) base_variable = Variable(base_lazy_variable_mat, requires_grad=True) base_variable_copy = Variable(base_lazy_variable_mat, requires_grad=True) base_lazy_variable = NonLazyVariable(base_variable) test_matrix = torch.randn(9, 4) interp_lazy_var = InterpolatedLazyVariable( base_lazy_variable, left_interp_indices, left_interp_values, right_interp_indices, right_interp_values, ) res = interp_lazy_var.matmul(Variable(test_matrix)) left_matrix = Variable(torch.zeros(9, 6)) right_matrix = Variable(torch.zeros(9, 6)) left_matrix.scatter_(1, left_interp_indices, left_interp_values_copy) right_matrix.scatter_(1, right_interp_indices, right_interp_values_copy) actual = (left_matrix.matmul(base_variable_copy).matmul( right_matrix.t()).matmul(Variable(test_matrix))) self.assertTrue(approx_equal(res.data, actual.data)) res.sum().backward() actual.sum().backward() self.assertTrue( approx_equal(base_variable.grad.data, base_variable_copy.grad.data)) self.assertTrue( approx_equal(left_interp_values.grad.data, left_interp_values_copy.grad.data))
def test_matmul_batch(self): left_interp_indices = Variable( torch.LongTensor([[2, 3], [3, 4], [4, 5]])).repeat(5, 3, 1) left_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]])).repeat(5, 3, 1) right_interp_indices = Variable( torch.LongTensor([[0, 1], [1, 2], [2, 3]])).repeat(5, 3, 1) right_interp_values = Variable(torch.Tensor([[1, 2], [2, 0.5], [1, 3]])).repeat(5, 3, 1) base_lazy_variable_mat = torch.randn(5, 6, 6) base_lazy_variable_mat = (base_lazy_variable_mat.transpose( 1, 2).matmul(base_lazy_variable_mat)) test_matrix = Variable(torch.randn(1, 9, 4)) base_lazy_variable = NonLazyVariable( Variable(base_lazy_variable_mat, requires_grad=True)) interp_lazy_var = InterpolatedLazyVariable( base_lazy_variable, left_interp_indices, left_interp_values, right_interp_indices, right_interp_values, ) res = interp_lazy_var.matmul(test_matrix) left_matrix = torch.Tensor([ [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], ]).repeat(5, 1, 1) right_matrix = torch.Tensor([ [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], ]).repeat(5, 1, 1) actual = (left_matrix.matmul(base_lazy_variable_mat).matmul( right_matrix.transpose(-1, -2)).matmul(test_matrix.data)) self.assertTrue(approx_equal(res.data, actual))
def test_matmul(): left_interp_indices = Variable(torch.LongTensor([[2, 3], [3, 4], [4, 5]])).repeat(3, 1) left_interp_values = Variable(torch.Tensor([[1, 2], [0.5, 1], [1, 3]])).repeat(3, 1) right_interp_indices = Variable(torch.LongTensor([[0, 1], [1, 2], [2, 3]])).repeat(3, 1) right_interp_values = Variable(torch.Tensor([[1, 2], [2, 0.5], [1, 3]])).repeat(3, 1) base_lazy_variable_mat = torch.randn(6, 6) base_lazy_variable_mat = base_lazy_variable_mat.t().matmul(base_lazy_variable_mat) base_lazy_variable = NonLazyVariable(Variable(base_lazy_variable_mat)) test_matrix = torch.randn(9, 4) test_matrix = torch.ones(9) interp_lazy_var = InterpolatedLazyVariable(base_lazy_variable, left_interp_indices, left_interp_values, right_interp_indices, right_interp_values) res = interp_lazy_var.matmul(Variable(test_matrix)).data left_matrix = torch.Tensor([ [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], [0, 0, 1, 2, 0, 0], [0, 0, 0, 0.5, 1, 0], [0, 0, 0, 0, 1, 3], ]) right_matrix = torch.Tensor([ [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], [1, 2, 0, 0, 0, 0], [0, 2, 0.5, 0, 0, 0], [0, 0, 1, 3, 0, 0], ]) actual = left_matrix.matmul(base_lazy_variable_mat).matmul(right_matrix.t()).matmul(test_matrix) assert approx_equal(res, actual)