docs: public void growMaxLength( int arrayLength , boolean preserveValue ) {
          if( arrayLength < 0 )
              throw new IllegalArgumentException("Negative array length. Overflow?");
          // see if multiplying numRows*numCols will cause an overflow. If it won't then pick the smaller of the two
          if( numRows != 0 && numCols <= Integer.MAX_VALUE / numRows ) {
              // save the user from themselves
              arrayLength = Math.min(numRows*numCols, arrayLength);
          }
          if( nz_values == null || arrayLength > this.nz_values.length ) {
              double[] data = new double[ arrayLength ];
              int[] row_idx = new int[ arrayLength ];
  
              if( preserveValue ) {
                  if( nz_values == null )
                      throw new IllegalArgumentException("Can't preserve values when uninitialized");
                  System.arraycopy(this.nz_values, 0, data, 0, this.nz_length);
                  System.arraycopy(this.nz_rows, 0, row_idx, 0, this.nz_length);
              }
  
              this.nz_values = data;
              this.nz_rows = row_idx;
          }
      }