The R Project SVN R-packages

Rev

Rev 6391 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 * Given a cptable list already initialized with the unique cp's in it,
 *  fill in the columns for risk and number of splits.
 *
 * The basic logic is : for each terminal node on the tree, start myself
 *  down at the bottom of the list of complexity parameters.  For each
 *  unique C.P. until my parent collapses, the node I'm in adds into that
 *  line of the CP table.  So walk up the CP list, adding in, until my
 *  parent would collapse; then report my position in the cp list to the
 *  parent and quit.
 *
 *  parent: complexity of the parent node
*/
#include "rpart.h"
#include "node.h"
#include "rpartproto.h"

CpTable
make_cp_table(pNode me, double parent, int nsplit)
{
    CpTable cplist;

    if (me->leftson) {          /* if there are splits below */
    /*
     * The 2 lines below are perhaps devious
     *  1) Since the return value depends on ones parent, both calls will
     *       return the same thing.
     *  2) I send 0 to the left to keep the current split (me) from
     *       being counted twice, once by each child.
     */
    make_cp_table(me->leftson, me->complexity, 0);
    cplist = make_cp_table(me->rightson, me->complexity, nsplit + 1);
    } else
    cplist = cptable_tail;

    while (cplist->cp < parent) {
    cplist->risk += me->risk;
    cplist->nsplit += nsplit;
    cplist = cplist->back;
    }

    return cplist;
}