]> ruin.nu Git - germs.git/blobdiff - src/main.cpp
More help output
[germs.git] / src / main.cpp
index 5e6a5c99902915cd28e344b4d63eecec0ed8f375..abd520f43a29f7a3ec9b4cb7cb8f893895f16cbc 100644 (file)
 #include <vector>
 #include <queue>
 #include <iterator>
+#include <fstream>
+
 using namespace std;
 
+#include <unistd.h>
+
 #include "geneorder.h"
 #include "modelidentifier.h"
 #include "genesorter.h"
 #include "sortaction.h"
+#include "genealgorithms.h"
+#include "model.h"
 
-typedef pair<ModelIdentifier::Model,double> modelpair;
+int main(int argc, char** argv){
 
-int main(){
+       string ann = "default.ann";
+       Model model(0);
+       bool detectModel = true;
+       bool onlyIdentify = false;
+       bool printPerm = false;
+
+       //Parse command line arguments
+       int opt;
+       while ((opt = getopt(argc, argv, "im:n:hp")) != -1) {
+               switch (opt) {
+                       case 'm':
+                               model = Model::modelFactory(optarg);
+                               detectModel = false;
+                               break;
+                       case 'n':
+                               ann = optarg;
+                               break;
+                       case 'i':
+                               onlyIdentify = true;
+                               break;
+                       case 'p':
+                               printPerm = true;
+                               break;
+                       case 'h':
+                               cout << "Usage: " << argv[0] << " [OPTION] [FILE]" << endl
+                                       << endl << "  -m <model> Specifies which model to use for sorting: Whirl, X, Zipper, FatX or Cloud "
+                                       << endl << "  -n <ann>   Specifies which artificial neural network to use for identification. '" << ann << "' is used by default"
+                                       << endl << "  -i         Only identify the model, don't try to sort it"
+                                       << endl << "  -p         Print the resulting permutation at each sorting step"
+                                       << endl << "  -h         Prints this help message"
+                                       << endl << endl
+                                       << "With no FILE, or if FILE is '-', stdin will be used"
+                                       << endl;
+                               exit(EXIT_SUCCESS);
+                               break;
+                       default: /* '?' */
+                               cerr << "Usage:  " << argv[0] << " [-n <ann>] [-h] [FILE]" << endl;
+                               exit(EXIT_FAILURE);
+               }
+       }
 
-       //TODO: Parse
+       //Open file, or stdin
+       istream* in;
+       ifstream file;
+       if (optind == argc || *argv[optind] == '-'){
+               in = &cin;
+       }else{
+               file.open(argv[optind]);
+               if (file.fail()){
+                       cerr << "Could not open file: '" << argv[optind] << "'" << endl;
+                       exit(EXIT_FAILURE);
+               }
+               in = &file;
+       }
+
+       //Parse the gene order permutation
        vector<Gene> g;
-       copy(istream_iterator<int>(cin), istream_iterator<int>(),
-                    back_inserter(g));   
+       copy(istream_iterator<int>(*in), istream_iterator<int>(),
+            back_inserter(g));
        GeneOrder go(g.begin(),g.end());
 
-       //TODO: Identify
-       ModelIdentifier mi("default.ann");
-       map<ModelIdentifier::Model,double> scores = mi.identify(go);
-       for (map<ModelIdentifier::Model,double>::iterator m = scores.begin();
-                       m != scores.end(); ++m){
-               cout << "Model: " << m->first << " score: " << m->second << endl;
+       //Identify the model
+       ModelIdentifier mi(ann);
+       priority_queue<pair<double,Model> > pq = mi.identify(go);
+       if (detectModel){
+               model = pq.top().second;
+       }
+       while (pq.size() > 0){
+               cout << "Model: " << pq.top().second.name() << " score: " << pq.top().first << endl;
+               pq.pop();
        }
+       cout << "Using model: " << model.name() << endl;
 
-       //TODO: Chose a sorter
+       cout << "Distance: " << inversionDistance(go) << endl;
+       //copy(go.begin(), go.end(), ostream_iterator<int>(cout, " "));
+       //cout << endl;
+
+       if (onlyIdentify){
+               return EXIT_SUCCESS;
+       }
+       //Sort
        GeneSorter so;
-       //TODO: Sort
-       GeneSorter::ActionList al = so.sort(go);
-       //TODO: Print result
-       return 0;
+       GeneSorter::ActionList al = so.sort(go,model);
+
+       //Print the result
+       double score = 0;
+
+       GeneOrder temp(go);
+       for (GeneSorter::ActionList::iterator sa = al.begin(); sa != al.end(); ++sa){
+               cout << "Action: " << sa->toString() << " model score: " << model.score(*sa,temp) << endl;
+               (*sa)(temp);
+               score += model.score(*sa,temp);
+
+               if (printPerm){
+                       copy(temp.begin(), temp.end(), ostream_iterator<int>(cout, " "));
+                       cout << endl;
+               }
+       }
+       cout << "Avg score: " << score / al.size() << endl;
+
+       return EXIT_SUCCESS;
 }