Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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