summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Simianer <p@simianer.de>2015-11-16 17:21:40 +0100
committerPatrick Simianer <p@simianer.de>2015-11-16 17:21:40 +0100
commitadf10dca9353bd9fa443eec67a30e2bbe58cbff4 (patch)
treef0d9b200453cec268344a8890a11059bf72d9bb1
parentaa35f4c9d8c507bddc6deb8ca7def6b22cb40470 (diff)
new obj.
-rw-r--r--prototype/hypergraph.rb39
-rwxr-xr-xprototype/new_obj.rb34
2 files changed, 71 insertions, 2 deletions
diff --git a/prototype/hypergraph.rb b/prototype/hypergraph.rb
index d43d5ee..a628c71 100644
--- a/prototype/hypergraph.rb
+++ b/prototype/hypergraph.rb
@@ -142,6 +142,31 @@ def HG::viterbi_path hypergraph, root, semiring=ViterbiSemiring.new
}
best_path << best_edge if best_edge
}
+
+ return best_path, toposorted.last.score
+end
+
+def HG::new_obj_path hypergraph, root, semiring=ViterbiSemiring.new
+ toposorted = topological_sort hypergraph.nodes
+ hypergraph.nodes.each { |n| n.score=1.0/0 }
+ root.score = 1
+ best_path = []
+ toposorted.each { |n|
+ best_edge = n.incoming.first
+ n.incoming.each { |e|
+ s = 0
+ e.tails.each { |m|
+ s += m.score
+ }
+ s *= e.score
+ if n.score >= s
+ best_edge = e
+ end
+ n.score = [s, n.score].min
+ }
+ best_path << best_edge if best_edge
+ }
+
return best_path, toposorted.last.score
end
@@ -163,6 +188,7 @@ def HG::all_paths hypergraph, root
end
paths = new_paths
}
+
return paths
end
@@ -182,11 +208,12 @@ def HG::derive path, cur, carry
return carry
end
-def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=false
+def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=false, new_obj_model=nil
nodes = []
edges = []
nodes_by_id = {}
- h = JSON.parse File.new(fn).read
+ f = ReadFile.new fn
+ h = JSON.parse f.read
w = SparseVector.from_h h['weights']
h['nodes'].each { |x|
n = Node.new x['id'], x['symbol'], x['span']
@@ -202,6 +229,14 @@ def HG::read_hypergraph_from_json fn, semiring=RealSemiring.new, log_weights=fal
if x['f']
if log_weights
e.score = Math.exp(w.dot(e.f))
+ elsif new_obj_model
+ e.score = e.f.dot(e.f)
+ new_obj_model.each { |x|
+ wx = x[0]
+ wf = x[1]
+ e.score -= wx*wf.dot(e.f)
+ }
+ puts e.score
else
e.score = w.dot(e.f)
end
diff --git a/prototype/new_obj.rb b/prototype/new_obj.rb
new file mode 100755
index 0000000..3380fd0
--- /dev/null
+++ b/prototype/new_obj.rb
@@ -0,0 +1,34 @@
+#!/usr/bin/env ruby
+
+require_relative 'hypergraph'
+
+class NewObjSemiring < Semiring
+ def initialize
+ @add = Proc.new { |a,b| [a,b].min }
+ @multiply = Proc.new { |a,b| a*b }
+ @one = 1.0
+ @null = 0.0
+ @convert = Proc.new { |v| v }
+ end
+end
+
+def main
+ #semiring = NewObjSemiring.new
+ semiring = ViterbiSemiring.new
+ #h = { "logp" => 0, "use_house" => 100, "use_small" => 100 }
+ #model = [[1, SparseVector.from_h(h)]]
+ hypergraph, nodes_by_id = HG::read_hypergraph_from_json('739.json.gz', semiring, true)
+ path, score = HG::viterbi_path hypergraph, nodes_by_id[-1], semiring
+ path.each { |e| puts "#{e.head.to_s}\t#{e.rule.to_s}" }
+ puts path.size
+ puts "---"
+ s = HG::derive path, path.last.head, []
+ puts s.size
+ puts "#{s.map { |i| i.word }.join ' '}"
+ puts Math.log(score)
+ puts
+
+end
+
+main
+