From 9a54c4c8c4cbd944ddd2ce29eec408e7a36e7cdf Mon Sep 17 00:00:00 2001 From: Etienne Kneuss Date: Wed, 13 Jun 2012 15:15:30 +0200 Subject: [PATCH] Collapse similar NFA states --- src/insane/alias/EffectRepresentations.scala | 2 ++ src/insane/utils/Automatons.scala | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/insane/alias/EffectRepresentations.scala b/src/insane/alias/EffectRepresentations.scala index 66d59e3..09baf5e 100644 --- a/src/insane/alias/EffectRepresentations.scala +++ b/src/insane/alias/EffectRepresentations.scala @@ -184,6 +184,8 @@ trait EffectRepresentations extends PointToGraphsDefs with PointToEnvs { res = res.removeDeadPaths + res = res.collapseSimilarStates + res } } diff --git a/src/insane/utils/Automatons.scala b/src/insane/utils/Automatons.scala index 5bdd103..77beea9 100644 --- a/src/insane/utils/Automatons.scala +++ b/src/insane/utils/Automatons.scala @@ -61,6 +61,21 @@ object Automatons { removeStates(states -- markedStates) } + + case class StateSig(ins: Set[(S, L)], outs: Set[(S, L)]) + + object StateSig { + def fromState(s: S): StateSig = { + StateSig(graph.ins(s).map(t => (t.v1, t.label)).toSet, + graph.outs(s).map(t => (t.v2, t.label)).toSet) + } + } + def collapseSimilarStates: Automaton[S, T, L] = { + // Keep the head of each kind, remove the rest + val toRemove = states.groupBy(StateSig.fromState _).values.flatMap(_.tail) + + removeStates(toRemove) + } } class AutomatonDotConverter[S <: StateAbs, T <: TransitionAbs[L, S], L](atm: Automaton[S, T, L], _title: String, _prefix: String) extends DotConverter[S, T](atm.graph, _title, _prefix) {