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 / riconosci.c < prev    next >
C/C++ Source or Header  |  2002-06-25  |  7KB  |  239 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "patt_rec.h"
  6. #include "nrutil.h"
  7.  
  8. int    dim;
  9. int    degree;
  10. double    normalization, sigma;
  11. int     delta_g, delta_r, delta_c;
  12. int     dim_r, dim_c;
  13.  
  14. void ReadParameters(char *filename) {
  15.   FILE *fp;
  16.  
  17.   fp = fopen(filename,"r");
  18.   fscanf(fp,"%d %d ",&dim_r, &dim_c);
  19.   fscanf(fp,"%d %d %d ",&delta_g, &delta_r, &delta_c);
  20. }
  21.  
  22. main(int argc, char *argv[])
  23. {
  24.     int        knl, i, j, k, nsv, isv, np, ntest, *class, *test_val;
  25.     char        *knl_t, sv_file[256], test_file[256], f_param[256], radius_file[256], kernel_file[256];
  26.     double        *x_vec, *sv, bee, *alpha, c_const, kernel(), aux,ftmp,*center, radius,Delta2,ker,ker2;
  27.     double          *alias_x, *alias_sv, *alias2_sv;
  28.     int             *index, n_tr;
  29.     double          curr_r, tmp;
  30.     double          **mat_kernel;
  31.     int             n_err,Delta = 0;
  32.         int             falsi_pos = 0;
  33.  
  34.         FILE        *fp1, *fp2, *fpk, *fpp, *fradius;
  35.  
  36.     strcpy(f_param,  "NO_PARAMETERS");
  37.  
  38.     for (k = 1; k < argc; k++)
  39.         if (*argv[k] == '-')
  40.             switch (*(argv[k] + 1)) {
  41.             case 'i':
  42.               if (sscanf(argv[++k], "%s", sv_file) == NULL)
  43.                 exit(-1);
  44.               break;
  45.             case 't':
  46.               if (sscanf(argv[++k], "%s", test_file) == NULL)
  47.                 exit(-1);
  48.               break;
  49.             case 'K':
  50.               if (sscanf(argv[++k], "%s", kernel_file) == NULL)
  51.                 exit(-1);
  52.               break;
  53.             case 'r':
  54.               if (sscanf(argv[++k], "%s", radius_file) == NULL)
  55.                 exit(-1);
  56.               break;
  57.             case 'p':
  58.               if (sscanf(argv[++k], "%s", f_param) == NULL)
  59.                 exit(-1);
  60.               break;
  61.             default:
  62.               exit(-1);
  63.             }
  64.  
  65.     fp1 = fopen(sv_file, "r");       /* SV file */
  66.     fp2 = fopen(test_file, "r");       /* Test file (with reference values) */
  67.     fradius = fopen( radius_file, "w");
  68.  
  69.     if (!strcmp(f_param, "NO_PARAMETERS"))
  70.       {
  71.         fprintf(stderr, "missing parameter file\n");
  72.         help_message();
  73.         exit(-1);
  74.       }
  75.         fprintf(stderr,"prima di readparam\n");
  76.     ReadParameters(f_param);
  77.     fprintf(stderr,"image size %d %d\n",dim_r,dim_c);
  78.     fprintf(stderr,"thickening %d %d %d\n",delta_g, delta_r, delta_c);
  79.             fprintf(stderr,"dopo di readparam\n");
  80.     
  81.     
  82.     fprintf(stderr,"file sv %s\n",sv_file);
  83.     fprintf(stderr,"file test %s\n",test_file);
  84.     fprintf(stderr,"file matrice %s\n",kernel_file);
  85.     fprintf(stderr,"file raggi %s\n", radius_file);
  86.     
  87.  
  88.     fprintf(stderr,"pinco pallino\n");
  89.  
  90.     /* reading support vector file */
  91.     
  92.     fscanf (fp1, "%d %d %d %d", &nsv, &dim, &dim_r, &dim_c);
  93.     alpha = (double *)malloc (nsv*sizeof(double));
  94.     class = (int *)malloc (nsv*sizeof(double));
  95.     sv = (double*)malloc (nsv*dim* sizeof(double));
  96.     index = (int *)malloc(nsv*sizeof(int));
  97.  
  98.     for (isv = 0; isv < nsv; isv++) {
  99.       fscanf(fp1,"%d ",&index[isv]);
  100.       for (i = 0; i < dim; i++) {
  101.         fscanf(fp1, "%lf", &sv[isv*dim+i]);
  102.       }
  103.       fscanf(fp1, "%d %lf", &class[isv], &alpha[isv]);
  104.     }
  105.     
  106.     fscanf(fp1, "%lf", &radius);
  107.     fscanf(fp1, "%lf", &c_const);
  108.     fscanf(fp1, "%d", &knl);
  109.     fprintf(stderr,"knl %lf radius %lf const %lf \n",(double)knl,radius,c_const);
  110.     switch (knl) {
  111.         case LINEAR_KERNEL:
  112.         fscanf(fp1, "%lf", &normalization);
  113.         break;
  114.         case POLY_KERNEL:
  115.         fscanf(fp1, "%lf %d", &normalization, °ree);
  116.         break;
  117.         case RBF_KERNEL:
  118.         fscanf(fp1, "%lf", &sigma);
  119.         break;
  120.     case HAUS_KERNEL:
  121.             fscanf(fp1, "%lf", &normalization); 
  122.         break;
  123.         case HAUS_KERNEL_SIMM:
  124.                 fscanf(fp1, "%lf", &normalization); 
  125.                 break;
  126.     case NEGATIVE_KERNEL:
  127.             fscanf(fp1, "%lf", &normalization); 
  128.         break;    
  129.         default:
  130.                 exit(UNKNOWN_KERNEL);
  131.         }
  132.     fclose(fp1);
  133.     
  134.     fprintf(stderr,"pinco pallino\n");
  135.  
  136.     fprintf(stderr,"radius %lf c_const %lf knl %d norm %lf\n",radius,c_const,knl,normalization);
  137.  
  138.     /* reading test file */
  139.  
  140.     fscanf(fp2, "%d %d", &ntest, &dim) ;
  141.     /*inizio il file dei raggi con il numero di elementi del test*/
  142.         fprintf(fradius,"%d \n",ntest);
  143.     
  144. //    x_vec = (double*)malloc(ntest*dim*sizeof(double));
  145.     x_vec = (double*)malloc(dim*sizeof(double));
  146.     test_val = (int*)malloc(ntest*sizeof(double));
  147.     
  148.     /* reading mat_kernel file */
  149.       
  150.     fpk = fopen(kernel_file,"r");
  151.     fscanf(fpk,"%d",&n_tr);
  152.     fprintf(stderr,"%d",n_tr);
  153.     mat_kernel = dmatrix(0,n_tr-1,0,n_tr-1);
  154.     for(k=0;k < n_tr;k++) {
  155.       for(j=0; j < n_tr;j++) {
  156.         fscanf(fpk,"%lf ",&tmp);
  157.         mat_kernel[k][j]=tmp;
  158.         }
  159.       }
  160.     fclose(fpk);
  161.       
  162.     fprintf(stderr,"\nperche qui non ci arriva1\n");
  163.  
  164.     for (i = 0; i < ntest; i++) {                        /***qui inizia il for grosso***/
  165.       for (j = 0; j < dim; j++)
  166. //        fscanf(fp2, "%lf", &x_vec[i * dim + j]);
  167.       fscanf(fp2, "%lf", &x_vec[j]);
  168.      
  169.       n_err = 0;
  170.       Delta2 = (double)Delta/10.;              /*Attenzione!!!!! solo per lo script!!!!!!!!!*/ 
  171.       
  172.       
  173.       /* pattern classification */
  174.       //for(i = 0; i < ntest; i++) {
  175. //        alias_x = x_vec+i*dim;
  176.         alias_x = x_vec;
  177.         aux=0.;
  178.         /*ci serve il training*/
  179.         //aux = kernel(knl,&x_vec[i*dim],&x_vec[i*dim]);
  180.         aux = kernel(knl,x_vec,x_vec);
  181.         /*aux = kernel(knl,alias_x,alias_x);*/
  182.         /*printf("%lf\n",aux);*/
  183.         for (j=nsv-1;j>=0;j--) {
  184.           alias_sv = sv+j*dim;
  185.           //aux -= 2.*alpha[j]*kernel(knl,&x_vec[i*dim],&sv[j*dim]);
  186.           aux -= 2.*alpha[j]*kernel(knl,x_vec,&sv[j*dim]);
  187.           /*aux -= 2.*alpha[j]*kernel(knl,alias_x,alias_sv);*/
  188.           for (k=nsv-1;k>=0;k--) {
  189.         alias2_sv = sv+k*dim;
  190.         aux += alpha[j]*alpha[k]*mat_kernel[index[j]][index[k]];
  191.                 /*aux += alpha[j]*alpha[k]*kernel(knl, &sv[j*dim], &sv[k*dim]);*/
  192.         /*printf("test %lf %lf\n", kernel(knl, alias_sv, alias2_sv),mat_kernel[index[j]][index[k]]);*/
  193.           }
  194.         }
  195.         
  196.         curr_r = sqrt(aux);
  197.         fprintf(fradius, "%lf\n",curr_r);
  198.         
  199.         fprintf(stderr,"i: %d radius: %lf altro: %lf ",i,radius,curr_r);
  200.         if( curr_r > radius  )  
  201.           fprintf(stderr, "-1\n");
  202.         else{
  203.           n_err++;
  204.           fprintf(stderr, "1\n");
  205.         }
  206.       }
  207.     fprintf(stdout,"%lf %lf\n",radius,curr_r);
  208.     //}
  209.     fclose(fp2);
  210.  
  211.     fprintf(stderr,"perche qui non ci arriva3\n");
  212.     /*
  213.        if(falsi_pos==1) {
  214.        fprintf(stdout, "%lf\n",((double)ntest-(double)n_err)/(double)ntest);
  215.       fprintf(stderr, "falsi positivi %lf\n",((double)ntest-(double)n_err)/(double)ntest);
  216.       }
  217.       else {
  218.       fprintf(stdout, "%lf\n",1.-(double)n_err/(double)ntest);
  219.       fprintf(stderr, "falsi neg %lf\n",1.-(double)n_err/(double)ntest);
  220.       }
  221.       fclose(fradius);
  222.       */
  223.     
  224.       }
  225.  
  226.  
  227. help_message()
  228. {
  229.     fprintf(stderr, "usage: riconosci -i sv file (support vector file, required) \n -t test file\n -r file_raggi\n  -K mat_kernel\n");
  230.         exit(-1);
  231. }
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.