code: protected int[] score_decide(Chunk chks[], int nnids[]) {
      int [] res = nnids.clone();
      for( int row=0; row<nnids.length; row++ ) { // Over all rows
        int nid = nnids[row];          // Get Node to decide from
        if( isDecidedRow(nid)) {               // already done
          res[row] -= _leaf;
          continue;
        }
        // Score row against current decisions & assign new split
        boolean oob = isOOBRow(nid);
        if( oob ) nid = oob2Nid(nid); // sampled away - we track the position in the tree
        DTree.DecidedNode dn = _tree.decided(nid);
        if( dn._split == null ) { // Might have a leftover non-split
          if( DTree.isRootNode(dn) ) { res[row] = nid - _leaf; continue; }
          nid = dn._pid;             // Use the parent split decision then
          int xnid = oob ? nid2Oob(nid) : nid;
          nnids[row] = xnid;
          res[row] = xnid - _leaf;
          dn = _tree.decided(nid); // Parent steers us
        }
        assert !isDecidedRow(nid);
        nid = dn.getChildNodeID(chks,row); // Move down the tree 1 level
        if( !isDecidedRow(nid) ) {
          if( oob ) nid = nid2Oob(nid); // Re-apply OOB encoding
          nnids[row] = nid;
        }
        res[row] = nid-_leaf;
      }
      return res;
    }
docs: giving it an improved prediction).