setsrch.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 986 行 · 第 1/2 页

C
986
字号
/* * Finds fk in Q, and removes it */{   FILENODE *fp, *pr=NULL;   if (fk == fbase)   {      fp = fbase->next;      fbase->next = NULL;      KillAllFN(fbase);      fbase = fp;   }   else   {      for (fp=fbase; fp != fk && fp; fp = fp->next) pr = fp;      assert(fp && pr);      pr->next = fp->next;      fp->next = NULL;      KillAllFN(fp);   }   return(fbase);}FILENODE *TstFile(char pre, FILENODE *fbase, int *N){   FILENODE *fp, *fn;   char ln[2048];   int i, k=0;   for (fp=fbase; fp; fp = fn)   {      fn = fp->next;      i = sprintf(ln, "make %csettest urout=%s opt=\"", pre, fp->rout);      if (fp->incX == 0) i += sprintf(ln+i, " -X 4 1 -1 2 -3");      if (fp->alpha == 0)      {         if (pre == 'c' && pre == 'z') i += sprintf(ln+i, " -a 1 0.0 0.0");         else i += sprintf(ln+i, " -a 1 0.0");      }      i += sprintf(ln+i, "\" ");      if (fp->cc) i += sprintf(ln+i, "%cUCC=\"%s\" ", pre, fp->cc);      if (fp->ccflags) i += sprintf(ln+i, "%cUCCFLAGS=\"%s\" ",pre,fp->ccflags);      sprintf(ln+i, "\n");      fprintf(stderr, "TST: %s", ln);      #if 1         if (system(ln)) fbase = KillFN(fbase, fp);         else k++;      #else         k++;      #endif   }   *N = k;   return(fbase);}int NumOfAlpha(int alpha, int n, int *ia)/* * returns number of occurences of alpha in ia */{   int i, j;   for (i=j=0; i < n; i++) if (ia[i] == alpha) j++;   return(j);}char *GetNam(char pre, int alpha, int beta, int incX, int incY){   static char nam[128];   char sx, sy, ca, cb;   char *rout="set";   if (alpha == 1) ca = '1';   else if (alpha == -1) ca = 'n';   else if (alpha == 0 && (pre=='c' || pre=='z')) ca = 'r';   else ca = 'X';   if (beta == 1) cb = '1';   else if (beta == -1) cb = 'n';   else if (beta == 0 && (pre=='c' || pre=='z')) cb = 'r';   else cb = 'X';   if (incX < 0) { sx = 'n'; incX = -incX; }   else sx = 'p';   if (incY < 0) { sy = 'n'; incY = -incY; }   else sy = 'p';   sprintf(nam, "ATL_%c%s_x%c%dy%c%da%cb%c",           pre, rout, sx, incX, sy, incY, ca, cb);   return(nam);}void GenAlphCase(char pre, char *spc, FILE *fpout, int alpha,                 int n, int *ix, int *iy, int *ia, int *ib){   int na, i;   na = NumOfAlpha(alpha, n, ia);   if (!na) return;   if (alpha ==  1)      fprintf(fpout, "%sif ( SCALAR_IS_ONE(alpha) )\n   {\n", spc);   if (alpha == -1)      fprintf(fpout, "%sif ( SCALAR_IS_NONE(alpha) )\n   {\n", spc);   else if (alpha == 0 && (pre=='c' || pre =='z') )      fprintf(fpout, "%sif (alpha[1] == ATL_rzero)\n   {\n", spc);   for (i=0; i < n; i++)   {      if (ia[i] == alpha)      {         if (ix[i] && iy[i])            fprintf(fpout, "%s   if (incx == %d && incy == %d)\n      {\n",                    spc, ix[i], iy[i]);         else if (iy[i])            fprintf(fpout, "%s   if (incy == %d)\n      {\n", spc, iy[i]);         else if (ix[i])            fprintf(fpout, "%s   if (incx == %d)\n      {\n", spc, ix[i]);         fprintf(fpout, "%s      %s(N, alpha, X, incx);\n",                 spc, GetNam(pre, alpha, ib[i], ix[i], iy[i]));         fprintf(fpout, "%s      return;\n", spc);         if (ix[i] || iy[i]) fprintf(fpout, "%s   }\n", spc);      }   }   fprintf(fpout, "%s}\n", spc);}void MangleIncs(FILE *fpout, char *spc, char pre)/* * Makes sure incX is positive */{   assert(spc[0] == ' ' && spc[1] == ' ' && spc[2] == ' ');   fprintf(fpout, "%sif (incX > 0) incx = incX;\n", spc);   fprintf(fpout, "%selse if (incX < 0)\n%s{\n", spc, spc);   fprintf(fpout, "%s   X += ((N-1)SHIFT) * incX;\n", spc);   fprintf(fpout, "%s   incx = -incX;\n", spc);   fprintf(fpout, "%s}\n%selse return;\n", spc, spc);}void GenMakefile(char pre, int n, int *ix, int *iy, int *ia, int *ib,                 FILENODE **bp){   char *cc, *ccflags, *nam, *typ="";   char ln[32];   char *rout = "set";   int i;   FILE *fpout;   sprintf(ln, "GEN/Make_%c%s", pre, rout);   fpout = fopen(ln, "w");   assert(fpout);   if (pre == 's') typ="SREAL";   else if (pre == 'd') typ="DREAL";   else if (pre == 'c') typ="SCPLX";   else if (pre == 'z') typ="DCPLX";   fprintf(fpout, "include Make.inc\n\n");   fprintf(fpout, "obj = ATL_%c%s.o", pre, rout);   for (i=0; i < n; i++)      fprintf(fpout, " %s.o", GetNam(pre, ia[i], ib[i], ix[i], iy[i]));   fprintf(fpout, "\n\n");   fprintf(fpout, "all : lib\n%clib : lib\nlib : %c%s.grd\n\n", pre, pre, rout);   fprintf(fpout, "%c%s.grd : $(obj)\n", pre, rout);   fprintf(fpout, "\t$(ARCHIVER) $(ARFLAGS) $(ATLASlib) $(obj)\n");   fprintf(fpout, "\t$(RANLIB) $(ATLASlib)\n");   fprintf(fpout, "\ttouch %c%s.grd\n", pre, rout);   fprintf(fpout, "\n");   sprintf(ln, "ATL_%c%s", pre, rout);   fprintf(fpout, "%s.o : %s.c\n", ln, ln);   fprintf(fpout, "\t$(ICC) $(ICCFLAGS) -D%s -o $@ -c %s.c\n", typ, ln);   for (i=0; i < n; i++)   {      nam = GetNam(pre, ia[i], ib[i], ix[i], iy[i]);      cc = bp[i]->cc;      ccflags = bp[i]->ccflags;      if (!cc) cc = (pre == 's' || pre == 'c') ? "$(SKC)" : "$(DKC)";      if (!ccflags)         ccflags = (pre == 's' || pre == 'c') ? "$(SKCFLAGS)":"$(DKCFLAGS)";      fprintf(fpout, "%s.o : %s.c\n", nam, nam);      fprintf(fpout, "\t%s %s $(CDEFS) -D%s -o $@ -c %s.c\n",              cc, ccflags, typ, nam);   }   fclose(fpout);}void GenMainRout(char pre, int n, int *ix, int *iy, int *ia, int *ib,                 FILENODE **bp){   int i, j, NeedElse=0;   FILENODE *gp;   FILE *fpout;   char *els="else if", *ifs ="if";   char *spcs="                  ";   char *spc = spcs+18;   char ln[64];   char *dargs="const int, const SCALAR, TYPE*, const int";   char *args="N, alpha, X, incx";   sprintf(ln, "GEN/ATL_%cset.c", pre);   fpout = fopen(ln, "w");   assert(fpout);   fprintf(fpout, "#include \"atlas_misc.h\"\n\n");   gp = FindGen(n, ix, iy, ia, ib, bp);   assert(gp);/* * prototype all routines */   for (i=0; i < n; i++)   {      fprintf(fpout, "void %s\n   (%s);\n",              GetNam(pre, ia[i], ib[i], ix[i], iy[i]), dargs);   }      fprintf(fpout, "void Mjoin(PATLU,set)\n   (const int, const TYPE, TYPE*, const int);\n");   fprintf(fpout, "\nvoid ATL_%cset(const int N, const SCALAR alpha, TYPE *X, const int incX)\n{\n", pre);   fprintf(fpout, "   int incx;\n\n");   fprintf(fpout, "   if (N > 0)\n   {\n");   spc -= 6;   MangleIncs(fpout, spc, pre);   if (pre == 'c' || pre == 'z')   {      fprintf(fpout,         "%sif (incx==1 && alpha[1] == *alpha)\n", spc);      fprintf(fpout,         "%s{\n", spc);      fprintf(fpout,         "%s   Mjoin(PATLU,set)(N+N, *alpha, X, 1);\n", spc);      fprintf(fpout,         "%s   return;\n", spc);      fprintf(fpout,         "%s}\n", spc);   }/* * Handle all special alpha cases */   GenAlphCase(pre, spc, fpout, 0, n, ix, iy, ia, ib);/* * Handle specific incX */   for (i=0; i < n-1; i++)   {      if (ia[i] != AlphaX) continue;      fprintf(fpout, "%s%s (incx == %d)\n", spc, ifs, ix[i]);      fprintf(fpout, "%s   %s(%s);\n", spc,              GetNam(pre, ia[i], ib[i], ix[i], iy[i]), args);      ifs = els;      NeedElse = 1;   }   if (NeedElse)   {      fprintf(fpout, "%selse\n", spc);      spc -= 3;   }   fprintf(fpout, "%s%s(%s);\n", spc,           GetNam(pre, AlphaX, AlphaX, 0, 0), args);   fprintf(fpout, "   }\n");   fprintf(fpout, "}\n");   fprintf(fpout,           "\nvoid ATL_%czero(const int N, TYPE *X, const int incX)\n{\n", pre);   if (pre == 'c' || pre == 'z')   {      fprintf(fpout, "   TYPE zero[2] = {ATL_rzero, ATL_rzero};\n");      fprintf(fpout, "   ATL_%cset(N, zero, X, incX);\n", pre);   }   else fprintf(fpout, "   ATL_%cset(N, ATL_rzero, X, incX);\n", pre);   fprintf(fpout, "}\n");   fclose(fpout);}void DumpFile(char *fnam, FILE *fpout){   FILE *fpin;   char ln[512];   sprintf(ln, "SET/%s", fnam);   fpin = fopen(ln, "r");   assert(fpin);   while(fgets(ln, 512, fpin)) fputs(ln, fpout);   fclose(fpin);}void GenFiles(char pre, int n, int *ix, int *iy, int *ia, int *ib,              FILENODE **bp)/* * Generates all needed files */{   int i;   char *nam, *typ;   char ln[128];   FILE *fpout;   GenMainRout(pre, n, ix, iy, ia, ib, bp);   GenMakefile(pre, n, ix, iy, ia, ib, bp);   for (i=0; i < n; i++)   {      nam = GetNam(pre, ia[i], ib[i], ix[i], iy[i]);      sprintf(ln, "GEN/%s.c", nam);      fpout = fopen(ln, "w");      assert(fpout);      fprintf(fpout, "#define ATL_USET %s\n\n", nam);      DumpFile(bp[i]->rout, fpout);      fclose(fpout);   }}void CreateSumm(char pre, int n, int *ix, int *iy, int *ia, int *ib,                FILENODE **bp)/* * Creates summary file of form:<ncases><ID> <alpha> <beta> <incX> <incY> <rout> <auth> */{   int i;   char ln[64];   FILE *fpout;   sprintf(ln, "res/%cSET_SUMM", pre);   fpout = fopen(ln, "w");   assert(fpout);   fprintf(fpout, "%d\n", n);   for (i=0; i < n; i++)   {      fprintf(fpout, "%3d %3d %3d %3d %3d %s \"%s\"\n",              bp[i]->ID, ia[i], ib[i], ix[i], iy[i], bp[i]->rout, bp[i]->auth);   }   fclose(fpout);}void AssBest(FILENODE *fbase, int n, int *id, FILENODE **bp)/* * Associates best file pointers with filenodes based on ID */{   int i, ID;   FILENODE *fp;   for (i=0; i < n; i++)   {      ID = id[i];      for (fp=fbase; fp; fp = fp->next) if (fp->ID == ID) break;      assert(fp);      bp[i] = fp;   }}FILENODE *GetSumm(char pre, int *N, int **IX, int **IY, int **IA,  int **IB,                  FILENODE ***BP){   FILENODE *fbase, **bp;   int i, n, *ix, *iy, *ia, *ib, *id;   char ln[512];   FILE *fpin;   *N = 0;   sprintf(ln, "res/%cSET_SUMM", pre);   fpin = fopen(ln, "r");   if (fpin == NULL) return(NULL);   fbase = ReadFile(pre);   assert( fgets(ln, 512, fpin) != NULL );   sscanf(ln, " %d", &n);   assert(n > 0);   ix = malloc(5*n*sizeof(int));   assert(ix);   iy = ix + n;   ia = iy + n;   ib = ia + n;   id = ib + n;   bp = malloc(n*sizeof(FILENODE*));   assert(bp);   for (i=0; i < n; i++)   {      assert( fgets(ln, 512, fpin) != NULL );      assert(sscanf(ln, " %d %d %d %d %d", id+i, ia+i, ib+i, ix+i, iy+i) == 5);      bp[i] = NULL;   }   fclose(fpin);   AssBest(fbase, n, id, bp);   *N = n;   *IX = ix;   *IY = iy;   *IA = ia;   *IB = ib;   *BP = bp;   return(fbase);}void DoIt(char pre){   FILENODE *fbase, **bp;   int n;   int *ix, *iy, *ia, *ib;   fbase = ReadFile(pre);   fbase = TstFile(pre, fbase, &n);  /* get rid of nodes that don't work */   ix = malloc(4*n*sizeof(int));   assert(ix);   bp = malloc(n*sizeof(FILENODE*));   assert(bp);   iy = ix + n;   ia = iy + n;   ib = ia + n;   n = GetCombos(fbase, ix, iy, ia, ib, bp);   BruteTime(pre, n, fbase, ix, iy, ia, ib, bp);   n = KillSpecCases(n, ix, iy, ia, ib, bp);   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   SortCases(n, ix, iy, ia, ib, bp);   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   CreateSumm(pre, n, ix, iy, ia, ib, bp);   KillAllFN(fbase);   free(bp);   free(ix);}void GoToTown(char pre){   FILENODE *fptr, **bp;   int n, *ix, *iy, *ia, *ib;   fptr = GetSumm(pre, &n, &ix, &iy, &ia, &ib, &bp);   if (!fptr)   {      DoIt(pre);      fptr = GetSumm(pre, &n, &ix, &iy, &ia, &ib, &bp);      assert(fptr);   }   fprintf(stdout, "%d:\n", __LINE__);   PrintTable(n, ix, iy, ia, ib, bp);   GenFiles(pre, n, ix, iy, ia, ib, bp);   KillAllFN(fptr);   free(bp);   free(ix);}void PrintUsage(char *nam){   fprintf(stderr, "\nUSAGE: %s -p <pre>\n\n", nam);   exit(-1);}char GetFlags(int nargs, char **args){   char ch;   if (nargs < 2) return('d');   if (args[1][0] == '-')   {      if (nargs < 3) PrintUsage(args[0]);      ch = args[2][0];   }   else ch = args[1][0];   switch(ch)   {   case 's':   case 'd':   case 'c':   case 'z':       break;   case 'S':      ch = 's';      break;   case 'D':      ch = 'd';      break;   case 'C':      ch = 'c';      break;   case 'Z':      ch = 'z';      break;   default:      PrintUsage(args[0]);   }   return(ch);}main(int nargs, char **args){   char pre;   pre = GetFlags(nargs, args);   GoToTown(pre);   exit(0);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?