Class: Tsumetogi::DpMatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/tsumetogi/dp_matcher.rb

Defined Under Namespace

Classes: Distance

Instance Method Summary collapse

Constructor Details

#initialize(references, targets, diff_strategy_name) ⇒ DpMatcher

Returns a new instance of DpMatcher.



7
8
9
10
11
12
13
14
# File 'lib/tsumetogi/dp_matcher.rb', line 7

def initialize(references, targets, diff_strategy_name)
  @references = references
  @targets = targets
  @diff_strategy_name = diff_strategy_name
  diff_class = Tsumetogi::DiffStrategies.const_get(diff_strategy_name) rescue Tsumetogi::DiffStrategies::Digest
  @diff_strategy = diff_class.new
  @trellis = []
end

Instance Method Details

#back_traceObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/tsumetogi/dp_matcher.rb', line 39

def back_trace
  ref_index = @references.size - 1
  tar_index = @targets.size - 1
  trace = []

  loop do
    dist = trellis(ref_index, tar_index)
    break if dist.direct == :none
    trace << dist.direct

    case dist.direct
    when :modify, :nochange
      ref_index -= 1
      tar_index -= 1
    when :add
      tar_index -= 1
    when :remove
      ref_index -= 1
    end
  end

  trace.reverse
end

#matchObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/tsumetogi/dp_matcher.rb', line 16

def match
  @diff_strategy.before_match

  total_num = @references.size * @targets.size
  processed_num = 0
  @references.each_with_index do |ref, ref_index|
    @diff_strategy.before_reference(ref, ref_index)
    @trellis << []
    @targets.each_with_index do |tar, tar_index|
      diff = @diff_strategy.difference(ref, tar)
      @trellis[ref_index] << minimize_distance(diff, ref_index, tar_index)
      processed_num += 1
      Tsumetogi.logger.progress "Matching with #{@diff_strategy_name}", processed_num, total_num
    end
    @diff_strategy.after_reference(ref, ref_index)
  end
  Tsumetogi.logger.puts

  self
ensure
  @diff_strategy.after_match
end