summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Simianer <p@simianer.de>2014-06-24 20:31:14 +0200
committerPatrick Simianer <p@simianer.de>2014-06-24 20:31:14 +0200
commite9009f3bb8d2b86250b601e76f6d6e697c71e611 (patch)
tree9217239cbae158bc98912d37e299658fb46929ad
parentf9106c8353aeaf6456a3eb0ea0c1e429f5de7650 (diff)
thread test
-rwxr-xr-xmain.rb2
-rw-r--r--parse.rb33
2 files changed, 29 insertions, 6 deletions
diff --git a/main.rb b/main.rb
index 1bf2203..7dc7370 100755
--- a/main.rb
+++ b/main.rb
@@ -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
diff --git a/parse.rb b/parse.rb
index aebb58d..8860b8c 100644
--- a/parse.rb
+++ b/parse.rb
@@ -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|