map<string, vector<span>> program_eval::eval(program& prog) { map<string, vector<span>> answer; auto sorted_rules = sort_rules(prog.rules); for (auto rule : sorted_rules) { rule_eval evaluator(answer, document_); auto result = evaluator.eval(*rule); auto it = answer.find(rule->pred.name); if (it == answer.end()) { // Move answer.insert(make_pair(rule->pred.name, move(result))); } else { // Union auto& spans = it->second; vector<span> span_union; span_union.reserve(spans.size() + result.size()); set_union(spans.begin(), spans.end(), result.begin(), result.end(), back_inserter(span_union)); span_union.shrink_to_fit(); spans.swap(span_union); } } return answer; }
int main(int argc, char** argv) { struct timeval start, end; if (argc < 4) { fprintf(stderr, "Wrong usage!\n"); fprintf(stderr, "%s <transactions_filename> <rules_filename> <output_filename>\n", argv[0]); exit(0); } START_CHRONO; work_queue.index = 0; pthread_mutex_init(&(work_queue.mutex), NULL); pthread_mutex_init(&output_mutex, NULL); #pragma omp parallel sections { #pragma omp section { n_transactions = read_transanctions(argv[1]); } #pragma omp section { n_rules = read_rules(argv[2]); } } output_fd = fopen(argv[3], "w"); sort_rules(); #ifdef DEBUG_PRINT fprintf(stderr, "\n"); #endif /*/ show_transactions(n_transactions); show_rules(n_rules); /*/ /* match_naive(); */ /* match_bounded_search(); */ bounded_search_match(); fclose(output_fd); STOP_CHRONO; #ifdef TIME_MEASURES fprintf(stderr, "\n[Bounded] Took %ld ms to match %d transactions (%.2lf transactions per second)!\n", GET_CHRONO, n_transactions, n_transactions * 1000 / (GET_CHRONO + 0.001)); #endif return 0; }