def parse_fsm_file(fsm_file,prefix4states=''): with open(fsm_file,'r') as reader: lines=[l.strip() for l in reader] index = 0 num_startings = int(lines[index]) index+=1 startings = [] for _ in range(num_startings): startings+=[prefix4states+lines[index]] index+=1 num_endings = int(lines[index]) index+=1 endings = [] for _ in range(num_endings): endings+=[prefix4states+lines[index]] index+=1 num_edges = int(lines[index]) index+=1 edges=[] for _ in range(num_edges): source,dest,label = lines[index].split() index+=1 edges+=[(prefix4states+source,prefix4states+dest,label)] return StandardAutomata(startings,edges,endings)
def extending_ending_states(fsm, ending_methods): startings = set(fsm.startings) endings = set(fsm.endings) edges = set(fsm.transitions) for (source, dest, label) in fsm.transitions: if label in ending_methods: for end in endings: edges.add((dest, end, lib.ending_char())) return StandardAutomata(startings, edges, endings)
def make_fsm(startings, endings, edges, id2cluster, generated_traces): log = {} for one_trace in generated_traces: previous_cluster = None previous_label = None previous_prob_id = None for (prob_id, word) in one_trace: if prob_id not in id2cluster or id2cluster[prob_id] == -1: print( "Skipping due to missing prob_id in id-to-cluster mapping") continue cluster_name = id2cluster[prob_id] if is_constructor(word): cluster_name = 'CSTART' # if word == ending_char(): # cluster_name = ending_cluster() if previous_cluster is not None: edges.add((previous_cluster, cluster_name, previous_label)) the_edge = (previous_cluster, cluster_name, previous_label) if the_edge not in log: log[the_edge] = set() log[the_edge].add((str(previous_prob_id) if previous_prob_id is not None else 'None', str(prob_id))) else: startings.add(cluster_name) previous_cluster = cluster_name previous_label = word previous_prob_id = prob_id ### if previous_label == ending_char(): edges.add((previous_cluster, ending_cluster(), previous_label)) return StandardAutomata(startings, edges, endings), log
def create_fsm(id2cluster, generated_traces): startings = set() endings = set() edges = set() endings.add(ending_cluster()) log = {} for one_trace in generated_traces: previous_cluster = None previous_label = None previous_prob_id = None for (prob_id, word) in one_trace: cluster_name = id2cluster[prob_id] if is_constructor(word): cluster_name = 'CSTART' # if word == ending_char(): # cluster_name = ending_cluster() if previous_cluster is not None: edges.add((previous_cluster, cluster_name, previous_label)) the_edge = (previous_cluster, cluster_name, previous_label) if the_edge not in log: log[the_edge] = set() log[the_edge].add((str(previous_prob_id) if previous_prob_id is not None else 'None', str(prob_id))) else: startings.add(cluster_name) previous_cluster = cluster_name previous_label = word previous_prob_id = prob_id ### if previous_label == ending_char(): edges.add((previous_cluster, ending_cluster(), previous_label)) return StandardAutomata(startings, edges, endings), log