#!/usr/bin/python import sys import RDF model = RDF.Model() parser = RDF.Parser(name="guess") if len(sys.argv) != 2: print "Usage: machina2dot FILE" sys.exit(-1) parser.parse_into_model(model, "file:" + sys.argv[1]) print """ digraph finite_state_machine { rankdir=LR; { node [ shape = doublecircle ]; """, written_nodes = {} node_durations = {} invis_id = 0; # Initial selectors initial_selectors_query = RDF.SPARQLQuery(""" PREFIX machina: SELECT DISTINCT ?n ?dur ?note WHERE { ?m machina:initialNode ?n . ?n a machina:SelectorNode ; machina:duration ?dur . OPTIONAL { ?n machina:enterAction ?a . ?a machina:midiNote ?note } } """) for result in initial_selectors_query.execute(model): node_id = result['n'].blank_identifier duration = float(result['dur'].literal_value['string']) written_nodes[node_id] = True; node_durations[node_id] = duration print "\t{ node [ style = invis ] ", print "invis%d" % invis_id, " }" label = "d=%.1f" % duration if result['note']: label += "\\nn=%s" % result['note'].literal_value['string'] print '\t', node_id, "[ label=\"%s\" ]" % label print '\t', "invis%d" % invis_id, " -> ", node_id invis_id += 1 print """ } { node [ shape = circle ]; """ # Initial non-selectors initial_nodes_query = RDF.SPARQLQuery(""" PREFIX machina: SELECT DISTINCT ?n ?dur ?note WHERE { ?m machina:initialNode ?n . ?n a machina:Node ; machina:duration ?dur . OPTIONAL { ?n machina:enterAction ?a . ?a machina:midiNote ?note } } """) for result in initial_nodes_query.execute(model): node_id = result['n'].blank_identifier duration = float(result['dur'].literal_value['string']) if written_nodes.has_key(node_id): continue written_nodes[node_id] = True; node_durations[node_id] = duration print "\t{ node [ style = invis ] ", print "invis%d" % invis_id, " }" label = "d=%.1f" % duration if result['note']: label += "\\nn=%s" % result['note'].literal_value['string'] print '\t', node_id, "[ label=\"%s\" ]" % label print '\t', "invis%d" % invis_id, " -> ", node_id invis_id += 1 # Non-initial selectors print """ } { node [ shape = doublecircle ]; """ selectors_query = RDF.SPARQLQuery(""" PREFIX machina: SELECT DISTINCT ?n ?dur ?note WHERE { ?m machina:node ?n . ?n a machina:SelectorNode ; machina:duration ?dur . OPTIONAL { ?n machina:enterAction ?a . ?a machina:midiNote ?note } } """) for result in selectors_query.execute(model): node_id = result['n'].blank_identifier duration = float(result['dur'].literal_value['string']) if written_nodes.has_key(node_id): continue node_durations[node_id] = duration label = "d=%.1f" % duration if result['note']: label += "\\nn=%s" % result['note'].literal_value['string'] print '\t', node_id, "[ label=\"%s\" ]" % label # Non-initial non-selectors print """ } { node [ shape = circle ]; """ nodes_query = RDF.SPARQLQuery(""" PREFIX machina: SELECT DISTINCT ?n ?dur ?note WHERE { ?m machina:node ?n . ?n a machina:Node ; machina:duration ?dur . OPTIONAL { ?n machina:enterAction ?a . ?a machina:midiNote ?note } } """) for result in nodes_query.execute(model): node_id = result['n'].blank_identifier duration = float(result['dur'].literal_value['string']) if written_nodes.has_key(node_id): continue node_durations[node_id] = duration label = "d=%.1f" % duration if result['note']: label += "\\nn=%s" % result['note'].literal_value['string'] print '\t', node_id, "[ label=\"%s\" ]" % label # Edges edge_query = RDF.SPARQLQuery(""" PREFIX machina: SELECT DISTINCT ?tail ?head ?prob WHERE { ?e a machina:Edge ; machina:tail ?tail ; machina:head ?head ; machina:probability ?prob . } """) for edge in edge_query.execute(model): print '\t', edge['tail'].blank_identifier, ' -> ', print edge['head'].blank_identifier, ' ', print "[ label = \"%1.2f\"" % float(edge['prob'].literal_value['string']), print "minlen = ", node_durations[edge['tail'].blank_identifier]+0.1, " ];" print """ } }"""