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 >
Wrap
C/C++ Source or Header
|
2002-06-25
|
2KB
|
107 lines
#include <stdio.h>
#include <stdlib.h>
#define EPS 1.0e-6
void solver(l, d, h, c, e, cl, alpha, svc)
int l, *cl, *svc;
double **d, *h, c, e, *alpha;
{
register int i, j;
int k, m, *ivector(),
*iposv, *izrov, icase;
double **a, **dmatrix(), *dvector(), x1x1;
void mod_simplex();
m = 2 * l;
a = dmatrix(1, m, 1, m + 2);
izrov = ivector(1, m + 1);
iposv = ivector(1, m);
fprintf(stderr,"uno m %d l %d \n",m,l);
/* Costruzione della matrice m */
for (i = 1; i <= m; i++)
for (j = 1; j <= m + 1; j++)
a[i][j] = 0.;
/* la prima colonna e' il vettore costante */
x1x1 = d[0][0];
a[1][1] = -e*cl[0];
a[2][1] = c + e*cl[0];
for (i = 3; i <= l + 1; i++)
a[i][1] = c;
for (i = l + 2; i <= m; i++)
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];
/* quindi c'e' la matrice H */
for (i = 2; i <= l; i++)
for (j = 2; j <= l; j++)
a[i+l][j+l+1] = d[i-1][j-1] + x1x1*cl[i-1]*cl[j-1] -
d[i-1][0]*cl[0]*cl[j-1] - d[j-1][0]*cl[0]*cl[i-1];
/* poi la matrice dei vincoli e del gradiente della lagrangiana */
for (j = 2; j <= l; j++) {
a[1][j + l + 1] = -cl[j-1] * cl[0];
a[2][j + l + 1] = cl[j-1] * cl[0];
a[j + l][2] = cl[j-1] * cl[0];
a[j + l][3] = -cl[j-1] * cl[0];
}
for (i = 3; i <= l + 1; i++) {
a[i][l + i] = -1.;
a[l + i - 1][1 + i] = 1.;
}
/* infine la colonna della variabile (artificiale) z_0 */
for (i = 1; i <= m; i++)
a[i][m + 2] = 1.;
/*
for (i=1;i<=m;i++) {
for(j=1;j<=m+2;j++)
fprintf(stderr, "%lf ",a[i][j]);
fprintf(stderr,"\n");
}
*/
mod_simplex(a, m, &icase, izrov, iposv);
if (icase == -1)
exit(-1);
if (icase == 0) {
for (i = 1; i < l; i++){
alpha[i] = 0.;
svc[i] = 0;}
alpha[0] = -e;
for (i = 1; i <= m; i++)
if (iposv[i] > (2*m - m/2 + 1) && iposv[i] < (2 * m + 1)) {
k = iposv[i] - 2 * m + m / 2;
if (a[i][1] < (c - EPS))
svc[k-1] = 1;
else
svc[k-1] = 2;
alpha[k-1] = a[i][1];
alpha[0] -= cl[k-1] * alpha[k-1];}
alpha[0] *= cl[0];
if (alpha[0] < EPS){
alpha[0] = 0.;
svc[0] = 0;}
else
if (alpha[0] < (c - EPS)){
svc[0] = 1;
}
else
svc[0] =2;
}
free_dmatrix(a, 1, m, 1, m + 2);
free_ivector(iposv, 1, m);
free_ivector(izrov, 1, m + 1);
}
#undef EPS