diff options
| -rwxr-xr-x | main.rb | 2 | ||||
| -rw-r--r-- | parse.rb | 33 | 
2 files changed, 29 insertions, 6 deletions
| @@ -52,6 +52,8 @@ def main      STDERR.write "> parsing\n"      Parse::parse input, n, active_chart, passive_chart, grammar +    exit +      weights = SparseVector.from_kv(ReadFile.read(cfg[:weights]), ' ', "\n")      if !weights        weights = SparseVector.new @@ -155,8 +155,22 @@ def Parse::parse input, n, active_chart, passive_chart, grammar      # parse      new_symbols = []      remaining_items = [] -    while !active_chart.at(i,j).empty? -      active_item = active_chart.at(i,j).pop +     +    num_threads = 2 +    slice_sz = active_chart.at(i,j).size/num_threads +    slices = [] +    num_threads.times { +      slices << active_chart.at(i,j).shift(slice_sz+1) +    } +    m = Mutex.new +    threads = [] + +    slices.each_with_index { |slice,ti| +    threads << Thread.new(ti) {  +    #while !active_chart.at(i,j).empty? +    while !slice.empty? +      #active_item = active_chart.at(i,j).pop +      active_item = slice.pop        advanced = false        visit(1, i, j, 1) { |k,l|          if passive_chart.has active_item.rhs[active_item.dot].symbol, k, l @@ -166,13 +180,16 @@ def Parse::parse input, n, active_chart, passive_chart, grammar              if scan new_item, input, j, passive_chart                if new_item.dot == new_item.rhs.size                  if new_item.left == i && new_item.right == j -                  new_symbols << new_item.lhs.symbol if !new_symbols.include? new_item.lhs.symbol -                  passive_chart.add new_item, i, j +                  #new_symbols << new_item.lhs.symbol if !new_symbols.include? new_item.lhs.symbol +                  m.synchronize { new_symbols << new_item.lhs.symbol if !new_symbols.include? new_item.lhs.symbol } +                  #passive_chart.add new_item, i, j +                  m.synchronize { passive_chart.add new_item, i, j }                    advanced = true                  end                else                  if new_item.right+(new_item.rhs.size-(new_item.dot)) <= j -                  active_chart.at(i,j) << new_item +                  #active_chart.at(i,j) << new_item +                  slice << new_item                    advanced = true                  end                end @@ -181,9 +198,13 @@ def Parse::parse input, n, active_chart, passive_chart, grammar          end        }        if !advanced -        remaining_items << active_item +        m.synchronize { remaining_items << active_item }        end      end +    } + +    } +    threads.each { |t| t.join }      # 'self-filling' step      new_symbols.each { |s| | 
