#!/usr/bin/python # -*- coding: iso-8859-15 -*- import sys; import getopt; import random; import math; opts={ '-n': 10, '-d': 0.5, '-a': "abcde", '-f': -1, '-g': -1, '-s': 1234 } if len(sys.argv)==1: print "Uso: ", sys.argv[0], "[-n num_nodos][-d densidad][-a alfabeto]" print "\t\t\t[-s semilla][-f fichero-salida][-g fichero_DOT]" print print "Genera un autómata para el algoritmo de Viterbi" print print "- Los valores por defecto son num_nodos=10 densidad=0.5 y alfabeto=abcde" print "- En fichero_salida se guarda el fichero en el formato definido en el enunciado" print " de la práctica" print "- En fichero_DOT se guarda una descripcion del autómata en formato DOT, que" print " puede ser utilizada para generar una representación gráfica por medio del" print " programa dot, incluído en el paquete Graphviz" print " (http://www.research.att.com/sw/tools/graphviz/)" sys.exit(0) [args, resto]=getopt.getopt(sys.argv[1:], "a:d:n:f:g:s:") for (k,v) in args: opts[k]=v; nnodos=int(opts['-n']) densidad=float(opts['-d']) alfabeto=opts['-a'] random.seed(int(opts['-s'])) if (opts['-f']==-1): outfile=sys.stdout; else: outfile=open(opts['-f'], "w") uso_logaritmos = False aristas=[ {} for i in range(0,nnodos+1)] for origen in range(1,nnodos): # ponia nnodos+1, el ultimo lo hacemos sumidero suma=0; for i in range(int(nnodos*densidad)): etiq=random.choice(alfabeto) dest=random.randint(1, nnodos) prob=random.random() #primero asignamos pesos aleatorios try: aristas[origen][(dest, etiq)] += prob except KeyError: aristas[origen][(dest, etiq)] = prob suma += prob # ... y luego las normalizamos para que sumen 1.0 (mas o menos ;-) for e in aristas[origen]: aristas[origen][e] /= suma if uso_logaritmos: aristas[origen][e] = math.log(aristas[origen][e]) #print "----------------------" outfile.write("%s\n%d\n" % (alfabeto,nnodos)) for origen in range(1,nnodos+1): for (dest, etiq) in aristas[origen]: outfile.write("%d %d %s %f\n" % (origen, dest, etiq, aristas[origen][(dest,etiq)])) if opts['-g']!= -1: graph=open(opts['-g'], "w") graph.write("digraph {\nrankdir=LR;\nnode [shape = circle];\n") for i in range(1,nnodos): graph.write("q%d;\n" % i) graph.write("node [shape = doublecircle];\n") graph.write("q%d;\n" % nnodos) graph.write("node [style = invis];\n") graph.write("\"\" -> q1\n") for orig in range(1, nnodos+1): for (dest, etiq) in aristas[orig]: graph.write("q%d -> q%d [label=\"%s / %f\"]\n" % (orig, dest, etiq, aristas[orig][(dest,etiq)])) graph.write("}") graph.close() outfile.close()