<feed xmlns='http://www.w3.org/2005/Atom'>
<title>odenwald, branch master</title>
<subtitle>Mirror of https://github.com/pks/odenwald.git
</subtitle>
<id>https://git.simianer.de/mirrored/odenwald/atom?h=master</id>
<link rel='self' href='https://git.simianer.de/mirrored/odenwald/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/'/>
<updated>2026-02-27T11:09:49Z</updated>
<entry>
<title>Merge pull request #1 from pks/claude</title>
<updated>2026-02-27T11:09:49Z</updated>
<author>
<name>pks</name>
<email>pks@users.noreply.github.com</email>
</author>
<published>2026-02-27T11:09:49Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=e7189f97ec29bd576fe79a260fa0e8cd25dcc968'/>
<id>urn:sha1:e7189f97ec29bd576fe79a260fa0e8cd25dcc968</id>
<content type='text'>
Claude</content>
</entry>
<entry>
<title>Ignore output directories</title>
<updated>2026-02-27T08:46:14Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-27T08:46:14Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=1377ffbdd2791e50cb3ca21d11c8c21febdbf911'/>
<id>urn:sha1:1377ffbdd2791e50cb3ca21d11c8c21febdbf911</id>
<content type='text'>
Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix C++ ow binary to produce translations</title>
<updated>2026-02-26T18:31:35Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-26T18:31:35Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=a1c5862a46b524d3e11a87c5a732c0c257aefe20'/>
<id>urn:sha1:a1c5862a46b524d3e11a87c5a732c0c257aefe20</id>
<content type='text'>
- Node::mark and Node::score uninitialized, causing segfaults in
  topological_sort — add default initializers (0, 0.0)
- odenwald.cc called incomplete sv_path() + exit(1) instead of
  viterbi_path()
- viterbi_path: add reset() before topological_sort, initialize
  best_edge to nullptr
- derive: off-by-one in NT order indexing — start j at 1 and
  use order[j]-1 (1-indexed alignment map)
- read: ifs.readsome() returns 0 on macOS — use ifs.read() +
  ifs.gcount()
- manual() signature: add missing Vocabulary parameter
- Remove gperftools/tcmalloc dependency from Makefile

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix two bugs in prototype parser</title>
<updated>2026-02-26T18:29:18Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-26T18:29:18Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=44f225d0642d2ecf13f533f68b9ae12d849809ea'/>
<id>urn:sha1:44f225d0642d2ecf13f533f68b9ae12d849809ea</id>
<content type='text'>
1. Inner visit at span (0,1) yielded no sub-spans because
   visit(1, 0, 1, 1) iterates span from 1 to r-x=0, which is
   empty. This prevented unary rules like [S] ||| [X,1] from
   completing at the leftmost span, so S(0,1) was never created.
   Drop the x=1 parameter (default x=0); scan already handles
   bounds checking.

2. Self-filling step searched remaining_items for unary NT rules,
   but those rules could be absent if consumed (advanced) during
   the parse loop. Look up grammar.start_nt directly instead,
   which covers all cases.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Rust implementation of SCFG decoder</title>
<updated>2026-02-26T18:28:22Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-26T18:28:22Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=0abcdd7e4358cb902c320b008d3c04bde07b749e'/>
<id>urn:sha1:0abcdd7e4358cb902c320b008d3c04bde07b749e</id>
<content type='text'>
Rust port of the Ruby prototype decoder with performance
optimizations for real Hiero-style grammars:

- Rule indexing by first terminal/NT symbol for fast lookup
- Chart symbol interning (u16 IDs) instead of string hashing
- Passive chart index by (symbol, left) for direct right-endpoint lookup
- Items store rule index instead of cloned rule data

Includes CKY+ parser, chart-to-hypergraph conversion, Viterbi
decoding, derivation extraction, and JSON hypergraph I/O.

Self-filling step in parse uses grammar lookup (not just
remaining active items) to handle rules that were consumed
during the parse loop or skipped by the has_any_at optimization.

Produces identical output to the Ruby prototype on all test examples.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Replace silent rescue with explicit type check in Item constructor</title>
<updated>2026-02-24T16:18:29Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-24T16:18:29Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=4e62908a1757f83ff703399252ad50758c4eb237'/>
<id>urn:sha1:4e62908a1757f83ff703399252ad50758c4eb237</id>
<content type='text'>
When creating an Item from a Rule (not an Item), tail_spans doesn't exist.
Check with is_a?(Item) instead of catching the exception silently.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Emit binary glue rule only once</title>
<updated>2026-02-24T16:16:06Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-24T16:16:06Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=22dc0fbdf002c7824941abc17a715a3e70ff37c1'/>
<id>urn:sha1:22dc0fbdf002c7824941abc17a715a3e70ff37c1</id>
<content type='text'>
The [S] -&gt; [S] [X] concatenation rule was duplicated for every non-S LHS
symbol. Move it out of the loop so it's added once.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Deduplicate all_paths by reachable edge set</title>
<updated>2026-02-24T16:14:37Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-24T16:14:37Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=e76951f21263eb7010a2898b9744364e989e90b8'/>
<id>urn:sha1:e76951f21263eb7010a2898b9744364e989e90b8</id>
<content type='text'>
The Cartesian product over all nodes produces duplicate derivations when
edges differ only in nodes unreachable from the top. Walk reachable edges
from the top edge of each path and drop paths with identical reachable sets.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix reordering bug in derive and add test example</title>
<updated>2026-02-24T16:07:57Z</updated>
<author>
<name>Patrick Simianer</name>
<email>patrick@lilt.com</email>
</author>
<published>2026-02-24T16:07:57Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=77666a09c0f82b231605da463a946a5a5fcd09b6'/>
<id>urn:sha1:77666a09c0f82b231605da463a946a5a5fcd09b6</id>
<content type='text'>
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 -&gt; English SVO) to exercise
the fix. Also updates trollop -&gt; optimist and guards xmlsimple require.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>external/README</title>
<updated>2017-08-04T19:24:05Z</updated>
<author>
<name>Patrick Simianer</name>
<email>p@simianer.de</email>
</author>
<published>2017-08-04T19:24:05Z</published>
<link rel='alternate' type='text/html' href='https://git.simianer.de/mirrored/odenwald/commit/?id=c13b5650ac4bee7e674d263fcb778599bb449bff'/>
<id>urn:sha1:c13b5650ac4bee7e674d263fcb778599bb449bff</id>
<content type='text'>
</content>
</entry>
</feed>
