summaryrefslogtreecommitdiff
path: root/hopefear.rb
blob: f0e32921edc8fc8960beba273fec7a0beeec80a0 (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
def hope_and_fear kbest, action
  max = -1.0/0
  max_idx = -1
  kbest.each_with_index { |k,i|
    if action=='hope' && k.scores[:decoder] + k.scores[:per_sentence_bleu] > max
      max_idx = i; max = k.scores[:decoder] + k.scores[:per_sentence_bleu]
    end
    if action=='fear' && k.scores[:decoder] - k.scores[:per_sentence_bleu] > max
      max_idx = i; max = k.scores[:decoder] - k.scores[:per_sentence_bleu]
    end
  }
  return max_idx
end

def gethopefear_rebol kbest, feedback, gold, max, corpus, own_reference=nil
  hope = fear = nil; new_reference = nil
  type1 = type2 = false
  if feedback == true
    # hope
    hope = kbest[0]
    new_reference = hope
    kbest.each { |k| k.scores[:per_sentence_bleu] = BLEU::per_sentence_bleu k.s, new_reference.s }
    # fear
    kbest.sort_by { |k| -(k.scores[:decoder]-k.scores[:per_sentence_bleu]) }.each_with_index { |k,i|
      break if i==max
      if !exec(k.s, gold, corpus, true)[0]
        fear = k
        break
      end
    }
    type1 = true
  else
    # fear
    fear = kbest[0]
    # hope
    kbest.sort_by { |k| -(k.scores[:decoder]+k.scores[:per_sentence_bleu]) }.each_with_index { |k,i|
      break if i==max
      if exec(k.s, gold, corpus, true)[0]
        hope = k
        break
      end
    }
    type2 = true
  end
  skip = true if !hope||!fear
  return hope, fear, skip, type1, type2, new_reference
end

def gethopefear_rebol_light kbest, feedback, gold, corpus
  hope = fear = nil
  type1 = type2 = false
  if feedback == true
    hope = kbest[0]
    type1 = true
  else
    hope = kbest[hope_and_fear kbest, 'hope']
    type2 = true
  end
  fear = kbest[hope_and_fear kbest, 'fear']
  # skip example if fear gives the right answer
  skip = exec(fear.s, gold, corpus, true)[0]
  return hope, fear, skip, type1, type2
end

def gethopefear_exec kbest, feedback, gold, max, corpus, own_reference=nil
  hope = fear = nil; hope_idx = 0; new_reference = nil
  type1 = type2 = false
  if feedback == true
    STDERR.write "If\n"
    hope = kbest[0]
    new_reference = hope
    type1 = true
  elsif own_reference
    STDERR.write "elsif\n"
    STDERR.write "#{own_reference.class}\n"
    hope = own_reference
    type1 = true
  else
    STDERR.write "else\n"
    # search for first (by decoder score) translation that gives the correct answer
    kbest.each_with_index { |k,i|
      next if i==0
      break if i==max
      if exec(k.s, gold, corpus, true)[0]
        hope_idx = i
        hope = k
        break
      end
    }
    type2 = true
  end
  # --"-- doesn't give the correct answer
  kbest.each_with_index { |k,i|
    next if i==0||i==hope_idx
    break if i==max
    if !exec(k.s, gold, corpus, true)[0]
      fear = k
      break
    end
  }
  skip = true if !hope||!fear
  return hope, fear, skip, type1, type2, new_reference
end

def gethopefear_rampion kbest, reference
  hope = fear = nil
  type1 = type2 = false
  # 1best is automatically hope if it matches reference
  if kbest[0].s == reference
    hope = kbest[0]
    fear = kbest[hope_and_fear kbest, 'fear']
    type1 = true
  else
    hope = kbest[hope_and_fear kbest, 'hope']
    # 1best is automatically fear if it doesn't match reference
    fear = kbest[0]
    type2 = true
  end
  return hope, fear, false, type1, type2
end