public static void main(String argv[]) throws IOException {
    int i, predict_probability = 0;

    // parse options
    for (i = 0; i < argv.length; i++) {
      if (argv[i].charAt(0) != '-') break;
      ++i;
      switch (argv[i - 1].charAt(1)) {
        case 'b':
          predict_probability = atoi(argv[i]);
          break;
        default:
          System.err.print("unknown option\n");
          exit_with_help();
      }
    }
    if (i >= argv.length) exit_with_help();
    try {
      BufferedReader input = new BufferedReader(new FileReader(argv[i]));
      DataOutputStream output = new DataOutputStream(new FileOutputStream(argv[i + 2]));
      svm_model model = svm.svm_load_model(argv[i + 1]);
      if (predict_probability == 1)
        if (svm.svm_check_probability_model(model) == 0) {
          System.err.print("Model does not support probabiliy estimates\n");
          System.exit(1);
        }
      predict(input, output, model, predict_probability);
      input.close();
      output.close();
    } catch (FileNotFoundException e) {
      exit_with_help();
    } catch (ArrayIndexOutOfBoundsException e) {
      exit_with_help();
    }
  }
  public static void main(String argv[]) throws IOException {
    int i, predict_probability = 0;
    svm_print_string = svm_print_stdout;

    // parse options
    for (i = 0; i < argv.length; i++) {
      if (argv[i].charAt(0) != '-') break;
      ++i;
      switch (argv[i - 1].charAt(1)) {
        case 'b':
          predict_probability = atoi(argv[i]);
          break;
        case 'q':
          svm_print_string = svm_print_null;
          i--;
          break;
        default:
          System.err.print("Unknown option: " + argv[i - 1] + "\n");
          exit_with_help();
      }
    }
    if (i >= argv.length - 2) exit_with_help();
    try {
      BufferedReader input = new BufferedReader(new FileReader(argv[i]));
      DataOutputStream output =
          new DataOutputStream(new BufferedOutputStream(new FileOutputStream(argv[i + 2])));
      svm_model model = svm.svm_load_model(argv[i + 1]);
      if (model == null) {
        System.err.print("can't open model file " + argv[i + 1] + "\n");
        System.exit(1);
      }
      if (predict_probability == 1) {
        if (svm.svm_check_probability_model(model) == 0) {
          System.err.print("Model does not support probabiliy estimates\n");
          System.exit(1);
        }
      } else {
        if (svm.svm_check_probability_model(model) != 0) {
          svm_predict.info("Model supports probability estimates, but disabled in prediction.\n");
        }
      }
      predict(input, output, model, predict_probability);
      input.close();
      output.close();
    } catch (FileNotFoundException e) {
      exit_with_help();
    } catch (ArrayIndexOutOfBoundsException e) {
      exit_with_help();
    }
  }
  private static void predict(
      BufferedReader input, DataOutputStream output, svm_model model, int predict_probability)
      throws IOException {
    int correct = 0;
    int total = 0;
    double error = 0;
    double sumv = 0, sumy = 0, sumvv = 0, sumyy = 0, sumvy = 0;

    int svm_type = svm.svm_get_svm_type(model);
    int nr_class = svm.svm_get_nr_class(model);
    double[] prob_estimates = null;

    if (predict_probability == 1) {
      if (svm_type == svm_parameter.EPSILON_SVR || svm_type == svm_parameter.NU_SVR) {
        System.out.print(
            "Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma="
                + svm.svm_get_svr_probability(model)
                + "\n");
      } else {
        int[] labels = new int[nr_class];
        svm.svm_get_labels(model, labels);
        prob_estimates = new double[nr_class];
        output.writeBytes("labels");
        for (int j = 0; j < nr_class; j++) output.writeBytes(" " + labels[j]);
        output.writeBytes("\n");
      }
    }
    while (true) {
      String line = input.readLine();
      if (line == null) break;

      StringTokenizer st = new StringTokenizer(line, " \t\n\r\f:");

      double target = atof(st.nextToken());
      int m = st.countTokens() / 2;
      svm_node[] x = new svm_node[m];
      for (int j = 0; j < m; j++) {
        x[j] = new svm_node();
        x[j].index = atoi(st.nextToken());
        x[j].value = atof(st.nextToken());
      }

      double v;
      if (predict_probability == 1
          && (svm_type == svm_parameter.C_SVC || svm_type == svm_parameter.NU_SVC)) {
        v = svm.svm_predict_probability(model, x, prob_estimates);
        output.writeBytes(v + " ");
        for (int j = 0; j < nr_class; j++) output.writeBytes(prob_estimates[j] + " ");
        output.writeBytes("\n");
      } else {
        v = svm.svm_predict(model, x);
        output.writeBytes(v + "\n");
      }

      if (v == target) ++correct;
      error += (v - target) * (v - target);
      sumv += v;
      sumy += target;
      sumvv += v * v;
      sumyy += target * target;
      sumvy += v * target;
      ++total;
    }
    /*
    if(svm_type == svm_parameter.EPSILON_SVR ||
       svm_type == svm_parameter.NU_SVR)
    {
    	System.out.print("Mean squared error = "+error/total+" (regression)\n");
    	System.out.print("Squared correlation coefficient = "+
    		 ((total*sumvy-sumv*sumy)*(total*sumvy-sumv*sumy))/
    		 ((total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy))+
    		 " (regression)\n");
    }
    else
    	System.out.print("Accuracy = "+(double)correct/total*100+
    		 "% ("+correct+"/"+total+") (classification)\n");
    */
  }