docs: private void solve(int method) throws NullPointerException {
      // solution exists
      if(solved) {
        return;
      }
  
      // bring in reduced row echelon form
      if(!reducedRowEchelonForm) {
        reducedRowEchelonForm(method);
      }
  
      if(!isSolvable(method)) {
        if(LOG.isDebugging()) {
          LOG.debugFine("Equation system is not solvable!");
        }
        return;
      }
  
      // compute one special solution
      final int cols = coeff[0].length;
      int numbound = 0, numfree = 0;
      int[] boundIndices = new int[cols], freeIndices = new int[cols];
      x_0 = new double[cols];
      outer: for(int i = 0; i < coeff.length; i++) {
        for(int j = i; j < coeff[row[i]].length; j++) {
          if(coeff[row[i]][col[j]] == 1) {
            x_0[col[i]] = rhs[row[i]];
            boundIndices[numbound++] = col[i];
            continue outer;
          }
        }
        freeIndices[numfree++] = i;
      }
  
      StringBuilder msg = new StringBuilder();
      if(LOG.isDebugging()) {
        msg.append("\nSpecial solution x_0 = [").append(FormatUtil.format(x_0, ",", FormatUtil.NF4)).append(']') //
            .append("\nbound Indices ").append(FormatUtil.format(boundIndices, ",")) //
            .append("\nfree Indices ").append(FormatUtil.format(freeIndices, ","));
      }
  
      // compute solution space of homogeneous linear equation system
      Arrays.sort(boundIndices, 0, numbound);
      int freeIndex = 0;
      int boundIndex = 0;
      u = new double[cols][numfree];
  
      for(int j = 0; j < u[0].length; j++) {
        for(int i = 0; i < u.length; i++) {
          if(freeIndex < numfree && i == freeIndices[freeIndex]) {
            u[i][j] = 1;
          }
          else if(boundIndex < numbound && i == boundIndices[boundIndex]) {
            u[i][j] = -coeff[row[boundIndex]][freeIndices[freeIndex]];
            boundIndex++;
          }
        }
        freeIndex++;
        boundIndex = 0; // Restart
      }
  
      if(LOG.isDebugging()) {
        msg.append("\nU");
        for(double[] anU : u) {
          msg.append('\n').append(FormatUtil.format(anU, ",", FormatUtil.NF4));
        }
        LOG.debugFine(msg.toString());
      }
  
      solved = true;
    }