From c231fedd79181a870d8f965c0fac797d1b29ece7 Mon Sep 17 00:00:00 2001 From: breandan Date: Tue, 30 Apr 2024 00:27:40 -0400 Subject: [PATCH] visualize WFSA --- .../kaliningraph/graphs/LabeledGraph.kt | 7 ++++++ .../kaliningraph/automata/WFSATest.kt | 24 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/commonMain/kotlin/ai/hypergraph/kaliningraph/graphs/LabeledGraph.kt b/src/commonMain/kotlin/ai/hypergraph/kaliningraph/graphs/LabeledGraph.kt index 8a3f852b..6fd7e367 100644 --- a/src/commonMain/kotlin/ai/hypergraph/kaliningraph/graphs/LabeledGraph.kt +++ b/src/commonMain/kotlin/ai/hypergraph/kaliningraph/graphs/LabeledGraph.kt @@ -75,6 +75,13 @@ open class LabeledGraph constructor(override val vertices: Set = setOf var accumuator = mutableSetOf() var description = "" + override fun reversed(): LabeledGraph = + (vertices.associateWith { setOf() } + + vertices.flatMap { src -> + src.outgoing.map { edge -> edge.target to LabeledEdge(edge.target, src, edge.label) } + }.groupBy({ it.first }, { it.second }).mapValues { (_, v) -> v.toSet() }) + .map { (k, v) -> V(k) { v } }.toSet().let { G(it) } + fun S() = BooleanMatrix(vertices.size, 1) { i, j -> this[i].occupied } fun rewrite(substitution: V2) = diff --git a/src/jvmTest/kotlin/ai/hypergraph/kaliningraph/automata/WFSATest.kt b/src/jvmTest/kotlin/ai/hypergraph/kaliningraph/automata/WFSATest.kt index 05c74bc4..98d54f2d 100644 --- a/src/jvmTest/kotlin/ai/hypergraph/kaliningraph/automata/WFSATest.kt +++ b/src/jvmTest/kotlin/ai/hypergraph/kaliningraph/automata/WFSATest.kt @@ -2,7 +2,9 @@ package ai.hypergraph.kaliningraph.automata import Grammars import Grammars.shortS2PParikhMap +import ai.hypergraph.kaliningraph.graphs.LabeledGraph import ai.hypergraph.kaliningraph.parsing.* +import ai.hypergraph.kaliningraph.visualization.alsoCopy import net.jhoogland.jautomata.* import net.jhoogland.jautomata.Automaton import net.jhoogland.jautomata.operations.* @@ -32,6 +34,25 @@ class WFSATest { .also { println("Took ${it.duration} to decode ${it.value.size} best strings") } } + fun Automaton.toDot(processed: MutableSet = mutableSetOf()) = + LabeledGraph { + val stateQueue = mutableListOf() + initialStates().forEach { stateQueue.add(it) } + while (true) { + if (stateQueue.isEmpty()) break + val state = stateQueue.removeAt(0) + transitionsOut(state).forEach { + val label = label(it) + "/" + transitionWeight(it).toString().take(4) + val next = this@toDot.to(it) + state.hashCode().toString()[label] = next.hashCode().toString() + if (next !in processed) { + processed.add(next) + stateQueue.add(next) + } + } + } + }.toDot().replace("Mrecord\"", "Mrecord\", label=\"\"") + /* ./gradlew jvmTest --tests "ai.hypergraph.kaliningraph.automata.WFSATest.testLBHRepair" */ @@ -54,7 +75,8 @@ class WFSATest { addTransition(s1, s2, a.root, 1.0) } } - ).also { println("Total: ${Automata.transitions(it).size} arcs, ${Automata.states(it).size}") } + )?.also { println("\n" + Operations.determinizeER(it).toDot().alsoCopy() + "\n") } + .also { println("Total: ${Automata.transitions(it).size} arcs, ${Automata.states(it).size}") } .let { Automata.bestStrings(it, 1000).map { it.label.joinToString(" ") }.toSet() } }.also { println("Found ${it.value.size} repairs by decoding WFSA")