/** CompleteModelRestricted.java * Created on Jan 29, 2008 * * @author Sunita Sarawagi * @since 1.3 * @version 1.3 */ package iitb.Model; import java.util.HashSet; import java.util.StringTokenizer; public class CompleteModelRestricted extends GenericModel { /** * */ private static final long serialVersionUID = 3151215795713987849L; public CompleteModelRestricted(String spec, int numLabels) throws Exception { super(numLabels,0); StringTokenizer tokens = new StringTokenizer(spec,":"); tokens.nextToken(); // this is the name of the model. HashSet<Edge> followEdges = new HashSet<Edge>(); HashSet<Integer> followLabels = new HashSet<Integer>(); int startLabel=-1; while (tokens.hasMoreTokens()) { int parent = Integer.parseInt(tokens.nextToken()); int child = Integer.parseInt(tokens.nextToken()); if (parent >= 0) { followEdges.add(new Edge(parent,child)); followLabels.add(child); } else { startLabel = child; } } _edges = new Edge[numLabels*numLabels-followEdges.size()*(numLabels-2)-((startLabel>=0)?1:0)*(numLabels-1)]; startStates = new int[numLabels-followEdges.size()]; for (int i = 0, st = 0; i < numLabels; i++) { if (!followLabels.contains(i)) startStates[st++] = i; } endStates = new int[numLabels]; for (int i = 0; i < endStates.length; i++) { endStates[i] = i; } edgeStart = new int[numLabels]; for (int i = 0, edgeNum=0; i < numLabels; i++) { edgeStart[i] = edgeNum; for (int j = 0; j < numLabels; j++) { if ((j==startLabel) && (i != j)) continue; Edge edge = new Edge(i,j); if ((i != j) && followLabels.contains(j) && !followEdges.contains(edge)) { continue; } _edges[edgeNum++] = edge; } } } }