void reformatTree(hpdRFnode* tree, SEXP forest, int* index, int *features_cardinality, int nrow, int treeID) { int *i = index; int id = *i; int* nodestatus = INTEGER(VECTOR_ELT(forest,0)); int* bestvar = INTEGER(VECTOR_ELT(forest,1)); int* treemap = INTEGER(VECTOR_ELT(forest,2)); double* nodepred = REAL(VECTOR_ELT(forest,3)); double* xbestsplit = REAL(VECTOR_ELT(forest,4)); if(tree->split_criteria != NULL && tree->split_criteria_length > 0) { nodestatus[treeID*nrow + id] = 1; bestvar[treeID*nrow +id] = tree->split_variable; nodepred[treeID*nrow +id] = tree->prediction; if(features_cardinality[bestvar[treeID*nrow +id]-1] == NA_INTEGER) xbestsplit[treeID*nrow +id] = tree->split_criteria[0]; else if(features_cardinality[bestvar[treeID*nrow +id]-1] < 31) { register double split = 0; for(int j = 0; j < tree->split_criteria_length; j++) split += 1 << ((int)tree->split_criteria[j]-1); xbestsplit[treeID*nrow +id] = split; } else printf("too many categorical variables can only support 31"); (*i)++; treemap[treeID*2*nrow +id] = (*i)+1; reformatTree(tree->left, forest, index, features_cardinality, nrow, treeID); (*i)++; treemap[treeID*2*nrow +id + nrow] = (*i)+1; reformatTree(tree->right, forest, index, features_cardinality, nrow, treeID); } else { nodestatus[treeID*nrow +id] = -1; nodepred[treeID*nrow +id] = tree->prediction; } }
/* prints the tree recursively */ void printTree(char *filename) { FILE* f = fopen(filename, "w"); reformatTree(); /* start printing */ for (int k=0; k<=treeHeight; k++) { printNull->level = k; recursivePrintValue(f, *(stack+stackPointer), k); fprintf(f, "\n"); for (int i=0; i<power(2, treeHeight-k-1); i++) { recursivePrintLinks(f, *(stack+stackPointer), i, k); fprintf(f, "\n"); } } printf("[INFO] [PRINT]\tThe tree was printed successfully in the file \"%s\".\n", filename); fclose(f); }