void processquerypattern(ModelType & model, ClassDecoder * classdecoder, const Pattern & pattern, const string & dorelations, bool doinstantiate) { if (!model.has(pattern)) { cout << "PATTERN \"" << pattern.tostring(*classdecoder) << "\" NOT FOUND IN MODEL" << endl; } else { model.print(&cout, *classdecoder, pattern, doinstantiate); if (!dorelations.empty()) model.outputrelations(pattern, *classdecoder, &cout, dorelations == "all" ? "" : dorelations); } }
void querymodel(ModelType & model, ClassEncoder * classencoder, ClassDecoder * classdecoder, string dorelations, bool doinstantiate, bool repeat = true) { const bool allowunknown = true; unsigned char buffer[65536]; uint32_t linenum = 0; std::string line; cerr << "Colibri Patternmodeller -- Interactive query mode." << endl; cerr << " Type ctrl-D to quit, type X to switch between exact mode and extensive mode (default: extensive mode)." << endl; bool exact = false; do { linenum++; cerr << linenum << ">> "; getline(cin,line); if ((line == "X") || (line == "X\n")) { exact = !exact; if (exact) { cerr << "Switched to Exact mode - Only exact matches will be shown now" << endl; } else { cerr << "Switched to Extensive mode - Input will be scanned for all matching patterns" << endl; } } else if (!line.empty()) { const int buffersize = classencoder->encodestring(line, buffer, allowunknown); Pattern linepattern = Pattern(buffer, buffersize); if (exact) { processquerypattern<ModelType>(model,classdecoder, linepattern, dorelations, doinstantiate); } else { vector<pair<Pattern, int> > patterns = model.getpatterns(linepattern); if (model.has(linepattern)) { const IndexReference ref = IndexReference(linenum,0); //process and output instance cout << ref.sentence << ':' << (int) ref.token << "\t"; processquerypattern<ModelType>(model, classdecoder, linepattern, dorelations, doinstantiate); } for (vector<pair<Pattern,int> >::iterator iter = patterns.begin(); iter != patterns.end(); iter++) { const Pattern pattern = iter->first; const IndexReference ref = IndexReference(linenum,iter->second); //process and output instance cout << ref.sentence << ':' << (int) ref.token << "\t"; processquerypattern<ModelType>(model, classdecoder, pattern, dorelations, doinstantiate); } } } } while (!cin.eof() && (repeat)); }