Rev 6464 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** The routine which will find the best split for a node** Input : node* node number** Output: Fills in the node's* primary splits* competitor splits*/#include "rpart.h"#include "node.h"#include "rpartproto.h"voidbsplit(pNode me, int n1, int n2){int i, j, k;int kk;int nc;double improve;double split = 0.0;pSplit tsplit;int *index;double *xtemp; /* these 3 because I got tired of typeing* "rp.xtemp", etc */double **ytemp;double *wtemp;xtemp = rp.xtemp;ytemp = rp.ytemp;wtemp = rp.wtemp;/** test out the variables 1 at at time*/me->primary = (pSplit) NULL;for (i = 0; i < rp.nvar; i++) {index = rp.sorts[i];nc = rp.numcat[i];/* extract x and y data */k = 0;for (j = n1; j < n2; j++) {kk = index[j];if (kk >= 0 && rp.wt[kk] > 0) { /* x data not missing and wt > 0 */xtemp[k] = rp.xdata[i][kk];ytemp[k] = rp.ydata[kk];wtemp[k] = rp.wt[kk];k++;}}if (k == 0 || (nc == 0 && xtemp[0] == xtemp[k - 1]))continue; /* no place to split */(*rp_choose) (k, ytemp, xtemp, nc, rp.min_node, &improve,&split, rp.csplit, me->risk, wtemp);/** Originally, this just said "if (improve > 0)", but rounding* error will sometimes create a non zero that should be 0. Yet we* want to retain invariance to the scale of "improve".*/if (improve > rp.iscale)rp.iscale = improve; /* largest seen so far */if (improve > (rp.iscale * 1e-10)) {improve /= rp.vcost[i]; /* scale the improvement */tsplit = insert_split(&(me->primary), nc, improve, rp.maxpri);if (tsplit) {tsplit->improve = improve;tsplit->var_num = i;tsplit->spoint = split;tsplit->count = k;if (nc == 0) {tsplit->spoint = split;tsplit->csplit[0] = rp.csplit[0];} elsefor (k = 0; k < nc; k++)tsplit->csplit[k] = rp.csplit[k];}}}}