class Petrinet::PnmlBuilder
Public Class Methods
new(xml)
click to toggle source
# File lib/petrinet/pnml_builder.rb, line 5 def initialize(xml) @xml = xml end
Public Instance Methods
net()
click to toggle source
# File lib/petrinet/pnml_builder.rb, line 9 def net doc = Nokogiri::XML(@xml) transition_by_id = {} place_by_id = {} edges = [] transitions = Hash.new {|h, k| h[k] = {take: [], give: []}} markings = Hash.new # https://github.com/bitwrap/bitwrap-io/blob/master/bitwrap_io/machine/pnml.py#L216 doc.xpath('//place').each do |place_node| place_id = place_node[:id].to_sym initial_marking_nodes = place_node.xpath('initialMarking/value/text()') initial_marking = initial_marking_nodes.empty? ? 0 : initial_marking_nodes[0].text.split(',')[1].to_i # place = Place.new(initial_marking) # place_by_id[place_id] = place # TODO: Remove markings[place_id] = initial_marking end doc.xpath('//transition').each do |transition_node| transition_id = transition_node[:id].to_sym # transition = Transition.new # transition_by_id[transition_id] = transition # TODO: Remove transitions[transition_id] end doc.xpath('//arc').each do |arc_node| source_id = arc_node[:source].to_sym target_id = arc_node[:target].to_sym # edge = Edge.new(source_id, target_id) # edges.push(edge) if transitions.has_key?(source_id) transition_name = source_id place_name = target_id transitions[transition_name][:give] << place_name elsif transitions.has_key?(target_id) transition_name = target_id place_name = source_id transitions[transition_name][:take] << place_name else raise "Unknown transition name in one of: #{source_id} -> #{target_id}" end end net = Net.build do |b| transitions.each do |transition_name, places| b.transition(transition_name, take: places[:take], give: places[:give]) end end net.mark(markings) end