public LinearClassifier createLinearClassifier(double[] weights) {
   double[][] weights2D;
   if (objective != null) {
     weights2D = objective.to2D(weights);
   } else {
     weights2D = ArrayUtils.to2D(weights, featureIndex.size(), labelIndex.size());
   }
   return new LinearClassifier<L, F>(weights2D, featureIndex, labelIndex);
 }
    public Double apply(Double sigmaToTry) {
      double[][] weights2D;
      setSigma(sigmaToTry);

      weights2D = trainWeights(trainSet, weights, true); // bypass.

      weights = ArrayUtils.flatten(weights2D);

      LinearClassifier<L, F> classifier =
          new LinearClassifier<L, F>(weights2D, trainSet.featureIndex, trainSet.labelIndex);

      double score = scorer.score(classifier, devSet);
      // System.out.println("score: "+score);
      // System.out.print(".");
      System.err.print("##sigma = " + getSigma() + " ");
      System.err.println("-> average Score: " + score);
      System.err.println("##time elapsed: " + timer.stop() + " milliseconds.");
      timer.restart();
      return -score;
    }
  /**
   * Sets the sigma parameter to a value that optimizes the held-out score given by <code>scorer
   * </code>. Search for an optimal value is carried out by <code>minimizer</code> dataset the data
   * set to optimize sigma on. kfold
   *
   * @return an interim set of optimal weights: the weights
   */
  public double[] heldOutSetSigma(
      final GeneralDataset<L, F> trainSet,
      final GeneralDataset<L, F> devSet,
      final Scorer<L> scorer,
      LineSearcher minimizer) {

    featureIndex = trainSet.featureIndex;
    labelIndex = trainSet.labelIndex;
    // double[] resultWeights = null;
    Timing timer = new Timing();

    NegativeScorer negativeScorer = new NegativeScorer(trainSet, devSet, scorer, timer);

    timer.start();
    double bestSigma = minimizer.minimize(negativeScorer);
    System.err.println("##best sigma: " + bestSigma);
    setSigma(bestSigma);

    return ArrayUtils.flatten(
        trainWeights(
            trainSet,
            negativeScorer.weights,
            true)); // make sure it's actually the interim weights from best sigma
  }
 public LinearClassifier<L, F> trainClassifierWithInitialWeights(
     GeneralDataset<L, F> dataset, double[][] initialWeights2D) {
   double[] initialWeights =
       (initialWeights2D != null) ? ArrayUtils.flatten(initialWeights2D) : null;
   return trainClassifier(dataset, initialWeights);
 }