00001 #include <stdlib.h>
00002 #include <iostream>
00003 #include <string>
00004 #include <ShockGraph.h>
00005 #include "matchingsystem.hpp"
00006 #include <Debug.h>
00007
00008 using namespace std;
00009
00010 const string error_msgs[] = {
00011 "Not enough arguments",
00012 "Error creating the database",
00013 "Error occured during reading of the database",
00014 "Parameters are incorrect. Use -h for help",
00015 "Could not open the command file",
00016 "Error occured during writing of the database",
00017 "Error reading the command file",
00018 "Expect <DTCF_root>",
00019 "Expect <types>",
00020 "Expect </DTCF_root>",
00021 "Expect <type>",
00022 "Expect </type>",
00023 "Expect <name>",
00024 "Expect </name>",
00025 "Expect <regions>",
00026 "Expect <region>",
00027 "Expect </region>",
00028 "Expect <prototype>",
00029 "Expect </prototype>",
00030 "Expect <id>",
00031 "Expect </id>",
00032 "Expect <dag>",
00033 "Expect </dag>",
00034 "Expect <views>",
00035 "Expect </DTCF root>",
00036 "Cannot find type with the given name",
00037 "Cannot open output file",
00038 "Cannot write to output file",
00039 "Cannot find a view with an id",
00040 "Cannot find a dag with an id",
00041 "Cannot find a prototype with a given name",
00042 "Cannot find a prototype with a given id",
00043 "Cannot find a type with a given id",
00044 "The dimension of the database should be between one and fourty",
00045 "Cannot open shockgraph file",
00046 "Expect <view>",
00047 "Expect </view>"
00048 };
00049
00050 istream& read_command(istream& is, string& s)
00051 {
00052 char p;
00053 char c[256];
00054 int i;
00055
00056 do {
00057 is.read(&p, sizeof(p));
00058 } while(p != '<' && p != '>');
00059
00060 i=-1;
00061 do {
00062 i++;
00063 is.read(&c[i], sizeof(char));
00064 }
00065 while((i < 255) && (c[i] != '<') && (c[i] != '>'));
00066
00067 c[i] = '\0';
00068 s = string(c);
00069 return is;
00070 }
00071
00072 ostream& PrintHelp(ostream& os)
00073 {
00074 os << "Usage: test {-c|-r|-h} [dimensions] [commandfile] [outputfile] [datafile] [file] ..." << endl << endl;
00075 os << "-c creates new database" << endl;
00076 os << "-r reads database from config file" << endl;
00077 os << "-h print out this help" << endl;
00078
00079 return os;
00080 }
00081
00082 void error_exit(int i)
00083 {
00084 cerr << "Error " << i << ": " << error_msgs[i] << endl;
00085 exit(3);
00086 }
00087
00088 int main(int argc, char *argv[])
00089 {
00090 int i;
00091 bool q;
00092 list< pair<string, ID> > view_map;
00093 map<ID, string> prototype_map;
00094 int dim;
00095 string idstr;
00096 string outfile;
00097 string cfile;
00098 string param;
00099 string names[7];
00100 ID prid;
00101
00102 names[0] = "database.cnf";
00103 names[1] = "dags.dat";
00104 names[2] = "index.dat";
00105 names[3] = "prototypes.dat";
00106 names[4] = "regions.dat";
00107 names[5] = "types.dat";
00108 names[6] = "views.dat";
00109
00110
00111 DAGMatchingDatabase<ShockGraph> dmd;
00112 DAGMatcher<ShockGraph> matcher(dmd);
00113
00114
00115
00116 if(argc < 2)
00117 {
00118 cerr << error_msgs[0] << endl;
00119 PrintHelp(cout);
00120 exit(3);
00121 }
00122
00123 param = string(argv[1]);
00124
00125 if(param == "-c" || param== "-r")
00126 {
00127
00128
00129 if(argc < 5)
00130 {
00131 cerr << error_msgs[0] << endl;
00132 PrintHelp(cout);
00133 exit(3);
00134 }
00135
00136 dim = atoi(argv[2]);
00137 cout << "Dim is " << dim << endl;
00138 if(dim < 1 || dim > 40) error_exit(33);
00139
00140
00141 cfile = string(argv[3]);
00142
00143
00144 outfile = string(argv[4]);
00145
00146 for(i=5; i < argc && i < 12; i++)
00147 {
00148 names[i-5] = string(argv[i]);
00149 }
00150
00151 if(param == "-c")
00152 {
00153 q = dmd.DAGs.Create(names[1]);
00154
00155 q = q && dmd.prototypes.Create(names[3]);
00156
00157 q = q && dmd.regions.Create(names[4]);
00158
00159 q = q && dmd.types.Create(names[5]);
00160
00161 q = q && dmd.views.Create(names[6]);
00162
00163 q = q && dmd.index.Create(names[2], dim);
00164
00165
00166 if(q)
00167 {
00168 cout << "Databases was created successfuly" << endl;
00169 }
00170 else
00171 {
00172 error_exit(1);
00173 }
00174 }
00175 else
00176 {
00177 if(dmd.Read(names[0]) == false)
00178 {
00179 error_exit(2);
00180 }
00181 else
00182 {
00183 cout << "Reading was performed successfuly" << endl;
00184 }
00185 }
00186 }
00187 else if(param == "-h")
00188 {
00189 PrintHelp(cout);
00190 exit(3);
00191 }
00192 else
00193 {
00194 cerr << error_msgs[3] << endl;
00195 PrintHelp(cout);
00196
00197 exit(3);
00198 }
00199
00200
00201
00202
00203 fstream f;
00204 string instrn;
00205 ID regid;
00206 ID tid;
00207 ID dagid = 0;
00208 ShockGraph dag;
00209
00210 f.open(cfile.c_str(), ios::in | ios::nocreate);
00211 if(!f) error_exit(4);
00212
00213 if(!read_command(f, instrn)) error_exit(6);
00214 if(instrn != "DTCF_root") error_exit(7);
00215
00216 if(!read_command(f, instrn)) error_exit(6);
00217 if(instrn != "types") error_exit(8);
00218
00219 if(!read_command(f, instrn)) error_exit(6);
00220 do
00221 {
00222 if(instrn != "type") error_exit(10);
00223
00224 if(!read_command(f, instrn)) error_exit(6);
00225 if(instrn != "name") error_exit(12);
00226
00227 if(!read_command(f, instrn)) error_exit(6);
00228 dmd.types.Add(DAGType(instrn));
00229
00230 if(!read_command(f, instrn)) error_exit(6);
00231 if(instrn != "/name") error_exit(13);
00232
00233 if(!read_command(f, instrn)) error_exit(6);
00234 if(instrn != "/type") error_exit(11);
00235
00236 if(!read_command(f, instrn)) error_exit(6);
00237 }
00238 while(instrn != "/types");
00239
00240 if(!read_command(f, instrn)) error_exit(6);
00241 if(instrn != "regions") error_exit(14);
00242
00243 if(!read_command(f, instrn)) error_exit(6);
00244 do
00245 {
00246 if(instrn != "region") error_exit(15);
00247
00248 regid = dmd.regions.Add(DAGRegion());
00249
00250 if(!read_command(f, instrn)) error_exit(6);
00251 if(instrn != "prototype") error_exit(17);
00252
00253 if(!read_command(f, instrn)) error_exit(6);
00254 if(instrn != "id") error_exit(19);
00255
00256 if(!read_command(f, idstr)) error_exit(6);
00257
00258 if(!read_command(f, instrn)) error_exit(6);
00259 if(instrn != "/id") error_exit(20);
00260
00261 if(!read_command(f, instrn)) error_exit(6);
00262 if(instrn != "type") error_exit(10);
00263
00264 if(!read_command(f, instrn)) error_exit(6);
00265 tid = dmd.types.Find(instrn);
00266 if(tid == NULLID) error_exit(25);
00267
00268 if(!read_command(f, instrn)) error_exit(6);
00269 if(instrn != "/type") error_exit(11);
00270
00271 if(!read_command(f, instrn)) error_exit(6);
00272 if(instrn != "dag") error_exit(21);
00273
00274 if(!read_command(f, instrn)) error_exit(6);
00275 if(!dag.ReadFromXMLFile(instrn.c_str())) error_exit(34);
00276 dagid = dmd.DAGs.Add(dag);
00277 if(!read_command(f, instrn)) error_exit(6);
00278 if(instrn != "/dag") error_exit(22);
00279
00280 prid = dmd.prototypes.Add(DAGPrototype(DAGView(tid, regid, dagid)));
00281 dmd.index.Add(prid, dag);
00282 prototype_map.insert(pair<ID, string>(prid, idstr));
00283
00284 if(!read_command(f, instrn)) error_exit(6);
00285 if(instrn != "/prototype") error_exit(18);
00286
00287 if(!read_command(f, instrn)) error_exit(6);
00288 if(instrn != "views") error_exit(23);
00289
00290 if(!read_command(f, instrn)) error_exit(6);
00291 do
00292 {
00293 if(instrn != "view") error_exit(35);
00294
00295 if(!read_command(f, instrn)) error_exit(6);
00296 if(instrn != "id") error_exit(19);
00297
00298 if(!read_command(f,idstr)) error_exit(6);
00299
00300 if(!read_command(f, instrn)) error_exit(6);
00301 if(instrn != "/id") error_exit(20);
00302
00303 if(!read_command(f, instrn)) error_exit(6);
00304 if(instrn != "type") error_exit(10);
00305
00306 if(!read_command(f, instrn)) error_exit(6);
00307 tid = dmd.types.Find(instrn);
00308 if(tid == NULLID) error_exit(25);
00309
00310 if(!read_command(f, instrn)) error_exit(6);
00311 if(instrn != "/type") error_exit(11);
00312
00313 if(!read_command(f, instrn)) error_exit(6);
00314 if(instrn != "dag") error_exit(21);
00315
00316 if(!read_command(f, instrn)) error_exit(6);
00317 if(!dag.ReadFromXMLFile(instrn.c_str())) error_exit(34);
00318 dagid = dmd.DAGs.Add(dag);
00319
00320 if(!read_command(f, instrn)) error_exit(6);
00321 if(instrn != "/dag") error_exit(22);
00322
00323 view_map.push_back(pair<string, ID>(idstr, dmd.views.Add(DAGView(tid, regid, dagid))));
00324
00325 if(!read_command(f, instrn)) error_exit(6);
00326 if(instrn != "/view") error_exit(36);
00327
00328 if(!read_command(f, instrn)) error_exit(6);
00329 }
00330 while(instrn != "/views");
00331
00332 if(!read_command(f, instrn)) error_exit(6);
00333 if(instrn != "/region") error_exit(16);
00334
00335 if(!read_command(f, instrn)) error_exit(6);
00336 }
00337 while(instrn != "/regions");
00338
00339
00340 if(!read_command(f, instrn)) error_exit(6);
00341 if(instrn != "/DTCF_root") error_exit(9);
00342
00343 f.close();
00344
00345
00346
00347 typename list< pair<string, ID> >::iterator p;
00348 vector< MatchData<ShockGraph> > results;
00349 int k = 2;
00350 pair<DAGView, bool> temp_a;
00351 pair<ShockGraph, bool> temp_b;
00352 pair<DAGType, bool> temp_c;
00353 pair<DAGPrototype, bool> temp_d;
00354 typename map<ID, string>::iterator mi;
00355
00356 f.open(outfile.c_str(), ios::out);
00357 if(!f) error_exit(26);
00358
00359 if(!(f << "<results>" << endl)) error_exit(27);
00360
00361 for(p = view_map.begin(); p!=view_map.end(); p++)
00362 {
00363
00364 if(!(f << "<view>" << endl)) error_exit(27);
00365 if(!(f << "<name>")) error_exit(27);
00366 if(!(f << p->first)) error_exit(27);
00367 if(!(f << "</name>" << endl)) error_exit(27);
00368
00369 temp_a = dmd.views[p->second];
00370 if(!temp_a.second) error_exit(28);
00371
00372 temp_b = dmd.DAGs[temp_a.first.graph];
00373 if(!temp_b.second) error_exit(29);
00374
00375 matcher.GetSimilar(temp_b.first, results, k);
00376
00377 if(!(f << "<index matches>" << endl)) error_exit(27);
00378
00379 for(i = 0; i<results.size(); i++)
00380 {
00381 if(!(f << "<prototype>" << endl)) error_exit(27);
00382
00383 if(!(f << "<name>")) error_exit(27);
00384 mi = prototype_map.find(results[i].prototype);
00385 if(mi == prototype_map.end()) error_exit(30);
00386 if(!(f << mi->second)) error_exit(27);
00387 if(!(f << "</name>" << endl)) error_exit(27);
00388
00389 temp_d = dmd.prototypes[results[i].prototype];
00390 if(!temp_d.second) error_exit(31);
00391
00392 temp_c = dmd.types[temp_d.first.view.type];
00393 if(!temp_c.second) error_exit(32);
00394
00395 if(!(f << "<type>")) error_exit(27);
00396 if(!(f << temp_c.first.name)) error_exit(27);
00397 if(!(f << "</type>" << endl)) error_exit(27);
00398
00399 if(!(f << "<distance>")) error_exit(27);
00400 if(!(f << results[i].distance)) error_exit(27);
00401 if(!(f << "</distance>" << endl)) error_exit(27);
00402
00403 if(!(f << "</prototype>" << endl)) error_exit(27);
00404 }
00405
00406 if(!(f << "</index matches>" << endl)) error_exit(27);
00407
00408 matcher.SortByClosest(temp_b.first, results);
00409
00410 if(!(f << "<final matches>" << endl)) error_exit(27);
00411
00412 for(i = 0; i<results.size(); i++)
00413 {
00414 if(!(f << "<prototype>" << endl)) error_exit(27);
00415
00416 if(!(f << "<name>")) error_exit(27);
00417 mi = prototype_map.find(results[i].prototype);
00418 if(mi == prototype_map.end()) error_exit(30);
00419 if(!(f << mi->second)) error_exit(27);
00420 if(!(f << "</name>" << endl)) error_exit(27);
00421
00422 temp_d = dmd.prototypes[results[i].prototype];
00423 if(!temp_d.second) error_exit(31);
00424
00425 temp_c = dmd.types[temp_d.first.view.type];
00426 if(!temp_c.second) error_exit(32);
00427
00428 if(!(f << "<type>")) error_exit(27);
00429 if(!(f << temp_c.first.name)) error_exit(27);
00430 if(!(f << "</type>" << endl)) error_exit(27);
00431
00432 if(!(f << "<distance>")) error_exit(27);
00433 if(!(f << results[i].distance)) error_exit(27);
00434 if(!(f << "</distance>" << endl)) error_exit(27);
00435
00436 if(!(f << "</prototype>" << endl)) error_exit(27);
00437 }
00438
00439 if(!(f << "</final matches>" << endl)) error_exit(27);
00440 }
00441
00442 if(!(f << "</results>" << endl)) error_exit(27);
00443
00444
00445 if(dmd.Write(names[0]) == false)
00446 error_exit(5);
00447 else
00448 cout << "Operation proceeded succesfuly" << endl;
00449
00450 return 0;
00451 }