1 /* gpmimult.c 31/10/95.
2  * 8/10/98 large-scale re-organisation.
3  * 16/3/96 - changed command-line syntax to
4  * gpmimult [options] groupname [cosname]
5  * where cosname defaults to "cos".
6  * This simply calculates minimizes and outputs all multiple-initial
7  * multipliers for a short-lex coset automatic group, using the
8  * general multiple-initial state multiplier automaton.
9  * It assumes that kbprog with -wd option, gpwacos, gpmigenmult
10  * (and preferably gpcheckmult)  have already been run of G.
11  *
12  * SYNOPSIS:
13  * gpmimult [-ip d/s] [-op d/s] [-silent] [-v] [-l/-h] [-pref prefix]
14  *						  groupname [cosname]
15  *
16  * Input is from groupname.cosname.migm
17  * Output is to groupname.cosname.mim'i' for each generator number i.
18  *
19  * OPTIONS:
20  * -ip d/s	input in dense or sparse format - sparse is default
21  * -op d/s	output in dense or sparse format - sparse is default
22  * -v		verbose
23  * -silent	no diagnostics
24  * -l/-h	large/huge hash-tables (for big examples)
25  * -pref prefix	Use the string 'prefix' as prefix for subgroup generators
26  *              Default is "_x". You MUST use the same prefix in all
27  *              runs of gpmigenmult2, gpmimakemult and gpmimakemult2.
28  */
29 
30 #include <stdio.h>
31 #include "defs.h"
32 #include "fsa.h"
33 #include "definitions.h"
34 
35 static FILE *rfile, *wfile;
36 
37 static void badusage(void);
38 
main(int argc,char * argv[])39 int main(int argc, char *argv[])
40 {
41   int arg, g, ngens;
42   fsa genmult, *mimult;
43   char gpname[100], cosgpname[100], inf[100], outf[100], fsaname[100],
44       prefix[16];
45   storage_type ip_store = SPARSE;
46   boolean op_format_set = FALSE;
47   storage_type op_format = SPARSE;
48   boolean seengpname, seencosname;
49 
50   setbuf(stdout, (char *)0);
51   setbuf(stderr, (char *)0);
52 
53   strcpy(prefix, "_x");
54   arg = 1;
55   seengpname = seencosname = FALSE;
56   while (argc > arg) {
57     if (strcmp(argv[arg], "-ip") == 0) {
58       arg++;
59       if (arg >= argc)
60         badusage();
61       if (strcmp(argv[arg], "d") == 0)
62         ip_store = DENSE;
63       else if (strcmp(argv[arg], "s") == 0)
64         ip_store = SPARSE;
65       else
66         badusage();
67     }
68     else if (strcmp(argv[arg], "-op") == 0) {
69       op_format_set = TRUE;
70       arg++;
71       if (arg >= argc)
72         badusage();
73       if (strcmp(argv[arg], "d") == 0)
74         op_format = DENSE;
75       else if (strcmp(argv[arg], "s") == 0)
76         op_format = SPARSE;
77       else
78         badusage();
79     }
80     else if (strcmp(argv[arg], "-silent") == 0)
81       kbm_print_level = 0;
82     else if (strcmp(argv[arg], "-v") == 0)
83       kbm_print_level = 2;
84     else if (strcmp(argv[arg], "-vv") == 0)
85       kbm_print_level = 3;
86     else if (strcmp(argv[arg], "-l") == 0)
87       kbm_large = TRUE;
88     else if (strcmp(argv[arg], "-h") == 0)
89       kbm_huge = TRUE;
90     else if (strcmp(argv[arg], "-pref") == 0) {
91       arg++;
92       if (arg >= argc)
93         badusage();
94       strcpy(prefix, argv[arg]);
95     }
96     else if (argv[arg][0] == '-')
97       badusage();
98     else if (!seengpname) {
99       seengpname = TRUE;
100       strcpy(gpname, argv[arg]);
101     }
102     else if (!seencosname) {
103       seencosname = TRUE;
104       sprintf(cosgpname, "%s.%s", gpname, argv[arg]);
105     }
106     else
107       badusage();
108     arg++;
109   }
110   if (!seengpname)
111     badusage();
112   if (!seencosname)
113     sprintf(cosgpname, "%s.cos", gpname);
114 
115   strcpy(inf, cosgpname);
116   strcat(inf, ".migm");
117 
118   if ((rfile = fopen(inf, "r")) == 0) {
119     fprintf(stderr, "Cannot open file %s.\n", inf);
120     exit(1);
121   }
122   fsa_read(rfile, &genmult, ip_store, 0, 0, TRUE, fsaname);
123 
124   tmalloc(mimult, fsa, 1);
125   ngens = genmult.states->labels->alphabet_size;
126 
127   for (g = 0; g <= ngens; g++) {
128     /* Form multiplier number g */
129     fsa_copy(mimult, &genmult);
130     if (fsa_mimakemult(mimult, g, prefix) == -1)
131       exit(1);
132     if (mimult_minimize(mimult) == -1)
133       exit(1);
134 
135     base_prefix(fsaname);
136     sprintf(fsaname + stringlen(fsaname), ".mim%d", g);
137     sprintf(outf, "%s.mim%d", cosgpname, g);
138 
139     if (op_format_set)
140       mimult->table->printing_format = op_format;
141     wfile = fopen(outf, "w");
142     fsa_print(wfile, mimult, fsaname);
143     fclose(wfile);
144 
145     if (kbm_print_level > 0)
146       printf("#Multiplier number %d with %d states computed.\n", g,
147              mimult->states->size);
148     fsa_clear(mimult);
149   }
150 
151   fsa_clear(&genmult);
152   tfree(mimult);
153   exit(0);
154 }
155 
badusage(void)156 void badusage(void)
157 {
158   fprintf(stderr,
159           "Usage: gpmimult [-ip d/s] [-op d/s] [-silent] [-v] [-l/-h]\n");
160   fprintf(stderr, "\t\t[-pref prefix]  groupname [cosname].\n");
161   exit(1);
162 }
163