/* st06.c CJP Version 1.1 08/10/07 */ #include #include #include"blimp.h" #define MAXGENS 10000 int test=0; int c; int *lrel; int **exrl,**inrl,*extp,*intp,*inv; int **rellist,*rels,**temp,*tempstore; int exrels,inrels,ingens; int comparerels(const void* a, const void* b); int perm(int* from, int* to); int main(int argc, char **argv) { int from[MAXGENS]; int to[MAXGENS]; int i,j,k; int good; FILE *f1,*f2; int *gp; int leave; int *pt; good=1; gp = (int*) malloc(sizeof(int)*GRPSIZ); if(gp==NULL) good=0; intp = (int*) malloc(sizeof(int)*GRPSIZ); if(intp==NULL) good=0; inv = (int*) malloc(sizeof(int)*GRPSIZ); if(inv==NULL) good=0; extp = (int*) malloc(sizeof(int)*GRPSIZ); if(extp==NULL) good=0; exrl = (int**) malloc(sizeof(int*)*GRPSIZ); if(exrl==NULL) good=0; inrl = (int**) malloc(sizeof(int*)*GRPSIZ); if(inrl==NULL) good=0; rels = (int*) malloc(sizeof(int)*GRPSIZ); if(rels==NULL) good=0; rellist = (int**) malloc(sizeof(int*)*GRPSIZ); if(rellist==NULL) good=0; temp = (int**) malloc(sizeof(int*)*20); if(temp==NULL) good=0; tempstore = (int*) malloc(sizeof(int)*20); if(tempstore==NULL) good=0; lrel = (int*) malloc(sizeof(int)*5); if(lrel==NULL) good=0; if(good==0) { printf("Error allocating memory in st06\n"); return 0; } if(argc!=4) { printf("Usage: st06 <-c or -i> \n"); return 0; } f1 = (FILE*) fopen(argv[2],"r"); if(f1==NULL) { printf("Error opening file %s\n",argv[2]); return 0; } f2 = (FILE*) fopen(argv[3],"w"); if(f2==NULL) { printf("Error opening file %s\n",argv[3]); return 0; } if(argv[1][0]=='-' && argv[1][1]=='c') { c=1; } else if(argv[1][0]=='-' && argv[1][1]=='i') { c=0; } else { printf("Invalid switch given to st06, use -c or -i\n"); return 0; } while(1) { i = ReadGroup(gp,f1); if(i==-1) break; leave=0; // Get Internal and External Presentations ExtractBlimp(gp,2,extp); ExtractBlimp(gp,6,intp); // Make a list of the triangles in the external pres exrels=0; pt = &extp[4]; for(i=0;i0) { lrel[0]=exrl[exrels-1][0]; lrel[1]=exrl[exrels-1][1]; lrel[2]=exrl[exrels-1][2]; } else { lrel[0]=extp[2]; lrel[1]=extp[2]; lrel[2]=extp[2]; } } // Do all Permutations, if fail, leave=1 and exit quickly for(i=1;i<=ingens;i++) { from[i]=0; to[i]=0; } if(perm(from, to)==1) leave=1; // Write out group if no earlier permutation found if(leave==1) continue; WriteGroup(gp,f2); } WriteEOF(f2); fclose(f1); fclose(f2); } int perm(int* from2, int* to2) // Return 1 reject gp, return 0 reject perm { int invol; int num,prenum; int i,j,k; int from[MAXGENS], to[MAXGENS]; int *pt; for(i=1;i<=ingens;i++) { from[i] = from2[i]; to[i] = to2[i]; } // Make list of images of relators num=0; pt = rels; for(i=0;i0) k=i; } // Write out the smallest rellist[j][0]=temp[k][0]; rellist[j][1]=temp[k][1]; rellist[j][2]=temp[k][2]; } // Sort List qsort(rellist,num,sizeof(int*),comparerels); // Remove any higher than largest for(i=0;i0) return 0; } if(i z1[2]) return 1; if(z0[1] < z1[1]) return -1; if(z0[1] > z1[1]) return 1; if(z0[0] < z1[0]) return -1; if(z0[0] > z1[0]) return 1; if(zero[0] < one[0]) return -1; if(zero[0] > one[0]) return 1; if(zero[1] < one[1]) return -1; if(zero[1] > one[1]) return 1; if(zero[2] < one[2]) return -1; if(zero[2] > one[2]) return 1; return 0; }