home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
BarlaA
/
sw
/
OLD
/
Simo
/
SVM_mono
/
svm4pr.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-06-25
|
6KB
|
226 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "patt_rec.h"
int knl;
int chunk_size = 50;
int ell;
int dim;
double c_const = 0.2;
double bee;
//char image_ker[256];
double normalization = 1.; /* linear and polynomial kernel normalization */
double sigma = 1.; /* Gaussian kernel variance */
int degree = 2; /* polynomial degree */
int delta_g, delta_r, delta_c;
int dim_r, dim_c;
int one_out_flag, one_out;
void ReadParameters(char *filename) {
FILE *fp;
fp = fopen(filename,"r");
fscanf(fp,"%d %d ",&dim_r, &dim_c);
fscanf(fp,"%d %d %d ",&delta_g, &delta_r, &delta_c);
}
main(int argc, char *argv[])
{
training *tr; /* training set iniziale */
double *solution; /* Soluzione trovata */
char f1_input[MAXLENGTH], f2_input[MAXLENGTH], f_output[MAXLENGTH];
char f_param[MAXLENGTH],knl_t[MAXLENGTH], f_ker[MAXLENGTH];
char image_ker[256];
int k, i;
FILE *fp1_in, *fp_out;
/*** legge la linea di comando ***/
strcpy(knl_t, "lin");
strcpy(f1_input, "NO_INPUT");
strcpy(f2_input, "NO_INPUT");
strcpy(f_output, "NO_OUTPUT");
strcpy(f_param, "NO_PARAMETERS");
strcpy(image_ker, "image_kernel.pgm");
strcpy(f_ker, "NO_KER_MATRIX");
one_out_flag = 0;
for (k = 1; k < argc; k++)
if (*argv[k] == '-')
switch (*(argv[k] + 1))
{
case 'i':
if (sscanf(argv[++k], "%s", f1_input) == NULL)
exit(-1);
break;
case 'o':
if (sscanf(argv[++k], "%s", f_output) == NULL)
exit(-1);
break;
case 't':
if (sscanf(argv[++k], "%s", f_param) == NULL)
exit(-1);
break;
case 'k':
if (sscanf(argv[++k], "%s", knl_t) == NULL)
exit(-1);
break;
case 'c':
if (sscanf(argv[++k], "%lf", &c_const) == NULL)
exit(-1);
break;
case 's':
if (sscanf(argv[++k], "%lf", &sigma) == NULL)
exit(-1);
break;
case 'p':
if (sscanf(argv[++k], "%d", &chunk_size) == NULL)
exit(-1);
break;
case 'n':
if (sscanf(argv[++k], "%lf", &normalization) == NULL)
exit(-1);
break;
case 'd':
if (sscanf(argv[++k], "%d", °ree) == NULL)
exit(-1);
break;
case 'K':
if(sscanf(argv[++k], "%s", f_ker) == NULL)
exit(-1);
break;
case 'l':{
if(sscanf(argv[++k], "%d", &one_out) == NULL)
exit(-1);
one_out_flag = 1;
break;
}
case 'h':
help_message();
break;
default:
help_message();
exit(-1);
}
if (!strcmp(f1_input, "NO_INPUT"))
{
fprintf(stderr, "missing input file\n");
help_message();
exit(-1);
}
if (!strcmp(f_output, "NO_OUTPUT"))
{
fprintf(stderr, "missing output file\n");
help_message();
exit(-1);
}
if (!strcmp(f_ker, "NO_KER_MATRIX"))
{
fprintf(stderr, "missing matrix file\n");
help_message();
exit(-1);
}
if (!strcmp(knl_t, "lin"))
knl = LINEAR_KERNEL;
else if (!strcmp (knl_t, "pol"))
knl = POLY_KERNEL;
else if (!strcmp(knl_t, "rbf"))
knl = RBF_KERNEL;
else if (!strcmp(knl_t,"haus"))
knl = HAUS_KERNEL;
else if (!strcmp(knl_t,"haus_simm"))
knl = HAUS_KERNEL_SIMM;
else if (!strcmp(knl_t,"neg"))
knl = NEGATIVE_KERNEL;
else if (!strcmp(knl_t,"mv"))
knl = MV_KERNEL;
else
{
fprintf(stderr, "\nunknown kernel type: %s\n\n", knl_t);
help_message();
}
if(( knl == HAUS_KERNEL)|| (knl == HAUS_KERNEL_SIMM)){
if (!strcmp(f_param, "NO_PARAMETERS"))
{
fprintf(stderr, "missing parameter file\n");
help_message();
exit(-1);
}
}
fprintf(stderr, "\ttraining files: %s\n", f1_input);
fprintf(stderr, "\tsupport vector file: %s\n", f_output);
fprintf(stderr, "\tparameters:\n");
fprintf(stderr, "\tC = %lf\n", c_const);
fprintf(stderr, "\t%s kernel\n", knl_t);
if (!strcmp(image_ker, "image_kernel.pgm"))
{
fprintf(stderr, "KERNEL IMAGE FILE: image_kernel.pgm\n");
}
switch (knl)
{
case LINEAR_KERNEL:
fprintf(stderr, "\tnormalization = %lf\n", normalization);
break;
case NEGATIVE_KERNEL:
fprintf(stderr, "\tnormalization = %lf\n", normalization);
break;
case POLY_KERNEL:
fprintf(stderr, "\tdegree = %d\n", degree);
fprintf(stderr, "\tnormalization = %lf\n", normalization);
break;
case RBF_KERNEL:
fprintf(stderr, "\tsigma = %lf\n", sigma);
break;
}
fprintf(stderr, "\tchunk_size = %d\n\n", chunk_size);
ReadParameters(f_param);
fprintf(stderr,"image size %d %d\n",dim_r,dim_c);
fprintf(stderr,"thickening %d %d %d\n",delta_g, delta_r, delta_c);
/*** caricamento dei vettori di training dal file di input ***/
fp1_in = myfopen(f1_input, "r", "training file\n");
tr = read_training(fp1_in);
fclose(fp1_in);
/*** Viene chiamata la procedura di soluzione ***/
printf("before solve %d\n",chunk_size);
solution = solve(tr, knl, c_const, chunk_size, image_ker,f_ker);
printf("after solve\n");
/*** Formattazione dell'output ***/
fprintf(stderr,"solution found\n");
fp_out = fopen(f_output, "w");
write_solution(fp_out, solution, knl, bee, c_const);
fprintf(stderr,"exit\n");
}
help_message()
{
fprintf(stderr, "usage: svm4pr -i input (training set, required) -o output (sv file, required) \n");
fprintf(stderr, "options: -c C (def 0.2)\n");
fprintf(stderr, " -k kernel_type (lin, pol, neg,rbf, mv, haus, haus_simm), (def lin)\n");
fprintf(stderr, " -p chunk_size (def 50)\n");
fprintf(stderr, " -s sigma (for rbf kernel only, def 1.0)\n");
fprintf(stderr, " -d degree (for pol kernel only, def 2)\n");
fprintf(stderr, " -n normalization (for lin and pol kernel only, def 1.0)\n");
fprintf(stderr, " -t param file\n");
fprintf(stderr, " -v diago_matrix_kernel file \n");
fprintf(stderr, " -K kernel matrix file \n");
exit(-1);
}