Doxygen Source Code Documentation
cl1.c File Reference
#include <math.h>#include <stddef.h>#include <stdio.h>#include <stdlib.h>#include "f2c.h"Go to the source code of this file.
Functions | |
| int | cl1_fort (integer *k, integer *l, integer *m, integer *n, integer *klmd, integer *klm2d, integer *nklmd, integer *n2d, real *q, integer *kode, real *toler, integer *iter, real *x, real *res, real *error, real *cu, integer *iu, integer *s) |
| float | cl1_solve (int ndim, int nvec, float *z, float **A, float *y, int cony) |
| float | cl1_solve_res (int ndim, int nvec, float *z, float **A, float *y, int cony, float *rez, int conr) |
Function Documentation
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 389 of file cl1.c. References abs, dabs, l, n1, n2, and q. Referenced by cl1_solve(), and cl1_solve_res().
00393 {
00394 /* System generated locals */
00395 integer q_dim1, q_offset, i__1, i__2;
00396 real r__1;
00397
00398 /* Local variables */
00399 static integer iimn, nklm;
00400 static real xmin, xmax;
00401 static integer iout, i__, j;
00402 static real z__;
00403 static integer iineg, maxit, n1, n2;
00404 static real pivot;
00405 static integer ia, ii, kk, in, nk, js;
00406 static real sn;
00407 static integer iphase, kforce;
00408 static real zu, zv;
00409 static integer nk1;
00410 static real tpivot;
00411 static integer klm, jmn, nkl, jpn;
00412 static real cuv;
00413 static doublereal sum;
00414 static integer klm1, klm2, nkl1;
00415
00416
00417 /* THIS SUBROUTINE USES A MODIFICATION OF THE SIMPLEX */
00418 /* METHOD OF LINEAR PROGRAMMING TO CALCULATE AN L1 SOLUTION */
00419 /* TO A K BY N SYSTEM OF LINEAR EQUATIONS */
00420 /* AX=B */
00421 /* SUBJECT TO L LINEAR EQUALITY CONSTRAINTS */
00422 /* CX=D */
00423 /* AND M LINEAR INEQUALITY CONSTRAINTS */
00424 /* EX.LE.F. */
00425
00426 /* DESCRIPTION OF PARAMETERS */
00427
00428 /* K NUMBER OF ROWS OF THE MATRIX A (K.GE.1). */
00429 /* L NUMBER OF ROWS OF THE MATRIX C (L.GE.0). */
00430 /* M NUMBER OF ROWS OF THE MATRIX E (M.GE.0). */
00431 /* N NUMBER OF COLUMNS OF THE MATRICES A,C,E (N.GE.1). */
00432 /* KLMD SET TO AT LEAST K+L+M FOR ADJUSTABLE DIMENSIONS. */
00433 /* KLM2D SET TO AT LEAST K+L+M+2 FOR ADJUSTABLE DIMENSIONS. */
00434 /* NKLMD SET TO AT LEAST N+K+L+M FOR ADJUSTABLE DIMENSIONS. */
00435 /* N2D SET TO AT LEAST N+2 FOR ADJUSTABLE DIMENSIONS */
00436
00437 /* Q TWO DIMENSIONAL REAL ARRAY WITH KLM2D ROWS AND */
00438 /* AT LEAST N2D COLUMNS. */
00439 /* ON ENTRY THE MATRICES A,C AND E, AND THE VECTORS */
00440 /* B,D AND F MUST BE STORED IN THE FIRST K+L+M ROWS */
00441 /* AND N+1 COLUMNS OF Q AS FOLLOWS */
00442 /* A B */
00443 /* Q = C D */
00444 /* E F */
00445 /* THESE VALUES ARE DESTROYED BY THE SUBROUTINE. */
00446
00447 /* KODE A CODE USED ON ENTRY TO, AND EXIT */
00448 /* FROM, THE SUBROUTINE. */
00449 /* ON ENTRY, THIS SHOULD NORMALLY BE SET TO 0. */
00450 /* HOWEVER, IF CERTAIN NONNEGATIVITY CONSTRAINTS */
00451 /* ARE TO BE INCLUDED IMPLICITLY, RATHER THAN */
00452 /* EXPLICITLY IN THE CONSTRAINTS EX.LE.F, THEN KODE */
00453 /* SHOULD BE SET TO 1, AND THE NONNEGATIVITY */
00454 /* CONSTRAINTS INCLUDED IN THE ARRAYS X AND */
00455 /* RES (SEE BELOW). */
00456 /* ON EXIT, KODE HAS ONE OF THE */
00457 /* FOLLOWING VALUES */
00458 /* 0- OPTIMAL SOLUTION FOUND, */
00459 /* 1- NO FEASIBLE SOLUTION TO THE */
00460 /* CONSTRAINTS, */
00461 /* 2- CALCULATIONS TERMINATED */
00462 /* PREMATURELY DUE TO ROUNDING ERRORS, */
00463 /* 3- MAXIMUM NUMBER OF ITERATIONS REACHED. */
00464
00465 /* TOLER A SMALL POSITIVE TOLERANCE. EMPIRICAL */
00466 /* EVIDENCE SUGGESTS TOLER = 10**(-D*2/3), */
00467 /* WHERE D REPRESENTS THE NUMBER OF DECIMAL */
00468 /* DIGITS OF ACCURACY AVAILABLE. ESSENTIALLY, */
00469 /* THE SUBROUTINE CANNOT DISTINGUISH BETWEEN ZERO */
00470 /* AND ANY QUANTITY WHOSE MAGNITUDE DOES NOT EXCEED */
00471 /* TOLER. IN PARTICULAR, IT WILL NOT PIVOT ON ANY */
00472 /* NUMBER WHOSE MAGNITUDE DOES NOT EXCEED TOLER. */
00473
00474 /* ITER ON ENTRY ITER MUST CONTAIN AN UPPER BOUND ON */
00475 /* THE MAXIMUM NUMBER OF ITERATIONS ALLOWED. */
00476 /* A SUGGESTED VALUE IS 10*(K+L+M). ON EXIT ITER */
00477 /* GIVES THE NUMBER OF SIMPLEX ITERATIONS. */
00478
00479 /* X ONE DIMENSIONAL REAL ARRAY OF SIZE AT LEAST N2D. */
00480 /* ON EXIT THIS ARRAY CONTAINS A */
00481 /* SOLUTION TO THE L1 PROBLEM. IF KODE=1 */
00482 /* ON ENTRY, THIS ARRAY IS ALSO USED TO INCLUDE */
00483 /* SIMPLE NONNEGATIVITY CONSTRAINTS ON THE */
00484 /* VARIABLES. THE VALUES -1, 0, OR 1 */
00485 /* FOR X(J) INDICATE THAT THE J-TH VARIABLE */
00486 /* IS RESTRICTED TO BE .LE.0, UNRESTRICTED, */
00487 /* OR .GE.0 RESPECTIVELY. */
00488
00489 /* RES ONE DIMENSIONAL REAL ARRAY OF SIZE AT LEAST KLMD. */
00490 /* ON EXIT THIS CONTAINS THE RESIDUALS B-AX */
00491 /* IN THE FIRST K COMPONENTS, D-CX IN THE */
00492 /* NEXT L COMPONENTS (THESE WILL BE =0),AND */
00493 /* F-EX IN THE NEXT M COMPONENTS. IF KODE=1 ON */
00494 /* ENTRY, THIS ARRAY IS ALSO USED TO INCLUDE SIMPLE */
00495 /* NONNEGATIVITY CONSTRAINTS ON THE RESIDUALS */
00496 /* B-AX. THE VALUES -1, 0, OR 1 FOR RES(I) */
00497 /* INDICATE THAT THE I-TH RESIDUAL (1.LE.I.LE.K) IS */
00498 /* RESTRICTED TO BE .LE.0, UNRESTRICTED, OR .GE.0 */
00499 /* RESPECTIVELY. */
00500
00501 /* ERROR ON EXIT, THIS GIVES THE MINIMUM SUM OF */
00502 /* ABSOLUTE VALUES OF THE RESIDUALS. */
00503
00504 /* CU A TWO DIMENSIONAL REAL ARRAY WITH TWO ROWS AND */
00505 /* AT LEAST NKLMD COLUMNS USED FOR WORKSPACE. */
00506
00507 /* IU A TWO DIMENSIONAL INTEGER ARRAY WITH TWO ROWS AND */
00508 /* AT LEAST NKLMD COLUMNS USED FOR WORKSPACE. */
00509
00510 /* S INTEGER ARRAY OF SIZE AT LEAST KLMD, USED FOR */
00511 /* WORKSPACE. */
00512
00513 /* IF YOUR FORTRAN COMPILER PERMITS A SINGLE COLUMN OF A TWO */
00514 /* DIMENSIONAL ARRAY TO BE PASSED TO A ONE DIMENSIONAL ARRAY */
00515 /* THROUGH A SUBROUTINE CALL, CONSIDERABLE SAVINGS IN */
00516 /* EXECUTION TIME MAY BE ACHIEVED THROUGH THE USE OF THE */
00517 /* FOLLOWING SUBROUTINE, WHICH OPERATES ON COLUMN VECTORS. */
00518 /* SUBROUTINE COL(V1, V2, XMLT, NOTROW, K) */
00519 /* THIS SUBROUTINE ADDS TO THE VECTOR V1 A MULTIPLE OF THE */
00520 /* VECTOR V2 (ELEMENTS 1 THROUGH K EXCLUDING NOTROW). */
00521 /* DIMENSION V1(K), V2(K) */
00522 /* KEND = NOTROW - 1 */
00523 /* KSTART = NOTROW + 1 */
00524 /* IF (KEND .LT. 1) GO TO 20 */
00525 /* DO 10 I=1,KEND */
00526 /* V1(I) = V1(I) + XMLT*V2(I) */
00527 /* 10 CONTINUE */
00528 /* IF(KSTART .GT. K) GO TO 40 */
00529 /* 20 DO 30 I=KSTART,K */
00530 /* V1(I) = V1(I) + XMLT*V2(I) */
00531 /* 30 CONTINUE */
00532 /* 40 RETURN */
00533 /* END */
00534 /* SEE COMMENTS FOLLOWING STATEMENT LABELLED 440 FOR */
00535 /* INSTRUCTIONS ON THE IMPLEMENTATION OF THIS MODIFICATION. */
00536 /* -----------------------------------------------------------------------
00537 */
00538
00539 /* INITIALIZATION. */
00540
00541 /* Parameter adjustments */
00542 --s;
00543 --res;
00544 iu -= 3;
00545 cu -= 3;
00546 --x;
00547 q_dim1 = *klm2d;
00548 q_offset = q_dim1 + 1;
00549 q -= q_offset;
00550
00551 /* Function Body */
00552 maxit = *iter;
00553 n1 = *n + 1;
00554 n2 = *n + 2;
00555 nk = *n + *k;
00556 nk1 = nk + 1;
00557 nkl = nk + *l;
00558 nkl1 = nkl + 1;
00559 klm = *k + *l + *m;
00560 klm1 = klm + 1;
00561 klm2 = klm + 2;
00562 nklm = *n + klm;
00563 kforce = 1;
00564 *iter = 0;
00565 js = 1;
00566 ia = 0;
00567 /* SET UP LABELS IN Q. */
00568 i__1 = *n;
00569 for (j = 1; j <= i__1; ++j) {
00570 q[klm2 + j * q_dim1] = (real) j;
00571 /* L10: */
00572 }
00573 i__1 = klm;
00574 for (i__ = 1; i__ <= i__1; ++i__) {
00575 q[i__ + n2 * q_dim1] = (real) (*n + i__);
00576 if (q[i__ + n1 * q_dim1] >= 0.f) {
00577 goto L30;
00578 }
00579 i__2 = n2;
00580 for (j = 1; j <= i__2; ++j) {
00581 q[i__ + j * q_dim1] = -q[i__ + j * q_dim1];
00582 /* L20: */
00583 }
00584 L30:
00585 ;
00586 }
00587 /* SET UP PHASE 1 COSTS. */
00588 iphase = 2;
00589 i__1 = nklm;
00590 for (j = 1; j <= i__1; ++j) {
00591 cu[(j << 1) + 1] = 0.f;
00592 cu[(j << 1) + 2] = 0.f;
00593 iu[(j << 1) + 1] = 0;
00594 iu[(j << 1) + 2] = 0;
00595 /* L40: */
00596 }
00597 if (*l == 0) {
00598 goto L60;
00599 }
00600 i__1 = nkl;
00601 for (j = nk1; j <= i__1; ++j) {
00602 cu[(j << 1) + 1] = 1.f;
00603 cu[(j << 1) + 2] = 1.f;
00604 iu[(j << 1) + 1] = 1;
00605 iu[(j << 1) + 2] = 1;
00606 /* L50: */
00607 }
00608 iphase = 1;
00609 L60:
00610 if (*m == 0) {
00611 goto L80;
00612 }
00613 i__1 = nklm;
00614 for (j = nkl1; j <= i__1; ++j) {
00615 cu[(j << 1) + 2] = 1.f;
00616 iu[(j << 1) + 2] = 1;
00617 jmn = j - *n;
00618 if (q[jmn + n2 * q_dim1] < 0.f) {
00619 iphase = 1;
00620 }
00621 /* L70: */
00622 }
00623 L80:
00624 if (*kode == 0) {
00625 goto L150;
00626 }
00627 i__1 = *n;
00628 for (j = 1; j <= i__1; ++j) {
00629 if ((r__1 = x[j]) < 0.f) {
00630 goto L90;
00631 } else if (r__1 == 0) {
00632 goto L110;
00633 } else {
00634 goto L100;
00635 }
00636 L90:
00637 cu[(j << 1) + 1] = 1.f;
00638 iu[(j << 1) + 1] = 1;
00639 goto L110;
00640 L100:
00641 cu[(j << 1) + 2] = 1.f;
00642 iu[(j << 1) + 2] = 1;
00643 L110:
00644 ;
00645 }
00646 i__1 = *k;
00647 for (j = 1; j <= i__1; ++j) {
00648 jpn = j + *n;
00649 if ((r__1 = res[j]) < 0.f) {
00650 goto L120;
00651 } else if (r__1 == 0) {
00652 goto L140;
00653 } else {
00654 goto L130;
00655 }
00656 L120:
00657 cu[(jpn << 1) + 1] = 1.f;
00658 iu[(jpn << 1) + 1] = 1;
00659 if (q[j + n2 * q_dim1] > 0.f) {
00660 iphase = 1;
00661 }
00662 goto L140;
00663 L130:
00664 cu[(jpn << 1) + 2] = 1.f;
00665 iu[(jpn << 1) + 2] = 1;
00666 if (q[j + n2 * q_dim1] < 0.f) {
00667 iphase = 1;
00668 }
00669 L140:
00670 ;
00671 }
00672 L150:
00673 if (iphase == 2) {
00674 goto L500;
00675 }
00676 /* COMPUTE THE MARGINAL COSTS. */
00677 L160:
00678 i__1 = n1;
00679 for (j = js; j <= i__1; ++j) {
00680 sum = 0.;
00681 i__2 = klm;
00682 for (i__ = 1; i__ <= i__2; ++i__) {
00683 ii = q[i__ + n2 * q_dim1];
00684 if (ii < 0) {
00685 goto L170;
00686 }
00687 z__ = cu[(ii << 1) + 1];
00688 goto L180;
00689 L170:
00690 iineg = -ii;
00691 z__ = cu[(iineg << 1) + 2];
00692 L180:
00693 sum += (doublereal) q[i__ + j * q_dim1] * (doublereal) z__;
00694 /* L190: */
00695 }
00696 q[klm1 + j * q_dim1] = sum;
00697 /* L200: */
00698 }
00699 i__1 = *n;
00700 for (j = js; j <= i__1; ++j) {
00701 ii = q[klm2 + j * q_dim1];
00702 if (ii < 0) {
00703 goto L210;
00704 }
00705 z__ = cu[(ii << 1) + 1];
00706 goto L220;
00707 L210:
00708 iineg = -ii;
00709 z__ = cu[(iineg << 1) + 2];
00710 L220:
00711 q[klm1 + j * q_dim1] -= z__;
00712 /* L230: */
00713 }
00714 /* DETERMINE THE VECTOR TO ENTER THE BASIS. */
00715 L240:
00716 xmax = 0.f;
00717 if (js > *n) {
00718 goto L490;
00719 }
00720 i__1 = *n;
00721 for (j = js; j <= i__1; ++j) {
00722 zu = q[klm1 + j * q_dim1];
00723 ii = q[klm2 + j * q_dim1];
00724 if (ii > 0) {
00725 goto L250;
00726 }
00727 ii = -ii;
00728 zv = zu;
00729 zu = -zu - cu[(ii << 1) + 1] - cu[(ii << 1) + 2];
00730 goto L260;
00731 L250:
00732 zv = -zu - cu[(ii << 1) + 1] - cu[(ii << 1) + 2];
00733 L260:
00734 if (kforce == 1 && ii > *n) {
00735 goto L280;
00736 }
00737 if (iu[(ii << 1) + 1] == 1) {
00738 goto L270;
00739 }
00740 if (zu <= xmax) {
00741 goto L270;
00742 }
00743 xmax = zu;
00744 in = j;
00745 L270:
00746 if (iu[(ii << 1) + 2] == 1) {
00747 goto L280;
00748 }
00749 if (zv <= xmax) {
00750 goto L280;
00751 }
00752 xmax = zv;
00753 in = j;
00754 L280:
00755 ;
00756 }
00757 if (xmax <= *toler) {
00758 goto L490;
00759 }
00760 if (q[klm1 + in * q_dim1] == xmax) {
00761 goto L300;
00762 }
00763 i__1 = klm2;
00764 for (i__ = 1; i__ <= i__1; ++i__) {
00765 q[i__ + in * q_dim1] = -q[i__ + in * q_dim1];
00766 /* L290: */
00767 }
00768 q[klm1 + in * q_dim1] = xmax;
00769 /* DETERMINE THE VECTOR TO LEAVE THE BASIS. */
00770 L300:
00771 if (iphase == 1 || ia == 0) {
00772 goto L330;
00773 }
00774 xmax = 0.f;
00775 i__1 = ia;
00776 for (i__ = 1; i__ <= i__1; ++i__) {
00777 z__ = (r__1 = q[i__ + in * q_dim1], dabs(r__1));
00778 if (z__ <= xmax) {
00779 goto L310;
00780 }
00781 xmax = z__;
00782 iout = i__;
00783 L310:
00784 ;
00785 }
00786 if (xmax <= *toler) {
00787 goto L330;
00788 }
00789 i__1 = n2;
00790 for (j = 1; j <= i__1; ++j) {
00791 z__ = q[ia + j * q_dim1];
00792 q[ia + j * q_dim1] = q[iout + j * q_dim1];
00793 q[iout + j * q_dim1] = z__;
00794 /* L320: */
00795 }
00796 iout = ia;
00797 --ia;
00798 pivot = q[iout + in * q_dim1];
00799 goto L420;
00800 L330:
00801 kk = 0;
00802 i__1 = klm;
00803 for (i__ = 1; i__ <= i__1; ++i__) {
00804 z__ = q[i__ + in * q_dim1];
00805 if (z__ <= *toler) {
00806 goto L340;
00807 }
00808 ++kk;
00809 res[kk] = q[i__ + n1 * q_dim1] / z__;
00810 s[kk] = i__;
00811 L340:
00812 ;
00813 }
00814 L350:
00815 if (kk > 0) {
00816 goto L360;
00817 }
00818 *kode = 2;
00819 goto L590;
00820 L360:
00821 xmin = res[1];
00822 iout = s[1];
00823 j = 1;
00824 if (kk == 1) {
00825 goto L380;
00826 }
00827 i__1 = kk;
00828 for (i__ = 2; i__ <= i__1; ++i__) {
00829 if (res[i__] >= xmin) {
00830 goto L370;
00831 }
00832 j = i__;
00833 xmin = res[i__];
00834 iout = s[i__];
00835 L370:
00836 ;
00837 }
00838 res[j] = res[kk];
00839 s[j] = s[kk];
00840 L380:
00841 --kk;
00842 pivot = q[iout + in * q_dim1];
00843 ii = q[iout + n2 * q_dim1];
00844 if (iphase == 1) {
00845 goto L400;
00846 }
00847 if (ii < 0) {
00848 goto L390;
00849 }
00850 if (iu[(ii << 1) + 2] == 1) {
00851 goto L420;
00852 }
00853 goto L400;
00854 L390:
00855 iineg = -ii;
00856 if (iu[(iineg << 1) + 1] == 1) {
00857 goto L420;
00858 }
00859 L400:
00860 ii = abs(ii);
00861 cuv = cu[(ii << 1) + 1] + cu[(ii << 1) + 2];
00862 if (q[klm1 + in * q_dim1] - pivot * cuv <= *toler) {
00863 goto L420;
00864 }
00865 /* BYPASS INTERMEDIATE VERTICES. */
00866 i__1 = n1;
00867 for (j = js; j <= i__1; ++j) {
00868 z__ = q[iout + j * q_dim1];
00869 q[klm1 + j * q_dim1] -= z__ * cuv;
00870 q[iout + j * q_dim1] = -z__;
00871 /* L410: */
00872 }
00873 q[iout + n2 * q_dim1] = -q[iout + n2 * q_dim1];
00874 goto L350;
00875 /* GAUSS-JORDAN ELIMINATION. */
00876 L420:
00877 if (*iter < maxit) {
00878 goto L430;
00879 }
00880 *kode = 3;
00881 goto L590;
00882 L430:
00883 ++(*iter);
00884 i__1 = n1;
00885 for (j = js; j <= i__1; ++j) {
00886 if (j != in) {
00887 q[iout + j * q_dim1] /= pivot;
00888 }
00889 /* L440: */
00890 }
00891 /* IF PERMITTED, USE SUBROUTINE COL OF THE DESCRIPTION */
00892 /* SECTION AND REPLACE THE FOLLOWING SEVEN STATEMENTS DOWN */
00893 /* TO AND INCLUDING STATEMENT NUMBER 460 BY.. */
00894 /* DO 460 J=JS,N1 */
00895 /* IF(J .EQ. IN) GO TO 460 */
00896 /* Z = -Q(IOUT,J) */
00897 /* CALL COL(Q(1,J), Q(1,IN), Z, IOUT, KLM1) */
00898 /* 460 CONTINUE */
00899 i__1 = n1;
00900 for (j = js; j <= i__1; ++j) {
00901 if (j == in) {
00902 goto L460;
00903 }
00904 z__ = -q[iout + j * q_dim1];
00905 i__2 = klm1;
00906 for (i__ = 1; i__ <= i__2; ++i__) {
00907 if (i__ != iout) {
00908 q[i__ + j * q_dim1] += z__ * q[i__ + in * q_dim1];
00909 }
00910 /* L450: */
00911 }
00912 L460:
00913 ;
00914 }
00915 tpivot = -pivot;
00916 i__1 = klm1;
00917 for (i__ = 1; i__ <= i__1; ++i__) {
00918 if (i__ != iout) {
00919 q[i__ + in * q_dim1] /= tpivot;
00920 }
00921 /* L470: */
00922 }
00923 q[iout + in * q_dim1] = 1.f / pivot;
00924 z__ = q[iout + n2 * q_dim1];
00925 q[iout + n2 * q_dim1] = q[klm2 + in * q_dim1];
00926 q[klm2 + in * q_dim1] = z__;
00927 ii = dabs(z__);
00928 if (iu[(ii << 1) + 1] == 0 || iu[(ii << 1) + 2] == 0) {
00929 goto L240;
00930 }
00931 i__1 = klm2;
00932 for (i__ = 1; i__ <= i__1; ++i__) {
00933 z__ = q[i__ + in * q_dim1];
00934 q[i__ + in * q_dim1] = q[i__ + js * q_dim1];
00935 q[i__ + js * q_dim1] = z__;
00936 /* L480: */
00937 }
00938 ++js;
00939 goto L240;
00940 /* TEST FOR OPTIMALITY. */
00941 L490:
00942 if (kforce == 0) {
00943 goto L580;
00944 }
00945 if (iphase == 1 && q[klm1 + n1 * q_dim1] <= *toler) {
00946 goto L500;
00947 }
00948 kforce = 0;
00949 goto L240;
00950 /* SET UP PHASE 2 COSTS. */
00951 L500:
00952 iphase = 2;
00953 i__1 = nklm;
00954 for (j = 1; j <= i__1; ++j) {
00955 cu[(j << 1) + 1] = 0.f;
00956 cu[(j << 1) + 2] = 0.f;
00957 /* L510: */
00958 }
00959 i__1 = nk;
00960 for (j = n1; j <= i__1; ++j) {
00961 cu[(j << 1) + 1] = 1.f;
00962 cu[(j << 1) + 2] = 1.f;
00963 /* L520: */
00964 }
00965 i__1 = klm;
00966 for (i__ = 1; i__ <= i__1; ++i__) {
00967 ii = q[i__ + n2 * q_dim1];
00968 if (ii > 0) {
00969 goto L530;
00970 }
00971 ii = -ii;
00972 if (iu[(ii << 1) + 2] == 0) {
00973 goto L560;
00974 }
00975 cu[(ii << 1) + 2] = 0.f;
00976 goto L540;
00977 L530:
00978 if (iu[(ii << 1) + 1] == 0) {
00979 goto L560;
00980 }
00981 cu[(ii << 1) + 1] = 0.f;
00982 L540:
00983 ++ia;
00984 i__2 = n2;
00985 for (j = 1; j <= i__2; ++j) {
00986 z__ = q[ia + j * q_dim1];
00987 q[ia + j * q_dim1] = q[i__ + j * q_dim1];
00988 q[i__ + j * q_dim1] = z__;
00989 /* L550: */
00990 }
00991 L560:
00992 ;
00993 }
00994 goto L160;
00995 L570:
00996 if (q[klm1 + n1 * q_dim1] <= *toler) {
00997 goto L500;
00998 }
00999 *kode = 1;
01000 goto L590;
01001 L580:
01002 if (iphase == 1) {
01003 goto L570;
01004 }
01005 /* PREPARE OUTPUT. */
01006 *kode = 0;
01007 L590:
01008 sum = 0.;
01009 i__1 = *n;
01010 for (j = 1; j <= i__1; ++j) {
01011 x[j] = 0.f;
01012 /* L600: */
01013 }
01014 i__1 = klm;
01015 for (i__ = 1; i__ <= i__1; ++i__) {
01016 res[i__] = 0.f;
01017 /* L610: */
01018 }
01019 i__1 = klm;
01020 for (i__ = 1; i__ <= i__1; ++i__) {
01021 ii = q[i__ + n2 * q_dim1];
01022 sn = 1.f;
01023 if (ii > 0) {
01024 goto L620;
01025 }
01026 ii = -ii;
01027 sn = -1.f;
01028 L620:
01029 if (ii > *n) {
01030 goto L630;
01031 }
01032 x[ii] = sn * q[i__ + n1 * q_dim1];
01033 goto L640;
01034 L630:
01035 iimn = ii - *n;
01036 res[iimn] = sn * q[i__ + n1 * q_dim1];
01037 if (ii >= n1 && ii <= nk) {
01038 sum += (doublereal) q[i__ + n1 * q_dim1];
01039 }
01040 L640:
01041 ;
01042 }
01043 *error = sum;
01044 return 0;
01045 } /* cl1_ */
|
|
||||||||||||||||||||||||||||
|
Definition at line 37 of file cl1.c. References calloc, cl1_fort(), free, l, and q. Referenced by L1F_worker(), and main().
00038 {
00039 /* loop counters */
00040
00041 int jj , ii ;
00042
00043 /* variables for CL1 (types declared in f2c.h) */
00044
00045 integer k,l,m,n,klmd,klm2d,nklmd,n2d , kode=0,iter , *iu,*s ;
00046 real *q , toler , *x , *res , error , *cu ;
00047
00048 /*-- check inputs --*/
00049
00050 if( ndim < 1 || nvec < 1 ) kode = 4 ;
00051 if( A == NULL || y == NULL || z == NULL ) kode = 4 ;
00052 for( jj=0 ; jj < nvec ; jj++ ) if( A[jj] == NULL ) kode = 4 ;
00053
00054 if( kode ){
00055 fprintf(stderr,"** cl1_solve ERROR: illegal inputs!\n") ;
00056 return (float)(-kode) ;
00057 }
00058
00059 /*-- setup call to CL1 --*/
00060
00061 k = ndim ;
00062 l = 0 ; /* no linear equality constraints */
00063 m = 0 ; /* no linear inequality constraints */
00064 n = nvec ;
00065
00066 klmd = k+l+m ;
00067 klm2d = k+l+m+2 ;
00068 nklmd = n+k+l+m ;
00069 n2d = n+2 ;
00070
00071 kode = (cony != 0) ; /* enforce implicit constraints on x[] */
00072 iter = 11*klmd ;
00073
00074 toler = 0.0001 ;
00075 error = 0.0 ;
00076
00077 /* input/output matrices & vectors */
00078
00079 q = (real *) calloc( 1, sizeof(real) * klm2d*n2d ) ;
00080 x = (real *) calloc( 1, sizeof(real) * n2d ) ;
00081 res = (real *) calloc( 1, sizeof(real) * klmd ) ;
00082
00083 /* workspaces */
00084
00085 cu = (real *) calloc( 1, sizeof(real) * 2*nklmd ) ;
00086 iu = (integer *) calloc( 1, sizeof(integer) * 2*nklmd ) ;
00087 s = (integer *) calloc( 1, sizeof(integer) * klmd ) ;
00088
00089 /* load matrices & vectors */
00090
00091 for( jj=0 ; jj < nvec ; jj++ )
00092 for( ii=0 ; ii < ndim ; ii++ )
00093 q[ii+jj*klm2d] = A[jj][ii] ; /* matrix */
00094
00095 for( ii=0 ; ii < ndim ; ii++ )
00096 q[ii+nvec*klm2d] = z[ii] ; /* vector */
00097
00098 if( cony ){
00099 for( jj=0 ; jj < nvec ; jj++ ) /* constraints on solution */
00100 x[jj] = (y[jj] < 0.0) ? -1.0
00101 :(y[jj] > 0.0) ? 1.0 : 0.0 ;
00102 }
00103
00104 for( ii=0 ; ii < klmd ; ii++ ) /* no constraints on resids */
00105 res[ii] = 0.0 ;
00106
00107 /*-- do the work --*/
00108
00109 cl1_fort( &k, &l, &m, &n,
00110 &klmd, &klm2d, &nklmd, &n2d,
00111 q, &kode, &toler, &iter, x, res, &error, cu, iu, s) ;
00112
00113 free(q) ; free(res) ; free(cu) ; free(iu) ; free(s) ;
00114
00115 if( kode != 0 ){
00116 free(x) ;
00117 #if 0
00118 switch( kode ){
00119 case 1: fprintf(stderr,"** cl1_solve ERROR: no feasible solution!\n"); break;
00120 case 2: fprintf(stderr,"** cl1_solve ERROR: rounding errors!\n") ; break;
00121 case 3: fprintf(stderr,"** cl1_solve ERROR: max iterations!\n") ; break;
00122 default: fprintf(stderr,"** cl1_solve ERROR: unknown problem!\n") ; break;
00123 }
00124 #endif
00125 return (float)(-kode) ;
00126 }
00127
00128 /*-- copy results into output --*/
00129
00130 for( jj=0 ; jj < nvec ; jj++ ) y[jj] = (float) x[jj] ;
00131
00132 free(x) ; return (float)error ;
00133 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 170 of file cl1.c. References calloc, cl1_fort(), free, l, and q. Referenced by main().
00172 {
00173 /* loop counters */
00174
00175 int jj , ii ;
00176
00177 /* variables for CL1 (types declared in f2c.h) */
00178
00179 integer k,l,m,n,klmd,klm2d,nklmd,n2d , kode=0,iter , *iu,*s ;
00180 real *q , toler , *x , *res , error , *cu ;
00181
00182 /*-- check inputs --*/
00183
00184 if( ndim < 1 || nvec < 1 ) kode = 4 ;
00185 if( A == NULL || y == NULL || z == NULL ) kode = 4 ;
00186 for( jj=0 ; jj < nvec ; jj++ ) if( A[jj] == NULL ) kode = 4 ;
00187
00188 if( kode ){
00189 fprintf(stderr,"** cl1_solve ERROR: illegal inputs!\n") ;
00190 return (float)(-kode) ;
00191 }
00192
00193 /*-- setup call to CL1 --*/
00194
00195 k = ndim ;
00196 l = 0 ; /* no linear equality constraints */
00197 m = 0 ; /* no linear inequality constraints */
00198 n = nvec ;
00199
00200 klmd = k+l+m ;
00201 klm2d = k+l+m+2 ;
00202 nklmd = n+k+l+m ;
00203 n2d = n+2 ;
00204
00205 kode = (cony != 0 || conr != 0) ; /* enforce implicit constraints on x[] */
00206 iter = 11*klmd ;
00207
00208 toler = 0.0001 ;
00209 error = 0.0 ;
00210
00211 /* input/output matrices & vectors */
00212
00213 q = (real *) calloc( 1, sizeof(real) * klm2d*n2d ) ;
00214 x = (real *) calloc( 1, sizeof(real) * n2d ) ;
00215 res = (real *) calloc( 1, sizeof(real) * klmd ) ;
00216
00217 /* workspaces */
00218
00219 cu = (real *) calloc( 1, sizeof(real) * 2*nklmd ) ;
00220 iu = (integer *) calloc( 1, sizeof(integer) * 2*nklmd ) ;
00221 s = (integer *) calloc( 1, sizeof(integer) * klmd ) ;
00222
00223 /* load matrices & vectors */
00224
00225 for( jj=0 ; jj < nvec ; jj++ )
00226 for( ii=0 ; ii < ndim ; ii++ )
00227 q[ii+jj*klm2d] = A[jj][ii] ; /* matrix */
00228
00229 for( ii=0 ; ii < ndim ; ii++ )
00230 q[ii+nvec*klm2d] = z[ii] ; /* vector */
00231
00232 if( cony ){
00233 for( jj=0 ; jj < nvec ; jj++ ) /* constraints on solution */
00234 x[jj] = (y[jj] < 0.0) ? -1.0
00235 :(y[jj] > 0.0) ? 1.0 : 0.0 ;
00236 }
00237
00238 if( conr ){
00239 for( ii=0 ; ii < ndim ; ii++ ) /* constraints on resids */
00240 res[ii] = (rez[ii] < 0.0) ? -1.0
00241 :(rez[ii] > 0.0) ? 1.0 : 0.0 ;
00242 }
00243
00244 /*-- do the work --*/
00245
00246 cl1_fort( &k, &l, &m, &n,
00247 &klmd, &klm2d, &nklmd, &n2d,
00248 q, &kode, &toler, &iter, x, res, &error, cu, iu, s) ;
00249
00250 free(q) ; free(cu) ; free(iu) ; free(s) ;
00251
00252 if( kode != 0 ){
00253 free(x) ; free(res) ;
00254 #if 0
00255 switch( kode ){
00256 case 1: fprintf(stderr,"** cl1_solve ERROR: no feasible solution!\n"); break;
00257 case 2: fprintf(stderr,"** cl1_solve ERROR: rounding errors!\n") ; break;
00258 case 3: fprintf(stderr,"** cl1_solve ERROR: max iterations!\n") ; break;
00259 default: fprintf(stderr,"** cl1_solve ERROR: unknown problem!\n") ; break;
00260 }
00261 #endif
00262 return (float)(-kode) ;
00263 }
00264
00265 /*-- copy results into output --*/
00266
00267 for( jj=0 ; jj < nvec ; jj++ ) y[jj] = (float) x[jj] ;
00268
00269 for( ii=0 ; ii < ndim ; ii++ ) rez[ii] = (float) res[ii] ;
00270
00271 free(res); free(x); return (float)error;
00272 }
|