docs: private void score_decide(Chunk chks[], Chunk nids, Chunk wrks, Chunk tree, int nnids[]) {
        for( int row=0; row<nids._len; row++ ) { // Over all rows
          int nid = (int)nids.at80(row);         // Get Node to decide from
          if( isDecidedRow(nid)) {               // already done
            nnids[row] = (nid-_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._col == -1 && DTree.isRootNode(dn)) { nnids[row] = (nid-_leaf); continue; }
          if( dn._split._col == -1 ) { // Might have a leftover non-split
            nid = dn._pid;             // Use the parent split decision then
            int xnid = oob ? nid2Oob(nid) : nid;
            nids.set0(row, xnid);
            nnids[row] = xnid-_leaf;
            dn = _tree.decided(nid); // Parent steers us
          }
  
          assert !isDecidedRow(nid);
          nid = dn.ns(chks,row); // Move down the tree 1 level
          if( !isDecidedRow(nid) ) {
            int xnid = oob ? nid2Oob(nid) : nid;
            nids.set0(row, xnid);
            nnids[row] = xnid-_leaf;
          } else {
            nnids[row] = nid-_leaf;
          }
        }
      }