diff options
author | Patrick Simianer <p@simianer.de> | 2014-06-24 20:31:14 +0200 |
---|---|---|
committer | Patrick Simianer <p@simianer.de> | 2014-06-24 20:31:14 +0200 |
commit | e9009f3bb8d2b86250b601e76f6d6e697c71e611 (patch) | |
tree | 9217239cbae158bc98912d37e299658fb46929ad | |
parent | f9106c8353aeaf6456a3eb0ea0c1e429f5de7650 (diff) |
thread test
-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| |