// Copyright 2008, 2009 Brady J. Garvin // This file is part of Covering Arrays by Simulated Annealing (CASA). // CASA is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // CASA is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with CASA. If not, see . #include #include #include #include "io/Usage.H" using namespace std; const char*PROGRAM_NAME = "Covering Arrays by Simulated Annealing (CASA)"; const char*PROGRAM_VERSION = "1.1b"; const char*BUG_ADDRESS = "bgarvin@cse.unl.edu"; static const char*PROGRAM_DOC = "Builds mixed-level covering arrays under constraints\n" "\n" "Copyright 2008, 2009 Brady J. Garvin\n" "\n" "CASA is free software: you can redistribute it and/or modify it\n" "under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "CASA is distributed in the hope that it will be useful, but\n" "WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with CASA. If not, see .\n"; static const char*USAGE_DOC = "[OPTIONS] [MODEL_FILE]"; static const char*ARG_DOC = " -o, --output [FILE] write to the given file, regardless of seed\n" " -c, --constrain [FILE] incorporate the given constraint file\n" "\n" " -s, --seed [SEED] set the seed value for the random number generator\n" "\n" " -i, --iterations [COUNT] set the initial number of iterations allowed at each array size\n" " -r, --retries [COUNT] set the number of retries allowed at the same array size\n" " -p, --partition [RATIO] set the weight of the upper bound in the binary search parition\n" "\n" " -t, --temperature [TEMP] set the initial temperature\n" " -d, --multiplier [RATIO] set the temperature multiplier applied each iteration\n" "\n" " -l, --lower-bound [SIZE] let the covering array be no smaller than the given size\n" " -u, --upper-bound [SIZE] let the covering array be no larger than the given size\n" " -n, --known-size [SIZE] lock the covering array at the given size\n" "\n" " -v, --version show the current version and exit\n" " -h, --help show this help and exit\n"; static const char*shortOptions = "o:c:s:i:r:p:t:d:l:u:n:vh"; static struct option longOptions[] = { {"output", required_argument, NULL, 'o'}, {"constrain", required_argument, NULL, 'c'}, {"seed", required_argument, NULL, 's'}, {"iterations", required_argument, NULL, 'i'}, {"retries", required_argument, NULL, 'r'}, {"partition", required_argument, NULL, 'p'}, {"temperature", required_argument, NULL, 't'}, {"decrement", required_argument, NULL, 'd'}, {"lower-bound", required_argument, NULL, 'l'}, {"upper-bound", required_argument, NULL, 'u'}, {"known-size", required_argument, NULL, 'n'}, {"version", no_argument, NULL, 'v'}, {"help", no_argument, NULL, 'h'}, {0, 0, 0, 0 }}; bool verbose = true; const char* modelFile = NULL; const char* constraintFile = NULL; const char* outputFile = NULL; bool seeded = false; int seed; double startingTemperature = 0.5L; double decrement = 0.99999L; unsigned iterations = 256; unsigned retries = 2; unsigned lowerBound = 0; unsigned upperBound = 0; double searchPartition = 2.L/3.L; static void version() { cerr << PROGRAM_NAME << ' ' << PROGRAM_VERSION << '\n'; exit(0); } static const char*name; static void usage(int error) { cerr << PROGRAM_NAME << ' ' << PROGRAM_VERSION << " - " << PROGRAM_DOC << "\n\nUsage: " << name << ' ' << USAGE_DOC << "\n\n" << ARG_DOC << "\n\n" << "Send bug reports to <" << BUG_ADDRESS << ">.\n"; exit(error); } void parseOptions(int argc, char*const*argv) { name = *argv; bool seen[256]; (void)seen; // Workaround for a bug in some versions of GCC for (unsigned i = 256; i-- > 0;) { seen[i] = false; } for (;;) { int index = 0; int found = getopt_long(argc, argv, shortOptions, longOptions, &index); switch (found) { case 'o': // output outputFile = optarg; break; case 'c': // constrain constraintFile = optarg; break; case 's': // seed seeded = true; seed = atoi(optarg); break; case 'i': // iterations iterations = atoi(optarg); break; case 'r': // retries retries = atoi(optarg); break; case 'p': // partition searchPartition = atof(optarg); break; case 't': // temperature startingTemperature = atof(optarg); break; case 'd': // decrement decrement = atof(optarg); break; case 'l': // lower-bound lowerBound = atoi(optarg); break; case 'u': // upper-bound upperBound = atoi(optarg); break; case 'n': // known-size lowerBound = upperBound = atoi(optarg); break; case 'v': // version version(); break; case 'h': // help usage(0); break; default: // done with options if (argc - optind < 1) { usage(1); } if (argc - optind > 1) { cerr << "Warning: ignoring extraneous arguments after model file ``" << argv[optind] << "''." << endl; } modelFile = argv[optind]; return; } seen[(unsigned)found] = true; } }