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 >
C/C++ Source or Header  |  2002-06-25  |  6KB  |  226 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <math.h>
  6. #include "patt_rec.h"
  7.  
  8. int    knl;            
  9. int    chunk_size = 50;        
  10. int    ell;            
  11. int    dim;                    
  12. double    c_const = 0.2;
  13. double    bee;
  14. //char    image_ker[256];
  15.  
  16. double    normalization = 1.;    /* linear and polynomial kernel normalization    */
  17. double    sigma = 1.;        /* Gaussian kernel variance            */
  18. int    degree = 2;        /* polynomial degree                */
  19. int     delta_g, delta_r, delta_c;
  20. int     dim_r, dim_c;
  21. int     one_out_flag, one_out;
  22.  
  23. void ReadParameters(char *filename) {
  24.   FILE *fp;
  25.  
  26.   fp = fopen(filename,"r");
  27.   fscanf(fp,"%d %d ",&dim_r, &dim_c);
  28.   fscanf(fp,"%d %d %d ",&delta_g, &delta_r, &delta_c);
  29. }
  30.  
  31. main(int argc, char *argv[])
  32. {
  33.     training    *tr;                /* training set iniziale     */
  34.     double        *solution;            /* Soluzione trovata        */
  35.     char        f1_input[MAXLENGTH], f2_input[MAXLENGTH], f_output[MAXLENGTH];
  36.     char            f_param[MAXLENGTH],knl_t[MAXLENGTH], f_ker[MAXLENGTH];
  37.     char image_ker[256];
  38.     int        k, i;
  39.  
  40.     FILE        *fp1_in, *fp_out;
  41.  
  42.     /*** legge la linea di comando ***/
  43.  
  44.     strcpy(knl_t, "lin");
  45.     strcpy(f1_input, "NO_INPUT");
  46.     strcpy(f2_input, "NO_INPUT");
  47.     strcpy(f_output, "NO_OUTPUT");
  48.         strcpy(f_param,  "NO_PARAMETERS");
  49.     strcpy(image_ker, "image_kernel.pgm");
  50.     strcpy(f_ker, "NO_KER_MATRIX");
  51.     one_out_flag = 0;
  52.  
  53.     for (k = 1; k < argc; k++)
  54.                 if (*argv[k] == '-')
  55.                         switch (*(argv[k] + 1)) 
  56.             {
  57.             case 'i':
  58.               if (sscanf(argv[++k], "%s", f1_input) == NULL)
  59.                 exit(-1);
  60.               break;
  61.             case 'o':
  62.               if (sscanf(argv[++k], "%s", f_output) == NULL)
  63.                 exit(-1);
  64.               break;
  65.             case 't':
  66.               if (sscanf(argv[++k], "%s", f_param) == NULL)
  67.                 exit(-1);
  68.               break;
  69.             case 'k':
  70.               if (sscanf(argv[++k], "%s", knl_t) == NULL)
  71.                 exit(-1);
  72.               break;
  73.             case 'c':
  74.               if (sscanf(argv[++k], "%lf", &c_const) == NULL)
  75.                 exit(-1);
  76.               break;
  77.             case 's':
  78.               if (sscanf(argv[++k], "%lf", &sigma) == NULL)
  79.                 exit(-1);
  80.               break;
  81.             case 'p':
  82.               if (sscanf(argv[++k], "%d", &chunk_size) == NULL)
  83.                 exit(-1);
  84.               break;
  85.             case 'n':
  86.               if (sscanf(argv[++k], "%lf", &normalization) == NULL)
  87.                 exit(-1);
  88.               break;
  89.             case 'd':
  90.               if (sscanf(argv[++k], "%d", °ree) == NULL)
  91.                 exit(-1);
  92.               break;
  93.             case 'K':
  94.               if(sscanf(argv[++k], "%s", f_ker) == NULL)
  95.                 exit(-1);
  96.               break;
  97.             case 'l':{
  98.               if(sscanf(argv[++k], "%d", &one_out) == NULL)
  99.                 exit(-1);
  100.               one_out_flag = 1;
  101.               break;
  102.             }
  103.             case 'h':
  104.               help_message();
  105.               break;
  106.             default:
  107.               help_message();
  108.               exit(-1);
  109.                          }
  110.  
  111.     if (!strcmp(f1_input, "NO_INPUT"))
  112.         {
  113.         fprintf(stderr, "missing input file\n");
  114.         help_message();
  115.         exit(-1);
  116.         }
  117.  
  118.     if (!strcmp(f_output, "NO_OUTPUT"))
  119.         {
  120.         fprintf(stderr, "missing output file\n");
  121.         help_message();
  122.         exit(-1);
  123.         }
  124.     if (!strcmp(f_ker, "NO_KER_MATRIX"))
  125.         {
  126.         fprintf(stderr, "missing matrix file\n");
  127.         help_message();
  128.         exit(-1);
  129.         }
  130.  
  131.     if (!strcmp(knl_t, "lin"))
  132.         knl = LINEAR_KERNEL;
  133.     else if (!strcmp (knl_t, "pol"))
  134.                 knl = POLY_KERNEL;
  135.     else if (!strcmp(knl_t, "rbf"))
  136.         knl = RBF_KERNEL;
  137.     else if (!strcmp(knl_t,"haus"))
  138.             knl = HAUS_KERNEL;
  139.         else if (!strcmp(knl_t,"haus_simm"))
  140.             knl = HAUS_KERNEL_SIMM;
  141.     else if (!strcmp(knl_t,"neg"))
  142.             knl = NEGATIVE_KERNEL;
  143.     else if (!strcmp(knl_t,"mv"))
  144.             knl = MV_KERNEL;
  145.         else 
  146.         {
  147.         fprintf(stderr, "\nunknown kernel type: %s\n\n", knl_t);
  148.         help_message();
  149.         }
  150.     if(( knl == HAUS_KERNEL)|| (knl == HAUS_KERNEL_SIMM)){
  151.     if (!strcmp(f_param, "NO_PARAMETERS"))
  152.       {
  153.         fprintf(stderr, "missing parameter file\n");
  154.         help_message();
  155.         exit(-1);
  156.       }
  157.       }
  158.     fprintf(stderr, "\ttraining files: %s\n", f1_input);
  159.     fprintf(stderr, "\tsupport vector file: %s\n", f_output);
  160.     fprintf(stderr, "\tparameters:\n");
  161.     fprintf(stderr, "\tC = %lf\n", c_const);
  162.     fprintf(stderr, "\t%s kernel\n", knl_t);
  163.     
  164.     if (!strcmp(image_ker, "image_kernel.pgm"))
  165.         {
  166.         fprintf(stderr, "KERNEL IMAGE FILE: image_kernel.pgm\n");
  167.         }
  168.     switch (knl)
  169.     {
  170.         case LINEAR_KERNEL:
  171.       fprintf(stderr, "\tnormalization = %lf\n", normalization);    
  172.       break;
  173.     case NEGATIVE_KERNEL:
  174.       fprintf(stderr, "\tnormalization = %lf\n", normalization);    
  175.       break;
  176.         case POLY_KERNEL:
  177.       fprintf(stderr, "\tdegree = %d\n", degree);    
  178.       fprintf(stderr, "\tnormalization = %lf\n", normalization);
  179.       break;
  180.         case RBF_KERNEL:
  181.       fprintf(stderr, "\tsigma = %lf\n", sigma);    
  182.       break;
  183.     }
  184.     fprintf(stderr, "\tchunk_size = %d\n\n", chunk_size);
  185.  
  186.     ReadParameters(f_param);
  187.     fprintf(stderr,"image size %d %d\n",dim_r,dim_c);
  188.     fprintf(stderr,"thickening %d %d %d\n",delta_g, delta_r, delta_c);
  189.  
  190.     /*** caricamento dei vettori di training dal file di input ***/
  191.  
  192.     fp1_in = myfopen(f1_input, "r", "training file\n");
  193.     tr = read_training(fp1_in); 
  194.     fclose(fp1_in); 
  195.  
  196.     /*** Viene chiamata la procedura di soluzione ***/
  197.     printf("before solve %d\n",chunk_size);
  198.     
  199.     solution = solve(tr, knl, c_const, chunk_size, image_ker,f_ker);
  200.     printf("after solve\n");
  201.  
  202.     /*** Formattazione dell'output   ***/
  203.  
  204.     fprintf(stderr,"solution found\n");
  205.     fp_out = fopen(f_output, "w");
  206.     write_solution(fp_out, solution, knl, bee, c_const); 
  207.     fprintf(stderr,"exit\n");
  208. }
  209.  
  210. help_message()
  211. {
  212.     fprintf(stderr, "usage: svm4pr -i input (training set, required) -o output (sv file, required) \n");
  213.     fprintf(stderr, "options: -c C (def 0.2)\n");
  214.     fprintf(stderr, "         -k kernel_type (lin, pol, neg,rbf, mv, haus, haus_simm), (def lin)\n");
  215.     fprintf(stderr, "         -p chunk_size (def 50)\n");
  216.     fprintf(stderr, "         -s sigma (for rbf kernel only, def 1.0)\n");
  217.     fprintf(stderr, "         -d degree (for pol kernel only, def 2)\n");
  218.     fprintf(stderr, "         -n normalization (for lin and pol kernel only, def 1.0)\n");
  219.     fprintf(stderr, "         -t param file\n");
  220.     fprintf(stderr, "         -v diago_matrix_kernel file \n");
  221.     fprintf(stderr, "         -K kernel matrix file \n");
  222.     exit(-1);
  223. }
  224.  
  225.  
  226.