int main(int argc, char **argv){
	fflush(stdout);
	fprintf(stdout, "\nProgram that generates training, evaluation and test sets for the OPF classifier\n");
	fprintf(stdout, "\nIf you have any problem, please contact: ");
	fprintf(stdout, "\n- [email protected]");
	fprintf(stdout, "\n- [email protected]\n");
	fprintf(stdout, "\nLibOPF version 2.0 (2009)\n");
	fprintf(stdout, "\n"); fflush(stdout);

	if(argc != 6){
		fprintf(stderr, "\nusage opf_split <P1> <P2> <P3> <P4> <P5>");
		fprintf(stderr, "\nP1: input dataset in the OPF file format");
		fprintf(stderr, "\nP2: percentage for the training set size [0,1]");
		fprintf(stderr, "\nP3: percentage for the evaluation set size [0,1] (leave 0 in the case of no learning)");
		fprintf(stderr, "\nP4: percentage for the test set size [0,1]");
		fprintf(stderr, "\nP5: normalize features? 1 - Yes  0 - No\n\n");
		exit(-1);
	}
	Subgraph *g = NULL, *gAux = NULL, *gTraining = NULL, *gEvaluating = NULL, *gTesting = NULL;
	float training_p = atof(argv[2]), evaluating_p = atof(argv[3]), testing_p = atof(argv[4]);
	int normalize = atoi(argv[5]);

	CheckInputData(training_p, evaluating_p, testing_p);

	fprintf(stdout, "\nReading data set ..."); fflush(stdout);
	g = ReadSubgraph(argv[1]);
	fprintf(stdout, " OK"); fflush(stdout);

	if(normalize) opf_NormalizeFeatures(g);

	fprintf(stdout, "\nSplitting data set ..."); fflush(stdout);
	opf_SplitSubgraph(g, &gAux, &gTesting, training_p+evaluating_p);

	if (evaluating_p > 0)
	  opf_SplitSubgraph(gAux, &gTraining, &gEvaluating, training_p/(training_p+evaluating_p));
	else gTraining = CopySubgraph(gAux);

	fprintf(stdout, " OK"); fflush(stdout);

	fprintf(stdout, "\nWriting data sets to disk ..."); fflush(stdout);
	WriteSubgraph(gTraining, "training.dat");
	WriteSubgraphPrototype(gTraining, "trainingp.dat");
	if (evaluating_p > 0) {
		WriteSubgraph(gEvaluating, "evaluating.dat");
		WriteSubgraphPrototype(gEvaluating, "evaluatingp.dat");
	}
	WriteSubgraph(gTesting, "testing.dat");
	WriteSubgraphPrototype(gTesting, "testingp.dat");
	fprintf(stdout, " OK"); fflush(stdout);

	fprintf(stdout, "\nDeallocating memory ...");
	DestroySubgraph(&g);
	DestroySubgraph(&gAux);
	DestroySubgraph(&gTraining);
	DestroySubgraph(&gEvaluating);
	DestroySubgraph(&gTesting);
	fprintf(stdout, " OK\n");

	return 0;
}
int main(int argc, char **argv)
{

    if (argc != 5)
    {
        fprintf(stderr, "\nusage FeatureSelection <training set> <evaluating set> <testing set> <search space configuration file>\n");
        exit(-1);
    }

    SearchSpace *s = NULL;
    int i;
    double time_opt, time_classify, classification_error;
    timer tic, toc;
    FILE *f = NULL;
    TransferFunc optTransfer = NULL;
    Subgraph *Train = NULL, *Evaluate = NULL, *Merge = NULL, *Test = NULL, *newTrain = NULL, *newTest = NULL;

    Train = ReadSubgraph(argv[1]);
    Evaluate = ReadSubgraph(argv[2]);
    Test = ReadSubgraph(argv[3]);
    s = ReadSearchSpaceFromFile(argv[4], _WCA_);
    optTransfer = S2TransferFunction;

    for (i = 0; i < Train->nfeats; i++)
    {
        s->LB[i] = -20;
        s->LB[i] = 20;
    }

    fprintf(stderr, "\nInitializing search space ... ");
    InitializeSearchSpace(s, _WCA_);
    fprintf(stderr, "\nOk\n");

    fflush(stderr);
    fprintf(stderr, "\nRunning WCA ... ");
    gettimeofday(&tic, NULL);
    runWCA(s, FeatureSelectionOPF, Train, Evaluate, optTransfer);
    gettimeofday(&toc, NULL);
    fflush(stderr);
    fprintf(stderr, "\nOK\n");

    time_opt = ((toc.tv_sec - tic.tv_sec) * 1000.0 + (toc.tv_usec - tic.tv_usec) * 0.001) / 1000.0;
    fprintf(stdout, "\nOptimization time: %f seconds\n", time_opt);
    fflush(stderr);

    Merge = opf_MergeSubgraph(Train, Evaluate);

    fflush(stderr);
    fprintf(stderr, "\nWriting new training and testing sets ...\n");
    newTrain = CreateSubgraphFromSelectedFeatures(Merge, s->g);
    newTest = CreateSubgraphFromSelectedFeatures(Test, s->g);
    fprintf(stderr, "\nTraining set\n");
    WriteSubgraph(newTrain, "training.wca.dat");
    fprintf(stderr, "\n\nTesting set\n");
    WriteSubgraph(newTest, "testing.wca.dat");
    fflush(stderr);
    fprintf(stderr, "\nOK\n");

    opf_OPFTraining(newTrain);
    gettimeofday(&tic, NULL);
    opf_OPFClassifying(newTrain, newTest);
    gettimeofday(&toc, NULL);
    classification_error = opf_Accuracy(newTest);

    time_classify = ((toc.tv_sec - tic.tv_sec) * 1000.0 + (toc.tv_usec - tic.tv_usec) * 0.001) / 1000.0;
    fprintf(stdout, "\nClassification time: %f seconds\n", time_classify);
    fflush(stderr);

    f = fopen("best_feats.txt", "a");
    fprintf(f, "%d %d", newTrain->nfeats, (int)s->g[0]);
    for (i = 1; i < Train->nfeats; i++)
    {
        fprintf(f, " %d", (int)s->g[i]);
    }
    fprintf(f, "\n");
    fclose(f);

    fprintf(stderr, "\nAccuracy: %.2lf%%\n", 100 * classification_error);
    f = fopen("final_accuracy.txt", "a");
    fprintf(f, "%lf\n", classification_error);
    fclose(f);

    fflush(stderr);
    fprintf(stderr, "\nDeallocating memory ...");
    DestroySubgraph(&Train);
    DestroySubgraph(&Evaluate);
    DestroySubgraph(&Merge);
    DestroySubgraph(&Test);
    DestroySubgraph(&newTrain);
    DestroySubgraph(&newTest);
    fflush(stderr);
    fprintf(stderr, "\nOK\n");

    f = fopen("optimization.time", "a");
    fprintf(f, "%f %f\n", time_opt, time_classify);
    fclose(f);

    DestroySearchSpace(&s, _WCA_);

    return 0;
}