docs: int bin( float col_data ) {
      if( Float.isNaN(col_data) ) return 0; // Always NAs to bin 0
      if (Float.isInfinite(col_data)) // Put infinity to most left/right bin
        if (col_data<0) return 0;
        else return _bins.length-1;
      // When the model is exposed to new test data, we could have data that is
      // out of range of any bin - however this binning call only happens during
      // model-building.
      assert _min <= col_data && col_data < _maxEx : "Coldata "+col_data+" out of range "+this;
      int idx1  = (int)((col_data-_min)*_step);
      assert 0 <= idx1 && idx1 <= _bins.length;
      if( idx1 == _bins.length) idx1--; // Roundoff error allows idx1 to hit upper bound, so truncate
      return idx1;
    }