docs: public static double maxLambdaLogisticL1(ClassificationDataSet cds)
      {
          /**
           * This code was ripped out/modified from NewGLMNET. It follows the
           * strategy laid out in Schmidt, M., Fung, G.,&amp;Rosaless, R. (2009).
           * Optimization Methods for L1-Regularization. Retrieved from
           * http://www.cs.ubc.ca/cgi-bin/tr/2009/TR-2009-19.pdf , where we use
           * the coordinate with the largest magnitude of the gradient
           */
          /**
           * if w=0, then D_part[i] = 0.5 for all i
           */
          final double D_part_i = 0.5;
          final int n = cds.getNumNumericalVars();
          Vec delta_L = new DenseVector(n);
          if(cds.rowMajor())
          {
              List<Vec> X = cds.getDataVectors();
              for (int i = 0; i < X.size(); i++)
              {
                  double y_i = cds.getDataPointCategory(i) * 2 - 1;
                  Vec x = X.get(i);
                  delta_L.mutableAdd(D_part_i * y_i, x);
              }
          }
          else
          {
              for(int j = 0; j < cds.getNumNumericalVars(); j++)
              {
                  Vec X_j = cds.getNumericColumn(j);
                  for(IndexValue iv : X_j)
                  {
                      int i = iv.getIndex();
                      double y_i = cds.getDataPointCategory(i) * 2 - 1;
                      delta_L.increment(j, D_part_i*y_i*iv.getValue());
                  }
              }
          }
          return max(abs(delta_L.max()), abs(delta_L.min())) / (cds.size());
      }