Пример #1
0
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;
}
Пример #2
0
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;
}