From 77666a09c0f82b231605da463a946a5a5fcd09b6 Mon Sep 17 00:00:00 2001 From: Patrick Simianer Date: Tue, 24 Feb 2026 17:07:57 +0100 Subject: Fix reordering bug in derive and add test example derive used a sequential counter to index into the source-side NT map, which only worked for monotone rules. Now looks up tails by the target NT's own index via map.index(i.index). Adds toy-reorder example (German verb-final -> English SVO) to exercise the fix. Also updates trollop -> optimist and guards xmlsimple require. Co-Authored-By: Claude Opus 4.6 --- example/toy-reorder/grammar | 6 ++++++ example/toy-reorder/in | 1 + example/toy-reorder/weights.toy | 1 + prototype/hypergraph.rb | 4 +--- prototype/ow_proto.rb | 6 +++--- 5 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 example/toy-reorder/grammar create mode 100644 example/toy-reorder/in create mode 100644 example/toy-reorder/weights.toy diff --git a/example/toy-reorder/grammar b/example/toy-reorder/grammar new file mode 100644 index 0000000..d93d98c --- /dev/null +++ b/example/toy-reorder/grammar @@ -0,0 +1,6 @@ +[S] ||| [NP,1] [VP,2] ||| [NP,1] [VP,2] ||| logp=0 +[NP] ||| er ||| he ||| logp=-0.5 +[NP] ||| das [NN,1] ||| the [NN,1] ||| logp=0 +[NN] ||| buch ||| book ||| logp=0 +[VP] ||| [NP,1] [V,2] ||| [V,2] [NP,1] ||| logp=0 +[V] ||| liest ||| reads ||| logp=-0.25 diff --git a/example/toy-reorder/in b/example/toy-reorder/in new file mode 100644 index 0000000..6eeb3a9 --- /dev/null +++ b/example/toy-reorder/in @@ -0,0 +1 @@ +er das buch liest diff --git a/example/toy-reorder/weights.toy b/example/toy-reorder/weights.toy new file mode 100644 index 0000000..3eb2502 --- /dev/null +++ b/example/toy-reorder/weights.toy @@ -0,0 +1 @@ +logp 2 diff --git a/prototype/hypergraph.rb b/prototype/hypergraph.rb index fd72393..fdaba5a 100644 --- a/prototype/hypergraph.rb +++ b/prototype/hypergraph.rb @@ -196,11 +196,9 @@ def HG::derive path, cur, carry edge = path.select { |e| e.head.symbol==cur.symbol \ && e.head.left==cur.left \ && e.head.right==cur.right }.first - j = 0 edge.rule.target.each { |i| if i.class == Grammar::NT - derive path, edge.tails[edge.rule.map[j]], carry - j += 1 + derive path, edge.tails[edge.rule.map.index(i.index)], carry else carry << i end diff --git a/prototype/ow_proto.rb b/prototype/ow_proto.rb index 912090b..41fe683 100755 --- a/prototype/ow_proto.rb +++ b/prototype/ow_proto.rb @@ -1,7 +1,7 @@ #!/usr/bin/env ruby -require 'trollop' -require 'xmlsimple' +require 'optimist' +begin; require 'xmlsimple'; rescue LoadError; end require_relative 'parse' def read_grammar fn, add_glue, add_pass_through, input=nil @@ -19,7 +19,7 @@ def read_grammar fn, add_glue, add_pass_through, input=nil end def main - cfg = Trollop::options do + cfg = Optimist::options do opt :input, "", :type => :string, :default => '-', :short => '-i' opt :grammar, "", :type => :string, :required => true, :short => '-g' opt :weights, "", :type => :string, :required => true, :short => '-w' -- cgit v1.2.3