THGreedy.c 1.19 KB
Newer Older
rusty1s's avatar
rusty1s committed
1
2
#include <TH/TH.h>

rusty1s's avatar
rusty1s committed
3
4
#include "common.h"

rusty1s's avatar
rusty1s committed
5
#define THGreedy_ TH_CONCAT_3(TH,Real,Greedy)
rusty1s's avatar
rusty1s committed
6

7
#define TH_GREEDY_CLUSTER(cluster, row, col, SELECT) { \
rusty1s's avatar
rusty1s committed
8
  THLongTensor_fill(cluster, -1); \
rusty1s's avatar
rusty1s committed
9
10
11
  int64_t *clusterData = THTensor_getData(cluster); \
  int64_t *rowData = THTensor_getData(row); \
  int64_t *colData = THTensor_getData(col); \
12
13
14
15
16
  ptrdiff_t idx = 0, nEdges = THLongTensor_nElement(row); \
  int64_t rowValue, pairValue, colValue, clusterValue; \
  while(idx < nEdges) { \
    rowValue = rowData[idx]; \
    pairValue = rowValue; \
rusty1s's avatar
rusty1s committed
17
    if (clusterData[rowValue] < 0) { \
18
19
20
21
22
23
24
      while(idx < nEdges && rowData[idx] == rowValue) { \
        colValue = colData[idx]; \
        if (clusterData[colValue] < 0) { \
          SELECT \
        } \
        idx++; \
      } \
rusty1s's avatar
rusty1s committed
25
    } \
26
27
28
29
    clusterValue = rowValue < pairValue ? rowValue : pairValue; \
    clusterData[rowValue] = clusterValue; \
    clusterData[pairValue] = clusterValue; \
    while(idx < nEdges && rowData[idx] == rowValue) idx++; \
rusty1s's avatar
rusty1s committed
30
31
32
  } \
}

33
34
35
36
void THGreedy(THLongTensor *cluster, THLongTensor *row, THLongTensor *col) {
  TH_GREEDY_CLUSTER(cluster, row, col,
    pairValue = colValue;
    break;
rusty1s's avatar
rusty1s committed
37
38
39
40
41
  )
}

#include "generic/THGreedy.c"
#include "THGenerateAllTypes.h"