summaryrefslogtreecommitdiff
path: root/decoder/apply_models.h
blob: 19a4c7be2d6967622ef6c0a33e3842a8bea6c8cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef _APPLY_MODELS_H_
#define _APPLY_MODELS_H_

#include <iostream>

struct ModelSet;
struct Hypergraph;
struct SentenceMetadata;

struct exhaustive_t {};

struct IntersectionConfiguration {
enum {
  FULL,
  CUBE,
  FAST_CUBE_PRUNING,
  FAST_CUBE_PRUNING_2,
  N_ALGORITHMS
};

  const int algorithm; // 0 = full intersection, 1 = cube pruning
  const int pop_limit; // max number of pops off the heap at each node
  IntersectionConfiguration(int alg, int k) : algorithm(alg), pop_limit(k) {}
  IntersectionConfiguration(exhaustive_t /* t */) : algorithm(0), pop_limit() {}
};

inline std::ostream& operator<<(std::ostream& os, const IntersectionConfiguration& c) {
  if (c.algorithm == 0) { os << "FULL"; }
  else if (c.algorithm == 1) { os << "CUBE:k=" << c.pop_limit; }
  else if (c.algorithm == 2) { os << "FAST_CUBE_PRUNING"; }
  else if (c.algorithm == 3) { os << "FAST_CUBE_PRUNING_2"; }
  else if (c.algorithm == 4) { os << "N_ALGORITHMS"; }
  else os << "OTHER";
  return os;
}

void ApplyModelSet(const Hypergraph& in,
                   const SentenceMetadata& smeta,
                   const ModelSet& models,
                   const IntersectionConfiguration& config,
                   Hypergraph* out);

#endif