#include
#define cluster_(NAME) TH_CONCAT_4(cluster_, NAME, _, Real)
void cluster_random(THLongTensor *output, THLongTensor *row, THLongTensor *col, THLongTensor *degree) {
int64_t *output_data = output->storage->data + output->storageOffset;
int64_t *row_data = row->storage->data + row->storageOffset;
int64_t *col_data = col->storage->data + col->storageOffset;
int64_t *degree_data = degree->storage->data + degree->storageOffset;
int64_t e = 0, row_value, col_value, i;
while(e < THLongTensor_nElement(row)) {
row_value = row_data[e];
if (output_data[row_value] < 0) { // Node is unmatched.
// Find next unmatched neighbor.
col_value = -1;
for (i = 0; i < degree_data[row_value]; i++) {
col_value = col_data[e + i];
if (output_data[col_value] < 0) break; // Neighbor found.
else col_value = -1;
}
// Set output.
if (col_value < 0) {
output_data[row_value] = row_value;
}
else {
i = row_value < col_value ? row_value : col_value;
output_data[row_value] = i;
output_data[col_value] = i;
}
}
e += degree_data[row_value];
}
}
#include "generic/cpu.c"
#include "THGenerateAllTypes.h"
|