class NEAT::Graph::DependencyResolver

Create an instantiation of this and pass it a list of nodes to resolve.

Public Class Methods

[](*outs) click to toggle source

Create a DependencyResolver from either an array of outputs or a parameter list of outputs.

# File lib/rubyneat/graph.rb, line 48
def self.[](*outs)
  outs = outs.first if outs.first.kind_of? Array
  DependencyResolver.new outs
end
new(outputs, &block) click to toggle source

Given a list of output nodes, we shall work backwards from them to resolve their dependencies.

Calls superclass method
# File lib/rubyneat/graph.rb, line 40
def initialize(outputs, &block)
  @outputs = outputs
  super
  block.(self) unless block.nil?
end

Public Instance Methods

resolve() click to toggle source

Resolve dependencies, and return [dependency_list, circular_ref_node_list] Note that circular_ref_node_list shall be nil if there are no dependencies!

# File lib/rubyneat/graph.rb, line 56
def resolve
  @resolved = []
  @unresolved = []
  @circular = []
  @outputs.each do |onode|
    rdep onode
  end
  [@resolved, @circular.empty? ? nil : @circular]
end
resolve!() click to toggle source

Throw an exception if dependencies are found. We only return the dependency list since we throw an exception on circular dependencies.

# File lib/rubyneat/graph.rb, line 69
def resolve!
  dl, cl = resolve
  raise GraphException("Circular Dependency Detected: %s" % cl) unless cl.nil?
  dl
end

Private Instance Methods

rdep(node) click to toggle source

recursive resolution of nodes

# File lib/rubyneat/graph.rb, line 77
def rdep(node)
  @unresolved << node
  node.inputs.each { |inode|
    if not @resolved.member? inode
      unless @unresolved.member? inode
        rdep inode
      else
        # we found a circular reference.
        @circular << inode
        #log.warn "Dependency found: %s" % inode
      end
    end
  }
  @resolved << node
  @unresolved.delete node
end