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
/
mod_simplex.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-06-25
|
1KB
|
76 lines
#include <stdio.h>
#define EPS 1.0e-6
void mod_simplex(a, m, icase, right, left)
int m, *icase, right[], left[];
double **a;
{
register int i,j;
int ip, is, k, kp, succ, ip0;
int *ivector(), cnt = 0;
double q1, test, bmin;
void pivot(), swap(), nrerror(), free_ivector();
for (k = 1; k <= m + 1; k++)
right[k] = m + k;
for (i = 1; i <= m; i++)
left[i] = i;
/* Inizializzazione */
kp = m + 1;
bmin = -EPS;
ip = 0;
for (i = 1; i <= m; i++) {
test = a[i][1] - bmin;
if (test < 0.0) {
bmin = a[i][1];
ip = i;
}
}
/*printf(" bmin = %lf\n",bmin);*/
if (ip == 0) {
*icase = 0;
return;
}
swap(a, m, m + 1, ip, kp);
right[m + 1] = ip;
left[ip] = m * 2 + 1;
kp = ip;
ip0 = ip;
for (;;) {
cnt++;
pivot(a, m + 1, m, &ip, kp, &q1);
if (ip == 0) {
*icase = -1;
printf("\n Ray termination \n");
return;
}
swap(a, m, m + 1, ip, kp);
succ = left[ip];
if (succ < m + 1)
succ += m;
else
succ -= m;
is = right[kp];
right[kp] = left[ip];
left[ip] = is;
if (ip == ip0) {
*icase = 0;
return;
}
for (i = 1; i <= m + 1; i++) {
if (right[i] == succ) {
kp = i;
break;
}
}
}
}
#undef EPS