Skip to content
Snippets Groups Projects
Commit 4b06c583 authored by Thomas's avatar Thomas
Browse files

cleanup2

parent 15638f0e
No related branches found
No related tags found
No related merge requests found
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Sets;
import net.automatalib.automata.fsa.impl.compact.CompactDFA;
import net.automatalib.automata.fsa.impl.compact.CompactNFA; import net.automatalib.automata.fsa.impl.compact.CompactNFA;
import net.automatalib.util.automata.builders.FSABuilder; import net.automatalib.util.automata.builders.FSABuilder;
import net.automatalib.visualization.Visualization;
import java.util.*;
public class GenRFSA<A extends CompactNFA<I>, S, I> { public class GenRFSA<A extends CompactNFA<I>, S, I> {
public CompactNFA<I> reverse(CompactNFA<I> original) { public CompactNFA<I> reverse(CompactNFA<I> original) {
...@@ -24,102 +17,4 @@ public class GenRFSA<A extends CompactNFA<I>, S, I> { ...@@ -24,102 +17,4 @@ public class GenRFSA<A extends CompactNFA<I>, S, I> {
original.getInitialStates().forEach(builder::withAccepting); original.getInitialStates().forEach(builder::withAccepting);
return builder.create(); return builder.create();
} }
public CompactNFA<I> precanonicalize(CompactNFA<I> original){
FSABuilder<Integer, I, CompactNFA<I>> builder = new FSABuilder<>(new CompactNFA<>(original.getInputAlphabet()));
BiMap<BitSet, Integer> detMap = HashBiMap.create();
CompactDFA<I> out = new CompactDFA<I>(original.getInputAlphabet());
NFAs.determinize(original, original.getInputAlphabet(), out, false, detMap);
Set<BitSet> detStates = new HashSet<>(detMap.keySet());
Set<BitSet> coverableStates = new HashSet<>();
for (BitSet testState : detStates) {
Set<BitSet> usingStates = new HashSet<>(detMap.keySet());
usingStates.remove(testState);
//kind a subset-sum
Set<Set<BitSet>> powersets = Sets.powerSet(usingStates);
for (Set<BitSet> set : powersets) {
BitSet sum = new BitSet();
set.forEach(s -> sum.or(s)); // maybe broken in openjdk
if (sum.equals(testState)){
coverableStates.add(testState);
break;
}
}
}
detStates.removeAll(coverableStates);
//initial states
BitSet initBs = new BitSet();
original.getInitialStates().forEach(initBs::set);
for (BitSet s : detStates) {
//initial states
BitSet tmp = (BitSet) s.clone();
tmp.or(initBs);
if (tmp.equals(initBs))
builder.withInitial(s);
//final states
if(s.stream().anyMatch(a -> original.isAccepting(a))){ // maybe broken in openjdk
builder.withAccepting(s);
}
//transitions
for (I i : out.getLocalInputs(detMap.get(s))) {
BitSet detSucc = detMap.inverse().get(out.getSuccessor(detMap.get(s), i));
powerset(detSucc).stream().filter(detStates::contains).forEach(succ -> builder.from(s).on(i).to(succ));
}
}
return builder.create();
}
public CompactNFA<I> canonicalize(CompactNFA<I> original) {
return canonicalizeReverseLang(reverse(original));
}
public CompactNFA<I> canonicalizeReverseLang(CompactNFA<I> original) {
return precanonicalize(reverse(precanonicalize(original)));
}
public static void main(String[] args) {
RandomNFAGen c = new RandomNFAGen(10);
CompactNFA<Integer> nfa = c.get();
GenRFSA<CompactNFA<Integer>, ?, Integer> genRFSA = new GenRFSA<>();
FSABuilder<Integer, Integer, CompactNFA<Integer>> builder = new FSABuilder<>(new CompactNFA<>(nfa.getInputAlphabet()));
builder.withInitial(1);
builder.withAccepting(3);
builder.from(1).on(0,1).to(1);
builder.from(1).on(0).to(2);
builder.from(2).on(0,1).to(3);
CompactNFA<Integer> nfa2 = builder.create();
Visualization.visualize(nfa2);
Visualization.visualize(genRFSA.reverse(nfa2));
Visualization.visualize(genRFSA.precanonicalize(genRFSA.reverse(nfa2)));
Visualization.visualize(genRFSA.canonicalizeReverseLang(nfa2));
Visualization.visualize(genRFSA.canonicalize(nfa2));
}
private static Set<BitSet> powerset(BitSet set) {
Set<BitSet> sets = new HashSet<>();
if (set.isEmpty()) {
sets.add(new BitSet(0));
return sets;
}
int head = set.nextSetBit(0);
BitSet rest = set.get(0, set.size());
rest.clear(head);
for (BitSet s : powerset(rest)) {
BitSet newSet = s.get(0, s.size());
newSet.set(head);
sets.add(newSet);
sets.add(s);
}
return sets;
}
} }
...@@ -35,8 +35,7 @@ public class RFSALearnAndCompare<I> { ...@@ -35,8 +35,7 @@ public class RFSALearnAndCompare<I> {
SimulatorOracle<I, Boolean> sul2 = new MySimulatorOracle<>(target); SimulatorOracle<I, Boolean> sul2 = new MySimulatorOracle<>(target);
GenRFSA<CompactNFA<I>, ?, I> genRFSA = new GenRFSA<>(); GenRFSA<CompactNFA<I>, ?, I> genRFSA = new GenRFSA<>();
CompactNFA<I> rfsa = genRFSA.canonicalize(target); CompactNFA<I> reverseTarget = genRFSA.reverse(target);
CompactNFA<I> rfsa2 = genRFSA.canonicalizeReverseLang(target);
mqOracle = new CounterOracle<>(sul, "membership queries learning"); mqOracle = new CounterOracle<>(sul, "membership queries learning");
mqOracle2 = new CounterOracle<>(sul2, "membership queries learning"); mqOracle2 = new CounterOracle<>(sul2, "membership queries learning");
...@@ -50,8 +49,8 @@ public class RFSALearnAndCompare<I> { ...@@ -50,8 +49,8 @@ public class RFSALearnAndCompare<I> {
NLStarLearner<I> nlstar2 = new NLStarLearnerBuilder<I>().withAlphabet(target.getInputAlphabet()) // input alphabet NLStarLearner<I> nlstar2 = new NLStarLearnerBuilder<I>().withAlphabet(target.getInputAlphabet()) // input alphabet
.withOracle(mqOracle2) // reverse membership oracle .withOracle(mqOracle2) // reverse membership oracle
.create(); .create();
DumpRFSAEQOracle<NFA<?, I>, I, Boolean> eqOracle = new DumpRFSAEQOracle<>(rfsa, mqOracle_2, 0, maxLength, maxTests); DumpRFSAEQOracle<NFA<?, I>, I> eqOracle = new DumpRFSAEQOracle<>(target, mqOracle_2, 0, maxLength, maxTests);
DumpRFSAEQOracle<NFA<?, I>, I, Boolean> eqOracle2 = new DumpRFSAEQOracle<>(rfsa2, mqOracle2_2, 0, maxLength, maxTests); DumpRFSAEQOracle<NFA<?, I>, I> eqOracle2 = new DumpRFSAEQOracle<>(reverseTarget, mqOracle2_2, 0, maxLength, maxTests);
experiment = new Experiment<>(nlstar, eqOracle, target.getInputAlphabet()); experiment = new Experiment<>(nlstar, eqOracle, target.getInputAlphabet());
experiment2 = new Experiment<>(nlstar2, eqOracle2, target.getInputAlphabet()); experiment2 = new Experiment<>(nlstar2, eqOracle2, target.getInputAlphabet());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment