diff options
| author | pks <pks@users.noreply.github.com> | 2026-02-27 12:09:49 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-27 12:09:49 +0100 |
| commit | e7189f97ec29bd576fe79a260fa0e8cd25dcc968 (patch) | |
| tree | 227bc72ff0f7f72b8c6b3e6f735d922dd13da147 /prototype/hypergraph.rb | |
| parent | c13b5650ac4bee7e674d263fcb778599bb449bff (diff) | |
| parent | 1377ffbdd2791e50cb3ca21d11c8c21febdbf911 (diff) | |
Claude
Diffstat (limited to 'prototype/hypergraph.rb')
| -rw-r--r-- | prototype/hypergraph.rb | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/prototype/hypergraph.rb b/prototype/hypergraph.rb index fd72393..08d1a29 100644 --- a/prototype/hypergraph.rb +++ b/prototype/hypergraph.rb @@ -189,18 +189,30 @@ def HG::all_paths hypergraph, root paths = new_paths } - return paths + seen = Set.new + paths.select { |p| + reachable = Set.new + mark_reachable p, p.last, reachable + key = reachable.map(&:object_id).sort + !seen.include?(key) && seen.add(key) + } +end + +def HG::mark_reachable path, edge, used + used << edge + edge.tails.each { |t| + child = path.find { |e| e.head == t } + mark_reachable path, child, used if child && !used.include?(child) + } end 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 |
