197 lines
4.5 KiB
C
197 lines
4.5 KiB
C
/* simplx.f -- translated by f2c (version 20031025).
|
|
You must link the resulting object file with libf2c:
|
|
on Microsoft Windows system, link with libf2c.lib;
|
|
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
|
|
or, if you install libf2c.a in a standard place, with -lf2c -lm
|
|
-- in that order, at the end of the command line, as in
|
|
cc *.o -lf2c -lm
|
|
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
|
|
|
|
http://www.netlib.org/f2c/libf2c.zip
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#include "f2c.h"
|
|
|
|
/* Table of constant values */
|
|
|
|
static integer c__0 = 0;
|
|
static integer c__1 = 1;
|
|
|
|
/* Subroutine */ int simplx_(doublereal *a, integer *m, integer *n, integer *
|
|
mp, integer *np, integer *m1, integer *m2, integer *m3, integer *
|
|
icase, integer *izrov, integer *iposv)
|
|
{
|
|
/* System generated locals */
|
|
integer a_dim1, a_offset, i__1, i__2;
|
|
|
|
/* Builtin functions */
|
|
/* Subroutine */ int s_paus(char *, ftnlen);
|
|
|
|
/* Local variables */
|
|
static integer i__, k, l1[1000], l2[1000], l3[1000];
|
|
static doublereal q1;
|
|
static integer m12, kh, ip, ir, kp, is, nl1, nl2;
|
|
static doublereal bmax;
|
|
extern /* Subroutine */ int simp1_(doublereal *, integer *, integer *,
|
|
integer *, integer *, integer *, integer *, integer *, doublereal
|
|
*), simp2_(doublereal *, integer *, integer *, integer *, integer
|
|
*, integer *, integer *, integer *, integer *, doublereal *),
|
|
simp3_(doublereal *, integer *, integer *, integer *, integer *,
|
|
integer *, integer *);
|
|
|
|
/* Parameter adjustments */
|
|
--iposv;
|
|
--izrov;
|
|
a_dim1 = *mp;
|
|
a_offset = 1 + a_dim1;
|
|
a -= a_offset;
|
|
|
|
/* Function Body */
|
|
if (*m != *m1 + *m2 + *m3) {
|
|
s_paus("Bad input constraint counts.", (ftnlen)28);
|
|
}
|
|
nl1 = *n;
|
|
i__1 = *n;
|
|
for (k = 1; k <= i__1; ++k) {
|
|
l1[k - 1] = k;
|
|
izrov[k] = k;
|
|
/* L11: */
|
|
}
|
|
nl2 = *m;
|
|
i__1 = *m;
|
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
|
if (a[i__ + 1 + a_dim1] < 0.) {
|
|
/* write(*,*) 'The A matrix input to SIMPLX is invalid.' */
|
|
s_paus("Bad input tableau.", (ftnlen)18);
|
|
}
|
|
l2[i__ - 1] = i__;
|
|
iposv[i__] = *n + i__;
|
|
/* L12: */
|
|
}
|
|
i__1 = *m2;
|
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
|
l3[i__ - 1] = 1;
|
|
/* L13: */
|
|
}
|
|
ir = 0;
|
|
if (*m2 + *m3 == 0) {
|
|
goto L30;
|
|
}
|
|
ir = 1;
|
|
i__1 = *n + 1;
|
|
for (k = 1; k <= i__1; ++k) {
|
|
q1 = (float)0.;
|
|
i__2 = *m;
|
|
for (i__ = *m1 + 1; i__ <= i__2; ++i__) {
|
|
q1 += a[i__ + 1 + k * a_dim1];
|
|
/* L14: */
|
|
}
|
|
a[*m + 2 + k * a_dim1] = -q1;
|
|
/* L15: */
|
|
}
|
|
L10:
|
|
i__1 = *m + 1;
|
|
simp1_(&a[a_offset], mp, np, &i__1, l1, &nl1, &c__0, &kp, &bmax);
|
|
if (bmax <= 1e-6 && a[*m + 2 + a_dim1] < -1e-6) {
|
|
*icase = -1;
|
|
return 0;
|
|
} else if (bmax <= 1e-6 && a[*m + 2 + a_dim1] <= 1e-6) {
|
|
m12 = *m1 + *m2 + 1;
|
|
if (m12 <= *m) {
|
|
i__1 = *m;
|
|
for (ip = m12; ip <= i__1; ++ip) {
|
|
if (iposv[ip] == ip + *n) {
|
|
simp1_(&a[a_offset], mp, np, &ip, l1, &nl1, &c__1, &kp, &
|
|
bmax);
|
|
if (bmax > (float)0.) {
|
|
goto L1;
|
|
}
|
|
}
|
|
/* L16: */
|
|
}
|
|
}
|
|
ir = 0;
|
|
--m12;
|
|
if (*m1 + 1 > m12) {
|
|
goto L30;
|
|
}
|
|
i__1 = m12;
|
|
for (i__ = *m1 + 1; i__ <= i__1; ++i__) {
|
|
if (l3[i__ - *m1 - 1] == 1) {
|
|
i__2 = *n + 1;
|
|
for (k = 1; k <= i__2; ++k) {
|
|
a[i__ + 1 + k * a_dim1] = -a[i__ + 1 + k * a_dim1];
|
|
/* L17: */
|
|
}
|
|
}
|
|
/* L18: */
|
|
}
|
|
goto L30;
|
|
}
|
|
simp2_(&a[a_offset], m, n, mp, np, l2, &nl2, &ip, &kp, &q1);
|
|
if (ip == 0) {
|
|
*icase = -1;
|
|
return 0;
|
|
}
|
|
L1:
|
|
i__1 = *m + 1;
|
|
simp3_(&a[a_offset], mp, np, &i__1, n, &ip, &kp);
|
|
if (iposv[ip] >= *n + *m1 + *m2 + 1) {
|
|
i__1 = nl1;
|
|
for (k = 1; k <= i__1; ++k) {
|
|
if (l1[k - 1] == kp) {
|
|
goto L2;
|
|
}
|
|
/* L19: */
|
|
}
|
|
L2:
|
|
--nl1;
|
|
i__1 = nl1;
|
|
for (is = k; is <= i__1; ++is) {
|
|
l1[is - 1] = l1[is];
|
|
/* L21: */
|
|
}
|
|
} else {
|
|
if (iposv[ip] < *n + *m1 + 1) {
|
|
goto L20;
|
|
}
|
|
kh = iposv[ip] - *m1 - *n;
|
|
if (l3[kh - 1] == 0) {
|
|
goto L20;
|
|
}
|
|
l3[kh - 1] = 0;
|
|
}
|
|
a[*m + 2 + (kp + 1) * a_dim1] += (float)1.;
|
|
i__1 = *m + 2;
|
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
|
a[i__ + (kp + 1) * a_dim1] = -a[i__ + (kp + 1) * a_dim1];
|
|
/* L22: */
|
|
}
|
|
L20:
|
|
is = izrov[kp];
|
|
izrov[kp] = iposv[ip];
|
|
iposv[ip] = is;
|
|
if (ir != 0) {
|
|
goto L10;
|
|
}
|
|
L30:
|
|
simp1_(&a[a_offset], mp, np, &c__0, l1, &nl1, &c__0, &kp, &bmax);
|
|
if (bmax <= (float)0.) {
|
|
*icase = 0;
|
|
return 0;
|
|
}
|
|
simp2_(&a[a_offset], m, n, mp, np, l2, &nl2, &ip, &kp, &q1);
|
|
if (ip == 0) {
|
|
*icase = 1;
|
|
return 0;
|
|
}
|
|
simp3_(&a[a_offset], mp, np, m, n, &ip, &kp);
|
|
goto L20;
|
|
} /* simplx_ */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|