Transform.augmentFromIfThenAutomaton(pta, null, ifthenAutomata, statesToAdd);// we only need to augment our PTA once (refer to the explanation above).
//System.out.println(new Date().toString()+" Graph augmented: "+pta.getStateNumber()+" states ("+pta.getAcceptStateNumber()+" accept states)");
}
else assert pta.getStateNumber() == pta.getAcceptStateNumber() : "graph with negatives but onlyUsePositives is set";
LearnerThatCanClassifyPairs learnerOfPairs = null;
LearnerGraph actualAutomaton = null;
//Visualiser.updateFrame(pta, referenceGraph);Visualiser.waitForKey();
for(Entry<CmpVertex,List<Label>> path: pta.pathroutines.computeShortPathsToAllStates().entrySet())
{
boolean accept = path.getKey().isAccept();
CmpVertex vert = referenceGraph.getVertex(path.getValue());
boolean shouldBe = vert==null?false:vert.isAccept();
assert accept == shouldBe: "state "+vert+" is incorrectly annotated as "+accept+" in path "+path;
}
{
LearnerGraph reducedPTA = PairQualityLearner.mergeStatesForUnique(pta,uniqueFromInitial);
learnerOfPairs = new PairQualityLearner.ReferenceLearner(learnerEval, referenceGraph, reducedPTA,false);
//learnerOfPairs.setLabelsLeadingFromStatesToBeMerged(Arrays.asList(new Label[]{uniqueFromInitial}));
synchronized (AbstractLearnerGraph.syncObj) {
PaperUAS.computePTASize(selectionID+" with unique "+uniqueFromInitial+" : ", reducedPTA, referenceGraph);
}
actualAutomaton = learnerOfPairs.learnMachine(new LinkedList<List<Label>>(),new LinkedList<List<Label>>());
LinkedList<AMEquivalenceClass<CmpVertex,LearnerGraphCachedData>> verticesToMerge = new LinkedList<AMEquivalenceClass<CmpVertex,LearnerGraphCachedData>>();
List<StatePair> pairsList = LearnerThatCanClassifyPairs.buildVerticesToMerge(actualAutomaton,learnerOfPairs.getLabelsLeadingToStatesToBeMerged(),learnerOfPairs.getLabelsLeadingFromStatesToBeMerged());
if (!pairsList.isEmpty())
{
int score = actualAutomaton.pairscores.computePairCompatibilityScore_general(null, pairsList, verticesToMerge);
if (score < 0)
{
learnerOfPairs = new PairQualityLearner.ReferenceLearner(learnerEval, referenceGraph, reducedPTA,false);
learnerOfPairs.setLabelsLeadingFromStatesToBeMerged(Arrays.asList(new Label[]{uniqueFromInitial}));
actualAutomaton = learnerOfPairs.learnMachine(new LinkedList<List<Label>>(),new LinkedList<List<Label>>());
score = actualAutomaton.pairscores.computePairCompatibilityScore_general(null, pairsList, verticesToMerge);
throw new RuntimeException("last merge in the learning process was not possible");
}
actualAutomaton = MergeStates.mergeCollectionOfVertices(actualAutomaton, null, verticesToMerge);
}
DifferenceToReference similarityMeasure = getMeasure(actualAutomaton,referenceGraph,testSet);
System.out.println("similarity = "+similarityMeasure);
}
{// not merging based on a unique transition from an initial state
learnerOfPairs = new PairQualityLearner.ReferenceLearner(learnerEval, referenceGraph, pta,false);
synchronized (AbstractLearnerGraph.syncObj) {
PaperUAS.computePTASize(selectionID+" no unique: ", pta, referenceGraph);
}
actualAutomaton = learnerOfPairs.learnMachine(new LinkedList<List<Label>>(),new LinkedList<List<Label>>());
DifferenceToReference similarityMeasure = getMeasure(actualAutomaton,referenceGraph,testSet);
System.out.println("similarity = "+similarityMeasure);
System.out.println();
/*
LearnerGraph reducedPTA = PairQualityLearner.mergeStatesForUnique(pta,uniqueFromInitial);