class Bayesnet::Node

Attributes

factor[R]
name[R]
parent_nodes[R]

Public Class Methods

new(name, parent_nodes) click to toggle source
# File lib/bayesnet/node.rb, line 5
def initialize(name, parent_nodes)
  @name = name
  @parent_nodes = parent_nodes
  @values = []
end

Public Instance Methods

as(distribution, given:) click to toggle source
# File lib/bayesnet/node.rb, line 54
def as(distribution, given:)
  @values.zip(distribution).each do |value, probability|
    @factor.val [value] + given + [probability]
  end
end
distributions(&block) click to toggle source
# File lib/bayesnet/node.rb, line 46
def distributions(&block)
  instance_eval(&block)
end
parameters() click to toggle source
# File lib/bayesnet/node.rb, line 50
def parameters
  (values.size - 1) * parent_nodes.values.reduce(1) { |mul, n| mul * n.values.size }
end
resolve_factor(parent_nodes) click to toggle source
# File lib/bayesnet/node.rb, line 31
def resolve_factor(parent_nodes)
  @parent_nodes = parent_nodes
  if @factor.is_a?(Proc)
    proc = @factor
    node = self
    @factor = Factor.build do
      scope node.name => node.values
      node.parent_nodes.each do |parent_node_name, parent_node|
        scope parent_node_name => parent_node.values
      end
    end
    instance_eval(&proc)
  end
end
values(hash_or_array = nil, &block) click to toggle source
# File lib/bayesnet/node.rb, line 11
def values(hash_or_array = nil, &block)
  case hash_or_array
  when NilClass
    @values
  when Hash
    @values = hash_or_array.keys
    node = self
    @factor = Factor.build do
      scope node.name => node.values
      hash_or_array.each do |value, probability|
        val [value, probability]
      end
    end
  when Array
    raise Error, "DSL error, #values requires a &block when first argument is an Array" unless block
    @values = hash_or_array
    @factor = block
  end
end