home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d01xx / d0199.lha / ASimplex / main.c < prev    next >
C/C++ Source or Header  |  1989-03-31  |  9KB  |  293 lines

  1. /*****************************************************************************
  2.  * Modul                : main.c                                             *
  3.  * Zweck                : Simplexalgorithmus                                 *
  4.  * Autor                : Stefan F÷rster                                     *
  5.  *                                                                           *
  6.  * Datum      | Version | Bemerkung                                          *
  7.  * -----------|---------|--------------------------------------------------- *
  8.  * 14.03.1989 | 1.0     |                                                    *
  9.  * 15.03.1989 |         | Zeitmessung mittels CurrentTime()                  *
  10.  * 17.03.1989 | 1.1     | SetTaskPri() jetzt korrekt                         *
  11.  *            |         | min cTx zugelassen                                 *
  12.  * 18.03.1989 | 1.2     | Optional Ausgabe an ein File m÷glich (-f)          *
  13.  *****************************************************************************/
  14.  
  15.  
  16.  
  17. IMPORT USHORT       PhaseI(), PhaseII();
  18. IMPORT BOOL         MPSX(), SearchExpr();
  19. IMPORT INT          GetInput();
  20. IMPORT SHORT        GetExpr();
  21. IMPORT VOID         GiveMemBack(), GetRidOfLists(), PrintError(), Cap();
  22. IMPORT VOID         CurrentTime(), *OpenLibrary(), SetTaskPri(), fclose();
  23. IMPORT struct Task  *FindTask();
  24.  
  25.  
  26. struct IntuitionBase *IntuitionBase = NULL;
  27.  
  28. DOUBLE    INFINITE = 1.0/0.0;  /* IEEE: NAN (Not A Number) */
  29.  
  30. FILE    *file[2] = { NULL };
  31.  
  32. TEXT    symbols[NUM_SYMBOLS][MAX_STRLEN+1];
  33. BOOL    minimize = _FALSE; /* _TRUE, falls Zielfunktion minimiert wird */
  34.  
  35. ITEMPTR list[NUM_LISTS];
  36. TEXT    args[BUFFER], line[BUFFER];
  37.  
  38. SHORT   m, n, *B = NULL, *Nq = NULL, *Nminus = NULL;
  39. DOUBLE  c0, c0start;
  40. DOUBLE  *A = NULL, *AB1 = NULL, *b = NULL, *b2q = NULL;
  41. DOUBLE  *c = NULL, *c2 = NULL, *upper = NULL, *lower = NULL;
  42. DOUBLE  *x = NULL, *cq = NULL, *pi = NULL, *dq = NULL, *help = NULL;
  43.  
  44.  
  45. STRPTR errors[] = {
  46.   (STRPTR)"Invalid arguments for \"load\"",
  47.   (STRPTR)"Identifier too long",
  48.   (STRPTR)"Identifier declared twice",
  49.   (STRPTR)"Unknown Identifier",
  50.   (STRPTR)"Sections have to start in column 1",
  51.   (STRPTR)"Section defined twice",
  52.   (STRPTR)"Unknown section",
  53.   (STRPTR)"Illegal order of sections",
  54.   (STRPTR)"Missing NAME-section (1st section) or NAME-section empty",
  55.   (STRPTR)"Missing ROWS-section (2nd section) or ROWS-section empty",
  56.   (STRPTR)"Missing goal or goal not found",
  57.   (STRPTR)"Missing COLUMNS-section (3rd section) or COLUMNS-section empty",
  58.   (STRPTR)"Missing RHS-section (4th section)",
  59.   (STRPTR)"Missing ENDATA-section (last section)",
  60.   (STRPTR)"Constraint must be of type N, E, L or G",
  61.   (STRPTR)"Bound must be of type UP or LO",
  62.   (STRPTR)"Lower bound > upper bound",
  63.   (STRPTR)"Expression in RANGES belongs to a \"E\"-constraint",
  64.   (STRPTR)"Can\'t find necessary expression in this line",
  65.   (STRPTR)"File-name too long",
  66.   (STRPTR)"Can\'t open file for read access",
  67.   (STRPTR)"Can\'t open file for write access",
  68.   (STRPTR)"End-of-file reached",
  69.   (STRPTR)"Not enough memory",
  70.   (STRPTR)"FATAL ERROR (This error should not occur, reboot system!)"
  71. };
  72.  
  73.  
  74.  
  75.  
  76.  
  77. main()
  78. {
  79.   INT     error;
  80.   SHORT   start, stop, length, i;
  81.   BOOL    end = _FALSE;
  82.   USHORT  verbose = 0, result;
  83.   TEXT    ch;
  84.   STRPTR  sptr;
  85.   ULONG   iter1, iter2, sec1, sec2, micro1, micro2;
  86.   LONG    h, min, sec, sec100, pri = 0L;
  87.   SHORT   atoi();
  88.   VOID    PrintSolution(), Leave();
  89.  
  90.   /* Zuerst Intuition-Bibliothek ÷ffnen */
  91.  
  92.   if(!(IntuitionBase = OpenLibrary("intuition.library",LIBRARY_VERSION))) {
  93.     Leave("Can't find \"intuition.library\"!");
  94.     return;
  95.   }
  96.  
  97.   puts("\f\033[1mASimplex Version 1.2");
  98.   puts("THE Amiga Simplex Program");
  99.   puts("(c) 18.03.1989 Stefan F÷rster\033[0m\n\n");
  100.  
  101.   FOREVER {
  102.  
  103.     printf(">> ");
  104.  
  105.     if(error = GetInput(args)) {
  106.       PrintError(error,NULL);
  107.       Leave("");
  108.     }
  109.     Cap(args,0,BUFFER);
  110.  
  111.     if(SearchExpr(args,&start,&stop)) {
  112.       length = GetExpr(line,args,start,stop);
  113.  
  114.       if(strcmp(line,"HELP") == 0) {
  115.         puts("   HELP");
  116.         puts("   LOAD <file> [-cGOAL] [-bRHS] [-rRANGE] [-uBOUND] [-m] \
  117. [-fFILE]");
  118.         puts("   VERBOSE");
  119.         puts("   PRIORITY [N]");
  120.         puts("   QUIT");
  121.       }
  122.  
  123.       else if(strcmp(line,"QUIT") == 0) {
  124.         do {
  125.           printf("?? Really [Y,N] ? ");
  126.           if(error = GetInput(args)) {
  127.             PrintError(error,NULL);
  128.             Leave("");
  129.           }
  130.           Cap(args,0,BUFFER);
  131.           if(!SearchExpr(args,&start,&stop)) start = 0;
  132.         } while((ch = *(args+start))!='N' && ch!='Y');
  133.         if(ch == 'Y') Leave("");
  134.       }
  135.  
  136.       else if(strcmp(line,"VERBOSE") == 0) {
  137.         verbose = verbose ? 0 : VERBOSE;
  138.         if(verbose) puts("   VERBOSE ON");
  139.         else        puts("   VERBOSE OFF");
  140.       }
  141.  
  142.       else if(strcmp(line,"PRIORITY") == 0) {
  143.         sptr = args+stop+1;
  144.         if(SearchExpr(sptr,&start,&stop)) {
  145.           length = GetExpr(line,sptr,start,stop);
  146.           pri = (LONG)atoi(line);
  147.           if(pri<0L) pri = 0L;
  148.           if(pri>20L) pri = 20L;
  149.           SetTaskPri(FindTask((STRPTR)0),pri);
  150.           printf("   Changed task priority to %ld.\n",pri);
  151.         }
  152.         else printf("   Current task priority is %ld.\n",pri);
  153.       }
  154.  
  155.       else if(strcmp(line,"LOAD") == 0) {
  156.         CurrentTime(&sec1,µ1);
  157.         if(MPSX(args+stop+1)) {
  158.           if(!verbose) puts("@@ Please wait - calculation.");
  159.           iter1 = iter2 = 0L;
  160.           result = PhaseI(&m,&n,B,Nq,A,AB1,b,b2q,c,c2,&c0,c0start,verbose,
  161.                           upper,x,cq,pi,dq,Nminus,help,&iter1);
  162.           if(result == NOT_INVERTABLE) {
  163.             puts("   Matrix AB is not invertable.");
  164.             if(file[1]) fputs("   Matrix AB is not invertable.\n",file[1]);
  165.           }
  166.  
  167.           else if(result == UNBOUNDED) {
  168.             puts("   PHASE I IS UNBOUNDED. THIS SHOULD NOT OCCUR!!");
  169.             if(file[1])
  170.               fputs("   PHASE I IS UNBOUNDED. THIS SHOULD NOT OCCUR!!\n",file[1]);
  171.           }
  172.  
  173.           else if(result == EMPTY) {
  174.             puts("   This problem is not solveable.");
  175.             if(file[1]) fputs("   This problem is not solveable.\n",file[1]);
  176.           }
  177.  
  178.           else if(result == CLEAR_CUT) PrintSolution();
  179.  
  180.           else {
  181.             result = PhaseII(m,n,B,Nq,A,AB1,b,b2q,c,&c0,c0start,
  182.                     verbose|PHASE_II,upper,lower,x,cq,pi,dq,Nminus,help,&iter2);
  183.             if(result == NOT_INVERTABLE) {
  184.               puts("   Matrix AB is not invertable.");
  185.               if(file[1]) fputs("   Matrix AB is not invertable.\n",file[1]);
  186.             }
  187.             else if(result == UNBOUNDED) {
  188.               puts("   This problem is unbounded.");
  189.               if(file[1]) fputs("   This problem is unbounded.\n",file[1]);
  190.             }
  191.             else PrintSolution();
  192.           }
  193.  
  194.           printf("-> %ld iterations needed.\n",iter1+iter2);
  195.           if(file[1]) fprintf(file[1],"-> %ld iterations needed.\n",iter1+iter2);
  196.           GiveMemBack();
  197.           GetRidOfLists();
  198.           minimize = _FALSE;
  199.         }
  200.         CurrentTime(&sec2,µ2);
  201.         sec100 = micro2-micro1;
  202.         sec = sec2-sec1;
  203.         if(sec100 < 0L) {
  204.           sec100 += 1000000L;
  205.           --sec;
  206.         }
  207.         sec100 /= 10000L;
  208.         h = sec/3600L;
  209.         min = (sec-3600L*h)/60;
  210.         sec -= 3600L*h+60*min;
  211.         printf("-> Used time: %3ld : %02ld : %02ld,%02ld\n",h,min,sec,sec100);
  212.         if(file[1]) {
  213.           fprintf(file[1],"-> Used time: %3ld : %02ld : %02ld,%02ld\f",h,min,
  214.                   sec,sec100);
  215.           fclose(file[1]);
  216.           file[1] = NULL;
  217.         }
  218.         if(file[0]) {
  219.           fclose(file[0]);
  220.           file[0] = NULL;
  221.         }
  222.       }
  223.  
  224.       else printf("   Unknown command \"%s\".\n",line);
  225.  
  226.     }
  227.  
  228.   } /* FOREVER */
  229.  
  230. }
  231.  
  232.  
  233.  
  234. /*****************************************************************************
  235.  * VOID PrintSolution()                                                      *
  236.  * Ausgabe der L÷sung                                                        *
  237.  *****************************************************************************/
  238.  
  239. VOID    PrintSolution()
  240.  
  241. {
  242.   VOID PrintX();
  243.  
  244.   puts("@@ Solution:\n");
  245.   printf("   %-9s = %14.10lg\n",symbols[GOAL],minimize ? -c0 : c0);
  246.   PrintX(list[VAR_LIST],stdout);
  247.   puts("");
  248.  
  249.   if(file[1]) {
  250.     fputs("@@ Solution:\n\n",file[1]);
  251.     fprintf(file[1],"   %-9s = %14.10lg\n",symbols[GOAL],minimize ? -c0 : c0);
  252.     PrintX(list[VAR_LIST],file[1]);
  253.     fputs("\n",file[1]);
  254.   }
  255. }
  256.  
  257.  
  258.  
  259. /*****************************************************************************
  260.  * VOID PrintX()                                                             *
  261.  * Gibt das Ergebnis der Berechnungen aus.                                   *
  262.  *****************************************************************************/
  263.  
  264. VOID    PrintX(ptr,fptr)
  265.  
  266. ITEMPTR ptr;
  267. FILE    *fptr;
  268.  
  269. {
  270.   if(ptr) {
  271.     PrintX(ptr->next,fptr);
  272.     fprintf(fptr,"   %-9s = %14.10lg\n",ptr->string,x[ptr->nr-1]);
  273.   }
  274. }
  275.  
  276.  
  277.  
  278. /*****************************************************************************
  279.  * VOID Leave()                                                              *
  280.  * Verlassen des Programms                                                   *
  281.  *****************************************************************************/
  282.  
  283. VOID    Leave(str)
  284.  
  285. STRPTR  str;
  286.  
  287. {
  288.   if(IntuitionBase) CloseLibrary(IntuitionBase);
  289.  
  290.   fprintf(stderr,"\n%s\n\n",str);
  291.   exit(0);
  292. }
  293.