cpu.c 2.67 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
void scatter_(mul)(int dim, THTensor *output, THLongTensor *index, THTensor *input) {
rusty1s's avatar
c99 c  
rusty1s committed
6
  int64_t i;
rusty1s's avatar
rusty1s committed
7
  TH_TENSOR_DIM_APPLY3(real, output, int64_t, index, real, input, dim, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM,
rusty1s's avatar
c99 c  
rusty1s committed
8
    for (i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
9
10
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] *= input_data[i];
rusty1s's avatar
rusty1s committed
11
12
13
    })
}

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

rusty1s's avatar
rusty1s committed
23
void scatter_(mean)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THTensor *count) {
rusty1s's avatar
c99 c  
rusty1s committed
24
  int64_t i;
rusty1s's avatar
rusty1s committed
25
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, real, count, dim,
rusty1s's avatar
c99 c  
rusty1s committed
26
    for (i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
27
28
      assertIndexInBoundaries(index_data[i], output_size, TH_TENSOR_DIM_APPLY_counter);
      output_data[index_data[i]] += input_data[i];
rusty1s's avatar
rusty1s committed
29
      count_data[index_data[i]]++;
rusty1s's avatar
rusty1s committed
30
31
32
    })
}

rusty1s's avatar
rusty1s committed
33
void scatter_(max)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THLongTensor *arg) {
rusty1s's avatar
c99 c  
rusty1s committed
34
  int64_t i;
rusty1s's avatar
rusty1s committed
35
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, int64_t, arg, dim,
rusty1s's avatar
c99 c  
rusty1s committed
36
    for (i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
37
38
39
      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];
rusty1s's avatar
rusty1s committed
40
        arg_data[index_data[i]] = i;
rusty1s's avatar
rusty1s committed
41
      }
rusty1s's avatar
min max  
rusty1s committed
42
43
44
    })
}

rusty1s's avatar
rusty1s committed
45
void scatter_(min)(int dim, THTensor *output, THLongTensor *index, THTensor *input, THLongTensor *arg) {
rusty1s's avatar
c99 c  
rusty1s committed
46
  int64_t i;
rusty1s's avatar
rusty1s committed
47
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, input, int64_t, arg, dim,
rusty1s's avatar
c99 c  
rusty1s committed
48
    for (i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
49
50
51
      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];
rusty1s's avatar
rusty1s committed
52
        arg_data[index_data[i]] = i;
rusty1s's avatar
rusty1s committed
53
54
55
56
      }
    })
}

rusty1s's avatar
rusty1s committed
57
void index_backward(int dim, THTensor *output, THLongTensor *index, THTensor *grad, THLongTensor *arg) {
rusty1s's avatar
c99 c  
rusty1s committed
58
  int64_t i;
rusty1s's avatar
rusty1s committed
59
  TH_TENSOR_DIM_APPLY4(real, output, int64_t, index, real, grad, int64_t, arg, dim,
rusty1s's avatar
c99 c  
rusty1s committed
60
    for (i = 0; i < THLongTensor_size(index, dim); i++) {
rusty1s's avatar
rusty1s committed
61
      if (arg_data[index_data[i]] == i) output_data[i] = grad_data[index_data[i]];
rusty1s's avatar
min max  
rusty1s committed
62
63
64
    })
}

rusty1s's avatar
rusty1s committed
65
#endif