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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define EPS 1.0e-6
  5.  
  6. void solver(l, d, h, c, e, cl, alpha, svc)
  7.    int    l, *cl, *svc;
  8.    double    **d, *h, c, e, *alpha;
  9. {
  10.    register int    i, j;
  11.    int             k, m, *ivector(),
  12.                    *iposv, *izrov, icase;
  13.    double          **a, **dmatrix(), *dvector(), x1x1;
  14.    void            mod_simplex();
  15.  
  16.    m = 2 * l;
  17.    a = dmatrix(1, m, 1, m + 2);
  18.    izrov = ivector(1, m + 1);
  19.    iposv = ivector(1, m);
  20.  
  21.    fprintf(stderr,"uno m %d l %d \n",m,l);
  22.    /* Costruzione della matrice m */
  23.  
  24.    for (i = 1; i <= m; i++)
  25.       for (j = 1; j <= m + 1; j++)
  26.      a[i][j] = 0.;
  27.  
  28.    /* la prima colonna e' il vettore costante */
  29.  
  30.    x1x1 = d[0][0];
  31.    a[1][1] = -e*cl[0];
  32.    a[2][1] = c + e*cl[0];
  33.    for (i = 3; i <= l + 1; i++)
  34.       a[i][1] = c;
  35.    for (i = l + 2; i <= m; i++)
  36.       a[i][1] = -e*(cl[0]*d[0][i-l-1]-x1x1*cl[i-l-1]) + h[i-l-1] - cl[i-l-1]*cl[0]*h[0];
  37.  
  38.    /* quindi c'e' la matrice H */
  39.  
  40.    for (i = 2; i <= l; i++)
  41.       for (j = 2; j <= l; j++)
  42.      a[i+l][j+l+1] = d[i-1][j-1] + x1x1*cl[i-1]*cl[j-1] - 
  43.                  d[i-1][0]*cl[0]*cl[j-1] - d[j-1][0]*cl[0]*cl[i-1];  
  44.  
  45.    /* poi la matrice dei vincoli e del gradiente della lagrangiana */
  46.  
  47.    for (j = 2; j <= l; j++) {
  48.       a[1][j + l + 1] = -cl[j-1] * cl[0];
  49.       a[2][j + l + 1] = cl[j-1] * cl[0];
  50.       a[j + l][2] = cl[j-1] * cl[0];
  51.       a[j + l][3] = -cl[j-1] * cl[0];
  52.    }
  53.  
  54.    for (i = 3; i <= l + 1; i++) {
  55.       a[i][l + i] = -1.;
  56.       a[l + i - 1][1 + i] = 1.;
  57.    }
  58.  
  59.    /* infine la colonna della variabile (artificiale) z_0 */
  60.  
  61.    for (i = 1; i <= m; i++)
  62.       a[i][m + 2] = 1.;
  63.  
  64. /*
  65.    for (i=1;i<=m;i++) {
  66.      for(j=1;j<=m+2;j++)
  67.        fprintf(stderr, "%lf ",a[i][j]);
  68.      fprintf(stderr,"\n");
  69.    }
  70. */
  71.    mod_simplex(a, m, &icase, izrov, iposv);
  72.  
  73.    if (icase == -1) 
  74.       exit(-1);
  75.    
  76.  
  77.    if (icase == 0) {
  78.       for (i = 1; i < l; i++){
  79.        alpha[i] = 0.;
  80.        svc[i] = 0;}
  81.       alpha[0] = -e;
  82.       for (i = 1; i <= m; i++)
  83.      if (iposv[i] > (2*m - m/2 + 1) && iposv[i] < (2 * m + 1)) {
  84.         k = iposv[i] - 2 * m + m / 2;
  85.         if (a[i][1] < (c - EPS))
  86.         svc[k-1] = 1;
  87.         else
  88.         svc[k-1] = 2;
  89.         alpha[k-1] = a[i][1];
  90.         alpha[0] -= cl[k-1] * alpha[k-1];}
  91.       alpha[0] *= cl[0];
  92.       if (alpha[0] < EPS){
  93.         alpha[0] = 0.;
  94.         svc[0] = 0;}
  95.       else
  96.         if (alpha[0] < (c - EPS)){
  97.         svc[0] = 1;
  98.         }
  99.         else
  100.         svc[0] =2;
  101.    }
  102.    free_dmatrix(a, 1, m, 1, m + 2);
  103.    free_ivector(iposv, 1, m);
  104.    free_ivector(izrov, 1, m + 1);
  105. }
  106. #undef EPS
  107.