cpu.c 3.77 KB
Newer Older
rusty1s's avatar
rusty1s committed
1
#ifndef TH_GENERIC_FILE
rusty1s's avatar
rusty1s committed
2
#define TH_GENERIC_FILE "generic/cpu.c"
rusty1s's avatar
rusty1s committed
3
4
#else

rusty1s's avatar
rusty1s committed
5
6
void scatter_(add)(int dim, THTensor *output, THLongTensor *index, THTensor *input) {
  TH_TENSOR_DIM_APPLY3(real, output, int64_t, index, real, input, dim, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM,
rusty1s's avatar
rusty1s committed
7
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
8
9
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] += input_data[i];
rusty1s's avatar
rusty1s committed
10
11
12
    })
}

rusty1s's avatar
rusty1s committed
13
14
void scatter_(sub)(int dim, THTensor *output, THLongTensor *index, THTensor *input) {
  TH_TENSOR_DIM_APPLY3(real, output, int64_t, index, real, input, dim, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM,
rusty1s's avatar
rusty1s committed
15
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
16
17
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] -= input_data[i];
rusty1s's avatar
rusty1s committed
18
19
20
    })
}

rusty1s's avatar
rusty1s committed
21
22
void scatter_(mul)(int dim, THTensor *output, THLongTensor *index, THTensor *input) {
  TH_TENSOR_DIM_APPLY3(real, output, int64_t, index, real, input, dim, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM,
rusty1s's avatar
rusty1s committed
23
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
24
25
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] *= input_data[i];
rusty1s's avatar
rusty1s committed
26
27
28
    })
}

rusty1s's avatar
rusty1s committed
29
30
void scatter_(div)(int dim, THTensor *output, THLongTensor *index, THTensor *input) {
  TH_TENSOR_DIM_APPLY3(real, output, int64_t, index, real, input, dim, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM,
rusty1s's avatar
rusty1s committed
31
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
32
33
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] /= input_data[i];
rusty1s's avatar
rusty1s committed
34
35
36
    })
}

rusty1s's avatar
rusty1s committed
37
void scatter_(mean)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THTensor *output_count) {
rusty1s's avatar
rusty1s committed
38
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, real, output_count, dim,
rusty1s's avatar
rusty1s committed
39
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
40
41
42
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] += input_data[i];
      output_count_data[index_data[i]]++;
rusty1s's avatar
rusty1s committed
43
44
45
    })
}

rusty1s's avatar
min max  
rusty1s committed
46
void scatter_(max)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THLongTensor *output_index) {
rusty1s's avatar
rusty1s committed
47
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, int64_t, output_index, dim,
rusty1s's avatar
min max  
rusty1s committed
48
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
49
50
51
52
53
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      if (input_data[i] >= output_data[index_data[i]]) {
        output_data[index_data[i]] = input_data[i];
        output_index_data[index_data[i]] = i;
      }
rusty1s's avatar
min max  
rusty1s committed
54
55
56
57
    })
}

void scatter_(min)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THLongTensor *output_index) {
rusty1s's avatar
rusty1s committed
58
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, int64_t, output_index, dim,
rusty1s's avatar
min max  
rusty1s committed
59
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
60
61
62
63
64
65
66
67
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      if (input_data[i] <= output_data[index_data[i]]) {
        output_data[index_data[i]] = input_data[i];
        output_index_data[index_data[i]] = i;
      }
    })
}

rusty1s's avatar
rusty1s committed
68
void index_backward(int dim, THTensor *output, THLongTensor *index, THTensor *grad, THLongTensor *grad_index) {
rusty1s's avatar
debug  
rusty1s committed
69
  int64_t idx;
rusty1s's avatar
rusty1s committed
70
71
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, grad, int64_t, grad_index, dim,
    for (int64_t i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
debug  
rusty1s committed
72
      idx = *(index_data + i * index_stride);
rusty1s's avatar
rusty1s committed
73
      /* if (grad_index_data[index_data[i]] == i) { */
rusty1s's avatar
debug  
rusty1s committed
74
      printf("i: %lli, idx: %lli grad_index: %i grad: %i \n", i, idx, *(grad_index_data + idx * grad_index_stride), *(grad_data + idx * grad_stride));
rusty1s's avatar
rusty1s committed
75
76
      /* output_data[i] = grad_data[idx]; */
      /* } */
rusty1s's avatar
min max  
rusty1s committed
77
78
79
    })
}

rusty1s's avatar
rusty1s committed
80
#endif