-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoptions.cpp
More file actions
379 lines (354 loc) · 17.5 KB
/
Copy pathoptions.cpp
File metadata and controls
379 lines (354 loc) · 17.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include "options.h"
options opt = options();
options::options() {
scanOpt = NULL;
solveOpt = NULL;
nhbOpt = NULL;
uaOpt = NULL;
similarOpt = NULL;
patternOpt = NULL;
templateOpt = NULL;
catalogOpt = NULL;
verbose = false;
//SET PREFERENCES
//opt->noPOSIX(); //do not check for POSIX style character options
//anyopt.setVerbose(); // print warnings about unknown options
//anyopt.autoUsagePrint(true); // print usage for bad options
//SET THE USAGE/HELP and THE OPTION STRINGS/CHARACTERS
anyopt.addUsage("");
anyopt.addUsage("Usage:");
anyopt.addUsage("" );
anyopt.addUsage(" -h --help Print this help");
anyopt.setCommandFlag("help", 'h');
anyopt.addUsage(" -v --version Print version");
anyopt.setCommandFlag("version", 'v');
anyopt.addUsage(" --verbose Add plenty of info during execution");
anyopt.setFlag("verbose");
anyopt.addUsage(" --scan Scan grid(s) for minimal puzzles");
anyopt.setCommandFlag("scan");
anyopt.addUsage(" --gridlist <file> Batch scan the grids in <file>");
anyopt.setOption("gridlist");
anyopt.addUsage(" --subgridlist <file> Scan each subgrid in <file>");
anyopt.setOption("subgridlist");
anyopt.addUsage(" --isubgridlist <file> Scan each subgrid completion in <file>");
anyopt.setOption("isubgridlist");
anyopt.addUsage(" --gridfile <file> Scan single grid from <file>.txt");
anyopt.setOption("gridfile");
anyopt.addUsage(" --batch Batch scan the grids from stdin");
anyopt.setFlag("batch");
anyopt.addUsage(" --numclues <n> Search for puzzles with up to n clues (17)");
anyopt.setOption("numclues");
anyopt.addUsage(" --stopatfirst Stop after the first puzzle is found");
anyopt.setFlag("stopatfirst");
anyopt.addUsage(" --minimals Skip non-minimal puzzles");
anyopt.setFlag("minimals");
anyopt.addUsage(" --shorter Don't expand puzzles with < n givens to non-minimals (not impl.)");
anyopt.setFlag("shorter");
anyopt.addUsage(" --cluemask <mask> 81-char mask forcing 0=non-given, 1=given");
anyopt.setOption("cluemask");
anyopt.addUsage(" --fixband Fix one band at a time (experimental)");
anyopt.setFlag("fixband");
anyopt.addUsage(" --fix1digit Fix one digit at a time (experimental)");
anyopt.setFlag("fix1digit");
anyopt.addUsage(" --fix2digits Fix 2 digits at a time");
anyopt.setFlag("fix2digits");
anyopt.addUsage(" --fix3digits Fix 3 digits at a time (experimental)");
anyopt.setFlag("fix3digits");
anyopt.addUsage(" --fix4digits Fix 4 + 5 digits (experimental)");
anyopt.setFlag("fix4digits");
anyopt.addUsage(" --fix1box Fix one box at a time (experimental)");
anyopt.setFlag("fix1box");
anyopt.addUsage(" --fix2boxes Fix 2 boxes at a time (experimental)");
anyopt.setFlag("fix2boxes");
anyopt.addUsage(" --fixauto Auto fix or perform an exhaustive scan (not impl.)");
anyopt.setFlag("fixauto");
anyopt.addUsage(" --exhaustive Perform an exhaustive scan, default");
anyopt.setFlag("exhaustive");
anyopt.addUsage(" --storepseudos Store pseudopuzzles with fixed clues");
anyopt.setFlag("storepseudos");
anyopt.addUsage(" --fast17 Batch speculative scan for 17s (99%)");
anyopt.setFlag("fast17");
anyopt.addUsage(" --veryfast17 Batch speculative scan for 17s (87%)");
anyopt.setFlag("veryfast17");
//anyopt.addUsage(" --knownpuzzles <file> Allow comparison to already known puzzles");
//anyopt.setOption("knownpuzzles");
//anyopt.addUsage(" --skipknowns Known puzzles are excluded from the output");
//anyopt.setFlag("skipknowns");
//anyopt.addUsage(" --appendunknowns Appended newly found to the file with knowns");
//anyopt.setFlag("appendunknowns");
anyopt.addUsage(" --mcnuasizelimit <n> Use UA of size up to <n> for MCN (13)");
anyopt.setOption("mcnuasizelimit");
anyopt.addUsage(" --mcnnoautoua Prevent auto UA generation calculating MCN");
anyopt.setFlag("mcnnoautoua");
anyopt.addUsage(" --progressseconds <n> Prints progress at every <n> seconds (30)");
anyopt.setOption("progressseconds");
anyopt.addUsage(" --bandcompletions Prints 416 band minimal clue completions");
anyopt.setFlag("bandcompletions");
anyopt.addUsage(" --scanfixedbandstack Scans grid given by puzzle for alternative givens of the same size with one band+stack fixed");
anyopt.setFlag("scanfixedbandstack");
anyopt.addUsage(" --scanunav Scans for puzzles large UA sets given by completion");
anyopt.setFlag("scanunav");
anyopt.addUsage(" --fastscan Scans stdin for puzzles using McGuire's method");
anyopt.setFlag("fastscan");
anyopt.addUsage(" --solve Solve puzzles");
anyopt.setCommandFlag("solve");
//anyopt.addUsage(" --puzzles <file> Puzzle list");
//anyopt.setOption("puzzles");
anyopt.addUsage(" --groupbygrid Normalized puzzles grouped by solution");
anyopt.setCommandFlag("groupbygrid");
anyopt.addUsage(" --gridsonly Prints ordered solution grids w/o duplicates");
anyopt.setFlag("gridsonly");
anyopt.addUsage(" --minimals Check puzzles for minimality");
//anyopt.setFlag("minimals");
anyopt.addUsage(" --count Print only the solution count");
anyopt.setFlag("count");
anyopt.addUsage(" --maxsolutioncount <n> Solves up to <n>-th solution (INT_MAX)");
anyopt.setOption("maxsolutioncount");
anyopt.addUsage(" --rate Print the rating");
anyopt.setFlag("rate");
anyopt.addUsage(" --backdoor Print backdoors & level");
anyopt.setFlag("backdoor");
anyopt.addUsage(" --nhb Process neighbour grids");
anyopt.setCommandFlag("nhb");
anyopt.addUsage(" --gridfile <file> Base grid <file>.txt");
//anyopt.setOption("gridfile");
anyopt.addUsage(" --knownpuzzles <file> Allow comparison to already known puzzles (not impl.)");
anyopt.setOption("knownpuzzles");
anyopt.addUsage(" --clusterize Clusterize at num UA distance");
anyopt.setFlag("clusterize");
anyopt.addUsage(" --unav Process unavoidable sets");
anyopt.setCommandFlag("unav");
anyopt.addUsage(" --gridfile <file> Base grid <file>.txt");
//anyopt.setOption("gridfile");
anyopt.addUsage(" --unav4 Find 4-digit unavoidables");
anyopt.setFlag("unav4");
anyopt.addUsage(" --unav5 Find 5-digit unavoidables");
anyopt.setFlag("unav5");
anyopt.addUsage(" --unav12 Find up to 12-digit McGuire's unavoidables");
anyopt.setFlag("unav12");
//anyopt.addUsage(" --unavmorph Find unavoidables which premute to same grid");
//anyopt.setFlag("unavmorph");
anyopt.addUsage(" --unavrandom Find from random pseudo puzzles");
anyopt.setFlag("unavrandom");
anyopt.addUsage(" --attempts <n> Attempt <n> pseudo puzzles (10000)");
anyopt.setOption("attempts");
anyopt.addUsage(" --unknowns <n> Use pseudo puzzles with <n> unknowns (54)");
anyopt.setOption("unknowns");
anyopt.addUsage(" --maxuasize <n> Ignore UA larger than <n> (81)");
anyopt.setOption("maxuasize");
anyopt.addUsage(" --minuasize <n> Ignore UA smaller than <n> (0)");
anyopt.setOption("minuasize");
anyopt.addUsage(" --minvalency <n> Ignore UA with valency smaller than <n> (0)");
anyopt.setOption("minvalency");
anyopt.addUsage(" --subcanon Print canonicalized UA patterns");
anyopt.setFlag("subcanon");
anyopt.addUsage(" --mspuzzles <file> Find UA solving pseudopuzzles in <file>");
anyopt.setOption("mspuzzles");
anyopt.addUsage(" --minus1 Find UA applying {-1} to valid puzzles");
anyopt.setFlag("minus1");
anyopt.addUsage(" --findvalency Find also the maximal valency");
anyopt.setFlag("findvalency");
anyopt.addUsage(" --count Count UA4 or selected type for each grid from stdin");
//anyopt.setFlag("count");
anyopt.addUsage(" --unav4 Count up to 4-digits UA");
anyopt.addUsage(" --unav5 Count up to 5-digits UA");
anyopt.addUsage(" --unav12 Count up to 12-cells UA");
anyopt.addUsage(" --unav6c Count separately the 4 types of 6-cell UA");
anyopt.setFlag("unav6c");
anyopt.addUsage(" --similar Find similar puzzles");
anyopt.setCommandFlag("similar");
anyopt.addUsage(" --relabel <depth> Relabel up to <depth> givens in stdin puzzles");
anyopt.setOption("relabel");
anyopt.addUsage(" --minimals Minimal multi-sol. puzzles, otherwise unique");
//anyopt.setFlag("minimals");
anyopt.addUsage(" --unique Single-solution puzzles only");
anyopt.setFlag("unique");
anyopt.addUsage(" --nosingles Ignore puzzles solved by singles");
anyopt.setFlag("nosingles");
anyopt.addUsage(" --minus1plus <file> Apply {-1+n} to puzzles in <file>.newms.txt");
anyopt.setOption("minus1plus");
anyopt.addUsage(" --puzzles <file> Puzzle list");
//anyopt.setOption("puzzles");
anyopt.addUsage(" --knownpuzzles <file> Exclude the known puzzles");
//anyopt.setOption("knownpuzzles");
anyopt.addUsage(" --minimals Check puzzles for minimality");
//anyopt.setFlag("minimals");
anyopt.addUsage(" --minus1 Apply {-1} to puzzles");
//anyopt.setFlag("minus1");
anyopt.addUsage(" --mspuzzles <file> Append pseudopuzzles to <file>");
//anyopt.setOption("mspuzzles");
anyopt.addUsage(" --minusandup <xy> Apply {-x} then {+1..y} to puzzleset from stdin and ouput unique minimals");
anyopt.setOption("minusandup");
anyopt.addUsage(" --9minus8 Try to reduce any 9-clue digit to 1-clue");
anyopt.setFlag("9minus8");
anyopt.addUsage(" --9minus7 Try to reduce any 9-clue digit to 2-clues");
anyopt.setFlag("9minus7");
anyopt.addUsage(" --9minus6 Try to reduce any 9-clue digit to 3-clues");
anyopt.setFlag("9minus6");
anyopt.addUsage(" --9minus5 Try to reduce any 9-clue digit to 4-clues");
anyopt.setFlag("9minus5");
anyopt.addUsage(" --twins Check puzzleset from stdin for unknown twins");
anyopt.setFlag("twins");
anyopt.addUsage(" --subcanon Canonicalize input puzzles");
//anyopt.setFlag("subcanon");
anyopt.addUsage(" --minimals Skip non-minimal twins");
anyopt.addUsage(" --cousins Generate puzzles with same pattern from similar grids");
anyopt.setFlag("cousins");
anyopt.addUsage(" --subcanon Canonicalize puzzles to mspuzzles");
//anyopt.setFlag("subcanon");
anyopt.addUsage(" --puzzles <file> Read <file>");
anyopt.setOption("puzzles");
anyopt.addUsage(" --mspuzzles <file> Output to ordered and duplicates free <file>");
//anyopt.setOption("mspuzzles");
anyopt.addUsage(" --removeredundant Removes redundant clues");
anyopt.setFlag("removeredundant");
anyopt.addUsage(" --invert <grid|.|a|d> Inverts clues of puzzle using given/any/all/different completions");
anyopt.setOption("invert");
anyopt.addUsage(" --plus1 Apply {+1} to puzzles");
anyopt.setFlag("plus1");
anyopt.addUsage(" --subcanon Canonicalize the puzzles");
anyopt.addUsage(" --minimals Minimal puzzles only, incl. multi-solution");
anyopt.addUsage(" --unique Single-solution puzzles only");
//anyopt.setFlag("unique");
anyopt.addUsage(" --plus2 Apply {+2} to puzzles and print uniques");
anyopt.setFlag("plus2");
anyopt.addUsage(" --bandminlex Prints 6 band minlex transformations for valid puzzles");
anyopt.setFlag("bandminlex");
anyopt.addUsage(" --clusterize Clusterize the puzzles");
//anyopt.setFlag("clusterize");
anyopt.addUsage(" --pattern Process pattern");
anyopt.setCommandFlag("pattern");
anyopt.addUsage(" --redundancy Prints redundancy level for patterns from stdin");
anyopt.setFlag("redundancy");
anyopt.addUsage(" --statistics Prints statistics for patterns from stdin (not impl.)");
anyopt.setFlag("statistics");
anyopt.addUsage(" --enumerate <pattern> Prints puzzles for given pattern");
anyopt.setOption("enumerate");
anyopt.addUsage(" --subcanon Print canonicalized ED puzzles");
//anyopt.setFlag("subcanon");
anyopt.addUsage(" --fixclues <puzzle> Prints only puzzles containing this subpuzzle");
anyopt.setOption("fixclues");
anyopt.addUsage(" --scanfor <pattern> Prints minimal puzzles with given pattern in grids from stdin");
anyopt.setOption("scanfor");
anyopt.addUsage(" --patcanon Prints canonicalized unique patterns from stdin");
anyopt.setFlag("patcanon");
anyopt.addUsage(" --settle <pattern> Converts non-minimal puzzles from stdin to minimals in pattern");
anyopt.setOption("settle");
// anyopt.addUsage(" --pg depth,er,ER,ep,EP,ed,ED,maxPasses,noSingles Re-labels stdin to stdout, related to Patterns Game");
// anyopt.addUsage(" --pg s<pattern> < grids.txt > puzzles.txt Scans grids for puzzles having the given pattern");
// anyopt.setOption("pg");
anyopt.addUsage(" --template Template/rookery related commands");
anyopt.setCommandFlag("template");
anyopt.addUsage(" --get2templates Prints identity for all 181 2-tepmplate classes (not impl.)");
anyopt.setFlag("get2templates");
anyopt.addUsage(" --get2rookeries Prints identity for all 170 2-rookery classes (not impl.)");
anyopt.setFlag("get2rookeries");
anyopt.addUsage(" --get999911110 Prints all ED puzzles having 999911110 symbols distribution");
anyopt.setFlag("get999911110");
anyopt.addUsage(" --r4tot4 Prints all 4-templates for a given list of 4-rookeries");
anyopt.setFlag("r4tot4");
anyopt.addUsage(" --r4tot5 Prints all 5-templates for a given list of 4-rookeries");
anyopt.setFlag("r4tot5");
anyopt.addUsage(" --countmax333 Counts maximal number of clues paritioning the input grid to 3+3+3 templates");
anyopt.setFlag("countmax333");
anyopt.addUsage(" --catalog Builds or extracts from a grids catalog");
anyopt.setCommandFlag("catalog");
anyopt.addUsage(" --extract Extract all or range of grids");
anyopt.setFlag("extract");
anyopt.addUsage(" --range Zero-based range of positions <min>-<max>");
anyopt.setOption("range");
anyopt.addUsage(" --binary Use binary representation");
anyopt.setFlag("binary");
anyopt.addUsage("");
//by default all options will be checked on the command line and from option/resource file
//anyopt.setFlag("help", 'h'); //a flag (takes no argument), supporting long and short form
//anyopt.setOption("size", 's'); //an option (takes an argument), supporting long and short form
//anyopt.setOption("name"); //an option (takes an argument), supporting only long form
//anyopt.setFlag('c'); //a flag (takes no argument), supporting only short form
//for options that will be checked only on the command and line not in option/resource file
//anyopt.setCommandFlag("zip" , 'z'); //a flag (takes no argument), supporting long and short form
//for options that will be checked only from the option/resource file
//anyopt.setFileOption("title"); //an option (takes an argument), supporting only long form
verbose = false;
time(&startTime);
}
extern const char *versionString;
bool options::read(int argc, char* argv[]) {
//PROCESS THE COMMAND LINE AND RESOURCE FILE */
//read options from a option/resource file with ':' separated opttions or flags, one per line
//anyopt.processFile( "/home/user/.options" );
//go through the command line and get the options/
anyopt.processCommandArgs(argc, argv);
if((!anyopt.hasOptions()) || anyopt.getFlag("help")) { //print usage if no options
anyopt.printUsage();
return true;
}
verbose = anyopt.getFlag("verbose");
if(anyopt.getFlag("version")) { //print version and exit
cout << endl << versionString << endl;
return true;
}
return false;
}
void options::printUsage() {
anyopt.printUsage();
}
const char* options::getValue(const char* key) {
return anyopt.getValue(key);
}
bool options::getFlag(const char* key) {
return anyopt.getFlag(key);
}
const char* options::getStartTime() const {
return ctime(&startTime);
}
int options::execCommand() {
//always read unav options
uaOptions uao;
uaOpt = &uao;
uao.readOptions();
if(anyopt.getFlag("scan")) {
scanOptions so;
scanOpt = &so;
return so.go();
}
if(anyopt.getFlag("solve")) {
solveOptions so;
solveOpt = &so;
return so.go();
}
if(anyopt.getFlag("nhb")) {
nhbOptions so;
nhbOpt = &so;
return so.go();
}
if(anyopt.getFlag("unav")) {
//uaOptions so;
//uaOpt = &so;
return uaOpt->go();
}
if(anyopt.getFlag("similar")) {
similarOptions so;
similarOpt = &so;
return so.go();
}
if(anyopt.getFlag("pattern")) {
patternOptions so;
patternOpt = &so;
return so.go();
}
if(anyopt.getFlag("template")) {
templateOptions so;
templateOpt = &so;
return so.go();
}
if(anyopt.getFlag("catalog")) {
catalogOptions so;
catalogOpt = &so;
return so.go();
}
cout << "Error: No command specified." << endl;
return -1;
}