#include
#define TH_TENSOR_GRACLUS(self, row, col, PRESELECT, SELECT) { \
THLongTensor_fill(self, -1); \
int64_t *selfData = THLongTensor_data(self); \
int64_t *rowData = THLongTensor_data(row); \
int64_t *colData = THLongTensor_data(col); \
ptrdiff_t e = 0, nEdges = THLongTensor_nElement(row); \
int64_t rowValue, colValue, matchedValue, value; \
while(e < nEdges) { \
rowValue = rowData[e]; \
matchedValue = rowValue; \
PRESELECT \
if (selfData[rowValue] < 0) { \
do { \
colValue = colData[e]; \
SELECT \
e++; \
} while(e < nEdges && rowData[e] == rowValue); \
value = rowValue < matchedValue ? rowValue : matchedValue; \
selfData[rowValue] = value; \
selfData[matchedValue] = value; \
} \
while(e < nEdges && rowData[e] == rowValue) e++; \
} \
}
void THTensor_graclus(THLongTensor *self, THLongTensor *row, THLongTensor *col) {
TH_TENSOR_GRACLUS(self, row, col, {},
if (selfData[colValue] < 0) { matchedValue = colValue; break; }
)
}
#include "generic/THGraclus.c"
#include "THGenerateAllTypes.h"
|