Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Class: Node
- # Description: Contains relevant information related to node
- # Generates conditional probability distribution table
- # Generates dot schema
- class Node
- attr_reader :parents
- attr_accessor :label, :values, :id
- def initialize
- @label = nil
- @parents = []
- @values = []
- end
- def add_parent(parent)
- @parents << parent
- end
- #generate conditional probability distribution table
- def cpd
- cpd = []
- labels = @values.map{|i| i.strip }
- cpd << [0.0] * @values.length
- @parents.reverse.each do |parent|
- tmp = []
- labels = [parent.label] + labels
- parent.values.each do |val|
- tmp = tmp + Array.new(cpd).map{|i| [val.strip] + i}
- end
- cpd = tmp
- end
- cpd = [labels] + cpd
- return cpd
- end
- def get_dot
- self.id.to_s + " [shape=none, margin=0, label=<" + get_dot_table + '>]'
- end
- private
- def get_dot_table
- table = cpd
- output= '<TABLE>' + "\n"
- output = output + '<TR><TD COLSPAN="' + table.first.length.to_s + '">' + label + '</TD></TR>' + "\n"
- table.each do |row|
- output = output + '<TR>' + row.map{|i| "<TD>#{i}</TD>"}.join() + '</TR>' + "\n"
- end
- output = output + '</TABLE>'
- end
- end
- #Helper method to convert string to label
- def get_label(text)
- text.strip
- end
- ids=['A','B','C','D','E','F','G','H']
- nodes = {}
- read_edge = false
- #open file
- File.open(ARGV[0]).each do |line|
- line = line.to_s.chomp.strip
- next unless line.length > 0
- #check if we are reading edges or nodes
- read_edge = true if !read_edge and line.downcase == "#edges"
- #read edge
- if read_edge
- tokens = line.split('->').reverse
- (0..tokens.length-2).each do |index|
- child = nodes[get_label tokens[index]]
- parent = nodes[get_label tokens[index+1]]
- if child and parent
- child.add_parent(parent)
- elsif !child
- puts "ERROR: MISSING #{tokens[index]}"
- exit
- elsif !parent
- puts "ERROR: MISSING #{tokens[index]}"
- exit
- end
- end
- # read nodes
- else
- node = Node.new
- tokens = line.split(',')
- node.label = get_label(tokens.shift)
- node.values = tokens
- node.id = ids[nodes.length]
- nodes[node.label] = node
- end
- end
- #Generate dot notation
- puts "digraph g{\n"
- nodes.each do |key, value|
- value.parents.each do |parent|
- puts parent.id + " -> " + value.id
- end
- end
- nodes.each do |key, value|
- puts value.get_dot
- end
- puts "}"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement