summaryrefslogtreecommitdiff
path: root/prototype/hypergraph.rb
diff options
context:
space:
mode:
authorpks <pks@users.noreply.github.com>2026-02-27 12:09:49 +0100
committerGitHub <noreply@github.com>2026-02-27 12:09:49 +0100
commite7189f97ec29bd576fe79a260fa0e8cd25dcc968 (patch)
tree227bc72ff0f7f72b8c6b3e6f735d922dd13da147 /prototype/hypergraph.rb
parentc13b5650ac4bee7e674d263fcb778599bb449bff (diff)
parent1377ffbdd2791e50cb3ca21d11c8c21febdbf911 (diff)
Merge pull request #1 from pks/claudeHEADmaster
Claude
Diffstat (limited to 'prototype/hypergraph.rb')
-rw-r--r--prototype/hypergraph.rb20
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