{~:	rooto:"YARD::CodeObjects::RootObject:@childrenIC:&YARD::CodeObjects::CodeObjectList[o:$YARD::CodeObjects::ModuleObject;IC;[o;	;IC;[o:$YARD::CodeObjects::MethodObject:@module_functionF:@scope:
instance:@visibility:public:
@pathI"NEAT::DSL#define:EF:@parameters[[I"	name;TI"NEAT.random_name_generator;T[I"█T0:@files[[I"lib/rubyneat/dsl.rb;Ti:@current_file_has_commentsT:
@name:define:@source_type:	ruby:
@tags[�:@docstrings{�:@docstringIC:YARD::Docstring"<DSL -- Define defines the parameters to the controller.
;T:@ref_tags[�;[�:	@allI"<DSL -- Define defines the parameters to the controller.;T:@unresolved_reference0:@object@:@hash_flagF:@line_rangeo:
Range:	exclF:
begini:endi:@namespace@
:@signatureI":def define(name = NEAT.random_name_generator, &block);T:@explicitT:@sourceI"�def define(name = NEAT.random_name_generator, &block)
  [
   :inputs,
   :outputs,
   :hidden  # we really don't care about mapping hidden neurons, but we'll ignore them later.
  ].each do |iometh|
    instance_eval %Q[
   def #{iometh}(nodes = nil, &block)
 neui = unless nodes.nil?
          nodes
        else
          block.()
        end
 NEAT::controller.neural_#{iometh} = if neui.kind_of? Hash
                                       neui
                                     else
                                       Hash[neui.map{|n| [NEAT::random_name_generator, n]}]
                                     end
   end]
  end
  block.(NEAT::controller)
end;T:
@dynamicTo;
;F;;
;;;I"NEAT::DSL#evolve;F;[[I"&block;T0;[[@i,;T;:evolve;;;[�;{�;IC;"DSL -- Run evolution
;T;[�;[�;I"DSL -- Run evolution;T;0; @ ;!F;"o;#;$F;%i+;&i+;'@
;(I"def evolve(&block);T;)T;*I";def evolve(&block)
  # Query function is called with the sequence (time evolution) number,
  # and returns an array or hash of parameters that will be given
  # to the input nodes. In the case of hash, the keys in the hash
  # shall correspond to the names given to the input neurons.
  def query(&block)
    NEAT::controller.query_func = block
  end

  def recurrence(&block)
    NEAT::controller.recurrence_func = block
  end

  # fitness function calls the block with 2 vectors or two hashes, input and output
  # vectors of the critter being evaluated for fitness, as well as a sequence
  # number that can be used to index what the actual output should be.
  # |vin, vout, seq|
  def fitness(&block)
    NEAT::controller.fitness_func = block
  end

  # Fitness ordering -- given 2 fitness numbers,
  # use the <=> to compare them (or the equivalent, following
  # the +1, 0, -1 that is in the sense of <=>)
  def compare(&block)
    NEAT::controller.compare_func = block
  end

  # Calculation to add the cost to the fitness, resulting in a fitness
  # that incorporates the cost for sorting purposes.
  def cost(&block)
    NEAT::controller.cost_func = block
  end

  # Stop the progression once the fitness criteria is reached
  # for the most fit critter
  def stop_on_fitness(&block)
    NEAT::controller.stop_on_fit_func = block
  end

  # Helper function to
  # Condition boolean vectors to be +1 if true, -1 if false (0 if sigmoid)
  def condition_boolean_vector(vec, sig = :tanh)
    vec.map{|b| b ? 1 : ((sig == :sigmoid) ? 0 : -1)}
  end

  # Helper function to
  # Uncondition boolean vectors to be +1 if true, -1 if false
  # FIXME we need a better discrimination function
  def uncondition_boolean_vector(vec, sig = :tanh)
    vec.map{|o| o > ((sig == :sigmoid) ? 0.5 : 0) ? true : false}
  end

  # Helper function to do a simple fitness calculation
  # on the basis of the sum of the square of the diffences
  # of the element in the two vectors.
  def simple_fitness_error(v1, v2)
    sqrt v1.zip(v2).map{|a, b| (a - b) ** 2.0}.reduce{|m, c| m + c}
  end

  block.(NEAT::controller)
end;T;+To;
;F;;
;;;I"NEAT::DSL#query;F;[[I"&block;T0;[[@i1;T;:
query;;;[�;{�;IC;"�Query function is called with the sequence (time evolution) number,
and returns an array or hash of parameters that will be given
to the input nodes. In the case of hash, the keys in the hash
shall correspond to the names given to the input neurons.
;T;[�;[�;I"�Query function is called with the sequence (time evolution) number,
and returns an array or hash of parameters that will be given
to the input nodes. In the case of hash, the keys in the hash
shall correspond to the names given to the input neurons.;T;0; @0;!F;"o;#;$F;%i-;&i0;'@
;(I"def query(&block);T;)T;*I"@def query(&block)
  NEAT::controller.query_func = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#recurrence;F;[[I"&block;T0;[[@i5;F;:recurrence;;;[�;{�;IC;"�
;T; @@:
@summary0;!F;[�;[�;I"�;T;0;'@
;(I"def recurrence(&block);T;)T;*I"Jdef recurrence(&block)
  NEAT::controller.recurrence_func = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#fitness;F;[[I"&block;T0;[[@i=;T;:fitness;;;[�;{�;IC;"�fitness function calls the block with 2 vectors or two hashes, input and output
vectors of the critter being evaluated for fitness, as well as a sequence
number that can be used to index what the actual output should be.
|vin, vout, seq|
;T;[�;[�;I"�fitness function calls the block with 2 vectors or two hashes, input and output
vectors of the critter being evaluated for fitness, as well as a sequence
number that can be used to index what the actual output should be.
|vin, vout, seq|;T;0; @O;!F;"o;#;$F;%i9;&i<;'@
;(I"def fitness(&block);T;)T;*I"Ddef fitness(&block)
  NEAT::controller.fitness_func = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#compare;F;[[I"&block;T0;[[@iD;T;:compare;;;[�;{�;IC;"�Fitness ordering -- given 2 fitness numbers,
use the <=> to compare them (or the equivalent, following
the +1, 0, -1 that is in the sense of <=>)
;T;[�;[�;I"�Fitness ordering -- given 2 fitness numbers,
use the <=> to compare them (or the equivalent, following
the +1, 0, -1 that is in the sense of <=>);T;0; @_;!F;"o;#;$F;%iA;&iC;'@
;(I"def compare(&block);T;)T;*I"Ddef compare(&block)
  NEAT::controller.compare_func = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#cost;F;[[I"&block;T0;[[@iJ;T;:	cost;;;[�;{�;IC;"xCalculation to add the cost to the fitness, resulting in a fitness
that incorporates the cost for sorting purposes.
;T;[�;[�;I"xCalculation to add the cost to the fitness, resulting in a fitness
that incorporates the cost for sorting purposes.;T;0; @o;!F;"o;#;$F;%iH;&iI;'@
;(I"def cost(&block);T;)T;*I">def cost(&block)
  NEAT::controller.cost_func = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#stop_on_fitness;F;[[I"&block;T0;[[@iP;T;:stop_on_fitness;;;[�;{�;IC;"WStop the progression once the fitness criteria is reached
for the most fit critter
;T;[�;[�;I"WStop the progression once the fitness criteria is reached
for the most fit critter;T;0; @;!F;"o;#;$F;%iN;&iO;'@
;(I" def stop_on_fitness(&block);T;)T;*I"Pdef stop_on_fitness(&block)
  NEAT::controller.stop_on_fit_func = block
end;T;+To;
;F;;
;;;I"'NEAT::DSL#condition_boolean_vector;F;[[I"vec;T0[I"sig;TI"
:tanh;T;[[@iV;T;:condition_boolean_vector;;;[�;{�;IC;"^Helper function to
Condition boolean vectors to be +1 if true, -1 if false (0 if sigmoid)
;T;[�;[�;I"^Helper function to
Condition boolean vectors to be +1 if true, -1 if false (0 if sigmoid);T;0; @�;!F;"o;#;$F;%iT;&iU;'@
;(I"3def condition_boolean_vector(vec, sig = :tanh);T;)T;*I"kdef condition_boolean_vector(vec, sig = :tanh)
  vec.map{|b| b ? 1 : ((sig == :sigmoid) ? 0 : -1)}
end;T;+To;
;F;;
;;;I")NEAT::DSL#uncondition_boolean_vector;F;[[I"vec;T0[I"sig;TI"
:tanh;T;[[@i];T;:uncondition_boolean_vector;;;[�;{�;IC;"{Helper function to
Uncondition boolean vectors to be +1 if true, -1 if false
FIXME we need a better discrimination function
;T;[�;[�;I"{Helper function to
Uncondition boolean vectors to be +1 if true, -1 if false
FIXME we need a better discrimination function;T;0; @�;!F;"o;#;$F;%iZ;&i\;'@
;(I"5def uncondition_boolean_vector(vec, sig = :tanh);T;)T;*I"ydef uncondition_boolean_vector(vec, sig = :tanh)
  vec.map{|o| o > ((sig == :sigmoid) ? 0.5 : 0) ? true : false}
end;T;+To;
;F;;
;;;I"#NEAT::DSL#simple_fitness_error;F;[[I"v1;T0[I"v2;T0;[[@id;T;:simple_fitness_error;;;[�;{�;IC;"�Helper function to do a simple fitness calculation
on the basis of the sum of the square of the diffences
of the element in the two vectors.
;T;[�;[�;I"�Helper function to do a simple fitness calculation
on the basis of the sum of the square of the diffences
of the element in the two vectors.;T;0; @�;!F;"o;#;$F;%ia;&ic;'@
;(I"%def simple_fitness_error(v1, v2);T;)T;*I"kdef simple_fitness_error(v1, v2)
  sqrt v1.zip(v2).map{|a, b| (a - b) ** 2.0}.reduce{|m, c| m + c}
end;T;+To;
;F;;
;;;I"NEAT::DSL#report;F;[[I"&block;T0;[[@il;T;:report;;;[�;{�;IC;"Report on evaluations
;T;[�;[�;I"Report on evaluations;T;0; @�;!F;"o;#;$F;%ik;&ik;'@
;(I"def report(&block);T;)T;*I"Bdef report(&block)
  NEAT::controller.report_hook = block
end;T;+To;
;F;;
;;;I"NEAT::DSL#run_engine;F;[[I"&block;T0;[[@iq;T;:run_engine;;;[�;{�;IC;"<Run the engine. The block is called on each generation.
;T;[�;[�;I"<Run the engine. The block is called on each generation.;T;0; @�;!F;"o;#;$F;%ip;&ip;'@
;(I"def run_engine(&block);T;)T;*I"^def run_engine(&block)
  NEAT::controller.end_run_func = block
  NEAT::controller.run
end;T;+To;
;F;;
;;;I"NEAT::DSL#method_missing;F;[[I"m;T0[I"
*args;T0[I"&block;T0;[[@iw;T;:method_missing;;;[�;{�;IC;"3This is used to handle the details of our DSL.
;T;[�;[�;I"3This is used to handle the details of our DSL.;T;0; @�;!F;"o;#;$F;%iv;&iv;'@
;(I")def method_missing(m, *args, &block);T;)T;*I"�def method_missing(m, *args, &block)
  # we want to catch parameters settings here.
  if NEAT::controller.parms.respond_to? (assignment = (m.to_s + '=').to_sym)
    raise NeatException.new("Missing value(s) to %s" % m) if args.empty?
    val = (args.size == 1) ? args[0] : args
    $log.debug { "Caught method %s with parameter of %s" % [assignment, val] }
    NEAT::controller.parms.send(assignment, val)
  else
    super
  end
end;T;+T:@owner@
:@class_mixinsIC;[�;:@
:@instance_mixinsIC;[o:YARD::CodeObjects::Proxy:
@imethod0:@origname0:@orignamespace0;:	Math;'@
:	@obj0:
@type:moduleo;=;>0;?I"NEAT::BasicNeuronTypes;T;@@
;:BasicNeuronTypes;'@;Bo;	;IC;[o:#YARD::CodeObjects::ClassObject;IC;[o;
;F;:
class;;;I"/NEAT::BasicNeuronTypes::InputNeuron.input?;F;[�;[[I"lib/rubyneat/neuron.rb;TiQ;F;:input?;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o:YARD::Tags::Tag
:@tag_nameI"return;F:
@textI"�;T;0:@types[I"Boolean;T; @�;I"�;T;0;'@�;(I"!def self.input? ; true ; end;T;)T;*I"!def self.input? ; true ; end;T;+To;
;F;;
;;;I"0NEAT::BasicNeuronTypes::InputNeuron#express;F;[[I"
instance;T0;[[@iT;T;:express;;;[�;{�;IC;".Takes a single input and passes it as is.
;T;[�;[�;I".Takes a single input and passes it as is.;T;0; @;!F;"o;#;$F;%iS;&iS;'@�;(I"def express(instance);T;)T;*I"_def express(instance)
  instance.define_singleton_method(@name) {|input|
    input
  }
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�:@attributesIC:SymbolHash{;GIC;O{�:@symbolize_valueT;
IC;O{�;PT;PT:
@aliases{�:@groups[�;[[@iP;T;:InputNeuron;;;;;[�;{�;IC;"�= Special class of Neuron that takes input from the "real world"
Name of this neuron equates to the parameter name of the input.

All inputs are handled with this neuron. This type of 
neuron only has one input -- from the outside world.
;T;[�;[�;I"�= Special class of Neuron that takes input from the "real world"
Name of this neuron equates to the parameter name of the input.

All inputs are handled with this neuron. This type of 
neuron only has one input -- from the outside world.;T;0; @�;!F;"o;#;$F;%iK;&iO;'@�;I"(NEAT::BasicNeuronTypes::InputNeuron;F:@superclasso;=;>0;?I"NEAT::Neuron;T;@@�;:Neuron;'@;Bo;F;IC;[o;
;F;;
;;;I"NEAT::Neuron#genotype;F;[�;[[@i;T;:
genotype;;;[�;{�;IC;" Genotype to which we belong
;T;[�;[�;I" Genotype to which we belong;T;0; @7;!F;"o;#;$F;%i;&i;'@5;(I"def genotype;T;*I"!def genotype
  @genotype
end;T;+To;
;F;;
;;;I"NEAT::Neuron#trait;F;[�;[[@i;F;:
trait;;;[�;{�;IC;")Returns the value of attribute trait
;T; @E;/0;!F;[�;[�;I")Returns the value of attribute trait;T;0;'@5;(I"def trait;T;*I"def trait
  @trait
end;T;+To;
;F;;
;;;I"NEAT::Neuron#trait=;F;[[I"
value;T0;[[@i;F;:trait=;;;[�;{�;IC;"Sets the attribute trait
;T; @R;/0;!F;[�;[o;I
;JI"
param;F;KI"-the value to set the attribute trait to.;T;I"
value;T;L0; @R;I"SSets the attribute trait
@param value the value to set the attribute trait to.;T;0;'@5;(I"def trait=(value);T;*I"+def trait=(value)
  @trait = value
end;T;+To;
;F;;
;;;I""NEAT::Neuron#heirarchy_number;F;[�;[[@i;T;:heirarchy_number;;;[�;{�;IC;"�(assigned by wire!) Heirarchy number in the Genome / Critter
We need this to assure we add genes in the proper order.
This will be recalculated every time a new neuron is added.
;T;[�;[�;I"�(assigned by wire!) Heirarchy number in the Genome / Critter
We need this to assure we add genes in the proper order.
This will be recalculated every time a new neuron is added.;T;0; @e;!F;"o;#;$F;%i;&i;'@5;(I"def heirarchy_number;T;*I"1def heirarchy_number
  @heirarchy_number
end;T;+To;
;F;;
;;;I"#NEAT::Neuron#heirarchy_number=;F;[[I"
value;T0;[[@i;T;:heirarchy_number=;;;[�;{�;IC;"�(assigned by wire!) Heirarchy number in the Genome / Critter
We need this to assure we add genes in the proper order.
This will be recalculated every time a new neuron is added.
;T;[�;[�;@o;0; @s;!F;"@p;'@5;(I"!def heirarchy_number=(value);T;*I"Adef heirarchy_number=(value)
  @heirarchy_number = value
end;T;+To;
;F;;
;;;I"NEAT::Neuron#output;F;[�;[[@i!;T;:output;;;[�;{�;IC;".This is true if this is an output neuron.
;T;[�;[�;I".This is true if this is an output neuron.;T;0; @�;!F;"o;#;$F;%i ;&i ;'@5;(I"def output;T;*I"def output
  @output
end;T;+To;
;F;;
;;;I"NEAT::Neuron#output=;F;[[I"
value;T0;[[@i!;T;:output=;;;[�;{�;IC;".This is true if this is an output neuron.
;T;[�;[�;@�;0; @�;!F;"@�;'@5;(I"def output=(value);T;*I"-def output=(value)
  @output = value
end;T;+To:+YARD::CodeObjects::ClassVariableObject;[[@i$;T;:@@neuron_types;;;;;[�;{�;IC;""List of neuron types defined.
;T;[�;[�;I""List of neuron types defined.;T;0; @�;!F;"o;#;$F;%i#;&i#;'@5;I"!NEAT::Neuron::@@neuron_types;F;(I"@@neuron_types = [];T;*I"@@neuron_types = [];T:@valueI"[];T;+To;
;F;;G;;;I"NEAT::Neuron.input?;F;[�;[[@i';T;;H;;;[�;{�;IC;"Class is is of Input type?
;T;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"Class is is of Input type?;T;0; @�;!F;"o;#;$F;%i&;&i&;'@5;(I""def self.input? ; false ; end;T;)T;*I""def self.input? ; false ; end;T;+To;
;F;;
;;;I"NEAT::Neuron#input?;F;[�;[[@i(;F;;H;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@5;(I")def input? ; self.class.input? ; end;T;)T;*I")def input? ; self.class.input? ; end;T;+To;
;F;;G;;;I"NEAT::Neuron.bias?;F;[�;[[@i*;F;:
bias?;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@5;(I"!def self.bias? ; false ; end;T;)T;*I"!def self.bias? ; false ; end;T;+To;
;F;;
;;;I"NEAT::Neuron#bias?;F;[�;[[@i+;F;;`;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@5;(I"'def bias? ; self.class.bias? ; end;T;)T;*I"'def bias? ; self.class.bias? ; end;T;+To;
;F;;
;;;I"NEAT::Neuron#output?;F;[�;[[@i.;T;:output?;;;[�;{�;IC;"%Instantiation is of outout type?
;T;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"%Instantiation is of outout type?;T;0; @�;!F;"o;#;$F;%i-;&i-;'@5;(I""def output? ; !!@output ; end;T;)T;*I""def output? ; !!@output ; end;T;+To;
;F;;G;;;I"NEAT::Neuron.inherited;F;[[I"
clazz;T0;[[@i0;F;:inherited;;;[�;{�;IC;"�
;T; @;/0;!F;[�;[o;I
;JI"private;F;K0;0;L0; @;I"�;T;0;'@5;(I"def self.inherited(clazz);T;)T;*I"<def self.inherited(clazz)
  @@neuron_types << clazz
end;T;+To;
;F;;G;;;I"NEAT::Neuron.neuron_types;F;[�;[[@i5;T;:neuron_types;;;[�;{�;IC;",List of distinct neuron types (classes)
;T;[�;[�;I",List of distinct neuron types (classes);T;0; @;!F;"o;#;$F;%i4;&i4;'@5;(I"0def self.neuron_types; @@neuron_types ; end;T;)T;*I"0def self.neuron_types; @@neuron_types ; end;T;+To;
;F;;
;;;I"NEAT::Neuron#express;F;[[I"
instance;T0;[[@i;;T;;M;;;[�;{�;IC;"�Function must be implemented by subclasses for phenotype
generation. Basically, an instance is passed to this function
and it will add a function to sum all inputs
and a apply an operator to the sum.
;T;[�;[�;I"�Function must be implemented by subclasses for phenotype
generation. Basically, an instance is passed to this function
and it will add a function to sum all inputs
and a apply an operator to the sum.;T;0; @&;!F;"o;#;$F;%i7;&i:;'@5;(I"def express(instance);T;)T;*I"edef express(instance)
  raise NeatException.new "express() must be implemented by subclass."
end;T;+T;:@5;;IC;[�;:@5;<IC;[o;=;>0;?0;@0;:
Graph;'@;Bo;	;IC;[o;F;IC;[�;:@;;;IC;[�;:@;;<IC;[�;:@;;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[I"lib/rubyneat/graph.rb;Ti;F;:GraphException;;;;;[�;{�;IC;"�
;T; @;;/0;!F;[�;[�;I"�;T;0;'@9;I" NEAT::Graph::GraphException;F;To;=;>0;?0;@0;:Exception;'@9;B0;C;G;+To;
;F;;
;;;I"NEAT::Graph#clear_graph;F;[�;[[@Fi;T;:clear_graph;;;[�;{�;IC;"$clear and initialize the graph.
;T;[�;[�;I"$clear and initialize the graph.;T;0; @O;!F;"o;#;$F;%i;&i;'@9;(I"def clear_graph;T;)T;*I")def clear_graph
  @g_inputs = []
end;T;+To;
;F;;
;;;I"NEAT::Graph#<<;F;[[I"
input;T0;[[@Fi;F;:<<;;;[�;{�;IC;"�
;T; @];/0;!F;[�;[�;I"�;T;0;'@9;(I"def << (input);T;)T;*I"3def << (input)
  @g_inputs << input
  self
end;T;+To;
;F;;
;;;I"NEAT::Graph#add;F;[[I"
input;T0;[[@Fi;T;:add;;;[�;{�;IC;"Add a single input
;T;[�;[�;I"Add a single input;T;0; @l;!F;"o;#;$F;%i;&i;'@9;(I"def add (input);T;)T;*I"-def add (input)
  @g_inputs << input
end;T;+To;
;F;;
;;;I"NEAT::Graph#inputs;F;[�;[[@Fi#;T;:inputs;;;[�;{�;IC;"Get list of inputs
;T;[�;[�;I"Get list of inputs;T;0; @|;!F;"o;#;$F;%i";&i";'@9;(I"def inputs;T;)T;*I"ldef inputs
  raise GraphException.new "Graph Failure -- input is nil" if @g_inputs.nil?
  @g_inputs
end;T;+To;F;IC;[
o;
;F;;
;;;I"/NEAT::Graph::DependencyResolver#initialize;F;[[I"outputs;T0[I"&block;T0;[[@Fi-;T;:initialize;;;[�;{�;IC;"cGiven a list of output nodes, we shall work backwards
from them to resolve their dependencies.
;T;[�;[o;I
;JI"return;F;KI")a new instance of DependencyResolver;T;0;L[I"DependencyResolver;F; @�;I"cGiven a list of output nodes, we shall work backwards
from them to resolve their dependencies.;T;0; @�;!F;"o;#;$F;%i+;&i,;'@�;(I"$def initialize(outputs, &block);T;)T;*I"fdef initialize(outputs, &block)
  @outputs = outputs
  super
  block.(self) unless block.nil?
end;T;+To;
;F;;G;;;I"'NEAT::Graph::DependencyResolver.[];F;[[I"
*outs;T0;[[@Fi5;T;:[];;;[�;{�;IC;"`Create a DependencyResolver from either
an array of outputs or a parameter list of outputs.
;T;[�;[�;I"`Create a DependencyResolver from either
an array of outputs or a parameter list of outputs.;T;0; @�;!F;"o;#;$F;%i3;&i4;'@�;(I"def self.[](*outs);T;)T;*I"jdef self.[](*outs)
  outs = outs.first if outs.first.kind_of? Array
  DependencyResolver.new outs
end;T;+To;
;F;;
;;;I",NEAT::Graph::DependencyResolver#resolve;F;[�;[[@Fi=;T;:resolve;;;[�;{�;IC;"�Resolve dependencies, and return [dependency_list, circular_ref_node_list]
Note that circular_ref_node_list shall be nil if there are no dependencies!
;T;[�;[�;I"�Resolve dependencies, and return [dependency_list, circular_ref_node_list]
Note that circular_ref_node_list shall be nil if there are no dependencies!;T;0; @�;!F;"o;#;$F;%i;;&i<;'@�;(I"def resolve;T;)T;*I"�def resolve
  @resolved = []
  @unresolved = []
  @circular = []
  @outputs.each do |onode|
    rdep onode
  end
  [@resolved, @circular.empty? ? nil : @circular]
end;T;+To;
;F;;
;;;I"-NEAT::Graph::DependencyResolver#resolve!;F;[�;[[@FiJ;T;:
resolve!;;;[�;{�;IC;"�Throw an exception if dependencies are found.
We only return the dependency list since we throw an exception on circular
dependencies.
;T;[�;[�;I"�Throw an exception if dependencies are found.
We only return the dependency list since we throw an exception on circular
dependencies.;T;0; @�;!F;"o;#;$F;%iG;&iI;'@�;(I"def resolve!;T;)T;*I"|def resolve!
  dl, cl = resolve
  raise GraphException("Circular Dependency Detected: %s" % cl) unless cl.nil?
  dl
end;T;+To;
;F;;
;:private;I")NEAT::Graph::DependencyResolver#rdep;F;[[I"	node;T0;[[@FiR;T;:	rdep;;;[�;{�;IC;""recursive resolution of nodes
;T;[�;[�;I""recursive resolution of nodes;T;0; @�;!F;"o;#;$F;%iQ;&iQ;'@�;(I"def rdep(node);T;)T;*I"fdef 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;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@Fi);T;:DependencyResolver;;;;;[�;{�;IC;"LCreate an instantiation of this and pass it a list of nodes to resolve.
;T;[�;[�;I"LCreate an instantiation of this and pass it a list of nodes to resolve.;T;0; @�;!F;"o;#;$F;%i(;&i(;'@9;I"$NEAT::Graph::DependencyResolver;F;To;=;>0;?0;@0;:NeatOb;'@;Bo;F;IC;[o;
;F;;
;;;I"NEAT::NeatOb#name;F;[�;[[I"lib/rubyneat/rubyneat.rb;Ti\;T;:	name;;;[�;{�;IC;"3Designation of this particular object instance
;T;[�;[�;I"3Designation of this particular object instance;T;0; @�;!F;"o;#;$F;%i[;&i[;'@�;(I"
def name;T;*I"def name
  @name
end;T;+To;
;F;;
;;;I"NEAT::NeatOb#controller;F;[�;[[@�i_;T;:controller;;;[�;{�;IC;"Who's your daddy?
;T;[�;[�;I"Who's your daddy?;T;0; @;!F;"o;#;$F;%i^;&i^;'@�;(I"def controller;T;*I"%def controller
  @controller
end;T;+To;
;F;;
;;;I"NEAT::NeatOb#log;F;[�;[[@�ia;F;:log;;;[�;{�;IC;"�
;T; @;/0;!F;[�;[�;I"�;T;0;'@�;(I"def log ; $log ; end;T;)T;*I"def log ; $log ; end;T;+To;
;F;;G;;;I"NEAT::NeatOb.log;F;[�;[[@�ib;F;;u;;;[�;{�;IC;"�
;T; @;/0;!F;[�;[�;I"�;T;0;'@�;(I"def self.log ; $log; end;T;)T;*I"def self.log ; $log; end;T;+To;
;F;;
;;;I"NEAT::NeatOb#initialize;F;[[I"controller;TI"nil;T[I"	name;TI"nil;T;[[@�ih;T;;k;;;[�;{�;IC;"�Initializer for all NEAT objects. Requires that
the controller object is specified for all classes
with the exception of the Controller itself or the
Controller's NeatSettings.
;T;[�;[o;I
;JI"return;F;KI"a new instance of NeatOb;T;0;L[I"NeatOb;F; @*;I"�Initializer for all NEAT objects. Requires that
the controller object is specified for all classes
with the exception of the Controller itself or the
Controller's NeatSettings.;T;0; @*;!F;"o;#;$F;%id;&ig;'@�;(I"1def initialize(controller = nil, name = nil);T;)T;*I"�def initialize(controller = nil, name = nil)
  @name = unless name.nil?
            name.to_sym
          else
            NEAT::random_name_generator
          end
  unless controller.nil?
    @controller = controller
  else
    raise NeatException.new "Controller Needed!" unless self.is_a?(Controller) or self.is_a?(Controller::NeatSettings)
    @controller = self unless self.is_a? Controller::NeatSettings
  end
end;T;+To;
;F;;
;;;I"NEAT::NeatOb#to_s;F;[�;[[@�iv;F;:	to_s;;;[�;{�;IC;"�
;T; @C;/0;!F;[�;[�;I"�;T;0;'@�;(I"
def to_s;T;)T;*I"6def to_s
  "%s<%s>" % [self.class, self.name]
end;T;+T;:@�;;IC;[�;:@�;<IC;[o;=;>0;?0;@0;:
DeepDive;'@�;B0;C;D;:@�;NIC;O{;GIC;O{�;PT;
IC;O{;sIC;O{:	read@�:
write0;PT;tIC;O{;x@;y0;PT;PT;PT;Q{�;R[�;[[@�iW;T;;r;;;;;[�;{�;IC;"Basis of all NEAT objects
;T;[�;[�;I"Basis of all NEAT objects;T;0; @�;!F;"o;#;$F;%iV;&iV;'@;I"NEAT::NeatOb;F;To;=;>0;?0;@0;:Object;'@;B0;C;G;+T;C;G;+T;:@9;;IC;[�;:@9;<IC;[�;:@9;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@Fi;T;;d;;;;;[�;{�;IC;"�General graph representation
(mainly used for Neurons, but could be used
for other structures.)

This is a mixin for Neuron and whatever else you'd like.
the contained class is for evaluation, and may be instantiated separately.
;T;[�;[�;I"�General graph representation
(mainly used for Neurons, but could be used
for other structures.)

This is a mixin for Neuron and whatever else you'd like.
the contained class is for evaluation, and may be instantiated separately.;T;0; @9;!F;"o;#;$F;%i	;&i;'@;I"NEAT::Graph;F;+T;C;Do;=;>0;?0;@0;;A;'@5;B0;C;D;:@5;NIC;O{;GIC;O{�;PT;
IC;O{	;VIC;O{;x@7;y0;PT;WIC;O{;x@E;y@R;PT;YIC;O{;x@e;y@s;PT;[IC;O{;x@�;y@�;PT;PT;PT;Q{�;R[�;[[@i;T;;U;;;;;[�;{�;IC;"�= Neuron -- Basis of all Neat Neuron types.
Normally contains primatives which aids in its
own expression, but the details of this remains to be worked out.
;T;[�;[�;I"�= Neuron -- Basis of all Neat Neuron types.
Normally contains primatives which aids in its
own expression, but the details of this remains to be worked out.;T;0; @5;!F;"o;#;$F;%i;&i;'@;I"NEAT::Neuron;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+T;C0;+To;F;IC;[
o;
;F;;G;;;I"-NEAT::BasicNeuronTypes::BiasNeuron.bias?;F;[�;[[@i_;F;;`;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@�;(I" def self.bias? ; true ; end;T;)T;*I" def self.bias? ; true ; end;T;+To;
;F;;
;;;I"0NEAT::BasicNeuronTypes::BiasNeuron#neu_bias;F;[�;[[@i`;F;:
neu_bias;;;[�;{�;IC;",Returns the value of attribute neu_bias
;T; @�;/0;!F;[�;[�;I",Returns the value of attribute neu_bias;T;0;'@�;(I"def neu_bias;T;*I"!def neu_bias
  @neu_bias
end;T;+To;
;F;;
;;;I"1NEAT::BasicNeuronTypes::BiasNeuron#neu_bias=;F;[[I"
value;T0;[[@i`;F;:neu_bias=;;;[�;{�;IC;" Sets the attribute neu_bias
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"0the value to set the attribute neu_bias to.;T;I"
value;T;L0; @�;I"YSets the attribute neu_bias
@param value the value to set the attribute neu_bias to.;T;0;'@�;(I"def neu_bias=(value);T;*I"1def neu_bias=(value)
  @neu_bias = value
end;T;+To;
;F;;
;;;I"2NEAT::BasicNeuronTypes::BiasNeuron#initialize;F;[[I"c;TI"nil;T[I"n;TI"nil;T;[[@ib;F;;k;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"!a new instance of BiasNeuron;T;0;L[I"BiasNeuron;F; @�;I"�;T;0;'@�;(I"!def initialize(c=nil, n=nil);T;)T;*I"@def initialize(c=nil, n=nil)
  super
  @neu_bias = 1.00
end;T;+To;
;F;;
;;;I"/NEAT::BasicNeuronTypes::BiasNeuron#express;F;[[I"
instance;T0;[[@ij;T;;M;;;[�;{�;IC;"�Just provides a bias signal
FIXME: we had to hard-code the value here for now. Not a biggie,
FIXME: but really should be @neu_bias
;T;[�;[�;I"�Just provides a bias signal
FIXME: we had to hard-code the value here for now. Not a biggie,
FIXME: but really should be @neu_bias;T;0; @�;!F;"o;#;$F;%ig;&ii;'@�;(I"def express(instance);T;)T;*I"Qdef express(instance)
  instance.define_singleton_method(@name) { 1.00 }
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{;{IC;O{;x@�;y@�;PT;PT;PT;Q{�;R[�;[[@i^;T;:BiasNeuron;;;;;[�;{�;IC;"�= Special class of neuron that provides a bias signal.
FIXME: The bias value is not behaving as expected because
FIXME: the instance is not the neuron, but the phenotype.
;T;[�;[�;I"�= Special class of neuron that provides a bias signal.
FIXME: The bias value is not behaving as expected because
FIXME: the instance is not the neuron, but the phenotype.;T;0; @�;!F;"o;#;$F;%i[;&i];'@�;I"'NEAT::BasicNeuronTypes::BiasNeuron;F;To;=;>0;?0;@0;;S;'@�;B@�;C0;+To;F;IC;[o;
;F;;
;;;I"2NEAT::BasicNeuronTypes::SigmoidNeuron#express;F;[[I"
instance;T0;[[@it;T;;M;;;[�;{�;IC;"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh)
;T;[�;[�;I"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh);T;0; @�;!F;"o;#;$F;%ir;&is;'@�;(I"def express(instance);T;)T;*I"�def express(instance)
  instance.define_singleton_method(@name) {|*inputs|
    1.0 / (1.0 + exp(-4.9 * inputs.reduce {|p, q| p + q}))
  }
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@iq;T;:SigmoidNeuron;;;;;[�;{�;IC;"rThe most commonly-used neuron for the hidden and output layers.
We use the Logistic Function for the Sigmoid.
;T;[�;[�;I"rThe most commonly-used neuron for the hidden and output layers.
We use the Logistic Function for the Sigmoid.;T;0; @�;!F;"o;#;$F;%io;&ip;'@�;I"*NEAT::BasicNeuronTypes::SigmoidNeuron;F;To;=;>0;?0;@0;;U;'@;B@5;C0;+To;F;IC;[o;
;F;;
;;;I"/NEAT::BasicNeuronTypes::TanhNeuron#express;F;[[I"
instance;T0;[[@i;T;;M;;;[�;{�;IC;"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh)
;T;[�;[�;I"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh);T;0; @ ;!F;"o;#;$F;%i};&i~;'@;(I"def express(instance);T;)T;*I"def express(instance)
  instance.define_singleton_method(@name) {|*inputs|
    tanh(2.4 * inputs.reduce {|p, q| p + q})
  }
end;T;+T;:@;;IC;[�;:@;<IC;[�;:@;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@i|;T;:TanhNeuron;;;;;[�;{�;IC;"9An alternative Sigmoid Function, but ranges -1 to +1
;T;[�;[�;I"9An alternative Sigmoid Function, but ranges -1 to +1;T;0; @;!F;"o;#;$F;%i{;&i{;'@�;I"'NEAT::BasicNeuronTypes::TanhNeuron;F;To;=;>0;?0;@0;;U;'@;B@5;C0;+To;F;IC;[o;
;F;;
;;;I"/NEAT::BasicNeuronTypes::SineNeuron#express;F;[[I"
instance;T0;[[@i�;T;;M;;;[�;{�;IC;"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh)
;T;[�;[�;I"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh);T;0; @D;!F;"o;#;$F;%i�;&i�;'@B;(I"def express(instance);T;)T;*I"~def express(instance)
  instance.define_singleton_method(@name) {|*inputs|
    sin(1.6 * inputs.reduce {|p, q| p + q})
  }
end;T;+T;:@B;;IC;[�;:@B;<IC;[�;:@B;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@i�;T;:SineNeuron;;;;;[�;{�;IC;"JSin function (CPPN) -- adjusted to have its +1 and -1 near TanhNeuron
;T;[�;[�;I"JSin function (CPPN) -- adjusted to have its +1 and -1 near TanhNeuron;T;0; @B;!F;"o;#;$F;%i�;&i�;'@�;I"'NEAT::BasicNeuronTypes::SineNeuron;F;To;=;>0;?0;@0;;U;'@;B@5;C0;+To;F;IC;[o;
;F;;
;;;I"1NEAT::BasicNeuronTypes::CosineNeuron#express;F;[[I"
instance;T0;[[@i�;T;;M;;;[�;{�;IC;"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh)
;T;[�;[�;I"screate a function on the instance with our name
that sums all inputs and produce a sigmoid output (using tanh);T;0; @h;!F;"o;#;$F;%i�;&i�;'@f;(I"def express(instance);T;)T;*I"~def express(instance)
  instance.define_singleton_method(@name) {|*inputs|
    cos(1.6 * inputs.reduce {|p, q| p + q})
  }
end;T;+T;:@f;;IC;[�;:@f;<IC;[�;:@f;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@i�;T;:CosineNeuron;;;;;[�;{�;IC;"MCosine function (CPPN) -- adjusted to have its +1 and -1 near TanhNeuron
;T;[�;[�;I"MCosine function (CPPN) -- adjusted to have its +1 and -1 near TanhNeuron;T;0; @f;!F;"o;#;$F;%i�;&i�;'@�;I")NEAT::BasicNeuronTypes::CosineNeuron;F;To;=;>0;?0;@0;;U;'@;B@5;C0;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@iJ;T;;E;;;;;[�;{�;IC;"�= Basic Neuron Types

Basically, the neurons (nodes) will have an instantiation to represent their places in the
neural net, and way to spin up the phenotypic representation.

The basic types to RubyNEAT are represented here.
;T;[�;[�;I"�= Basic Neuron Types

Basically, the neurons (nodes) will have an instantiation to represent their places in the
neural net, and way to spin up the phenotypic representation.

The basic types to RubyNEAT are represented here.
;T;0; @�;!F;"o;#;$F;%iC;&iI;'@;I"NEAT::BasicNeuronTypes;F;+T;C;Do;=;>0;?0;@0;:	NEAT;'@;B@;C;D;:@
;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@i;F;:DSL;;;;;[�;{�;IC;"�
;T; @
;/0;!F;[�;[�;I"�;T;0;'@;I"NEAT::DSL;F;+T@9@5@�o;F;IC;[o;
;F;;
;;;I"NEAT::Critter#population;F;[�;[[I"lib/rubyneat/critter.rb;Ti;F;:population;;;[�;{�;IC;".Returns the value of attribute population
;T; @�;/0;!F;[�;[�;I".Returns the value of attribute population;T;0;'@�;(I"def population;T;*I"%def population
  @population
end;T;+To;
;F;;
;;;I"NEAT::Critter#genotype;F;[�;[[@�i;F;;V;;;[�;{�;IC;",Returns the value of attribute genotype
;T; @�;/0;!F;[�;[�;I",Returns the value of attribute genotype;T;0;'@�;(I"def genotype;T;*I"!def genotype
  @genotype
end;T;+To;
;F;;
;;;I"NEAT::Critter#genotype=;F;[[I"
value;T0;[[@�i;F;:genotype=;;;[�;{�;IC;" Sets the attribute genotype
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"0the value to set the attribute genotype to.;T;I"
value;T;L0; @�;I"YSets the attribute genotype
@param value the value to set the attribute genotype to.;T;0;'@�;(I"def genotype=(value);T;*I"1def genotype=(value)
  @genotype = value
end;T;+To;
;F;;
;;;I"NEAT::Critter#phenotype;F;[�;[[@�i;F;:phenotype;;;[�;{�;IC;"-Returns the value of attribute phenotype
;T; @�;/0;!F;[�;[�;I"-Returns the value of attribute phenotype;T;0;'@�;(I"def phenotype;T;*I"#def phenotype
  @phenotype
end;T;+To;
;F;;
;;;I"NEAT::Critter#phenotype=;F;[[I"
value;T0;[[@�i;F;:phenotype=;;;[�;{�;IC;"!Sets the attribute phenotype
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"1the value to set the attribute phenotype to.;T;I"
value;T;L0; @�;I"[Sets the attribute phenotype
@param value the value to set the attribute phenotype to.;T;0;'@�;(I"def phenotype=(value);T;*I"3def phenotype=(value)
  @phenotype = value
end;T;+To;
;F;;
;;;I"NEAT::Critter#fitness;F;[�;[[@�i;T;;0;;;[�;{�;IC;""Ratings assigned by Evaluator
;T;[�;[�;I""Ratings assigned by Evaluator;T;0; @�;!F;"o;#;$F;%i;&i;'@�;(I"def fitness;T;*I"def fitness
  @fitness
end;T;+To;
;F;;
;;;I"NEAT::Critter#fitness=;F;[[I"
value;T0;[[@�i;T;:
fitness=;;;[�;{�;IC;""Ratings assigned by Evaluator
;T;[�;[�;@;0; @;!F;"@;'@�;(I"def fitness=(value);T;*I"/def fitness=(value)
  @fitness = value
end;T;+To;
;F;;
;;;I"NEAT::Critter#novelty;F;[�;[[@�i;T;:novelty;;;[�;{�;IC;""Ratings assigned by Evaluator
;T;[�;[�;@;0; @;!F;"@;'@�;(I"def novelty;T;*I"def novelty
  @novelty
end;T;+To;
;F;;
;;;I"NEAT::Critter#novelty=;F;[[I"
value;T0;[[@�i;T;:
novelty=;;;[�;{�;IC;""Ratings assigned by Evaluator
;T;[�;[�;@;0; @";!F;"@;'@�;(I"def novelty=(value);T;*I"/def novelty=(value)
  @novelty = value
end;T;+To;
;F;;
;;;I"NEAT::Critter#initialize;F;[[I"pop;T0[I"mating;TI"
false;T[I"&block;T0;[[@�i;T;;k;;;[�;{�;IC;"rCritter construction. We construct the genotype.
The phenotype will be constructed by the Expressor operator.
;T;[�;[o;I
;JI"return;F;KI"a new instance of Critter;T;0;L[I"Critter;F; @0;I"rCritter construction. We construct the genotype.
The phenotype will be constructed by the Expressor operator.;T;0; @0;!F;"o;#;$F;%i;&i;'@�;(I"0def initialize(pop, mating = false, &block);T;)T;*I"�def initialize(pop, mating = false, &block)
  super pop.controller
  @population = pop
  @genotype = Genotype.new(self, mating)
  block.(self) unless block.nil?
end;T;+To;
;F;;
;;;I"(NEAT::Critter#ready_for_expression!;F;[�;[[@�i";T;:ready_for_expression!;;;[�;{�;IC;"FGet the Critter ready for the Expressor to
express the geneotype.
;T;[�;[�;I"FGet the Critter ready for the Expressor to
express the geneotype.;T;0; @J;!F;"o;#;$F;%i ;&i!;'@�;(I"def ready_for_expression!;T;)T;*I"odef ready_for_expression!
  @genotype.wire!
  @phenotype = NEAT::Critter::Phenotype[self]
  @phenotype
end;T;+To;
;F;;
;;;I"NEAT::Critter#express!;F;[�;[[@�i);T;:
express!;;;[�;{�;IC;"5Exoress this critter using the Expressor plugin.
;T;[�;[�;I"5Exoress this critter using the Expressor plugin.;T;0; @X;!F;"o;#;$F;%i(;&i(;'@�;(I"def express!;T;)T;*I";def express!
  @controller.expressor.express! self
end;T;+To;
;F;;
;;;I"&NEAT::Critter#initialize_neurons!;F;[�;[[@�i0;T;:initialize_neurons!;;;[�;{�;IC;"�This initializes neurons in preparation for recurrence.
Note that the Critter should already have expressed its
genotype before this is called.
;T;[�;[�;I"�This initializes neurons in preparation for recurrence.
Note that the Critter should already have expressed its
genotype before this is called.;T;0; @f;!F;"o;#;$F;%i-;&i/;'@�;(I"def initialize_neurons!;T;)T;*I"@def initialize_neurons!
  @phenotype.initialize_neurons
end;T;+To;
;F;;
;;;I"NEAT::Critter#evaluate!;F;[�;[[@�i7;T;:evaluate!;;;[�;{�;IC;"_A single evaluation step. Evaluate and
generate fitness, novelty, etc.
Returns the result.
;T;[�;[�;I"_A single evaluation step. Evaluate and
generate fitness, novelty, etc.
Returns the result.;T;0; @t;!F;"o;#;$F;%i4;&i6;'@�;(I"def evaluate!;T;)T;*I"=def evaluate!
  @controller.evaluator.evaluate! self
end;T;+To;F;IC;[o;
;F;;
;;;I"$NEAT::Critter::Genotype#critter;F;[�;[[@�iH;T;:critter;;;[�;{�;IC;"Critter to which we belong
;T;[�;[�;I"Critter to which we belong;T;0; @�;!F;"o;#;$F;%iG;&iG;'@�;(I"def critter;T;*I"def critter
  @critter
end;T;+To;
;F;;
;;;I"%NEAT::Critter::Genotype#critter=;F;[[I"
value;T0;[[@�iH;T;:
critter=;;;[�;{�;IC;"Critter to which we belong
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def critter=(value);T;*I"/def critter=(value)
  @critter = value
end;T;+To;
;F;;
;;;I""NEAT::Critter::Genotype#genes;F;[�;[[@�iK;T;:
genes;;;[�;{�;IC;"&Genes keyed by innovation numbers
;T;[�;[�;I"&Genes keyed by innovation numbers;T;0; @�;!F;"o;#;$F;%iJ;&iJ;'@�;(I"def genes;T;*I"def genes
  @genes
end;T;+To;
;F;;
;;;I"#NEAT::Critter::Genotype#genes=;F;[[I"
value;T0;[[@�iK;T;:genes=;;;[�;{�;IC;"&Genes keyed by innovation numbers
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def genes=(value);T;*I"+def genes=(value)
  @genes = value
end;T;+To;
;F;;
;;;I"$NEAT::Critter::Genotype#neurons;F;[�;[[@�iN;T;:neurons;;;[�;{�;IC;"#List of neurons hashed by name
;T;[�;[�;I"#List of neurons hashed by name;T;0; @�;!F;"o;#;$F;%iM;&iM;'@�;(I"def neurons;T;*I"def neurons
  @neurons
end;T;+To;
;F;;
;;;I"%NEAT::Critter::Genotype#neurons=;F;[[I"
value;T0;[[@�iN;T;:
neurons=;;;[�;{�;IC;"#List of neurons hashed by name
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def neurons=(value);T;*I"/def neurons=(value)
  @neurons = value
end;T;+To;
;F;;
;;;I"*NEAT::Critter::Genotype#neural_inputs;F;[�;[[@�iQ;T;:neural_inputs;;;[�;{�;IC;"0Instantiations of neural inputs and outputs
;T;[�;[�;I"0Instantiations of neural inputs and outputs;T;0; @�;!F;"o;#;$F;%iP;&iP;'@�;(I"def neural_inputs;T;*I"+def neural_inputs
  @neural_inputs
end;T;+To;
;F;;
;;;I"+NEAT::Critter::Genotype#neural_outputs;F;[�;[[@�iQ;T;:neural_outputs;;;[�;{�;IC;"0Instantiations of neural inputs and outputs
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def neural_outputs;T;*I"-def neural_outputs
  @neural_outputs
end;T;+To;
;F;;
;;;I"-NEAT::Critter::Genotype#dangling_neurons;F;[�;[[@�iT;T;:dangling_neurons;;;[�;{�;IC;"<This will be set to true if there are dangling neurons.
;T;[�;[�;I"<This will be set to true if there are dangling neurons.;T;0; @�;!F;"o;#;$F;%iS;&iS;'@�;(I"def dangling_neurons;T;*I"1def dangling_neurons
  @dangling_neurons
end;T;+To;
;F;;
;;;I".NEAT::Critter::Genotype#dangling_neurons=;F;[[I"
value;T0;[[@�iT;T;:dangling_neurons=;;;[�;{�;IC;"<This will be set to true if there are dangling neurons.
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"!def dangling_neurons=(value);T;*I"Adef dangling_neurons=(value)
  @dangling_neurons = value
end;T;+To;
;F;;
;;;I".NEAT::Critter::Genotype#dangling_neurons?;F;[�;[[@�iU;F;:dangling_neurons?;;;[�;{�;IC;"<This will be set to true if there are dangling neurons.;T; @;/0;!F;[�;[�;I"=This will be set to true if there are dangling neurons.
;T;0;"0;'@�;(@�;*I"1def dangling_neurons
  @dangling_neurons
end;T;+To;
;F;;
;;;I",NEAT::Critter::Genotype#neural_gene_map;F;[�;[[@�i[;T;:neural_gene_map;;;[�;{�;IC;"�Map neurons to the genes that marks them as output
{ oneu_name => [ gene_1, gene_2,... gene_n], ...}
Just take the in_neuron name and the weight to do
the call to that neuron function with the appropriate weights
;T;[�;[�;I"�Map neurons to the genes that marks them as output
{ oneu_name => [ gene_1, gene_2,... gene_n], ...}
Just take the in_neuron name and the weight to do
the call to that neuron function with the appropriate weights;T;0; @;!F;"o;#;$F;%iW;&iZ;'@�;(I"def neural_gene_map;T;*I"/def neural_gene_map
  @neural_gene_map
end;T;+To;
;F;;
;;;I"'NEAT::Critter::Genotype#initialize;F;[[I"critter;T0[I"mating;TI"
false;T[I"&block;T0;[[@�i];F;;k;;;[�;{�;IC;"�
;T; @(;/0;!F;[�;[o;I
;JI"return;F;KI"a new instance of Genotype;T;0;L[I"
Genotype;F; @(;I"�;T;0;'@�;(I"4def initialize(critter, mating = false, &block);T;)T;*I"�def initialize(critter, mating = false, &block)
  super critter.controller
  @critter = critter

  # Initialize basic structures
  @genes = nil
  @neural_inputs = Hash[@critter.population.input_neurons.map { |sym, ineu|
                          [sym, ineu.new(@controller, sym)]
                        }]

  @neural_outputs = Hash[@critter.population.output_neurons.map { |sym, ineu|
                          [sym, ineu.new(@controller, sym)]
                        }]
  @neurons = @neural_inputs.clone # this must be a shallow clone!
  @neurons.merge! @neural_outputs

  @controller.evolver.gen_initial_genes!(self) unless mating
  block.(self) unless block.nil?
end;T;+To;
;F;;
;;;I"&NEAT::Critter::Genotype#neucleate;F;[[I"clean:;TI"	true;T[I"&block;T0;[[@�iv;T;:neucleate;;;[�;{�;IC;"sWe add genes given here to the genome.
An array of genes is returned from the block
and we simply add them in.
;T;[�;[o;I
;JI"
param;F;K0;I"
clean;T;L[I"boolean;T; @Ao;I
;JI"
param;F;K0;I"
block;T;L[I"	Proc;T; @A;I"�We add genes given here to the genome.
An array of genes is returned from the block
and we simply add them in.
@param [boolean] clean
@param [Proc] block;T;0; @A;!F;"o;#;$F;%iq;&iu;'@�;(I"'def neucleate(clean: true, &block);T;)T;*I"�def neucleate(clean: true, &block)
  genes = Hash[block.(self).map { |g|
    g.genotype = self
    [g.innovation, g] }]
  if clean
    @genes = genes
  else
    @genes.merge! genes
  end
  nuke_redundancies!
end;T;+To;
;F;;
;;;I"/NEAT::Critter::Genotype#nuke_redundancies!;F;[�;[[@�i�;T;:nuke_redundancies!;;;[�;{�;IC;"�Remove any redundancies in the genome,
any genes refering to the same two neurons.
Simply choose one and delete the rest.
TODO: implement nuke_redundancies!
;T;[�;[�;I"�Remove any redundancies in the genome,
any genes refering to the same two neurons.
Simply choose one and delete the rest.
TODO: implement nuke_redundancies!;T;0; @^;!F;"o;#;$F;%i};&i�;'@�;(I"def nuke_redundancies!;T;)T;*I"Cdef nuke_redundancies!
  log.warn 'nuke_redundancies! NIY'
end;T;+To;
;F;;
;;;I"$NEAT::Critter::Genotype#forget!;F;[�;[[@�i�;T;:forget!;;;[�;{�;IC;"*Make the neurons forget their wiring.
;T;[�;[�;I"*Make the neurons forget their wiring.;T;0; @l;!F;"o;#;$F;%i�;&i�;'@�;(I"def forget!;T;)T;*I"vdef forget!
  @neurons.each { |name, neu| neu.clear_graph }
  @neural_gene_map = Hash.new {|h, k| h[k] = [] }
end;T;+To;
;F;;
;;;I""NEAT::Critter::Genotype#wire!;F;[�;[[@�i�;T;:
wire!;;;[�;{�;IC;",Wire up the neurons based on the genes.
;T;[�;[�;I",Wire up the neurons based on the genes.;T;0; @z;!F;"o;#;$F;%i�;&i�;'@�;(I"def wire!;T;)T;*I"�def wire!
  forget!
  @genes.each do |innov, gene|
    if gene.enabled?
      raise NeatException.new "Can't find #{gene.out_neuron}" if @neurons[gene.out_neuron].nil?
      @neurons[gene.out_neuron] << @neurons[gene.in_neuron]
      @neural_gene_map[gene.out_neuron] << gene unless gene.in_neuron.nil?
    end
  end unless @genes.nil?
  if @genes.nil?
    $log.error 'Genes Not Present'
  end
end;T;+To;
;F;;
;;;I"(NEAT::Critter::Genotype#add_neurons;F;[[I"
*neus;T0;[[@�i�;T;:add_neurons;;;[�;{�;IC;" Add new neurons to the fold
;T;[�;[�;I" Add new neurons to the fold;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def add_neurons(*neus);T;)T;*I"Wdef add_neurons(*neus)
  neus.each do |neu|
    @neurons[neu.name] = neu
  end
end;T;+To;
;F;;
;;;I"&NEAT::Critter::Genotype#add_genes;F;[[I"*genes;T0;[[@�i�;T;:add_genes;;;[�;{�;IC;"bGenes added here MUST correspond to pre-existing neurons.
Be sure to do add_neurons first!!!!
;T;[�;[�;I"bGenes added here MUST correspond to pre-existing neurons.
Be sure to do add_neurons first!!!!;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def add_genes(*genes);T;)T;*I"'def add_genes(*genes)
  genes.each do |gene|
    raise NeatException.new "Neuron #{gene.in_neuron} missing" unless @neurons.member? gene.in_neuron
    raise NeatException.new "Neuron #{gene.out_neuron} missing" unless @neurons.member? gene.out_neuron
    @genes[gene.innovation] = gene
  end
end;T;+To;
;F;;
;;;I"'NEAT::Critter::Genotype#innervate!;F;[[I"*hneus;T0;[[@�i�;T;:innervate!;;;[�;{�;IC;"�We take the neural hashes (presumably from other neurons), and innervate them.
We do this in distinctions based on the neuron's names.
FIXME We need to randomly select a neuron in the case of clashes.
;T;[�;[o;I
;JI"
param;F;KI"&-- hashes of neurons to innervate;T;I"
hneus;T;L[I"	Hash;T; @�;I"�We take the neural hashes (presumably from other neurons), and innervate them.
We do this in distinctions based on the neuron's names.
FIXME We need to randomly select a neuron in the case of clashes.
@param [Hash] hneus -- hashes of neurons to innervate;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def innervate!(*hneus);T;)T;*I"\def innervate!(*hneus)
  hneus.each do |neus|
    @neurons.merge! neus.dclone
  end
end;T;+To;
;F;;
;;;I"#NEAT::Critter::Genotype#prune!;F;[�;[[@�i�;T;:prune!;;;[�;{�;IC;":Go through the list of neurons and drop
any neurons not referenced by the genes.

Then go through the genes and drop any that
are dangling (i.e. no matching neurons)

Then make sure that @neural_inputs and @neural_outputs reference the actual
instance neurons in @neurons

TODO add this circularity check to prune!
;T;[�;[�;I":Go through the list of neurons and drop
any neurons not referenced by the genes.

Then go through the genes and drop any that
are dangling (i.e. no matching neurons)

Then make sure that @neural_inputs and @neural_outputs reference the actual
instance neurons in @neurons

TODO add this circularity check to prune!;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def prune!;T;)T;*I"�def prune!
  # Take care of dangling neurons
  neunames = @genes.values.map{|g| [g.in_neuron, g.out_neuron]}.flatten.to_set
  @neurons = Hash[@neurons.values.reject do |n|
    not neunames.member? n.name
  end.map do |n|
    [n.name, n]
  end]

  # Take care of dangling genes
  @genes = Hash[@genes.values.reject do |gene|
    not (@neurons.member?(gene.in_neuron) and @neurons.member?(gene.out_neuron))
  end.map do |gene|
    [gene.name, gene]
  end]

  # Make sure @neural_inputs and @neural_outputs are consistent
  @neural_inputs = Hash[@neural_inputs.values.map{|n| [n.name, @neurons[n.name]]}]
  @neural_outputs = Hash[@neural_outputs.values.map{|n| [n.name, @neurons[n.name]]}]
end;T;+To;
;F;;
;;;I")NEAT::Critter::Genotype#fitness_cost;F;[�;[[@�i�;T;:fitness_cost;;;[�;{�;IC;")Calculate the cost of this genotype.
;T;[�;[�;I")Calculate the cost of this genotype.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def fitness_cost;T;)T;*I"�def fitness_cost
  p = @controller.parms
  p.fitness_cost_per_neuron * @neurons.size + p.fitness_cost_per_gene * @genes.size
end;T;+To;
;F;;
;;;I"#NEAT::Critter::Genotype#dump_s;F;[�;[[@�i�;F;:dump_s;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@�;(I"def dump_s;T;)T;*I"�def dump_s
  to_s + "\ngenes:\n" + @genes.map{|k, gene|
    gene.to_s}.join("\n") + "\nneurons:\n" + @neurons.map{|k, neu|
    neu.to_s}.join("\n")
end;T;+To;F;IC;[o;
;F;;
;;;I"+NEAT::Critter::Genotype::Gene#genotype;F;[�;[[@�i�;T;;V;;;[�;{�;IC;"parent genotype
;T;[�;[�;I"parent genotype;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def genotype;T;*I"!def genotype
  @genotype
end;T;+To;
;F;;
;;;I",NEAT::Critter::Genotype::Gene#genotype=;F;[[I"
value;T0;[[@�i�;T;;�;;;[�;{�;IC;"parent genotype
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def genotype=(value);T;*I"1def genotype=(value)
  @genotype = value
end;T;+To;
;F;;
;;;I"-NEAT::Critter::Genotype::Gene#innovation;F;[�;[[@�i�;T;:innovation;;;[�;{�;IC;"innovation number
;T;[�;[�;I"innovation number;T;0; @;!F;"o;#;$F;%i�;&i�;'@�;(I"def innovation;T;*I"%def innovation
  @innovation
end;T;+To;
;F;;
;;;I".NEAT::Critter::Genotype::Gene#innovation=;F;[[I"
value;T0;[[@�i�;T;:innovation=;;;[�;{�;IC;"innovation number
;T;[�;[�;@;0; @;!F;"@;'@�;(I"def innovation=(value);T;*I"5def innovation=(value)
  @innovation = value
end;T;+To;
;F;;
;;;I",NEAT::Critter::Genotype::Gene#in_neuron;F;[�;[[@�i�;T;:in_neuron;;;[�;{�;IC;"\input neuron's name (where our output goes)
ouptut neuron's name (neuron to be queried)
;T;[�;[�;I"\input neuron's name (where our output goes)
ouptut neuron's name (neuron to be queried);T;0; @!;!F;"o;#;$F;%i�;&i�;'@�;(I"def in_neuron;T;*I"#def in_neuron
  @in_neuron
end;T;+To;
;F;;
;;;I"-NEAT::Critter::Genotype::Gene#in_neuron=;F;[[I"
value;T0;[[@�i�;T;:in_neuron=;;;[�;{�;IC;"\input neuron's name (where our output goes)
ouptut neuron's name (neuron to be queried)
;T;[�;[�;@+;0; @/;!F;"@,;'@�;(I"def in_neuron=(value);T;*I"3def in_neuron=(value)
  @in_neuron = value
end;T;+To;
;F;;
;;;I"-NEAT::Critter::Genotype::Gene#out_neuron;F;[�;[[@�i�;T;:out_neuron;;;[�;{�;IC;"\input neuron's name (where our output goes)
ouptut neuron's name (neuron to be queried)
;T;[�;[�;@+;0; @=;!F;"@,;'@�;(I"def out_neuron;T;*I"%def out_neuron
  @out_neuron
end;T;+To;
;F;;
;;;I".NEAT::Critter::Genotype::Gene#out_neuron=;F;[[I"
value;T0;[[@�i�;T;:out_neuron=;;;[�;{�;IC;"\input neuron's name (where our output goes)
ouptut neuron's name (neuron to be queried)
;T;[�;[�;@+;0; @I;!F;"@,;'@�;(I"def out_neuron=(value);T;*I"5def out_neuron=(value)
  @out_neuron = value
end;T;+To;
;F;;
;;;I")NEAT::Critter::Genotype::Gene#weight;F;[�;[[@�i�;T;:weight;;;[�;{�;IC;"weight of the connection
;T;[�;[�;I"weight of the connection;T;0; @W;!F;"o;#;$F;%i�;&i�;'@�;(I"def weight;T;*I"def weight
  @weight
end;T;+To;
;F;;
;;;I"*NEAT::Critter::Genotype::Gene#weight=;F;[[I"
value;T0;[[@�i�;T;:weight=;;;[�;{�;IC;"weight of the connection
;T;[�;[�;@a;0; @e;!F;"@b;'@�;(I"def weight=(value);T;*I"-def weight=(value)
  @weight = value
end;T;+To;
;F;;
;;;I"*NEAT::Critter::Genotype::Gene#enabled;F;[�;[[@�i�;T;:enabled;;;[�;{�;IC;"Is this gene enabled?
;T;[�;[�;I"Is this gene enabled?;T;0; @s;!F;"o;#;$F;%i�;&i�;'@�;(I"def enabled;T;*I"def enabled
  @enabled
end;T;+To;
;F;;
;;;I"+NEAT::Critter::Genotype::Gene#enabled=;F;[[I"
value;T0;[[@�i�;T;:
enabled=;;;[�;{�;IC;"Is this gene enabled?
;T;[�;[�;@};0; @�;!F;"@~;'@�;(I"def enabled=(value);T;*I"/def enabled=(value)
  @enabled = value
end;T;+To;
;F;;
;;;I"-NEAT::Critter::Genotype::Gene#initialize;F;[[I"
genotype;T0[I"&block;T0;[[@�i�;F;;k;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"a new instance of Gene;T;0;L[I"	Gene;F; @�;I"�;T;0;'@�;(I"%def initialize(genotype, &block);T;)T;*I"�def initialize(genotype, &block)
  super genotype.controller
  @genotype = genotype
  @enabled = true
  @innovation = NEAT::new_innovation
  @in_neuron = @out_neuron = nil
  block.(self) unless block.nil?
end;T;+To;
;F;;
;;;I"+NEAT::Critter::Genotype::Gene#enabled?;F;[�;[[@�i�;F;:
enabled?;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@�;(I""def enabled? ; @enabled ; end;T;)T;*I""def enabled? ; @enabled ; end;T;+To;
;F;;
;;;I",NEAT::Critter::Genotype::Gene#disabled?;F;[�;[[@�i;F;:disabled?;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"�;T;0;'@�;(I"'def disabled? ; not enabled? ; end;T;)T;*I"'def disabled? ; not enabled? ; end;T;+To;
;F;;G;;;I"%NEAT::Critter::Genotype::Gene.[];F;[
[I"
genotype;T0[I"
input;T0[I"output;T0[I"weight;TI"0.0;T[I"
innov;TI"nil;T;[[@�i	;T;;l;;;[�;{�;IC;"�Create a new Gene and set it up fully.
genotype -- genotype
input -- name of input neuron connection
output -- name of output neuron connection
weight -- weight to give neuron (optional)
innov -- innovation number of gene (optional)
;T;[�;[�;I"�Create a new Gene and set it up fully.
genotype -- genotype
input -- name of input neuron connection
output -- name of output neuron connection
weight -- weight to give neuron (optional)
innov -- innovation number of gene (optional);T;0; @�;!F;"o;#;$F;%i;&i;'@�;(I"Ddef self.[](genotype, input, output, weight = 0.0, innov = nil);T;)T;*I"!def self.[](genotype, input, output, weight = 0.0, innov = nil)
  g = Gene.new genotype
  g.in_neuron = (input.kind_of? Symbol) ? input : input.name
  g.out_neuron = (output.kind_of? Symbol) ? output : output.name
  g.weight = weight
  g.innovation = innov unless innov.nil?
  return g
end;T;+To;
;F;;
;;;I"'NEAT::Critter::Genotype::Gene#to_s;F;[�;[[@�i;F;;v;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@�;(I"
def to_s;T;)T;*I"Rdef to_s
  super + "[i%s,w%s,%s]" % [@innovation, @weight, self.enabled?]
end;T;+To;
;F;;
;;;I")NEAT::Critter::Genotype::Gene#dump_s;F;[�;[[@�i;F;;�;;;[�;{�;IC;"�;T; @�;/0;!F;[�;[�;I"
;T;0;"0;'@�;(@�;*I"Rdef to_s
  super + "[i%s,w%s,%s]" % [@innovation, @weight, self.enabled?]
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{;VIC;O{;x@�;y@�;PT;�IC;O{;x@;y@;PT;�IC;O{;x@!;y@/;PT;�IC;O{;x@=;y@I;PT;�IC;O{;x@W;y@e;PT;�IC;O{;x@s;y@�;PT;PT;PT;Q{@�;v;R[�;[[@�i�;T;:	Gene;;;;;[�;{�;IC;"�= Gene Specification
The Gene specifices a singlular input and
output neuron, which represents a connection
between them, along with the weight of that
connection, which may be positive, negative, or zero.

There is also the enabled flag
;T;[�;[�;I"�= Gene Specification
The Gene specifices a singlular input and
output neuron, which represents a connection
between them, along with the weight of that
connection, which may be positive, negative, or zero.

There is also the enabled flag;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;I""NEAT::Critter::Genotype::Gene;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y0;PT;�IC;O{;x@�;y0;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@;y0;PT;PT;PT;Q{@;�;R[�;[[@�iF;T;:
Genotype;;;;;[�;{�;IC;",= Genotype part of the Critter
List of connections, basically.

Also, basic phentypic expression (which may be overriden by
the expressor)

= Notes
Currently, all lists of neurons and genes are Hashes. The
neurons are indexed by their own names, and the genes
are indexed by their innovation numbers.
;T;[�;[�;I"-= Genotype part of the Critter
List of connections, basically.

Also, basic phentypic expression (which may be overriden by
the expressor)

= Notes
Currently, all lists of neurons and genes are Hashes. The
neurons are indexed by their own names, and the genes
are indexed by their innovation numbers.
;T;0; @�;!F;"o;#;$F;%i;;&iE;'@�;I"NEAT::Critter::Genotype;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+To;F;IC;[
o;
;F;;
;;;I"%NEAT::Critter::Phenotype#critter;F;[�;[[@�i!;T;;�;;;[�;{�;IC;"Critter to which we belong
;T;[�;[�;I"Critter to which we belong;T;0; @/;!F;"o;#;$F;%i ;&i ;'@-;(I"def critter;T;*I"def critter
  @critter
end;T;+To;
;F;;
;;;I"&NEAT::Critter::Phenotype#critter=;F;[[I"
value;T0;[[@�i!;T;;�;;;[�;{�;IC;"Critter to which we belong
;T;[�;[�;@9;0; @=;!F;"@:;'@-;(I"def critter=(value);T;*I"/def critter=(value)
  @critter = value
end;T;+To;
;F;;
;;;I""NEAT::Critter::Phenotype#code;F;[�;[[@�i$;T;:	code;;;[�;{�;IC;"<Expressed code as a string (that was instance_eval()ed)
;T;[�;[�;I"<Expressed code as a string (that was instance_eval()ed);T;0; @K;!F;"o;#;$F;%i#;&i#;'@-;(I"
def code;T;*I"def code
  @code
end;T;+To;
;F;;
;;;I"#NEAT::Critter::Phenotype#code=;F;[[I"
value;T0;[[@�i$;T;:
code=;;;[�;{�;IC;"<Expressed code as a string (that was instance_eval()ed)
;T;[�;[�;@U;0; @Y;!F;"@V;'@-;(I"def code=(value);T;*I")def code=(value)
  @code = value
end;T;+To;
;F;;G;;;I" NEAT::Critter::Phenotype.[];F;[[I"critter;T0;[[@�i&;F;;l;;;[�;{�;IC;"�
;T; @g;/0;!F;[�;[�;I"�;T;0;'@-;(I"def self.[](critter);T;)T;*I"�def self.[](critter)
  ph = Phenotype.new critter.controller
  ph.critter = critter
  ph.code = "## Phenotype Code %s for critter %s\n" % [ph.name, critter.name]
  return ph
end;T;+To;
;F;;
;;;I"&NEAT::Critter::Phenotype#express!;F;[�;[[@�i.;T;;�;;;[�;{�;IC;"+Take what is in code and express that!
;T;[�;[�;I"+Take what is in code and express that!;T;0; @v;!F;"o;#;$F;%i-;&i-;'@-;(I"def express!;T;)T;*I"2def express!
  instance_eval @code
  self
end;T;+To;
;F;;
;;;I"'NEAT::Critter::Phenotype#stimulate;F;[�;[[@�i6;T;:stimulate;;;[�;{�;IC;"�This function is re-written by Expressor -- with parameters and all.
It returns a "response" in the form of a response hash.
TODO This *is* network activation, so we should rename this at a later date...
;T;[�;[�;I"�This function is re-written by Expressor -- with parameters and all.
It returns a "response" in the form of a response hash.
TODO This *is* network activation, so we should rename this at a later date...;T;0; @�;!F;"o;#;$F;%i3;&i5;'@-;(I"def stimulate;T;)T;*I"def stimulate
  nil
end;T;+To;
;F;;
;;;I""NEAT::Critter::Phenotype#to_s;F;[�;[[@�i;;T;;v;;;[�;{�;IC;"This gives us a complete
;T;[�;[�;I"This gives us a complete;T;0; @�;!F;"o;#;$F;%i:;&i:;'@-;(I"
def to_s;T;)T;*I"0def to_s
  "## %s\n%s" % [super, @code]
end;T;+T;:@-;;IC;[�;:@-;<IC;[o;=;>0;?0;@0;;A;'@-;B0;C;D;:@-;NIC;O{;GIC;O{�;PT;
IC;O{;�IC;O{;x@/;y@=;PT;�IC;O{;x@K;y@Y;PT;PT;PT;Q{�;R[�;[[@�i;T;:Phenotype;;;;;[�;{�;IC;"@= Phenotype part of the Critter
This is created by Evolver.
;T;[�;[�;I"A= Phenotype part of the Critter
This is created by Evolver. ;T;0; @-;!F;"o;#;$F;%i;&i;'@�;I"NEAT::Critter::Phenotype;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+To;
;F;;
;;;I"NEAT::Critter#compare;F;[[I"oc;T0;[[@�iM;T;;1;;;[�;{�;IC;"�Compare ourselves against another critter for
compability.

The function to be used here is:
distance = c1*E + c2*D + c3*W

Where:
E, D - The number of excess and disjoint genes repesctively.
N - The number of genes in the largest genome.
W - The sum of absolute weight differences.

This is a variation of the formulation suggested by the Stanley
paper, which normalizes the E and D terms by N.
;T;[�;[�;I"�Compare ourselves against another critter for
compability.

The function to be used here is:
distance = c1*E + c2*D + c3*W

Where:
E, D - The number of excess and disjoint genes repesctively.
N - The number of genes in the largest genome.
W - The sum of absolute weight differences.

This is a variation of the formulation suggested by the Stanley
paper, which normalizes the E and D terms by N.;T;0; @�;!F;"o;#;$F;%i@;&iL;'@�;(I"def compare(oc);T;)T;*I"�def compare(oc)
  c1 = @controller.parms.excess_coefficient
  c2 = @controller.parms.disjoint_coefficient
  c3 = @controller.parms.weight_coefficient
  e = excess(oc)
  d = disjoint(oc)
  w = weight_diff(oc)
  return c1 * e + c2 * d + c3 * w
end;T;+To;
;F;;
;;;I"NEAT::Critter#dump_s;F;[�;[[@�iX;T;;�;;;[�;{�;IC;"Critter print
;T;[�;[�;I"Critter print;T;0; @�;!F;"o;#;$F;%iW;&iW;'@�;(I"def dump_s;T;)T;*I"Mdef dump_s
  to_s + @genotype.dump_s + "\n" + @phenotype.to_s + "\n"
end;T;+To;
;F;;
;;o;I"NEAT::Critter#excess;F;[[I"oc;T0;[[@�i^;T;:excess;;;[�;{�;IC;" Return a count of excesses.
;T;[�;[�;I" Return a count of excesses.;T;0; @�;!F;"o;#;$F;%i];&i];'@�;(I"def excess(oc);T;)T;*I"Mdef excess(oc)
  (@genotype.genes.size - oc.genotype.genes.size).abs
end;T;+To;
;F;;
;;o;I"NEAT::Critter#disjoint;F;[[I"oc;T0;[[@�ic;T;:
disjoint;;;[�;{�;IC;"'Return the count of disjoint genes
;T;[�;[�;I"'Return the count of disjoint genes;T;0; @�;!F;"o;#;$F;%ib;&ib;'@�;(I"def disjoint(oc);T;)T;*I"|def disjoint(oc)
  a = @genotype.genes.keys
  b = oc.genotype.genes.keys
  (a - b).size + (b - a).size - excess(oc)
end;T;+To;
;F;;
;;o;I"NEAT::Critter#weight_diff;F;[[I"oc;T0;[[@�ij;F;:weight_diff;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@�;(I"def weight_diff(oc);T;)T;*I"�def weight_diff(oc)
  ag = @genotype.genes
  bg = oc.genotype.genes
  matches = ag.keys & bg.keys
  unless matches.empty?
    matches.map{|i| (ag[i].weight - bg[i].weight).abs}.reduce{|w, ws| w + ws} / matches.size
  else
    0
  end
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{
;IC;O{;x@�;y0;PT;VIC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;0IC;O{;x@�;y@;PT;�IC;O{;x@;y@";PT;PT;PT;Q{�;R[�;[[@�i;T;:Critter;;;;;[�;{�;IC;"z= Critters for NEAT
The Critter class comprises a Genotype and a Phenotype.
The Genotype comprises Genes and Neurons.
;T;[�;[�;I"z= Critters for NEAT
The Critter class comprises a Genotype and a Phenotype.
The Genotype comprises Genes and Neurons.;T;0; @�;!F;"o;#;$F;%i
;&i;'@;I"NEAT::Critter;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+To;F;IC;[o;
;F;;
;;;I"NEAT::Evolver#npop;F;[�;[[I"lib/rubyneat/evolver.rb;Ti;F;:	npop;;;[�;{�;IC;"(Returns the value of attribute npop
;T; @	;/0;!F;[�;[�;I"(Returns the value of attribute npop;T;0;'@	;(I"
def npop;T;*I"def npop
  @npop
end;T;+To;
;F;;
;;;I"NEAT::Evolver#initialize;F;[[I"c;T0;[[@ 	i;F;;k;;;[�;{�;IC;"�
;T; @)	;/0;!F;[�;[o;I
;JI"return;F;KI"a new instance of Evolver;T;0;L[I"Evolver;F; @)	;I"�;T;0;'@	;(I"def initialize(c);T;)T;*I"Edef initialize(c)
  super
  @critter_op = CritterOp.new self
end;T;+To;
;F;;
;;;I"%NEAT::Evolver#gen_initial_genes!;F;[[I"
genotype;T0;[[@ 	i;T;:gen_initial_genes!;;;[�;{�;IC;"`Generate the initial genes for a given genotype.
We key genes off their innovation numbers.
;T;[�;[�;I"`Generate the initial genes for a given genotype.
We key genes off their innovation numbers.;T;0; @=	;!F;"o;#;$F;%i;&i;'@	;(I"%def gen_initial_genes!(genotype);T;)T;*I"#def gen_initial_genes!(genotype)
  genotype.genes = {}
  genotype.neural_inputs.each do |s1, input|
    genotype.neural_outputs.each do |s2, output|
      g = Critter::Genotype::Gene[genotype, input, output, NEAT::controller.gaussian]
      genotype.genes[g.innovation] = g
    end
  end
end;T;+To;
;F;;
;;;I"NEAT::Evolver#mutate!;F;[[I"population;T0;[[@ 	i$;T;:mutate!;;;[�;{�;IC;"#Here we mutate the population.
;T;[�;[�;I"#Here we mutate the population.;T;0; @M	;!F;"o;#;$F;%i#;&i#;'@	;(I"def mutate!(population);T;)T;*I"�def mutate!(population)
  @npop = population

  if @controller.parms.mate_only_prob.nil? or rand > @controller.parms.mate_only_prob
    log.debug "[[[ Neuron and Gene Giggling!"
    mutate_perturb_gene_weights!
    mutate_change_gene_weights!
    mutate_add_neurons!
    mutate_change_neurons!
    mutate_add_genes!
    mutate_disable_genes!
    mutate_reenable_genes!
    log.debug "]]] End Neuron and Gene Giggling!\n"
  else
    log.debug "*** Mating only!"
  end
end;T;+To;
;F;;
;;;I"NEAT::Evolver#evolve;F;[[I"population;T0;[[@ 	i:;T;;,;;;[�;{�;IC;"�Here we clone the population and then evolve it
on the basis of fitness and novelty, etc.

Returns  the newly-evolved population.
;T;[�;[�;I"�Here we clone the population and then evolve it
on the basis of fitness and novelty, etc.

Returns  the newly-evolved population.;T;0; @]	;!F;"o;#;$F;%i6;&i9;'@	;(I"def evolve(population);T;)T;*I"�def evolve(population)
  @npop = population.dclone
  
  # Population sorting and evaluation for breeding, mutations, etc.
  prepare_speciation!
  prepare_fitness!
  prepare_novelty!

  mate!

  return @npop
end;T;+To;
;F;;
;:protected;I"&NEAT::Evolver#prepare_speciation!;F;[�;[[@ 	iJ;F;:prepare_speciation!;;;[�;{�;IC;"�
;T; @m	;/0;!F;[�;[�;I"�;T;0;'@	;(I"def prepare_speciation!;T;)T;*I"cdef prepare_speciation!
  @npop.speciate!
  log.debug "SPECIES:"
  NEAT::dpp @npop.species
end;T;+To;
;F;;
;;�;I"#NEAT::Evolver#prepare_fitness!;F;[�;[[@ 	iW;T;:prepare_fitness!;;;[�;{�;IC;"zSort species within the basis of fitness.
Think of the fitness as an error / cost function.
The better fit, the closer to zero the fitness parameter will be.

If a compare block is specified in the DSL, then that function is called
with the *fitness values* from critters c1 and c2. The default valuation
is c1.fitness <=> c2.fitness. You may elect to evaluate them differently.
;T;[�;[�;I"zSort species within the basis of fitness.
Think of the fitness as an error / cost function.
The better fit, the closer to zero the fitness parameter will be.

If a compare block is specified in the DSL, then that function is called
with the *fitness values* from critters c1 and c2. The default valuation
is c1.fitness <=> c2.fitness. You may elect to evaluate them differently.;T;0; @z	;!F;"o;#;$F;%iP;&iV;'@	;(I"def prepare_fitness!;T;)T;*I"�def prepare_fitness!
  @npop.species.each do |k, sp|
    sp.sort!{|c1, c2|
      unless @controller.compare_func.nil?
        @controller.compare_func.(c1.fitness, c2.fitness)
      else
        c1.fitness <=> c2.fitness
      end
    }
  end
end;T;+To;
;F;;
;;�;I"#NEAT::Evolver#prepare_novelty!;F;[�;[[@ 	id;T;:prepare_novelty!;;;[�;{�;IC;"TODO: write novelty code
;T;[�;[�;I"TODO: write novelty code;T;0; @�	;!F;"o;#;$F;%ic;&ic;'@	;(I"def prepare_novelty!;T;)T;*I"def prepare_novelty!
end;T;+To;
;F;;
;;�;I"/NEAT::Evolver#mutate_perturb_gene_weights!;F;[�;[[@ 	ih;T;:!mutate_perturb_gene_weights!;;;[�;{�;IC;"@Perturb existing gene weights by adding a guassian to them.
;T;[�;[�;I"@Perturb existing gene weights by adding a guassian to them.;T;0; @�	;!F;"o;#;$F;%ig;&ig;'@	;(I"%def mutate_perturb_gene_weights!;T;)T;*I"�def mutate_perturb_gene_weights!
  @gperturb = Distribution::Normal::rng(0, @controller.parms.mutate_perturb_gene_weights_sd) if @gperturb.nil?
  @npop.critters.each do |critter|
    critter.genotype.genes.each { |innov, gene|
      if rand < @controller.parms.mutate_perturb_gene_weights_prob
        gene.weight += per = @gperturb.()
        log.debug { "Peturbed gene #{gene}.#{innov} by #{per}" }
      end
    }
  end
end;T;+To;
;F;;
;;�;I".NEAT::Evolver#mutate_change_gene_weights!;F;[�;[[@ 	iu;T;: mutate_change_gene_weights!;;;[�;{�;IC;"=Totally change weights to something completely different
;T;[�;[�;I"=Totally change weights to something completely different;T;0; @�	;!F;"o;#;$F;%it;&it;'@	;(I"$def mutate_change_gene_weights!;T;)T;*I"�def mutate_change_gene_weights!
  @gchange = Distribution::Normal::rng(0, @controller.parms.mutate_change_gene_weights_sd) if @gchange.nil?
  @npop.critters.each do |critter|
    critter.genotype.genes.each { |innov, gene|
      if rand < @controller.parms.mutate_change_gene_weights_prob
        gene.weight = chg = @gchange.()
        log.debug { "Change gene #{gene}.#{innov} by #{chg}" }
      end
    }
  end
end;T;+To;
;F;;
;;�;I"$NEAT::Evolver#mutate_add_genes!;F;[�;[[@ 	i|;F;:mutate_add_genes!;;;[�;{�;IC;"�
;T; @�	;/0;!F;[�;[�;I"�;T;0;'@	;(I"def mutate_add_genes!;T;)T;*I"�def mutate_add_genes!
  @npop.critters.each do |critter|
    if rand < @controller.parms.mutate_add_gene_prob
      log.debug "mutate_add_genes! for #{critter}"
      @critter_op.add_gene! critter
    end
  end
end;T;+To;
;F;;
;;�;I"(NEAT::Evolver#mutate_disable_genes!;F;[�;[[@ 	i�;F;:mutate_disable_genes!;;;[�;{�;IC;"�
;T; @�	;/0;!F;[�;[�;I"�;T;0;'@	;(I"def mutate_disable_genes!;T;)T;*I"�def mutate_disable_genes!
  @npop.critters.each do |critter|
    if rand < @controller.parms.mutate_gene_disable_prob
      log.debug "mutate_disable_genes! for #{critter}"
      @critter_op.disable_gene! critter
    end
  end
end;T;+To;
;F;;
;;�;I")NEAT::Evolver#mutate_reenable_genes!;F;[�;[[@ 	i�;F;:mutate_reenable_genes!;;;[�;{�;IC;"�
;T; @�	;/0;!F;[�;[�;I"�;T;0;'@	;(I"def mutate_reenable_genes!;T;)T;*I"�def mutate_reenable_genes!
  @npop.critters.each do |critter|
    if rand < @controller.parms.mutate_gene_reenable_prob
      log.debug "mutate_reenable_genes! for #{critter}"
      @critter_op.reenable_gene! critter
    end
  end
end;T;+To;
;F;;
;;�;I"&NEAT::Evolver#mutate_add_neurons!;F;[�;[[@ 	i�;F;:mutate_add_neurons!;;;[�;{�;IC;"�
;T; @�	;/0;!F;[�;[�;I"�;T;0;'@	;(I"def mutate_add_neurons!;T;)T;*I"�def mutate_add_neurons!
  @npop.critters.each do |critter|
    if rand < @controller.parms.mutate_add_neuron_prob
      log.debug "mutate_add_neurons! for #{critter}"
      @critter_op.add_neuron! critter
    end
  end
end;T;+To;
;F;;
;;�;I")NEAT::Evolver#mutate_change_neurons!;F;[�;[[@ 	i�;T;:mutate_change_neurons!;;;[�;{�;IC;"'TODO Finish mutate_change_neurons!
;T;[�;[�;I"'TODO Finish mutate_change_neurons!;T;0; @�	;!F;"o;#;$F;%i�;&i�;'@	;(I"def mutate_change_neurons!;T;)T;*I"Ldef mutate_change_neurons!
  log.error "mutate_change_neurons! NIY"
end;T;+To;
;F;;
;;�;I"NEAT::Evolver#mate!;F;[�;[[@ 	i�;T;:
mate!;;;[�;{�;IC;"pHere we select candidates for mating. We must look at species and fitness
to make the selection for mating.
;T;[�;[�;I"pHere we select candidates for mating. We must look at species and fitness
to make the selection for mating.;T;0; @�	;!F;"o;#;$F;%i�;&i�;'@	;(I"def mate!;T;)T;*I"Qdef mate!
  parm = @controller.parms
  popsize = parm.population_size
  surv = parm.survival_threshold
  survmin = parm.survival_mininum_per_species
  mlist = [] # list of chosen mating pairs of critters [crit1, crit2], or [:carryover, crit]

  # species list already sorted in descending order of fitness.
  # We will generate the approximate number of  pairs that correspond
  # to the survivial_threshold percentage of the population,
  # then backfill with the most fit out of the top original population.
  @npop.species.each do |k, sp|
    crem = [(sp.size * surv).ceil, survmin].max
    log.warn "Minumum per species hit -- #{survmin}" unless crem > survmin
    spsel = sp[0, crem]
    spsel = sp if spsel.empty?
    crem.times do
      mlist << [spsel[rand spsel.size], spsel[rand spsel.size]]
    end
  end

  # And now for the backfilling
  unless mlist.size >= @npop.critters.size
    mlist += @npop.critters[0, @npop.critters.size - mlist.size].map{|crit| [:carryover, crit]}
  end

  @npop.critters = mlist.map do |crit1, crit2|
    (crit1 == :carryover) ? crit2 : sex(crit1, crit2)
  end
end;T;+To;
;F;;
;;�;I"NEAT::Evolver#sex;F;[[I"
crit1;T0[I"
crit2;T0;[[@ 	i�;T;:sex;;;[�;{�;IC;"uMate the given critters and return a baby.
This is rather involved, and relies heavily on the Innovation Numbers.

Some definitions:

Matching Gene
2 genes with matching innovation numbers.

Disjoint Gene
A gene in one has an innovation number in the range of innovation numbers
of the other.

Excess Gene
Gene in one critter that has an innovation number outside of the range
of innovation numbers of the other.

Neurons
Distinct Neurons from both crit1 and crit2 must be present in
the baby.

Excess and Disjoint genes are always included from the more fit parent.
Matching genes are randomly chosen. For now, we make it 50/50.
;T;[�;[�;I"uMate the given critters and return a baby.
This is rather involved, and relies heavily on the Innovation Numbers.

Some definitions:

Matching Gene
2 genes with matching innovation numbers.

Disjoint Gene
A gene in one has an innovation number in the range of innovation numbers
of the other.

Excess Gene
Gene in one critter that has an innovation number outside of the range
of innovation numbers of the other.

Neurons
Distinct Neurons from both crit1 and crit2 must be present in
the baby.

Excess and Disjoint genes are always included from the more fit parent.
Matching genes are randomly chosen. For now, we make it 50/50.;T;0; @
;!F;"o;#;$F;%i�;&i�;'@	;(I"def sex(crit1, crit2);T;)T;*I"2def sex(crit1, crit2)
  Critter.new(@npop, true) do |baby|
    fitcrit = if crit1.fitness > crit2.fitness
                crit1
              elsif crit2.fitness > crit1.fitness
                crit2
              else
                (rand(2) == 1) ? crit1 : crit2
              end
    a = crit1.genotype.genes.keys.to_set
    b = crit2.genotype.genes.keys.to_set
    disjoint = (a - b) + (b - a)
    joint = (a + b) - disjoint
    baby.genotype.neucleate { |gtype|
      joint.map { |innov|
        g1 = crit1.genotype.genes[innov]
        g2 = crit2.genotype.genes[innov]
        Critter::Genotype::Gene[gtype,
                                g1.in_neuron, g1.out_neuron,
                                (rand(2) == 1) ? g1.weight : g2.weight,
                                innov]
      } + disjoint.map { |innov|
        fitcrit.genotype.genes[innov].clone unless fitcrit.genotype.genes[innov].nil?
      }.reject{|i| i.nil? }
    }
    baby.genotype.innervate! crit1.genotype.neurons, crit2.genotype.neurons
    baby.genotype.prune!
    baby.genotype.wire!
  end
end;T;+To;F;IC;[
o;
;F;;
;;;I"(NEAT::Evolver::CritterOp#initialize;F;[[I"	evol;T0;[[@ 	i�;F;;k;;;[�;{�;IC;"�
;T; @
;/0;!F;[�;[o;I
;JI"return;F;KI" a new instance of CritterOp;T;0;L[I"CritterOp;F; @
;I"�;T;0;'@
;(I"def initialize(evol);T;)T;*I"[def initialize(evol)
  super evol.controller
  @evolver = evol
  @npop = evol.npop
end;T;+To;
;F;;
;;;I")NEAT::Evolver::CritterOp#add_neuron!;F;[[I"	crit;T0;[[@ 	i	;T;:add_neuron!;;;[�;{�;IC;"�= Add a neuron to given critter
Here, we add a neuron by randomly picking a
gene, and split it into two genes with an intervening
neuron. The old gene is not replaced, but disabled. 2 new genes are
created along with the new neuron.
;T;[�;[�;I"�= Add a neuron to given critter
Here, we add a neuron by randomly picking a
gene, and split it into two genes with an intervening
neuron. The old gene is not replaced, but disabled. 2 new genes are
created along with the new neuron.;T;0; @*
;!F;"o;#;$F;%i;&i;'@
;(I"def add_neuron!(crit);T;)T;*I"�def add_neuron!(crit)
  gene = crit.genotype.genes.values.sample
  neu = controller.neural_hidden.values.sample.new(controller)
  g1 = Critter::Genotype::Gene[crit.genotype, gene.in_neuron, neu.name, gene.weight]
  g2 = Critter::Genotype::Gene[crit.genotype, neu.name, gene.out_neuron, gene.weight]
  gene.enabled = false
  crit.genotype.add_neurons neu
  crit.genotype.add_genes g1, g2
  log.debug "add_neuron!: neu #{neu}, g1 #{g1}, g2 #{g2}"
end;T;+To;
;F;;
;;;I"'NEAT::Evolver::CritterOp#add_gene!;F;[[I"	crit;T0;[[@ 	i";T;:add_gene!;;;[�;{�;IC;"�= Add a gene to the genome
Unlike adding a new neuron, adding a new gene
could result in a circular dependency. If so,
and if recurrency is switched off, we must detect
this condition and switch off the offending neurons.

Obviously, this might result in a loss of functionality, but
oh well.

An easy and obvious check is to make sure we don't
accept any inputs from output neurons, and we don't
do any outputs to input neurons.

Constructs for handling recurrency are present in Expressor.
;T;[�;[�;I"�= Add a gene to the genome
Unlike adding a new neuron, adding a new gene
could result in a circular dependency. If so,
and if recurrency is switched off, we must detect
this condition and switch off the offending neurons.

Obviously, this might result in a loss of functionality, but
oh well.

An easy and obvious check is to make sure we don't
accept any inputs from output neurons, and we don't
do any outputs to input neurons.

Constructs for handling recurrency are present in Expressor.;T;0; @:
;!F;"o;#;$F;%i;&i!;'@
;(I"def add_gene!(crit);T;)T;*I"�def add_gene!(crit)
  n1 = crit.genotype.neurons.values.sample # input
  n2 = crit.genotype.neurons.values.sample # output

  # Sanity checks!
  unless n1 == n2 or n1.output? or n2.input?
    gene = Critter::Genotype::Gene[crit.genotype, n1.name, n2.name, NEAT::controller.gaussian]
    crit.genotype.add_genes gene
    log.debug "add_gene! Added gene #{gene}(#{n1.name} -> #{n2.name}) to #{crit}"
  end
end;T;+To;
;F;;
;;;I"+NEAT::Evolver::CritterOp#disable_gene!;F;[[I"	crit;T0;[[@ 	i/;T;:disable_gene!;;;[�;{�;IC;"3Pick an enabled gene at random and disable it.
;T;[�;[�;I"3Pick an enabled gene at random and disable it.;T;0; @J
;!F;"o;#;$F;%i.;&i.;'@
;(I"def disable_gene!(crit);T;)T;*I"�def disable_gene!(crit)
  gene = crit.genotype.genes.values.reject{|gene| gene.disabled? }.sample
  gene.enabled = false unless gene.nil?
end;T;+To;
;F;;
;;;I",NEAT::Evolver::CritterOp#reenable_gene!;F;[[I"	crit;T0;[[@ 	i5;T;:reenable_gene!;;;[�;{�;IC;"4Pick a disabled gene at random and reenable it.
;T;[�;[�;I"4Pick a disabled gene at random and reenable it.;T;0; @Z
;!F;"o;#;$F;%i4;&i4;'@
;(I"def reenable_gene!(crit);T;)T;*I"�def reenable_gene!(crit)
  gene = crit.genotype.genes.values.reject{|gene| gene.enabled? }.sample
  gene.enabled = true unless gene.nil?
end;T;+T;:@
;;IC;[�;:@
;<IC;[�;:@
;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@ 	i�;T;:CritterOp;;;;;[�;{�;IC;")A set of Critter Genotype operators.
;T;[�;[�;I")A set of Critter Genotype operators.;T;0; @
;!F;"o;#;$F;%i�;&i�;'@	;I"NEAT::Evolver::CritterOp;F;To;=;>0;?0;@0;;r;'@;B@�;C;G;+T;:@	;;IC;[�;:@	;<IC;[�;:@	;NIC;O{;GIC;O{�;PT;
IC;O{;�IC;O{;x@	;y0;PT;PT;PT;Q{�;R[�;[[@ 	i;T;:Evolver;;;;;[�;{�;IC;"�= Evolver -- Basis of all evolvers.
All evolvers shall derive from this basic evolver (or this one can be
used as is). Here, we'll have many different evolutionary operators
that will perform operations on the various critters in the population.
;T;[�;[�;I"�= Evolver -- Basis of all evolvers.
All evolvers shall derive from this basic evolver (or this one can be
used as is). Here, we'll have many different evolutionary operators
that will perform operations on the various critters in the population.
;T;0; @	;!F;"o;#;$F;%i	;&i
;'@;I"NEAT::Evolver;F;To;=;>0;?0;@0;:
Operator;'@;Bo;F;IC;[�;:@�
;;IC;[�;:@�
;<IC;[�;:@�
;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@�i{;T;;�;;;;;[�;{�;IC;"A= Base class of operators in RubyNEAT,
Such as Evolver, etc.
;T;[�;[�;I"A= Base class of operators in RubyNEAT,
Such as Evolver, etc.;T;0; @�
;!F;"o;#;$F;%i~;&i;'@;I"NEAT::Operator;F;To;=;>0;?0;@0;;r;'@;B@�;C0;+T;C;G;+To;
;F;;G;;;I"NEAT.random_name_generator;F;[�;[[@�iA;F;:random_name_generator;;;[�;{�;IC;"�
;T; @�
;/0;!F;[�;[�;I"�;T;0;'@;(I"#def self.random_name_generator;T;)T;*I"�def self.random_name_generator
  (1..3).map {
    @rng_names[rand @rng_names.size]
  }.push(@rng_count += 1).join('_').to_sym
end;T;+To:&YARD::CodeObjects::ConstantObject;[[@�iI;T;:
STIMULUS;;;;;[�;{�;IC;"wName of the stimulus method in NEAT::Critter::Phenotype to use
for the singleton method expression of the critter.
;T;[�;[�;I"wName of the stimulus method in NEAT::Critter::Phenotype to use
for the singleton method expression of the critter.;T;0; @�
;!F;"o;#;$F;%iG;&iH;'@;I"NEAT::STIMULUS;F;(I"STIMULUS = :stimulate;T;*I"STIMULUS = :stimulate;T;_I":stimulate;T;+To;
;F;;G;;;I"NEAT.new_innovation;F;[�;[[@�iL;T;:new_innovation;;;[�;{�;IC;"&Mixin for new innovation numbers.
;T;[�;[�;I"&Mixin for new innovation numbers.;T;0; @�
;!F;"o;#;$F;%iK;&iK;'@;(I"=def self.new_innovation; @controller.new_innovation; end;T;)T;*I"=def self.new_innovation; @controller.new_innovation; end;T;+To;
;F;;G;;;I"NEAT.gaussian;F;[�;[[@�iO;T;:
gaussian;;;[�;{�;IC;"#Mixin for the gaussian object.
;T;[�;[�;I"#Mixin for the gaussian object.;T;0; @�
;!F;"o;#;$F;%iN;&iN;'@;(I"2def self.gaussian ; @controller.gaussian; end;T;)T;*I"2def self.gaussian ; @controller.gaussian; end;T;+To;
;F;;G;;;I"
NEAT.dpp;F;[[I"ob;T0;[[@�iR;T;:dpp;;;[�;{�;IC;"PrettyPrint to log.debug
;T;[�;[�;I"PrettyPrint to log.debug;T;0; @�
;!F;"o;#;$F;%iQ;&iQ;'@;(I"def self.dpp ob;T;)T;*I"&def self.dpp ob
  #$log.ap ob
end;T;+T@�o;F;IC;[�;:@�
;;IC;[�;:@�
;<IC;[�;:@�
;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@�i{;F;:NeatException;;;;;[�;{�;IC;"�
;T; @�
;/0;!F;[�;[�;I"�;T;0;'@;I"NEAT::NeatException;F;To;=;>0;?0;@0;;f;'@;B0;C;G;+T@�
o;F;IC;[�;:@�
;;IC;[�;:@�
;<IC;[�;:@�
;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@�i�;T;:
Trait;;;;;[�;{�;IC;"�= Traits
A Trait is a group of parameters that can be expressed     
as a group more than one time.  Traits save a genetic      
algorithm from having to search vast parameter landscapes  
on every node.  Instead, each node can simply point to a trait 
and those traits can evolve on their own. (Taken from the C version of NEAT)

Since we wish to allow for different classes of Neurons, this trait idea is
super, since all we need to do is have a different trait species for the
different node types.
;T;[�;[�;I"�= Traits
A Trait is a group of parameters that can be expressed     
as a group more than one time.  Traits save a genetic      
algorithm from having to search vast parameter landscapes  
on every node.  Instead, each node can simply point to a trait 
and those traits can evolve on their own. (Taken from the C version of NEAT)

Since we wish to allow for different classes of Neurons, this trait idea is
super, since all we need to do is have a different trait species for the
different node types.;T;0; @�
;!F;"o;#;$F;%i~;&i�;'@;I"NEAT::Trait;F;To;=;>0;?0;@0;;r;'@;B@�;C0;+To;F;IC;[:o;
;F;;
;;;I"$NEAT::Controller#glob_innov_num;F;[�;[[@�i�;T;:glob_innov_num;;;[�;{�;IC;"global innovation number
;T;[�;[�;I"global innovation number;T;0; @;!F;"o;#;$F;%i�;&i�;'@;(I"def glob_innov_num;T;*I"-def glob_innov_num
  @glob_innov_num
end;T;+To;
;F;;
;;;I"NEAT::Controller#seq_num;F;[�;[[@�i�;T;:seq_num;;;[�;{�;IC;",current sequence number being evaluated
;T;[�;[�;I",current sequence number being evaluated;T;0; @!;!F;"o;#;$F;%i�;&i�;'@;(I"def seq_num;T;*I"def seq_num
  @seq_num
end;T;+To;
;F;;
;;;I"$NEAT::Controller#generation_num;F;[�;[[@�i�;T;:generation_num;;;[�;{�;IC;"Current generation count
;T;[�;[�;I"Current generation count;T;0; @/;!F;"o;#;$F;%i�;&i�;'@;(I"def generation_num;T;*I"-def generation_num
  @generation_num
end;T;+To;
;F;;
;;;I"$NEAT::Controller#neuron_catalog;F;[�;[[@�i�;T;:neuron_catalog;;;[�;{�;IC;"@catalog of neurons classes to use { weight => nclass, ... }
;T;[�;[�;I"@catalog of neurons classes to use { weight => nclass, ... };T;0; @=;!F;"o;#;$F;%i�;&i�;'@;(I"def neuron_catalog;T;*I"-def neuron_catalog
  @neuron_catalog
end;T;+To;
;F;;
;;;I"%NEAT::Controller#neuron_catalog=;F;[[I"
value;T0;[[@�i�;T;:neuron_catalog=;;;[�;{�;IC;"@catalog of neurons classes to use { weight => nclass, ... }
;T;[�;[�;@G;0; @K;!F;"@H;'@;(I"def neuron_catalog=(value);T;*I"=def neuron_catalog=(value)
  @neuron_catalog = value
end;T;+To;
;F;;
;;;I"#NEAT::Controller#neural_inputs;F;[�;[[@�i�;T;;�;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;I"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron);T;0; @Y;!F;"o;#;$F;%i�;&i�;'@;(I"def neural_inputs;T;*I"+def neural_inputs
  @neural_inputs
end;T;+To;
;F;;
;;;I"$NEAT::Controller#neural_inputs=;F;[[I"
value;T0;[[@�i�;T;:neural_inputs=;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;@c;0; @g;!F;"@d;'@;(I"def neural_inputs=(value);T;*I";def neural_inputs=(value)
  @neural_inputs = value
end;T;+To;
;F;;
;;;I"$NEAT::Controller#neural_outputs;F;[�;[[@�i�;T;;�;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;@c;0; @u;!F;"@d;'@;(I"def neural_outputs;T;*I"-def neural_outputs
  @neural_outputs
end;T;+To;
;F;;
;;;I"%NEAT::Controller#neural_outputs=;F;[[I"
value;T0;[[@�i�;T;:neural_outputs=;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;@c;0; @�;!F;"@d;'@;(I"def neural_outputs=(value);T;*I"=def neural_outputs=(value)
  @neural_outputs = value
end;T;+To;
;F;;
;;;I"#NEAT::Controller#neural_hidden;F;[�;[[@�i�;T;:neural_hidden;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;@c;0; @�;!F;"@d;'@;(I"def neural_hidden;T;*I"+def neural_hidden
  @neural_hidden
end;T;+To;
;F;;
;;;I"$NEAT::Controller#neural_hidden=;F;[[I"
value;T0;[[@�i�;T;:neural_hidden=;;;[�;{�;IC;"�Class map of named input and output neurons (each critter will have 
instantiations of these) name: InputNeuralClass (usually InputNeuron)
;T;[�;[�;@c;0; @�;!F;"@d;'@;(I"def neural_hidden=(value);T;*I";def neural_hidden=(value)
  @neural_hidden = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#parms;F;[�;[[@�i�;T;:
parms;;;[�;{�;IC;".Parameters for evolution (NeatParameters)
;T;[�;[�;I".Parameters for evolution (NeatParameters);T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def parms;T;*I"def parms
  @parms
end;T;+To;
;F;;
;;;I"NEAT::Controller#parms=;F;[[I"
value;T0;[[@�i�;T;:parms=;;;[�;{�;IC;".Parameters for evolution (NeatParameters)
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def parms=(value);T;*I"+def parms=(value)
  @parms = value
end;T;+To;
;F;;
;;;I" NEAT::Controller#population;F;[�;[[@�i�;T;;;;;[�;{�;IC;".population object and class specification
;T;[�;[�;I".population object and class specification;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def population;T;*I"%def population
  @population
end;T;+To;
;F;;
;;;I"(NEAT::Controller#population_history;F;[�;[[@�i�;T;:population_history;;;[�;{�;IC;".population object and class specification
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def population_history;T;*I"5def population_history
  @population_history
end;T;+To;
;F;;
;;;I"&NEAT::Controller#population_class;F;[�;[[@�i�;T;:population_class;;;[�;{�;IC;".population object and class specification
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def population_class;T;*I"1def population_class
  @population_class
end;T;+To;
;F;;
;;;I"NEAT::Controller#expressor;F;[�;[[@�i�;F;:expressor;;;[�;{�;IC;"-Returns the value of attribute expressor
;T; @�;/0;!F;[�;[�;I"-Returns the value of attribute expressor;T;0;'@;(I"def expressor;T;*I"#def expressor
  @expressor
end;T;+To;
;F;;
;;;I" NEAT::Controller#expressor=;F;[[I"
value;T0;[[@�i�;F;:expressor=;;;[�;{�;IC;"!Sets the attribute expressor
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"1the value to set the attribute expressor to.;T;I"
value;T;L0; @�;I"[Sets the attribute expressor
@param value the value to set the attribute expressor to.;T;0;'@;(I"def expressor=(value);T;*I"3def expressor=(value)
  @expressor = value
end;T;+To;
;F;;
;;;I"%NEAT::Controller#expressor_class;F;[�;[[@�i�;F;:expressor_class;;;[�;{�;IC;"3Returns the value of attribute expressor_class
;T; @;/0;!F;[�;[�;I"3Returns the value of attribute expressor_class;T;0;'@;(I"def expressor_class;T;*I"/def expressor_class
  @expressor_class
end;T;+To;
;F;;
;;;I"&NEAT::Controller#expressor_class=;F;[[I"
value;T0;[[@�i�;F;:expressor_class=;;;[�;{�;IC;"'Sets the attribute expressor_class
;T; @;/0;!F;[�;[o;I
;JI"
param;F;KI"7the value to set the attribute expressor_class to.;T;I"
value;T;L0; @;I"gSets the attribute expressor_class
@param value the value to set the attribute expressor_class to.;T;0;'@;(I" def expressor_class=(value);T;*I"?def expressor_class=(value)
  @expressor_class = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#evaluator;F;[�;[[@�i�;F;:evaluator;;;[�;{�;IC;"-Returns the value of attribute evaluator
;T; @+;/0;!F;[�;[�;I"-Returns the value of attribute evaluator;T;0;'@;(I"def evaluator;T;*I"#def evaluator
  @evaluator
end;T;+To;
;F;;
;;;I" NEAT::Controller#evaluator=;F;[[I"
value;T0;[[@�i�;F;:evaluator=;;;[�;{�;IC;"!Sets the attribute evaluator
;T; @8;/0;!F;[�;[o;I
;JI"
param;F;KI"1the value to set the attribute evaluator to.;T;I"
value;T;L0; @8;I"[Sets the attribute evaluator
@param value the value to set the attribute evaluator to.;T;0;'@;(I"def evaluator=(value);T;*I"3def evaluator=(value)
  @evaluator = value
end;T;+To;
;F;;
;;;I"%NEAT::Controller#evaluator_class;F;[�;[[@�i�;F;:evaluator_class;;;[�;{�;IC;"3Returns the value of attribute evaluator_class
;T; @K;/0;!F;[�;[�;I"3Returns the value of attribute evaluator_class;T;0;'@;(I"def evaluator_class;T;*I"/def evaluator_class
  @evaluator_class
end;T;+To;
;F;;
;;;I"&NEAT::Controller#evaluator_class=;F;[[I"
value;T0;[[@�i�;F;:evaluator_class=;;;[�;{�;IC;"'Sets the attribute evaluator_class
;T; @X;/0;!F;[�;[o;I
;JI"
param;F;KI"7the value to set the attribute evaluator_class to.;T;I"
value;T;L0; @X;I"gSets the attribute evaluator_class
@param value the value to set the attribute evaluator_class to.;T;0;'@;(I" def evaluator_class=(value);T;*I"?def evaluator_class=(value)
  @evaluator_class = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#evolver;F;[�;[[@�i�;F;:evolver;;;[�;{�;IC;"+Returns the value of attribute evolver
;T; @k;/0;!F;[�;[�;I"+Returns the value of attribute evolver;T;0;'@;(I"def evolver;T;*I"def evolver
  @evolver
end;T;+To;
;F;;
;;;I"NEAT::Controller#evolver=;F;[[I"
value;T0;[[@�i�;F;:
evolver=;;;[�;{�;IC;"Sets the attribute evolver
;T; @x;/0;!F;[�;[o;I
;JI"
param;F;KI"/the value to set the attribute evolver to.;T;I"
value;T;L0; @x;I"WSets the attribute evolver
@param value the value to set the attribute evolver to.;T;0;'@;(I"def evolver=(value);T;*I"/def evolver=(value)
  @evolver = value
end;T;+To;
;F;;
;;;I"#NEAT::Controller#evolver_class;F;[�;[[@�i�;F;:evolver_class;;;[�;{�;IC;"1Returns the value of attribute evolver_class
;T; @�;/0;!F;[�;[�;I"1Returns the value of attribute evolver_class;T;0;'@;(I"def evolver_class;T;*I"+def evolver_class
  @evolver_class
end;T;+To;
;F;;
;;;I"$NEAT::Controller#evolver_class=;F;[[I"
value;T0;[[@�i�;F;:evolver_class=;;;[�;{�;IC;"%Sets the attribute evolver_class
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"5the value to set the attribute evolver_class to.;T;I"
value;T;L0; @�;I"cSets the attribute evolver_class
@param value the value to set the attribute evolver_class to.;T;0;'@;(I"def evolver_class=(value);T;*I";def evolver_class=(value)
  @evolver_class = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#verbosity;F;[�;[[@�i�;T;:verbosity;;;[�;{�;IC;"{Global verbosity level:
1 - normal (the default)
2 - really verbose
3 - maximally verbose
Use in conjunction with log.debug
;T;[�;[�;I"{Global verbosity level:
1 - normal (the default)
2 - really verbose
3 - maximally verbose
Use in conjunction with log.debug;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def verbosity;T;*I"#def verbosity
  @verbosity
end;T;+To;
;F;;
;;;I" NEAT::Controller#verbosity=;F;[[I"
value;T0;[[@�i�;T;:verbosity=;;;[�;{�;IC;"{Global verbosity level:
1 - normal (the default)
2 - really verbose
3 - maximally verbose
Use in conjunction with log.debug
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def verbosity=(value);T;*I"3def verbosity=(value)
  @verbosity = value
end;T;+To;
;F;;
;;;I" NEAT::Controller#query_func;F;[�;[[@�i�;T;:query_func;;;[�;{�;IC;"-Query function that Critters shall call.
;T;[�;[�;I"-Query function that Critters shall call.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def query_func;T;*I"%def query_func
  @query_func
end;T;+To;
;F;;
;;;I"!NEAT::Controller#query_func=;F;[[I"
value;T0;[[@�i�;T;:query_func=;;;[�;{�;IC;"-Query function that Critters shall call.
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def query_func=(value);T;*I"5def query_func=(value)
  @query_func = value
end;T;+To;
;F;;
;;;I""NEAT::Controller#fitness_func;F;[�;[[@�i�;T;:fitness_func;;;[�;{�;IC;"6Fitness function that Critters shall be rated on.
;T;[�;[�;I"6Fitness function that Critters shall be rated on.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def fitness_func;T;*I")def fitness_func
  @fitness_func
end;T;+To;
;F;;
;;;I"#NEAT::Controller#fitness_func=;F;[[I"
value;T0;[[@�i�;T;:fitness_func=;;;[�;{�;IC;"6Fitness function that Critters shall be rated on.
;T;[�;[�;@�;0; @�;!F;"@�;'@;(I"def fitness_func=(value);T;*I"9def fitness_func=(value)
  @fitness_func = value
end;T;+To;
;F;;
;;;I"%NEAT::Controller#recurrence_func;F;[�;[[@�i�;T;:recurrence_func;;;[�;{�;IC;"5Recurrence function that Critters will yield to.
;T;[�;[�;I"5Recurrence function that Critters will yield to.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def recurrence_func;T;*I"/def recurrence_func
  @recurrence_func
end;T;+To;
;F;;
;;;I"&NEAT::Controller#recurrence_func=;F;[[I"
value;T0;[[@�i�;T;:recurrence_func=;;;[�;{�;IC;"5Recurrence function that Critters will yield to.
;T;[�;[�;@	
;0; @

;!F;"@

;'@;(I" def recurrence_func=(value);T;*I"?def recurrence_func=(value)
  @recurrence_func = value
end;T;+To;
;F;;
;;;I""NEAT::Controller#compare_func;F;[�;[[@�i�;T;:compare_func;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;I"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.;T;0; @
;!F;"o;#;$F;%i�;&i�;'@;(I"def compare_func;T;*I")def compare_func
  @compare_func
end;T;+To;
;F;;
;;;I"#NEAT::Controller#compare_func=;F;[[I"
value;T0;[[@�i�;T;:compare_func=;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;@%
;0; @)
;!F;"@&
;'@;(I"def compare_func=(value);T;*I"9def compare_func=(value)
  @compare_func = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#cost_func;F;[�;[[@�i�;T;:cost_func;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;@%
;0; @7
;!F;"@&
;'@;(I"def cost_func;T;*I"#def cost_func
  @cost_func
end;T;+To;
;F;;
;;;I" NEAT::Controller#cost_func=;F;[[I"
value;T0;[[@�i�;T;:cost_func=;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;@%
;0; @C
;!F;"@&
;'@;(I"def cost_func=(value);T;*I"3def cost_func=(value)
  @cost_func = value
end;T;+To;
;F;;
;;;I"&NEAT::Controller#stop_on_fit_func;F;[�;[[@�i�;T;:stop_on_fit_func;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;@%
;0; @Q
;!F;"@&
;'@;(I"def stop_on_fit_func;T;*I"1def stop_on_fit_func
  @stop_on_fit_func
end;T;+To;
;F;;
;;;I"'NEAT::Controller#stop_on_fit_func=;F;[[I"
value;T0;[[@�i�;T;:stop_on_fit_func=;;;[�;{�;IC;"bCompare function for fitness
Cost function for integrating in the cost to the fitness scalar.
;T;[�;[�;@%
;0; @]
;!F;"@&
;'@;(I"!def stop_on_fit_func=(value);T;*I"Adef stop_on_fit_func=(value)
  @stop_on_fit_func = value
end;T;+To;
;F;;
;;;I""NEAT::Controller#end_run_func;F;[�;[[@�i�;T;:end_run_func;;;[�;{�;IC;"uEnd run function to call at the end of each generational run
Also report_hook to dump reports for the user, etc.
;T;[�;[�;I"uEnd run function to call at the end of each generational run
Also report_hook to dump reports for the user, etc.;T;0; @k
;!F;"o;#;$F;%i�;&i�;'@;(I"def end_run_func;T;*I")def end_run_func
  @end_run_func
end;T;+To;
;F;;
;;;I"#NEAT::Controller#end_run_func=;F;[[I"
value;T0;[[@�i�;T;:end_run_func=;;;[�;{�;IC;"uEnd run function to call at the end of each generational run
Also report_hook to dump reports for the user, etc.
;T;[�;[�;@u
;0; @y
;!F;"@v
;'@;(I"def end_run_func=(value);T;*I"9def end_run_func=(value)
  @end_run_func = value
end;T;+To;
;F;;
;;;I"!NEAT::Controller#report_hook;F;[�;[[@�i�;T;:report_hook;;;[�;{�;IC;"uEnd run function to call at the end of each generational run
Also report_hook to dump reports for the user, etc.
;T;[�;[�;@u
;0; @�
;!F;"@v
;'@;(I"def report_hook;T;*I"'def report_hook
  @report_hook
end;T;+To;
;F;;
;;;I""NEAT::Controller#report_hook=;F;[[I"
value;T0;[[@�i�;T;:report_hook=;;;[�;{�;IC;"uEnd run function to call at the end of each generational run
Also report_hook to dump reports for the user, etc.
;T;[�;[�;@u
;0; @�
;!F;"@v
;'@;(I"def report_hook=(value);T;*I"7def report_hook=(value)
  @report_hook = value
end;T;+To;
;F;;
;;;I"NEAT::Controller#log;F;[�;[[@�i�;T;;u;;;[�;{�;IC;"&Logger object for all of RubyNEAT
;T;[�;[�;I"&Logger object for all of RubyNEAT;T;0; @�
;!F;"o;#;$F;%i�;&i�;'@;(I"def log;T;*I"def log
  @log
end;T;+To;F;IC;[po;
;F;;
;;;I"3NEAT::Controller::NeatSettings#hash_on_fitness;F;[�;[[@�i�;T;:hash_on_fitness;;;[�;{�;IC;"uSet to true to returned named parameters as hashes to the fitness function
(the default is to do ordered arrays)
;T;[�;[�;I"uSet to true to returned named parameters as hashes to the fitness function
(the default is to do ordered arrays);T;0; @�
;!F;"o;#;$F;%i�;&i�;'@�
;(I"def hash_on_fitness;T;*I"/def hash_on_fitness
  @hash_on_fitness
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#hash_on_fitness=;F;[[I"
value;T0;[[@�i�;T;:hash_on_fitness=;;;[�;{�;IC;"uSet to true to returned named parameters as hashes to the fitness function
(the default is to do ordered arrays)
;T;[�;[�;@�
;0; @�
;!F;"@�
;'@�
;(I" def hash_on_fitness=(value);T;*I"?def hash_on_fitness=(value)
  @hash_on_fitness = value
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#age_significance;F;[�;[[@�i�;T;:age_significance;;;[�;{�;IC;"#based on the C version of NEAT
;T;[�;[�;I"#based on the C version of NEAT;T;0; @�
;!T;"o;#;$F;%i�;&i�;'@�
;(I"def age_significance;T;*I"1def age_significance
  @age_significance
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#age_significance=;F;[[I"
value;T0;[[@�i�;T;:age_significance=;;;[�;{�;IC;"#based on the C version of NEAT
;T;[�;[�;@�
;0; @�
;!T;"@�
;'@�
;(I"!def age_significance=(value);T;*I"Adef age_significance=(value)
  @age_significance = value
end;T;+To;
;F;;
;;;I"1NEAT::Controller::NeatSettings#babies_stolen;F;[�;[[@�i�;F;:babies_stolen;;;[�;{�;IC;"1Returns the value of attribute babies_stolen
;T; @�
;/0;!F;[�;[�;I"1Returns the value of attribute babies_stolen;T;0;'@�
;(I"def babies_stolen;T;*I"+def babies_stolen
  @babies_stolen
end;T;+To;
;F;;
;;;I"2NEAT::Controller::NeatSettings#babies_stolen=;F;[[I"
value;T0;[[@�i�;F;:babies_stolen=;;;[�;{�;IC;"%Sets the attribute babies_stolen
;T; @�
;/0;!F;[�;[o;I
;JI"
param;F;KI"5the value to set the attribute babies_stolen to.;T;I"
value;T;L0; @�
;I"cSets the attribute babies_stolen
@param value the value to set the attribute babies_stolen to.;T;0;'@�
;(I"def babies_stolen=(value);T;*I";def babies_stolen=(value)
  @babies_stolen = value
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#compatibility_threshold;F;[�;[[@�i�;T;:compatibility_threshold;;;[�;{�;IC;"$Species compatability threshold
;T;[�;[�;I"$Species compatability threshold;T;0; @	;!F;"o;#;$F;%i�;&i�;'@�
;(I" def compatibility_threshold;T;*I"?def compatibility_threshold
  @compatibility_threshold
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#compatibility_threshold=;F;[[I"
value;T0;[[@�i�;T;:compatibility_threshold=;;;[�;{�;IC;"$Species compatability threshold
;T;[�;[�;@;0; @;!F;"@;'@�
;(I"(def compatibility_threshold=(value);T;*I"Odef compatibility_threshold=(value)
  @compatibility_threshold = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#disjoint_coefficient;F;[�;[[@�i�;T;:disjoint_coefficient;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;I"Speciation coffficient;T;0; @%;!F;"o;#;$F;%i�;&i�;'@�
;(I"def disjoint_coefficient;T;*I"9def disjoint_coefficient
  @disjoint_coefficient
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#disjoint_coefficient=;F;[[I"
value;T0;[[@�i�;T;:disjoint_coefficient=;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;@/;0; @3;!F;"@0;'@�
;(I"%def disjoint_coefficient=(value);T;*I"Idef disjoint_coefficient=(value)
  @disjoint_coefficient = value
end;T;+To;
;F;;
;;;I"6NEAT::Controller::NeatSettings#excess_coefficient;F;[�;[[@�i�;T;:excess_coefficient;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;@/;0; @A;!F;"@0;'@�
;(I"def excess_coefficient;T;*I"5def excess_coefficient
  @excess_coefficient
end;T;+To;
;F;;
;;;I"7NEAT::Controller::NeatSettings#excess_coefficient=;F;[[I"
value;T0;[[@�i�;T;:excess_coefficient=;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;@/;0; @M;!F;"@0;'@�
;(I"#def excess_coefficient=(value);T;*I"Edef excess_coefficient=(value)
  @excess_coefficient = value
end;T;+To;
;F;;
;;;I"6NEAT::Controller::NeatSettings#weight_coefficient;F;[�;[[@�i�;T;:weight_coefficient;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;@/;0; @[;!F;"@0;'@�
;(I"def weight_coefficient;T;*I"5def weight_coefficient
  @weight_coefficient
end;T;+To;
;F;;
;;;I"7NEAT::Controller::NeatSettings#weight_coefficient=;F;[[I"
value;T0;[[@�i�;T;:weight_coefficient=;;;[�;{�;IC;"Speciation coffficient
;T;[�;[�;@/;0; @g;!F;"@0;'@�
;(I"#def weight_coefficient=(value);T;*I"Edef weight_coefficient=(value)
  @weight_coefficient = value
end;T;+To;
;F;;
;;;I"/NEAT::Controller::NeatSettings#max_species;F;[�;[[@�i�;T;:max_species;;;[�;{�;IC;"mMax target number of species (will result in the compatability_coeifficient
being adjusted automatically
;T;[�;[�;I"mMax target number of species (will result in the compatability_coeifficient
being adjusted automatically;T;0; @u;!F;"o;#;$F;%i�;&i�;'@�
;(I"def max_species;T;*I"'def max_species
  @max_species
end;T;+To;
;F;;
;;;I"0NEAT::Controller::NeatSettings#max_species=;F;[[I"
value;T0;[[@�i�;T;:max_species=;;;[�;{�;IC;"mMax target number of species (will result in the compatability_coeifficient
being adjusted automatically
;T;[�;[�;@;0; @�;!F;"@�;'@�
;(I"def max_species=(value);T;*I"7def max_species=(value)
  @max_species = value
end;T;+To;
;F;;
;;;I"/NEAT::Controller::NeatSettings#dropoff_age;F;[�;[[@�i�;T;:dropoff_age;;;[�;{�;IC;"0Species Peality age for not making progress
;T;[�;[�;I"0Species Peality age for not making progress;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�
;(I"def dropoff_age;T;*I"'def dropoff_age
  @dropoff_age
end;T;+To;
;F;;
;;;I"0NEAT::Controller::NeatSettings#dropoff_age=;F;[[I"
value;T0;[[@�i�;T;:dropoff_age=;;;[�;{�;IC;"0Species Peality age for not making progress
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"def dropoff_age=(value);T;*I"7def dropoff_age=(value)
  @dropoff_age = value
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#smallest_species;F;[�;[[@�i�;T;:smallest_species;;;[�;{�;IC;"JSpecies smallest population allowed (coalse smaller species into one)
;T;[�;[�;I"JSpecies smallest population allowed (coalse smaller species into one);T;0; @�;!F;"o;#;$F;%i�;&i�;'@�
;(I"def smallest_species;T;*I"1def smallest_species
  @smallest_species
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#smallest_species=;F;[[I"
value;T0;[[@�i�;T;:smallest_species=;;;[�;{�;IC;"JSpecies smallest population allowed (coalse smaller species into one)
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"!def smallest_species=(value);T;*I"Adef smallest_species=(value)
  @smallest_species = value
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#interspecies_mate_rate;F;[�;[[@�i�;T;:interspecies_mate_rate;;;[�;{�;IC;".Ratio of mating are actually interspecies
;T;[�;[�;I".Ratio of mating are actually interspecies;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�
;(I"def interspecies_mate_rate;T;*I"=def interspecies_mate_rate
  @interspecies_mate_rate
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#interspecies_mate_rate=;F;[[I"
value;T0;[[@�i�;T;:interspecies_mate_rate=;;;[�;{�;IC;".Ratio of mating are actually interspecies
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"'def interspecies_mate_rate=(value);T;*I"Mdef interspecies_mate_rate=(value)
  @interspecies_mate_rate = value
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#linktrait_mutation_sig;F;[�;[[@�i�;F;:linktrait_mutation_sig;;;[�;{�;IC;":Returns the value of attribute linktrait_mutation_sig
;T; @�;/0;!F;[�;[�;I":Returns the value of attribute linktrait_mutation_sig;T;0;'@�
;(I"def linktrait_mutation_sig;T;*I"=def linktrait_mutation_sig
  @linktrait_mutation_sig
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#linktrait_mutation_sig=;F;[[I"
value;T0;[[@�i�;F;:linktrait_mutation_sig=;;;[�;{�;IC;".Sets the attribute linktrait_mutation_sig
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI">the value to set the attribute linktrait_mutation_sig to.;T;I"
value;T;L0; @�;I"uSets the attribute linktrait_mutation_sig
@param value the value to set the attribute linktrait_mutation_sig to.;T;0;'@�
;(I"'def linktrait_mutation_sig=(value);T;*I"Mdef linktrait_mutation_sig=(value)
  @linktrait_mutation_sig = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#mate_multipoint_avg_prob;F;[�;[[@�i�;F;:mate_multipoint_avg_prob;;;[�;{�;IC;"<Returns the value of attribute mate_multipoint_avg_prob
;T; @;/0;!F;[�;[�;I"<Returns the value of attribute mate_multipoint_avg_prob;T;0;'@�
;(I"!def mate_multipoint_avg_prob;T;*I"Adef mate_multipoint_avg_prob
  @mate_multipoint_avg_prob
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mate_multipoint_avg_prob=;F;[[I"
value;T0;[[@�i�;F;:mate_multipoint_avg_prob=;;;[�;{�;IC;"0Sets the attribute mate_multipoint_avg_prob
;T; @;/0;!F;[�;[o;I
;JI"
param;F;KI"@the value to set the attribute mate_multipoint_avg_prob to.;T;I"
value;T;L0; @;I"ySets the attribute mate_multipoint_avg_prob
@param value the value to set the attribute mate_multipoint_avg_prob to.;T;0;'@�
;(I")def mate_multipoint_avg_prob=(value);T;*I"Qdef mate_multipoint_avg_prob=(value)
  @mate_multipoint_avg_prob = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#mate_multipoint_prob;F;[�;[[@�i�;F;:mate_multipoint_prob;;;[�;{�;IC;"8Returns the value of attribute mate_multipoint_prob
;T; @%;/0;!F;[�;[�;I"8Returns the value of attribute mate_multipoint_prob;T;0;'@�
;(I"def mate_multipoint_prob;T;*I"9def mate_multipoint_prob
  @mate_multipoint_prob
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#mate_multipoint_prob=;F;[[I"
value;T0;[[@�i�;F;:mate_multipoint_prob=;;;[�;{�;IC;",Sets the attribute mate_multipoint_prob
;T; @2;/0;!F;[�;[o;I
;JI"
param;F;KI"<the value to set the attribute mate_multipoint_prob to.;T;I"
value;T;L0; @2;I"qSets the attribute mate_multipoint_prob
@param value the value to set the attribute mate_multipoint_prob to.;T;0;'@�
;(I"%def mate_multipoint_prob=(value);T;*I"Idef mate_multipoint_prob=(value)
  @mate_multipoint_prob = value
end;T;+To;
;F;;
;;;I"2NEAT::Controller::NeatSettings#mate_only_prob;F;[�;[[@�i�;F;:mate_only_prob;;;[�;{�;IC;"2Returns the value of attribute mate_only_prob
;T; @E;/0;!F;[�;[�;I"2Returns the value of attribute mate_only_prob;T;0;'@�
;(I"def mate_only_prob;T;*I"-def mate_only_prob
  @mate_only_prob
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#mate_only_prob=;F;[[I"
value;T0;[[@�i�;F;:mate_only_prob=;;;[�;{�;IC;"&Sets the attribute mate_only_prob
;T; @R;/0;!F;[�;[o;I
;JI"
param;F;KI"6the value to set the attribute mate_only_prob to.;T;I"
value;T;L0; @R;I"eSets the attribute mate_only_prob
@param value the value to set the attribute mate_only_prob to.;T;0;'@�
;(I"def mate_only_prob=(value);T;*I"=def mate_only_prob=(value)
  @mate_only_prob = value
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#mate_singlepoint_prob;F;[�;[[@�i�;F;:mate_singlepoint_prob;;;[�;{�;IC;"9Returns the value of attribute mate_singlepoint_prob
;T; @e;/0;!F;[�;[�;I"9Returns the value of attribute mate_singlepoint_prob;T;0;'@�
;(I"def mate_singlepoint_prob;T;*I";def mate_singlepoint_prob
  @mate_singlepoint_prob
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#mate_singlepoint_prob=;F;[[I"
value;T0;[[@�i�;F;:mate_singlepoint_prob=;;;[�;{�;IC;"-Sets the attribute mate_singlepoint_prob
;T; @r;/0;!F;[�;[o;I
;JI"
param;F;KI"=the value to set the attribute mate_singlepoint_prob to.;T;I"
value;T;L0; @r;I"sSets the attribute mate_singlepoint_prob
@param value the value to set the attribute mate_singlepoint_prob to.;T;0;'@�
;(I"&def mate_singlepoint_prob=(value);T;*I"Kdef mate_singlepoint_prob=(value)
  @mate_singlepoint_prob = value
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#max_generations;F;[�;[[@�i�;T;:max_generations;;;[�;{�;IC;"4Maximum number of generations to run, if given.
;T;[�;[�;I"4Maximum number of generations to run, if given.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�
;(I"def max_generations;T;*I"/def max_generations
  @max_generations
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#max_generations=;F;[[I"
value;T0;[[@�i�;T;:max_generations=;;;[�;{�;IC;"4Maximum number of generations to run, if given.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I" def max_generations=(value);T;*I"?def max_generations=(value)
  @max_generations = value
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#max_population_history;F;[�;[[@�i�;T;:max_population_history;;;[�;{�;IC;"EMaximun number of populations to maintain in the history buffer.
;T;[�;[�;I"EMaximun number of populations to maintain in the history buffer.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�
;(I"def max_population_history;T;*I"=def max_population_history
  @max_population_history
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#max_population_history=;F;[[I"
value;T0;[[@�i�;T;:max_population_history=;;;[�;{�;IC;"EMaximun number of populations to maintain in the history buffer.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"'def max_population_history=(value);T;*I"Mdef max_population_history=(value)
  @max_population_history = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#mutate_add_gene_prob;F;[�;[[@�i�;F;:mutate_add_gene_prob;;;[�;{�;IC;"8Returns the value of attribute mutate_add_gene_prob
;T; @�;/0;!F;[�;[�;I"8Returns the value of attribute mutate_add_gene_prob;T;0;'@�
;(I"def mutate_add_gene_prob;T;*I"9def mutate_add_gene_prob
  @mutate_add_gene_prob
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#mutate_add_gene_prob=;F;[[I"
value;T0;[[@�i�;F;:mutate_add_gene_prob=;;;[�;{�;IC;",Sets the attribute mutate_add_gene_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"<the value to set the attribute mutate_add_gene_prob to.;T;I"
value;T;L0; @�;I"qSets the attribute mutate_add_gene_prob
@param value the value to set the attribute mutate_add_gene_prob to.;T;0;'@�
;(I"%def mutate_add_gene_prob=(value);T;*I"Idef mutate_add_gene_prob=(value)
  @mutate_add_gene_prob = value
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#mutate_add_neuron_prob;F;[�;[[@�i�;F;:mutate_add_neuron_prob;;;[�;{�;IC;":Returns the value of attribute mutate_add_neuron_prob
;T; @�;/0;!F;[�;[�;I":Returns the value of attribute mutate_add_neuron_prob;T;0;'@�
;(I"def mutate_add_neuron_prob;T;*I"=def mutate_add_neuron_prob
  @mutate_add_neuron_prob
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#mutate_add_neuron_prob=;F;[[I"
value;T0;[[@�i�;F;:mutate_add_neuron_prob=;;;[�;{�;IC;".Sets the attribute mutate_add_neuron_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI">the value to set the attribute mutate_add_neuron_prob to.;T;I"
value;T;L0; @�;I"uSets the attribute mutate_add_neuron_prob
@param value the value to set the attribute mutate_add_neuron_prob to.;T;0;'@�
;(I"'def mutate_add_neuron_prob=(value);T;*I"Mdef mutate_add_neuron_prob=(value)
  @mutate_add_neuron_prob = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#mutate_gene_disable_prob;F;[�;[[@�i�;F;:mutate_gene_disable_prob;;;[�;{�;IC;"<Returns the value of attribute mutate_gene_disable_prob
;T; @�;/0;!F;[�;[�;I"<Returns the value of attribute mutate_gene_disable_prob;T;0;'@�
;(I"!def mutate_gene_disable_prob;T;*I"Adef mutate_gene_disable_prob
  @mutate_gene_disable_prob
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mutate_gene_disable_prob=;F;[[I"
value;T0;[[@�i�;F;:mutate_gene_disable_prob=;;;[�;{�;IC;"0Sets the attribute mutate_gene_disable_prob
;T; @
;/0;!F;[�;[o;I
;JI"
param;F;KI"@the value to set the attribute mutate_gene_disable_prob to.;T;I"
value;T;L0; @
;I"ySets the attribute mutate_gene_disable_prob
@param value the value to set the attribute mutate_gene_disable_prob to.;T;0;'@�
;(I")def mutate_gene_disable_prob=(value);T;*I"Qdef mutate_gene_disable_prob=(value)
  @mutate_gene_disable_prob = value
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mutate_gene_reenable_prob;F;[�;[[@�i�;F;:mutate_gene_reenable_prob;;;[�;{�;IC;"=Returns the value of attribute mutate_gene_reenable_prob
;T; @;/0;!F;[�;[�;I"=Returns the value of attribute mutate_gene_reenable_prob;T;0;'@�
;(I""def mutate_gene_reenable_prob;T;*I"Cdef mutate_gene_reenable_prob
  @mutate_gene_reenable_prob
end;T;+To;
;F;;
;;;I">NEAT::Controller::NeatSettings#mutate_gene_reenable_prob=;F;[[I"
value;T0;[[@�i�;F;:mutate_gene_reenable_prob=;;;[�;{�;IC;"1Sets the attribute mutate_gene_reenable_prob
;T; @*;/0;!F;[�;[o;I
;JI"
param;F;KI"Athe value to set the attribute mutate_gene_reenable_prob to.;T;I"
value;T;L0; @*;I"{Sets the attribute mutate_gene_reenable_prob
@param value the value to set the attribute mutate_gene_reenable_prob to.;T;0;'@�
;(I"*def mutate_gene_reenable_prob=(value);T;*I"Sdef mutate_gene_reenable_prob=(value)
  @mutate_gene_reenable_prob = value
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#mutate_gene_trait_prob;F;[�;[[@�i;F;:mutate_gene_trait_prob;;;[�;{�;IC;":Returns the value of attribute mutate_gene_trait_prob
;T; @=;/0;!F;[�;[�;I":Returns the value of attribute mutate_gene_trait_prob;T;0;'@�
;(I"def mutate_gene_trait_prob;T;*I"=def mutate_gene_trait_prob
  @mutate_gene_trait_prob
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#mutate_gene_trait_prob=;F;[[I"
value;T0;[[@�i;F;:mutate_gene_trait_prob=;;;[�;{�;IC;".Sets the attribute mutate_gene_trait_prob
;T; @J;/0;!F;[�;[o;I
;JI"
param;F;KI">the value to set the attribute mutate_gene_trait_prob to.;T;I"
value;T;L0; @J;I"uSets the attribute mutate_gene_trait_prob
@param value the value to set the attribute mutate_gene_trait_prob to.;T;0;'@�
;(I"'def mutate_gene_trait_prob=(value);T;*I"Mdef mutate_gene_trait_prob=(value)
  @mutate_gene_trait_prob = value
end;T;+To;
;F;;
;;;I"DNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_prob;F;[�;[[@�i;T;:%mutate_perturb_gene_weights_prob;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;I"EFor gene weights perturbations and changes (complete overwrites);T;0; @];!F;"o;#;$F;%i;&i;'@�
;(I")def mutate_perturb_gene_weights_prob;T;*I"Qdef mutate_perturb_gene_weights_prob
  @mutate_perturb_gene_weights_prob
end;T;+To;
;F;;
;;;I"ENEAT::Controller::NeatSettings#mutate_perturb_gene_weights_prob=;F;[[I"
value;T0;[[@�i;T;:&mutate_perturb_gene_weights_prob=;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @k;!F;"@h;'@�
;(I"1def mutate_perturb_gene_weights_prob=(value);T;*I"adef mutate_perturb_gene_weights_prob=(value)
  @mutate_perturb_gene_weights_prob = value
end;T;+To;
;F;;
;;;I"BNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_sd;F;[�;[[@�i;T;:#mutate_perturb_gene_weights_sd;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @y;!F;"@h;'@�
;(I"'def mutate_perturb_gene_weights_sd;T;*I"Mdef mutate_perturb_gene_weights_sd
  @mutate_perturb_gene_weights_sd
end;T;+To;
;F;;
;;;I"CNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_sd=;F;[[I"
value;T0;[[@�i;T;:$mutate_perturb_gene_weights_sd=;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @�;!F;"@h;'@�
;(I"/def mutate_perturb_gene_weights_sd=(value);T;*I"]def mutate_perturb_gene_weights_sd=(value)
  @mutate_perturb_gene_weights_sd = value
end;T;+To;
;F;;
;;;I"CNEAT::Controller::NeatSettings#mutate_change_gene_weights_prob;F;[�;[[@�i;T;:$mutate_change_gene_weights_prob;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @�;!F;"@h;'@�
;(I"(def mutate_change_gene_weights_prob;T;*I"Odef mutate_change_gene_weights_prob
  @mutate_change_gene_weights_prob
end;T;+To;
;F;;
;;;I"DNEAT::Controller::NeatSettings#mutate_change_gene_weights_prob=;F;[[I"
value;T0;[[@�i;T;:%mutate_change_gene_weights_prob=;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @�;!F;"@h;'@�
;(I"0def mutate_change_gene_weights_prob=(value);T;*I"_def mutate_change_gene_weights_prob=(value)
  @mutate_change_gene_weights_prob = value
end;T;+To;
;F;;
;;;I"ANEAT::Controller::NeatSettings#mutate_change_gene_weights_sd;F;[�;[[@�i;T;:"mutate_change_gene_weights_sd;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @�;!F;"@h;'@�
;(I"&def mutate_change_gene_weights_sd;T;*I"Kdef mutate_change_gene_weights_sd
  @mutate_change_gene_weights_sd
end;T;+To;
;F;;
;;;I"BNEAT::Controller::NeatSettings#mutate_change_gene_weights_sd=;F;[[I"
value;T0;[[@�i;T;:#mutate_change_gene_weights_sd=;;;[�;{�;IC;"EFor gene weights perturbations and changes (complete overwrites)
;T;[�;[�;@g;0; @�;!F;"@h;'@�
;(I".def mutate_change_gene_weights_sd=(value);T;*I"[def mutate_change_gene_weights_sd=(value)
  @mutate_change_gene_weights_sd = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#mutate_neuron_trait_prob;F;[�;[[@�i	;F;:mutate_neuron_trait_prob;;;[�;{�;IC;"<Returns the value of attribute mutate_neuron_trait_prob
;T; @�;/0;!F;[�;[�;I"<Returns the value of attribute mutate_neuron_trait_prob;T;0;'@�
;(I"!def mutate_neuron_trait_prob;T;*I"Adef mutate_neuron_trait_prob
  @mutate_neuron_trait_prob
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mutate_neuron_trait_prob=;F;[[I"
value;T0;[[@�i	;F;:mutate_neuron_trait_prob=;;;[�;{�;IC;"0Sets the attribute mutate_neuron_trait_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"@the value to set the attribute mutate_neuron_trait_prob to.;T;I"
value;T;L0; @�;I"ySets the attribute mutate_neuron_trait_prob
@param value the value to set the attribute mutate_neuron_trait_prob to.;T;0;'@�
;(I")def mutate_neuron_trait_prob=(value);T;*I"Qdef mutate_neuron_trait_prob=(value)
  @mutate_neuron_trait_prob = value
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#mutate_only_prob;F;[�;[[@�i
;F;:mutate_only_prob;;;[�;{�;IC;"4Returns the value of attribute mutate_only_prob
;T; @�;/0;!F;[�;[�;I"4Returns the value of attribute mutate_only_prob;T;0;'@�
;(I"def mutate_only_prob;T;*I"1def mutate_only_prob
  @mutate_only_prob
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#mutate_only_prob=;F;[[I"
value;T0;[[@�i
;F;:mutate_only_prob=;;;[�;{�;IC;"(Sets the attribute mutate_only_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"8the value to set the attribute mutate_only_prob to.;T;I"
value;T;L0; @�;I"iSets the attribute mutate_only_prob
@param value the value to set the attribute mutate_only_prob to.;T;0;'@�
;(I"!def mutate_only_prob=(value);T;*I"Adef mutate_only_prob=(value)
  @mutate_only_prob = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#mutate_random_trait_prob;F;[�;[[@�i;F;:mutate_random_trait_prob;;;[�;{�;IC;"<Returns the value of attribute mutate_random_trait_prob
;T; @;/0;!F;[�;[�;I"<Returns the value of attribute mutate_random_trait_prob;T;0;'@�
;(I"!def mutate_random_trait_prob;T;*I"Adef mutate_random_trait_prob
  @mutate_random_trait_prob
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mutate_random_trait_prob=;F;[[I"
value;T0;[[@�i;F;:mutate_random_trait_prob=;;;[�;{�;IC;"0Sets the attribute mutate_random_trait_prob
;T; @;/0;!F;[�;[o;I
;JI"
param;F;KI"@the value to set the attribute mutate_random_trait_prob to.;T;I"
value;T;L0; @;I"ySets the attribute mutate_random_trait_prob
@param value the value to set the attribute mutate_random_trait_prob to.;T;0;'@�
;(I")def mutate_random_trait_prob=(value);T;*I"Qdef mutate_random_trait_prob=(value)
  @mutate_random_trait_prob = value
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#mutate_toggle_enable_prob;F;[�;[[@�i;F;:mutate_toggle_enable_prob;;;[�;{�;IC;"=Returns the value of attribute mutate_toggle_enable_prob
;T; @';/0;!F;[�;[�;I"=Returns the value of attribute mutate_toggle_enable_prob;T;0;'@�
;(I""def mutate_toggle_enable_prob;T;*I"Cdef mutate_toggle_enable_prob
  @mutate_toggle_enable_prob
end;T;+To;
;F;;
;;;I">NEAT::Controller::NeatSettings#mutate_toggle_enable_prob=;F;[[I"
value;T0;[[@�i;F;:mutate_toggle_enable_prob=;;;[�;{�;IC;"1Sets the attribute mutate_toggle_enable_prob
;T; @4;/0;!F;[�;[o;I
;JI"
param;F;KI"Athe value to set the attribute mutate_toggle_enable_prob to.;T;I"
value;T;L0; @4;I"{Sets the attribute mutate_toggle_enable_prob
@param value the value to set the attribute mutate_toggle_enable_prob to.;T;0;'@�
;(I"*def mutate_toggle_enable_prob=(value);T;*I"Sdef mutate_toggle_enable_prob=(value)
  @mutate_toggle_enable_prob = value
end;T;+To;
;F;;
;;;I"7NEAT::Controller::NeatSettings#mutdiff_coefficient;F;[�;[[@�i
;F;:mutdiff_coefficient;;;[�;{�;IC;"7Returns the value of attribute mutdiff_coefficient
;T; @G;/0;!F;[�;[�;I"7Returns the value of attribute mutdiff_coefficient;T;0;'@�
;(I"def mutdiff_coefficient;T;*I"7def mutdiff_coefficient
  @mutdiff_coefficient
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#mutdiff_coefficient=;F;[[I"
value;T0;[[@�i
;F;:mutdiff_coefficient=;;;[�;{�;IC;"+Sets the attribute mutdiff_coefficient
;T; @T;/0;!F;[�;[o;I
;JI"
param;F;KI";the value to set the attribute mutdiff_coefficient to.;T;I"
value;T;L0; @T;I"oSets the attribute mutdiff_coefficient
@param value the value to set the attribute mutdiff_coefficient to.;T;0;'@�
;(I"$def mutdiff_coefficient=(value);T;*I"Gdef mutdiff_coefficient=(value)
  @mutdiff_coefficient = value
end;T;+To;
;F;;
;;;I"1NEAT::Controller::NeatSettings#newlink_tries;F;[�;[[@�i;F;:newlink_tries;;;[�;{�;IC;"1Returns the value of attribute newlink_tries
;T; @g;/0;!F;[�;[�;I"1Returns the value of attribute newlink_tries;T;0;'@�
;(I"def newlink_tries;T;*I"+def newlink_tries
  @newlink_tries
end;T;+To;
;F;;
;;;I"2NEAT::Controller::NeatSettings#newlink_tries=;F;[[I"
value;T0;[[@�i;F;:newlink_tries=;;;[�;{�;IC;"%Sets the attribute newlink_tries
;T; @t;/0;!F;[�;[o;I
;JI"
param;F;KI"5the value to set the attribute newlink_tries to.;T;I"
value;T;L0; @t;I"cSets the attribute newlink_tries
@param value the value to set the attribute newlink_tries to.;T;0;'@�
;(I"def newlink_tries=(value);T;*I";def newlink_tries=(value)
  @newlink_tries = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#neuron_trait_mut_sig;F;[�;[[@�i;F;:neuron_trait_mut_sig;;;[�;{�;IC;"8Returns the value of attribute neuron_trait_mut_sig
;T; @�;/0;!F;[�;[�;I"8Returns the value of attribute neuron_trait_mut_sig;T;0;'@�
;(I"def neuron_trait_mut_sig;T;*I"9def neuron_trait_mut_sig
  @neuron_trait_mut_sig
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#neuron_trait_mut_sig=;F;[[I"
value;T0;[[@�i;F;:neuron_trait_mut_sig=;;;[�;{�;IC;",Sets the attribute neuron_trait_mut_sig
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"<the value to set the attribute neuron_trait_mut_sig to.;T;I"
value;T;L0; @�;I"qSets the attribute neuron_trait_mut_sig
@param value the value to set the attribute neuron_trait_mut_sig to.;T;0;'@�
;(I"%def neuron_trait_mut_sig=(value);T;*I"Idef neuron_trait_mut_sig=(value)
  @neuron_trait_mut_sig = value
end;T;+To;
;F;;
;;;I";NEAT::Controller::NeatSettings#fitness_cost_per_neuron;F;[�;[[@�i;T;:fitness_cost_per_neuron;;;[�;{�;IC;"�fitness costs, if given, use in the computation of fitness
AFTER the overall fitness for the applied stimuli have been
caclulated.
;T;[�;[�;I"�fitness costs, if given, use in the computation of fitness
AFTER the overall fitness for the applied stimuli have been
caclulated.;T;0; @�;!F;"o;#;$F;%i;&i;'@�
;(I" def fitness_cost_per_neuron;T;*I"?def fitness_cost_per_neuron
  @fitness_cost_per_neuron
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#fitness_cost_per_neuron=;F;[[I"
value;T0;[[@�i;T;:fitness_cost_per_neuron=;;;[�;{�;IC;"�fitness costs, if given, use in the computation of fitness
AFTER the overall fitness for the applied stimuli have been
caclulated.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"(def fitness_cost_per_neuron=(value);T;*I"Odef fitness_cost_per_neuron=(value)
  @fitness_cost_per_neuron = value
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#fitness_cost_per_gene;F;[�;[[@�i;F;:fitness_cost_per_gene;;;[�;{�;IC;"9Returns the value of attribute fitness_cost_per_gene
;T; @�;/0;!F;[�;[�;I"9Returns the value of attribute fitness_cost_per_gene;T;0;'@�
;(I"def fitness_cost_per_gene;T;*I";def fitness_cost_per_gene
  @fitness_cost_per_gene
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#fitness_cost_per_gene=;F;[[I"
value;T0;[[@�i;F;:fitness_cost_per_gene=;;;[�;{�;IC;"-Sets the attribute fitness_cost_per_gene
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"=the value to set the attribute fitness_cost_per_gene to.;T;I"
value;T;L0; @�;I"sSets the attribute fitness_cost_per_gene
@param value the value to set the attribute fitness_cost_per_gene to.;T;0;'@�
;(I"&def fitness_cost_per_gene=(value);T;*I"Kdef fitness_cost_per_gene=(value)
  @fitness_cost_per_gene = value
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#start_population_size;F;[�;[[@�i;T;:start_population_size;;;[�;{�;IC;"YIf set, will start off at the specified size and 
grow to the bigger population size
;T;[�;[�;I"YIf set, will start off at the specified size and 
grow to the bigger population size;T;0; @�;!F;"o;#;$F;%i;&i;'@�
;(I"def start_population_size;T;*I";def start_population_size
  @start_population_size
end;T;+To;
;F;;
;;;I":NEAT::Controller::NeatSettings#start_population_size=;F;[[I"
value;T0;[[@�i;T;:start_population_size=;;;[�;{�;IC;"YIf set, will start off at the specified size and 
grow to the bigger population size
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"&def start_population_size=(value);T;*I"Kdef start_population_size=(value)
  @start_population_size = value
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#population_size;F;[�;[[@�i;T;:population_size;;;[�;{�;IC;"YIf set, will start off at the specified size and 
grow to the bigger population size
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"def population_size;T;*I"/def population_size
  @population_size
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#population_size=;F;[[I"
value;T0;[[@�i;T;:population_size=;;;[�;{�;IC;"YIf set, will start off at the specified size and 
grow to the bigger population size
;T;[�;[�;@�;0; @;!F;"@�;'@�
;(I" def population_size=(value);T;*I"?def population_size=(value)
  @population_size = value
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#start_sequence_at;F;[�;[[@�i;F;:start_sequence_at;;;[�;{�;IC;"5Returns the value of attribute start_sequence_at
;T; @;/0;!F;[�;[�;I"5Returns the value of attribute start_sequence_at;T;0;'@�
;(I"def start_sequence_at;T;*I"3def start_sequence_at
  @start_sequence_at
end;T;+To;
;F;;
;;;I"6NEAT::Controller::NeatSettings#start_sequence_at=;F;[[I"
value;T0;[[@�i;F;:start_sequence_at=;;;[�;{�;IC;")Sets the attribute start_sequence_at
;T; @&;/0;!F;[�;[o;I
;JI"
param;F;KI"9the value to set the attribute start_sequence_at to.;T;I"
value;T;L0; @&;I"kSets the attribute start_sequence_at
@param value the value to set the attribute start_sequence_at to.;T;0;'@�
;(I""def start_sequence_at=(value);T;*I"Cdef start_sequence_at=(value)
  @start_sequence_at = value
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#end_sequence_at;F;[�;[[@�i;F;:end_sequence_at;;;[�;{�;IC;"3Returns the value of attribute end_sequence_at
;T; @9;/0;!F;[�;[�;I"3Returns the value of attribute end_sequence_at;T;0;'@�
;(I"def end_sequence_at;T;*I"/def end_sequence_at
  @end_sequence_at
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#end_sequence_at=;F;[[I"
value;T0;[[@�i;F;:end_sequence_at=;;;[�;{�;IC;"'Sets the attribute end_sequence_at
;T; @F;/0;!F;[�;[o;I
;JI"
param;F;KI"7the value to set the attribute end_sequence_at to.;T;I"
value;T;L0; @F;I"gSets the attribute end_sequence_at
@param value the value to set the attribute end_sequence_at to.;T;0;'@�
;(I" def end_sequence_at=(value);T;*I"?def end_sequence_at=(value)
  @end_sequence_at = value
end;T;+To;
;F;;
;;;I"/NEAT::Controller::NeatSettings#print_every;F;[�;[[@�i;F;:print_every;;;[�;{�;IC;"/Returns the value of attribute print_every
;T; @Y;/0;!F;[�;[�;I"/Returns the value of attribute print_every;T;0;'@�
;(I"def print_every;T;*I"'def print_every
  @print_every
end;T;+To;
;F;;
;;;I"0NEAT::Controller::NeatSettings#print_every=;F;[[I"
value;T0;[[@�i;F;:print_every=;;;[�;{�;IC;"#Sets the attribute print_every
;T; @f;/0;!F;[�;[o;I
;JI"
param;F;KI"3the value to set the attribute print_every to.;T;I"
value;T;L0; @f;I"_Sets the attribute print_every
@param value the value to set the attribute print_every to.;T;0;'@�
;(I"def print_every=(value);T;*I"7def print_every=(value)
  @print_every = value
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#recur_only_prob;F;[�;[[@�i;F;:recur_only_prob;;;[�;{�;IC;"3Returns the value of attribute recur_only_prob
;T; @y;/0;!F;[�;[�;I"3Returns the value of attribute recur_only_prob;T;0;'@�
;(I"def recur_only_prob;T;*I"/def recur_only_prob
  @recur_only_prob
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#recur_only_prob=;F;[[I"
value;T0;[[@�i;F;:recur_only_prob=;;;[�;{�;IC;"'Sets the attribute recur_only_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"7the value to set the attribute recur_only_prob to.;T;I"
value;T;L0; @�;I"gSets the attribute recur_only_prob
@param value the value to set the attribute recur_only_prob to.;T;0;'@�
;(I" def recur_only_prob=(value);T;*I"?def recur_only_prob=(value)
  @recur_only_prob = value
end;T;+To;
;F;;
;;;I".NEAT::Controller::NeatSettings#recur_prob;F;[�;[[@�i;F;:recur_prob;;;[�;{�;IC;".Returns the value of attribute recur_prob
;T; @�;/0;!F;[�;[�;I".Returns the value of attribute recur_prob;T;0;'@�
;(I"def recur_prob;T;*I"%def recur_prob
  @recur_prob
end;T;+To;
;F;;
;;;I"/NEAT::Controller::NeatSettings#recur_prob=;F;[[I"
value;T0;[[@�i;F;:recur_prob=;;;[�;{�;IC;""Sets the attribute recur_prob
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"2the value to set the attribute recur_prob to.;T;I"
value;T;L0; @�;I"]Sets the attribute recur_prob
@param value the value to set the attribute recur_prob to.;T;0;'@�
;(I"def recur_prob=(value);T;*I"5def recur_prob=(value)
  @recur_prob = value
end;T;+To;
;F;;
;;;I"6NEAT::Controller::NeatSettings#survival_threshold;F;[�;[[@�i#;T;:survival_threshold;;;[�;{�;IC;"Qfactor (0 to 1) of the top percentage of the species that's
allowed to mate.
;T;[�;[�;I"Qfactor (0 to 1) of the top percentage of the species that's
allowed to mate.;T;0; @�;!F;"o;#;$F;%i!;&i";'@�
;(I"def survival_threshold;T;*I"5def survival_threshold
  @survival_threshold
end;T;+To;
;F;;
;;;I"7NEAT::Controller::NeatSettings#survival_threshold=;F;[[I"
value;T0;[[@�i#;T;:survival_threshold=;;;[�;{�;IC;"Qfactor (0 to 1) of the top percentage of the species that's
allowed to mate.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"#def survival_threshold=(value);T;*I"Edef survival_threshold=(value)
  @survival_threshold = value
end;T;+To;
;F;;
;;;I"@NEAT::Controller::NeatSettings#survival_mininum_per_species;F;[�;[[@�i$;F;:!survival_mininum_per_species;;;[�;{�;IC;"@Returns the value of attribute survival_mininum_per_species
;T; @�;/0;!F;[�;[�;I"@Returns the value of attribute survival_mininum_per_species;T;0;'@�
;(I"%def survival_mininum_per_species;T;*I"Idef survival_mininum_per_species
  @survival_mininum_per_species
end;T;+To;
;F;;
;;;I"ANEAT::Controller::NeatSettings#survival_mininum_per_species=;F;[[I"
value;T0;[[@�i$;F;:"survival_mininum_per_species=;;;[�;{�;IC;"4Sets the attribute survival_mininum_per_species
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI"Dthe value to set the attribute survival_mininum_per_species to.;T;I"
value;T;L0; @�;I"|Sets the attribute survival_mininum_per_species
@param value the value to set the attribute survival_mininum_per_species to.;T;0;'@�
;(I"-def survival_mininum_per_species=(value);T;*I"Ydef survival_mininum_per_species=(value)
  @survival_mininum_per_species = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#trait_mutation_power;F;[�;[[@�i&;F;:trait_mutation_power;;;[�;{�;IC;"8Returns the value of attribute trait_mutation_power
;T; @�;/0;!F;[�;[�;I"8Returns the value of attribute trait_mutation_power;T;0;'@�
;(I"def trait_mutation_power;T;*I"9def trait_mutation_power
  @trait_mutation_power
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#trait_mutation_power=;F;[[I"
value;T0;[[@�i&;F;:trait_mutation_power=;;;[�;{�;IC;",Sets the attribute trait_mutation_power
;T; @;/0;!F;[�;[o;I
;JI"
param;F;KI"<the value to set the attribute trait_mutation_power to.;T;I"
value;T;L0; @;I"qSets the attribute trait_mutation_power
@param value the value to set the attribute trait_mutation_power to.;T;0;'@�
;(I"%def trait_mutation_power=(value);T;*I"Idef trait_mutation_power=(value)
  @trait_mutation_power = value
end;T;+To;
;F;;
;;;I"8NEAT::Controller::NeatSettings#trait_param_mut_prob;F;[�;[[@�i';F;:trait_param_mut_prob;;;[�;{�;IC;"8Returns the value of attribute trait_param_mut_prob
;T; @;/0;!F;[�;[�;I"8Returns the value of attribute trait_param_mut_prob;T;0;'@�
;(I"def trait_param_mut_prob;T;*I"9def trait_param_mut_prob
  @trait_param_mut_prob
end;T;+To;
;F;;
;;;I"9NEAT::Controller::NeatSettings#trait_param_mut_prob=;F;[[I"
value;T0;[[@�i';F;:trait_param_mut_prob=;;;[�;{�;IC;",Sets the attribute trait_param_mut_prob
;T; @";/0;!F;[�;[o;I
;JI"
param;F;KI"<the value to set the attribute trait_param_mut_prob to.;T;I"
value;T;L0; @";I"qSets the attribute trait_param_mut_prob
@param value the value to set the attribute trait_param_mut_prob to.;T;0;'@�
;(I"%def trait_param_mut_prob=(value);T;*I"Idef trait_param_mut_prob=(value)
  @trait_param_mut_prob = value
end;T;+To;
;F;;
;;;I"3NEAT::Controller::NeatSettings#weigh_mut_power;F;[�;[[@�i(;F;:weigh_mut_power;;;[�;{�;IC;"3Returns the value of attribute weigh_mut_power
;T; @5;/0;!F;[�;[�;I"3Returns the value of attribute weigh_mut_power;T;0;'@�
;(I"def weigh_mut_power;T;*I"/def weigh_mut_power
  @weigh_mut_power
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#weigh_mut_power=;F;[[I"
value;T0;[[@�i(;F;:weigh_mut_power=;;;[�;{�;IC;"'Sets the attribute weigh_mut_power
;T; @B;/0;!F;[�;[o;I
;JI"
param;F;KI"7the value to set the attribute weigh_mut_power to.;T;I"
value;T;L0; @B;I"gSets the attribute weigh_mut_power
@param value the value to set the attribute weigh_mut_power to.;T;0;'@�
;(I" def weigh_mut_power=(value);T;*I"?def weigh_mut_power=(value)
  @weigh_mut_power = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#feature_selection_switch;F;[�;[[@�i+;T;:feature_selection_switch;;;[�;{�;IC;"Enable FS-NEAT
;T;[�;[�;I"Enable FS-NEAT;T;0; @U;!F;"o;#;$F;%i*;&i*;'@�
;(I"!def feature_selection_switch;T;*I"Adef feature_selection_switch
  @feature_selection_switch
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#feature_selection_switch=;F;[[I"
value;T0;[[@�i+;T;:feature_selection_switch=;;;[�;{�;IC;"Enable FS-NEAT
;T;[�;[�;@_;0; @c;!F;"@`;'@�
;(I")def feature_selection_switch=(value);T;*I"Qdef feature_selection_switch=(value)
  @feature_selection_switch = value
end;T;+To;
;F;;
;;;I"0NEAT::Controller::NeatSettings#hyper_switch;F;[�;[[@�i0;T;:hyper_switch;;;[�;{�;IC;"�Enable HyperNEAT. This will result in the critters
being interpreted as CPPNs for substrate weights. Additional
setup will be necessary.
;T;[�;[�;I"�Enable HyperNEAT. This will result in the critters
being interpreted as CPPNs for substrate weights. Additional
setup will be necessary.;T;0; @q;!F;"o;#;$F;%i-;&i/;'@�
;(I"def hyper_switch;T;*I")def hyper_switch
  @hyper_switch
end;T;+To;
;F;;
;;;I"1NEAT::Controller::NeatSettings#hyper_switch=;F;[[I"
value;T0;[[@�i0;T;:hyper_switch=;;;[�;{�;IC;"�Enable HyperNEAT. This will result in the critters
being interpreted as CPPNs for substrate weights. Additional
setup will be necessary.
;T;[�;[�;@{;0; @;!F;"@|;'@�
;(I"def hyper_switch=(value);T;*I"9def hyper_switch=(value)
  @hyper_switch = value
end;T;+To;
;F;;
;;;I"<NEAT::Controller::NeatSettings#evolved_substrate_switch;F;[�;[[@�i4;T;:evolved_substrate_switch;;;[�;{�;IC;"YEnable Evolved Substrate HyperNEAT. Meaningless unless
hyper_switch is also enabled.
;T;[�;[�;I"YEnable Evolved Substrate HyperNEAT. Meaningless unless
hyper_switch is also enabled.;T;0; @�;!F;"o;#;$F;%i2;&i3;'@�
;(I"!def evolved_substrate_switch;T;*I"Adef evolved_substrate_switch
  @evolved_substrate_switch
end;T;+To;
;F;;
;;;I"=NEAT::Controller::NeatSettings#evolved_substrate_switch=;F;[[I"
value;T0;[[@�i4;T;:evolved_substrate_switch=;;;[�;{�;IC;"YEnable Evolved Substrate HyperNEAT. Meaningless unless
hyper_switch is also enabled.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I")def evolved_substrate_switch=(value);T;*I"Qdef evolved_substrate_switch=(value)
  @evolved_substrate_switch = value
end;T;+To;
;F;;
;;;I"4NEAT::Controller::NeatSettings#real_time_switch;F;[�;[[@�i8;T;:real_time_switch;;;[�;{�;IC;"bEnable RT-NEAT, for gradual evolution suitable for
games and other human-interactive systems.
;T;[�;[�;I"bEnable RT-NEAT, for gradual evolution suitable for
games and other human-interactive systems.;T;0; @�;!F;"o;#;$F;%i6;&i7;'@�
;(I"def real_time_switch;T;*I"1def real_time_switch
  @real_time_switch
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#real_time_switch=;F;[[I"
value;T0;[[@�i8;T;:real_time_switch=;;;[�;{�;IC;"bEnable RT-NEAT, for gradual evolution suitable for
games and other human-interactive systems.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I"!def real_time_switch=(value);T;*I"Adef real_time_switch=(value)
  @real_time_switch = value
end;T;+To;
;F;;
;;;I"5NEAT::Controller::NeatSettings#recurrency_switch;F;[�;[[@�i;;T;:recurrency_switch;;;[�;{�;IC;"+If true, allow for recurrent networks.
;T;[�;[�;I"+If true, allow for recurrent networks.;T;0; @�;!F;"o;#;$F;%i:;&i:;'@�
;(I"def recurrency_switch;T;*I"3def recurrency_switch
  @recurrency_switch
end;T;+To;
;F;;
;;;I"6NEAT::Controller::NeatSettings#recurrency_switch=;F;[[I"
value;T0;[[@�i;;T;:recurrency_switch=;;;[�;{�;IC;"+If true, allow for recurrent networks.
;T;[�;[�;@�;0; @�;!F;"@�;'@�
;(I""def recurrency_switch=(value);T;*I"Cdef recurrency_switch=(value)
  @recurrency_switch = value
end;T;+To;
;F;;
;;;I".NEAT::Controller::NeatSettings#initialize;F;[�;[[@�i>;T;;k;;;[�;{�;IC;"+Set up defaults for mandatory entries.
;T;[�;[o;I
;JI"return;F;KI"#a new instance of NeatSettings;T;0;L[I"NeatSettings;F; @�;I"+Set up defaults for mandatory entries.;T;0; @�;!F;"o;#;$F;%i=;&i=;'@�
;(I"def initialize;T;)T;*I"�def initialize
  super
  @start_sequence_at = 0
  @end_sequence_at = 100
  @max_generations = 1000

  # Default operators
  @evaluator = Evaluator.new self
  @expressor = Expressor.new self
  @evolver = Evolver.new self
end;T;+T;:@�
;;IC;[�;:@�
;<IC;[�;:@�
;NIC;O{;GIC;O{�;PT;
IC;O{:;�IC;O{;x@�
;y@�
;PT;IC;O{;x@�
;y@�
;PT;IC;O{;x@�
;y@�
;PT;IC;O{;x@	;y@;PT;IC;O{;x@%;y@3;PT;
IC;O{;x@A;y@M;PT;IC;O{;x@[;y@g;PT;IC;O{;x@u;y@�;PT;IC;O{;x@�;y@�;PT;IC;O{;x@�;y@�;PT;IC;O{;x@�;y@�;PT;IC;O{;x@�;y@�;PT;IC;O{;x@;y@;PT;IC;O{;x@%;y@2;PT;IC;O{;x@E;y@R;PT;IC;O{;x@e;y@r;PT; IC;O{;x@�;y@�;PT;"IC;O{;x@�;y@�;PT;$IC;O{;x@�;y@�;PT;&IC;O{;x@�;y@�;PT;(IC;O{;x@�;y@
;PT;*IC;O{;x@;y@*;PT;,IC;O{;x@=;y@J;PT;.IC;O{;x@];y@k;PT;0IC;O{;x@y;y@�;PT;2IC;O{;x@�;y@�;PT;4IC;O{;x@�;y@�;PT;6IC;O{;x@�;y@�;PT;8IC;O{;x@�;y@�;PT;:IC;O{;x@;y@;PT;<IC;O{;x@';y@4;PT;>IC;O{;x@G;y@T;PT;@IC;O{;x@g;y@t;PT;BIC;O{;x@�;y@�;PT;DIC;O{;x@�;y@�;PT;FIC;O{;x@�;y@�;PT;HIC;O{;x@�;y@�;PT;JIC;O{;x@�;y@;PT;LIC;O{;x@;y@&;PT;NIC;O{;x@9;y@F;PT;PIC;O{;x@Y;y@f;PT;RIC;O{;x@y;y@�;PT;TIC;O{;x@�;y@�;PT;VIC;O{;x@�;y@�;PT;XIC;O{;x@�;y@�;PT;ZIC;O{;x@�;y@;PT;\IC;O{;x@;y@";PT;^IC;O{;x@5;y@B;PT;`IC;O{;x@U;y@c;PT;bIC;O{;x@q;y@;PT;dIC;O{;x@�;y@�;PT;fIC;O{;x@�;y@�;PT;hIC;O{;x@�;y@�;PT;PT;PT;Q{�;R[�;[[@�i�;T;:NeatSettings;;;;;[�;{�;IC;"�Various parameters affecting evolution.
Based somewhat on the C version of NEAT.
TODO not all of these parameters are implemented yet!!!
;T;[�;[�;I"�Various parameters affecting evolution.
Based somewhat on the C version of NEAT.
TODO not all of these parameters are implemented yet!!!;T;0; @�
;!F;"o;#;$F;%i�;&i�;'@;I"#NEAT::Controller::NeatSettings;F;To;=;>0;?0;@0;;r;'@;B@�;C0;+To;
;F;;
;;;I" NEAT::Controller#initialize;F;[
[I"neural_inputs:;TI"nil;T[I"neural_outputs:;TI"nil;T[I"neural_hidden:;TI"nil;T[I"parameters:;TI"NeatSettings.new;T[I"&block;T0;[[@�iN;T;;k;;;[�;{�;IC;"�- neural_inputs -- array of input classes
- neural_outputs -- array of output classes
- parameters -- NeatParameters object, or a path to a YAML file to create this.
;T;[�;[o;I
;JI"return;F;KI"!a new instance of Controller;T;0;L[I"Controller;F; @;;I"�- neural_inputs -- array of input classes
- neural_outputs -- array of output classes
- parameters -- NeatParameters object, or a path to a YAML file to create this.;T;0; @;;!F;"o;#;$F;%iK;&iM;'@;(I"'def initialize(neural_inputs: nil,;T;)T;*I"�def initialize(neural_inputs: nil,
               neural_outputs: nil,
               neural_hidden: nil,
               parameters: NeatSettings.new,
                  &block)
  super(self)
  @verbosity = 1
  @glob_innov_num = 0
  @gaussian = Distribution::Normal.rng
  @population_history = []
  @evolver = Evolver.new self
  @expressor = Expressor.new self

  @neuron_catalog = Neuron::neuron_types.clone
  @neural_inputs  = neural_inputs
  @neural_outputs = neural_outputs
  @neural_hidden  = neural_hidden

  # Default classes for population and operators, etc.
  @population_class = NEAT::Population
  @evaluator_class = NEAT::Evaluator
  @expressor_class = NEAT::Expressor
  @evolver_class = NEAT::Evolver

  # Handle the parameters parameter. :-)
  @parms = unless parameters.kind_of? String
             parameters
           else # load it from a file
             open(parameters, 'r') { |fd| YAML::load fd.read }
           end
  block.(self) unless block.nil?
end;T;+To;
;F;;
;;;I"$NEAT::Controller#new_innovation;F;[�;[[@�io;F;;�;;;[�;{�;IC;"�
;T; @\;/0;!F;[�;[�;I"�;T;0;'@;(I"3def new_innovation ; @glob_innov_num += 1; end;T;)T;*I"3def new_innovation ; @glob_innov_num += 1; end;T;+To;
;F;;
;;;I"NEAT::Controller#gaussian;F;[�;[[@�ip;F;;�;;;[�;{�;IC;"�
;T; @i;/0;!F;[�;[�;I"�;T;0;'@;(I"&def gaussian ; @gaussian.() ; end;T;)T;*I"&def gaussian ; @gaussian.() ; end;T;+To;
;F;;
;;;I"NEAT::Controller#run;F;[�;[[@�is;T;:run;;;[�;{�;IC;"Run this evolution.
;T;[�;[�;I"Run this evolution.;T;0; @v;!F;"o;#;$F;%ir;&ir;'@;(I"def run;T;)T;*I"�def run
  pre_run_initialize
  (1..@parms.max_generations).each do |gen_number|
    @generation_num = gen_number
    @population_history << unless @population.nil?
                             @population
                           else
                             @population = @population_class.new(self)
                           end
    @population_history.shift unless @population_history.size <= @parms.max_population_history
    @population.mutate!
    @population.express!

    ## Evaluate population
    @evaluator.ready_for_evaluation @population
    (@parms.start_sequence_at .. @parms.end_sequence_at).each do |snum|
      @seq_num = snum
      @population.evaluate!
    end

    @population.analyze!
    @population.speciate!

    $log.debug @population.dump_s unless @verbosity < 3

    new_pop = @population.evolve

    ## Report hook for evaluation
    @report_hook.(@population.report) unless @report_hook.nil?

    ## Exit if fitness criteria is reached
    #FIXME handle this exit condition better!!!!!
    exit if @stop_on_fit_func.(@population.report[:fitness], self) unless @stop_on_fit_func.nil?

    ## Evolve population
    @population = new_pop

    ## Finish up this run
    @end_run_func.(self) unless @end_run_func.nil?
  end
end;T;+To;
;F;;
;;o;I"(NEAT::Controller#pre_run_initialize;F;[�;[[@�i�;T;:pre_run_initialize;;;[�;{�;IC;"EWe must set up the objects we need prior to the run, if not set.
;T;[�;[�;I"EWe must set up the objects we need prior to the run, if not set.;T;0; @�;!F;"o;#;$F;%i�;&i�;'@;(I"def pre_run_initialize;T;)T;*I"�def pre_run_initialize
  @evaluator = @evaluator_class.new(self) if @evaluator.nil?
  @evolver = @evolver_class.new(self) if @evolver.nil?
end;T;+T;:@;;IC;[�;:@;<IC;[�;:@;NIC;O{;GIC;O{�;PT;
IC;O{ ;�IC;O{;x@;y0;PT;�IC;O{;x@!;y0;PT;�IC;O{;x@/;y0;PT;�IC;O{;x@=;y@K;PT;�IC;O{;x@Y;y@g;PT;�IC;O{;x@u;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;IC;O{;x@�;y0;PT;�IC;O{;x@�;y0;PT;�IC;O{;x@�;y0;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@;y@;PT;�IC;O{;x@+;y@8;PT;�IC;O{;x@K;y@X;PT;�IC;O{;x@k;y@x;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@�;PT;�IC;O{;x@�;y@

;PT;�IC;O{;x@
;y@)
;PT;�IC;O{;x@7
;y@C
;PT;�IC;O{;x@Q
;y@]
;PT;�IC;O{;x@k
;y@y
;PT;�IC;O{;x@�
;y@�
;PT;uIC;O{;x@�
;y0;PT;PT;PT;Q{�;R[�;[[@�i�;T;:Controller;;;;;[�;{�;IC;"= Controller for all operations of RubyNEAT
This object contains all the specifications and details for
evolving and evaluation of the RubyNEAT system.  It is 
a type of "World", if you will, for the entire enterprise.

Your application shall only have one Controller.
;T;[�;[�;I"= Controller for all operations of RubyNEAT
This object contains all the specifications and details for
evolving and evaluation of the RubyNEAT system.  It is 
a type of "World", if you will, for the entire enterprise.

Your application shall only have one Controller.;T;0; @;!F;"o;#;$F;%i�;&i�;'@;I"NEAT::Controller;F;To;=;>0;?0;@0;;r;'@;B@�;C0;+To;
;F;;G;;;I"NEAT.controller;F;[�;[[@�i�;F;;t;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@;(I",def self.controller ; @controller ; end;T;)T;*I",def self.controller ; @controller ; end;T;+To;
;F;;G;;;I"NEAT.controller=;F;[[I"controller;T0;[[@�i�;F;:controller=;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@;(I"Fdef self.controller=(controller) ; @controller = controller ; end;T;)T;*I"Fdef self.controller=(controller) ; @controller = controller ; end;T;+To;
;F;;G;;;I"NEAT.create_controller;F;[[I"*parms;T0;[[@�i�;F;:create_controller;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@;(I"Rdef self.create_controller(*parms); @controller = Controller.new(*parms); end;T;)T;*I"Rdef self.create_controller(*parms); @controller = Controller.new(*parms); end;T;+To;F;IC;[
o;
;F;;
;;;I"NEAT::Expressor#initialize;F;[[I"c;T0;[[I"lib/rubyneat/expressor.rb;Ti
;F;;k;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[o;I
;JI"return;F;KI" a new instance of Expressor;T;0;L[I"Expressor;F; @�;I"�;T;0;'@�;(I"def initialize(c);T;)T;*I"(def initialize(c)
  super      
end;T;+To;
;F;;
;;;I"NEAT::Expressor#express!;F;[[I"critter;T0;[[@�i;T;;�;;;[�;{�;IC;"�Take the genotype of the critter and
create a phenotype from the genotype.

In the phenotype, it creates a function called stimulate(),
which is called with the input parameters and returns a response
in the form of a response hash (which corresponds directly to the
output neurons).

This implementation assumes an acyclic graph (feed forward)
and cannot handle cycles at all. Later we may fix this or create
a type of Expressor that can.
;T;[�;[�;I"�Take the genotype of the critter and
create a phenotype from the genotype.

In the phenotype, it creates a function called stimulate(),
which is called with the input parameters and returns a response
in the form of a response hash (which corresponds directly to the
output neurons).

This implementation assumes an acyclic graph (feed forward)
and cannot handle cycles at all. Later we may fix this or create
a type of Expressor that can.;T;0; @;!F;"o;#;$F;%i;&i;'@�;(I"def express!(critter);T;)T;*I"�def express!(critter)
  critter.ready_for_expression!
  express_neurons! critter
  express_genes! critter
  express_expression! critter
end;T;+To;
;F;;
;;�;I"%NEAT::Expressor#express_neurons!;F;[[I"critter;T0;[[@�i%;T;:express_neurons!;;;[�;{�;IC;"Express Neurons as methods
;T;[�;[�;I"Express Neurons as methods;T;0; @;!F;"o;#;$F;%i$;&i$;'@�;(I""def express_neurons!(critter);T;)T;*I"�def express_neurons!(critter)
  critter.genotype.neurons.each do |name, neuron|
    neuron.express(critter.phenotype) unless neuron.input? and not neuron.bias?
  end
end;T;+To;
;F;;
;;�;I"#NEAT::Expressor#express_genes!;F;[[I"critter;T0;[[@�i?;T;:express_genes!;;;[�;{�;IC;"m= Expression of the Genotype as a Phenotype.
What this really does is create the function that calls
all the functions. 

This makes use of the Graph plugin for Neurons.
= Recurrency and Expression of Genes
A simple approach has been taken here to allow for recurrency in
our Critters. Basically, a looping construct has been put around the
activation of the neurons so that recurrency can be done in 2 ways:
1) Via yielding, thus treating the stimulus function as a enumerable.
In this approach, one would call the Critter's phenotype with a block of
code that would accept the output of the net. It would return 'true' to
continue the iteration, or 'false' to end the iteration.
2) Via multiple calls to the Pheontype instance:
Since the value of the prior activation is preserved in the instance variables
of the phenotype, subsequent activations will iterate the network.
== Cavets to recurrent activation
For (2) above, the input neurons would be overwritten on each subsequent call.
Since we do not allow recurrent connections to input neurons anyway, this should
not be an issue, though we may allow for this at a future date.
;T;[�;[�;I"m= Expression of the Genotype as a Phenotype.
What this really does is create the function that calls
all the functions. 

This makes use of the Graph plugin for Neurons.
= Recurrency and Expression of Genes
A simple approach has been taken here to allow for recurrency in
our Critters. Basically, a looping construct has been put around the
activation of the neurons so that recurrency can be done in 2 ways:
1) Via yielding, thus treating the stimulus function as a enumerable.
In this approach, one would call the Critter's phenotype with a block of
code that would accept the output of the net. It would return 'true' to
continue the iteration, or 'false' to end the iteration.
2) Via multiple calls to the Pheontype instance:
Since the value of the prior activation is preserved in the instance variables
of the phenotype, subsequent activations will iterate the network.
== Cavets to recurrent activation
For (2) above, the input neurons would be overwritten on each subsequent call.
Since we do not allow recurrent connections to input neurons anyway, this should
not be an issue, though we may allow for this at a future date.;T;0; @!;!F;"o;#;$F;%i+;&i>;'@�;(I" def express_genes!(critter);T;)T;*I"~def express_genes!(critter)
  g = critter.genotype
  p = critter.phenotype

  init_code = "\n  def initialize_neurons\n"

  # 'stimulate' function call (really should be 'activate', but we'll reserve this for something else)
  p.code += "  def #{NEAT::STIMULUS}("
  p.code += g.neural_inputs.reject{ |sym| g.neural_inputs[sym].bias? }.map{|sym, neu| sym}.join(", ")
  p.code += ")\n"

  # Assign all the parameters to instance variables.
  p.code += g.neural_inputs.map{|sym, neu| "    @#{sym} = #{sym}\n"}.join("")
  p.code += "    loop {\n"

  # Resolve the order in which we shall call the neurons
  # TODO handle the dependency list if it comes back!
  @resolved, @dependencies = NEAT::Graph::DependencyResolver[g.neural_outputs.map{|s, neu| neu}].resolve

  # And now call them in that order!
  @resolved.each do |neu|
    unless neu.input?
      init_code += "    @#{neu.name} = 0\n"
      if g.neural_gene_map.member? neu.name
        p.code += "      @#{neu.name} = #{neu.name}("
        p.code += g.neural_gene_map[neu.name].map{ |gene|
          "%s * @%s" % [gene.weight, gene.in_neuron]
        }.join(", ") + ")\n"
      else
        g.dangling_neurons = true
        log.debug "Dangling neuron in critter #{critter} -- #{neu}"
      end
    end
  end
  init_code += "  end\n"

  # And now return the result as a vector of outputs.
  p.code += "     @_outvec = [" + g.neural_outputs.map{|sym, neu| "@#{sym}"}.join(',') + "]\n"
  p.code += "     break unless block_given?\n"
  p.code += "     break unless yield @_outvec\n"
  p.code += "  }\n"
  p.code += "  @_outvec\n"
  p.code += "  end\n"
  p.code += init_code
  log.debug p.code
  p.express!
end;T;+To;
;F;;
;;�;I"(NEAT::Expressor#express_expression!;F;[[I"critter;T0;[[@�io;F;:express_expression!;;;[�;{�;IC;"�
;T; @1;/0;!F;[�;[�;I"�;T;0;'@�;(I"%def express_expression!(critter);T;)T;*I"Ldef express_expression!(critter)
  critter.phenotype.express!      
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@�i;T;:Expressor;;;;;[�;{�;IC;"Q= Basis of all expressors. 
Expressor object turn genotypes into phenotypes.
;T;[�;[�;I"Q= Basis of all expressors. 
Expressor object turn genotypes into phenotypes.;T;0; @�;!F;"o;#;$F;%i
;&i;'@;I"NEAT::Expressor;F;To;=;>0;?0;@0;;�;'@;B@�
;C0;+To;F;IC;[o;
;F;;
;;;I")NEAT::Evaluator#ready_for_evaluation;F;[[I"pop;T0;[[I"lib/rubyneat/evaluator.rb;Ti;T;:ready_for_evaluation;;;[�;{�;IC;"kThis is call prior to any sequence evaluation. Here,
we clean up persistent tracking information, etc.
;T;[�;[�;I"kThis is call prior to any sequence evaluation. Here,
we clean up persistent tracking information, etc.;T;0; @T;!F;"o;#;$F;%i
;&i;'@R;(I""def ready_for_evaluation(pop);T;)T;*I"Ydef ready_for_evaluation(pop)
  @crit_hist = {}
  pop.initialize_for_recurrence!
end;T;+To;
;F;;
;;;I"NEAT::Evaluator#evaluate!;F;[[I"critter;T0;[[@[i;T;;�;;;[�;{�;IC;"GEvaluate one step of a sequence of evaluations.
For time series and realtime ongoing evaluations,
everything is. 

Returns [vin, vout], where vin is the input vector,
and vout in the output vector from the critter.
FIXME: this should not really have to deal with an error.
FIXME: the error should be handled upstream from here.
;T;[�;[�;I"yEvaluate one step of a sequence of evaluations.
For time series and realtime ongoing evaluations,
@controller.seq_num governs where in the sequence
everything is. 

Returns [vin, vout], where vin is the input vector,
and vout in the output vector from the critter.
FIXME: this should not really have to deal with an error.
FIXME: the error should be handled upstream from here.;T;0; @e;!F;"o;#;$F;%i;&i;'@R;(I"def evaluate!(critter);T;)T;*I"�def evaluate!(critter)
  vin = @controller.query_func.(@controller.seq_num)
  @crit_hist[critter] = {} unless @crit_hist.member? critter
  begin
    vout = critter.phenotype.stimulate *vin, &@controller.recurrence_func
    log.debug "Critter #{critter.name}: vin=#{vin}. vout=#{vout}"
    @crit_hist[critter][@controller.seq_num] = [vin, vout]
  rescue Exception => e
    log.error "Exception #{e} on code:\n#{critter.phenotype.code}"
    @crit_hist[critter][@controller.seq_num] = [vin, :error]
  end
end;T;+To;
;F;;
;;;I")NEAT::Evaluator#analyze_for_fitness!;F;[[I"critter;T0;[[@[i-;T;:analyze_for_fitness!;;;[�;{�;IC;"�Analyze the evaluation and compute a fitness for the given critter.
Note that if cost_func is set, we call that to integrate the cost to
the fitness average fitness calculated for the fitness vector.
;T;[�;[�;I"�Analyze the evaluation and compute a fitness for the given critter.
Note that if cost_func is set, we call that to integrate the cost to
the fitness average fitness calculated for the fitness vector.;T;0; @u;!F;"o;#;$F;%i*;&i,;'@R;(I"&def analyze_for_fitness!(critter);T;)T;*I"8def analyze_for_fitness!(critter)
  fitvec = @crit_hist[critter].map{|seq, vio| @controller.fitness_func.(vio[0], vio[1], seq) }
  # Average the fitness vector to get a scalar fitness.
  critter.fitness = unless @controller.cost_func.nil?
                      @controller.cost_func.(fitvec, critter.genotype.fitness_cost)
                    else
                      fitvec.reduce {|a,r| a+r} / fitvec.size.to_f + critter.genotype.fitness_cost
                    end
  log.debug "Fitness Vector: #{fitvec}, fitness of #{critter.fitness} assigned to #{critter}"
end;T;+T;:@R;;IC;[�;:@R;<IC;[�;:@R;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@[i;T;:Evaluator;;;;;[�;{�;IC;"�= Evaluator evaluates phenotype of critter for fitness, novelty, etc.
We can have a chain of these evaluators whose outputs are summed, etc.
;T;[�;[�;I"�= Evaluator evaluates phenotype of critter for fitness, novelty, etc.
We can have a chain of these evaluators whose outputs are summed, etc.;T;0; @R;!F;"o;#;$F;%i	;&i
;'@;I"NEAT::Evaluator;F;To;=;>0;?0;@0;;�;'@;B@�
;C0;+To;F;IC;[%o;
;F;;
;;;I"#NEAT::Population#input_neurons;F;[�;[[I"lib/rubyneat/population.rb;Ti;T;:input_neurons;;;[�;{�;IC;"`Ordered list or hash of input neuron classes 
(all critters generated here shall have this)
;T;[�;[�;I"`Ordered list or hash of input neuron classes 
(all critters generated here shall have this);T;0; @�;!F;"o;#;$F;%i;&i;'@�;(I"def input_neurons;T;*I"+def input_neurons
  @input_neurons
end;T;+To;
;F;;
;;;I"$NEAT::Population#input_neurons=;F;[[I"
value;T0;[[@�i;T;:input_neurons=;;;[�;{�;IC;"`Ordered list or hash of input neuron classes 
(all critters generated here shall have this)
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def input_neurons=(value);T;*I";def input_neurons=(value)
  @input_neurons = value
end;T;+To;
;F;;
;;;I"$NEAT::Population#hidden_neurons;F;[�;[[@�i;T;:hidden_neurons;;;[�;{�;IC;"8List of possible neuron classes for hidden neurons.
;T;[�;[�;I"8List of possible neuron classes for hidden neurons.;T;0; @�;!F;"o;#;$F;%i;&i;'@�;(I"def hidden_neurons;T;*I"-def hidden_neurons
  @hidden_neurons
end;T;+To;
;F;;
;;;I"%NEAT::Population#hidden_neurons=;F;[[I"
value;T0;[[@�i;T;:hidden_neurons=;;;[�;{�;IC;"8List of possible neuron classes for hidden neurons.
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def hidden_neurons=(value);T;*I"=def hidden_neurons=(value)
  @hidden_neurons = value
end;T;+To;
;F;;
;;;I"$NEAT::Population#output_neurons;F;[�;[[@�i;T;:output_neurons;;;[�;{�;IC;"`Ordered list or hash of output neuron classes
(all critters generated here shall have this)
;T;[�;[�;I"`Ordered list or hash of output neuron classes
(all critters generated here shall have this);T;0; @�;!F;"o;#;$F;%i;&i;'@�;(I"def output_neurons;T;*I"-def output_neurons
  @output_neurons
end;T;+To;
;F;;
;;;I"%NEAT::Population#output_neurons=;F;[[I"
value;T0;[[@�i;T;:output_neurons=;;;[�;{�;IC;"`Ordered list or hash of output neuron classes
(all critters generated here shall have this)
;T;[�;[�;@�;0; @�;!F;"@�;'@�;(I"def output_neurons=(value);T;*I"=def output_neurons=(value)
  @output_neurons = value
end;T;+To;
;F;;
;;;I"NEAT::Population#traits;F;[�;[[@�i;F;:traits;;;[�;{�;IC;"*Returns the value of attribute traits
;T; @�;/0;!F;[�;[�;I"*Returns the value of attribute traits;T;0;'@�;(I"def traits;T;*I"def traits
  @traits
end;T;+To;
;F;;
;;;I"NEAT::Population#traits=;F;[[I"
value;T0;[[@�i;F;:traits=;;;[�;{�;IC;"Sets the attribute traits
;T; @�;/0;!F;[�;[o;I
;JI"
param;F;KI".the value to set the attribute traits to.;T;I"
value;T;L0; @�;I"USets the attribute traits
@param value the value to set the attribute traits to.;T;0;'@�;(I"def traits=(value);T;*I"-def traits=(value)
  @traits = value
end;T;+To;
;F;;
;;;I"NEAT::Population#critters;F;[�;[[@�i;T;:
critters;;;[�;{�;IC;"'list of critter in this population
;T;[�;[�;I"'list of critter in this population;T;0; @;!F;"o;#;$F;%i;&i;'@�;(I"def critters;T;*I"!def critters
  @critters
end;T;+To;
;F;;
;;;I"NEAT::Population#critters=;F;[[I"
value;T0;[[@�i;T;:critters=;;;[�;{�;IC;"'list of critter in this population
;T;[�;[�;@;0; @;!F;"@;'@�;(I"def critters=(value);T;*I"1def critters=(value)
  @critters = value
end;T;+To;
;F;;
;;;I"NEAT::Population#fitness;F;[�;[[@�i!;T;;0;;;[�;{�;IC;"+Overall population fitness and novelty
;T;[�;[�;I"+Overall population fitness and novelty;T;0; @*;!F;"o;#;$F;%i ;&i ;'@�;(I"def fitness;T;*I"def fitness
  @fitness
end;T;+To;
;F;;
;;;I"NEAT::Population#novelty;F;[�;[[@�i!;T;;�;;;[�;{�;IC;"+Overall population fitness and novelty
;T;[�;[�;@4;0; @8;!F;"@5;'@�;(I"def novelty;T;*I"def novelty
  @novelty
end;T;+To;
;F;;
;;;I"NEAT::Population#species;F;[�;[[@�i$;T;:species;;;[�;{�;IC;"Hash list of species lists
;T;[�;[�;I"Hash list of species lists;T;0; @D;!F;"o;#;$F;%i#;&i#;'@�;(I"def species;T;*I"def species
  @species
end;T;+To;
;F;;
;;;I" NEAT::Population#initialize;F;[[I"c;T0[I"&block;T0;[[@�i*;T;;k;;;[�;{�;IC;"3Create initial (ramdom) population of critters
;T;[�;[o;I
;JI"return;F;KI"!a new instance of Population;T;0;L[I"Population;F; @R;I"3Create initial (ramdom) population of critters;T;0; @R;!F;"o;#;$F;%i);&i);'@�;(I"def initialize(c, &block);T;)T;*I"�def initialize(c, &block)
  super
  @input_neurons = c.neural_inputs.clone
  @output_neurons = c.neural_outputs.clone
  @hidden_neurons = unless c.neural_hidden.nil?
                      c.neural_hidden
                    else
                      c.neuron_catalog.keep_if {|n| not n.input?}
                    end
  @critters = (0 ... c.parms.start_population_size || c.parms.population_size).map do
    Critter.new(self)
  end
  block.(self) unless block.nil?
end;T;+To;
;F;;
;;;I"0NEAT::Population#initialize_for_recurrence!;F;[�;[[@�i;;T;:initialize_for_recurrence!;;;[�;{�;IC;"TMake sure all critters are reset and prepared for
recurrent network evaluation.
;T;[�;[�;I"TMake sure all critters are reset and prepared for
recurrent network evaluation.;T;0; @i;!F;"o;#;$F;%i9;&i:;'@�;(I"#def initialize_for_recurrence!;T;)T;*I"Zdef initialize_for_recurrence!
  @critters.each {|crit| crit.initialize_neurons!}
end;T;+To;
;F;;
;;;I"NEAT::Population#mutate!;F;[�;[[@�i@;T;;�;;;[�;{�;IC;""Mutate the genes and neurons.
;T;[�;[�;I""Mutate the genes and neurons.;T;0; @w;!F;"o;#;$F;%i?;&i?;'@�;(I"def mutate!;T;)T;*I"7def mutate!
  @controller.evolver.mutate! self
end;T;+To;
;F;;
;;;I"NEAT::Population#express!;F;[�;[[@�iE;T;;�;;;[�;{�;IC;"#Express the entire population.
;T;[�;[�;I"#Express the entire population.;T;0; @�;!F;"o;#;$F;%iD;&iD;'@�;(I"def express!;T;)T;*I"Fdef express!
   @critters.each { |critter| critter.express! }
end;T;+To;
;F;;
;;;I"NEAT::Population#evaluate!;F;[�;[[@�iJ;T;;�;;;[�;{�;IC;"Called for each sequence.
;T;[�;[�;I"Called for each sequence.;T;0; @�;!F;"o;#;$F;%iI;&iI;'@�;(I"def evaluate!;T;)T;*I"Hdef evaluate!
   @critters.each { |critter| critter.evaluate! }
end;T;+To;
;F;;
;;;I"NEAT::Population#analyze!;F;[�;[[@�iO;T;:
analyze!;;;[�;{�;IC;" Alalyze evaluation results.
;T;[�;[�;I" Alalyze evaluation results.;T;0; @�;!F;"o;#;$F;%iN;&iN;'@�;(I"def analyze!;T;)T;*I"hdef analyze!
   @critters.each { |critter| @controller.evaluator.analyze_for_fitness! critter }
end;T;+To;
;F;;
;;;I"NEAT::Population#evolve;F;[�;[[@�iU;T;;,;;;[�;{�;IC;"DCall this after evaluation.
Returns a newly-evolved population.
;T;[�;[�;I"DCall this after evaluation.
Returns a newly-evolved population.;T;0; @�;!F;"o;#;$F;%iS;&iT;'@�;(I"def evolve;T;)T;*I"5def evolve
  @controller.evolver.evolve self
end;T;+To;
;F;;
;;;I"NEAT::Population#speciate!;F;[�;[[@�i^;T;:speciate!;;;[�;{�;IC;"�Group critters into species
Note that the @species objects
have useful singleton methods:
* @species.member? -- checks all of the lists for membership, not just the hash
* @species[crit].fitness -- fitness of the entire species
;T;[�;[�;I"�Group critters into species
Note that the @species objects
have useful singleton methods:
* @species.member? -- checks all of the lists for membership, not just the hash
* @species[crit].fitness -- fitness of the entire species;T;0; @�;!F;"o;#;$F;%iY;&i];'@�;(I"def speciate!;T;)T;*I"�def speciate!
  # We blow away existing species and create our own member? function
  @species = {} # lists keyed by representative critter
  def @species.member?(crit)
    super.member?(crit) or self.map{|k, li| li.member? crit}.reduce{|t1, t2| t1 or t2 }
  end

  def @species.evaluate!
    self.each do |k, sp|
      sp.fitness = sp.map{|crit| crit.fitness}.reduce{|a,b| a+b} / sp.size
    end
  end

  def @species.compactify!(parm)
    mutt = self[:mutt] = self.map { |k, splist| [k, splist]}.reject {|k, splist|
      splist.size >= parm.smallest_species
    }.map { |k, splist|
      self.delete k
      splist
    }.flatten

    # FIXME this code is not dry!!!!
    def mutt.fitness=(fit)
      @fitness = fit
    end

    def mutt.fitness
      @fitness
    end

    self.delete :mutt if self[:mutt].empty?
  end

  # Some convience parms
  parm = @controller.parms

  # And so now we iterate...
  @critters.each do |crit|
    wearein = false
    @species.each do |ck, list|
      delta = crit.compare(ck)
      #log.debug { "delta for #{crit} and #{ck} is #{delta}" }
      if delta < parm.compatibility_threshold
        list << crit
        wearein = true
        break
      end
    end

    # New species?
    unless wearein
      @species[crit] = species = [crit]
      def species.fitness=(fit)
        @fitness = fit
      end
      def species.fitness
        @fitness
      end
    end
  end

  # Compactify the species if less than smallest_species
  @species.compactify! parm

  # And now we evaluate all species for fitness...
  @species.evaluate!

  # Dump for debugging reasons
  @species.each do |k, sp|
    log.debug ">> Species #{k} has #{sp.size} members with a #{sp.fitness} fitness"
  end

end;T;+To;
;F;;G;;;I"NEAT::Population.member?;F;[[I"	crit;T0;[[@�ia;T;:member?;;;[�;{�;IC;"*lists keyed by representative critter
;T;[�;[o;I
;JI"return;F;KI"�;T;0;L[I"Boolean;T; @�;I"*lists keyed by representative critter;T;0; @�;!F;"o;#;$F;%i`;&i`;'@�;(I"def @species.member?(crit);T;)T;*I"ydef @species.member?(crit)
  super.member?(crit) or self.map{|k, li| li.member? crit}.reduce{|t1, t2| t1 or t2 }
end;T;+To;
;F;;G;;;I"NEAT::Population.evaluate!;F;[�;[[@�ie;F;;�;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@�;(I"def @species.evaluate!;T;)T;*I"�def @species.evaluate!
  self.each do |k, sp|
    sp.fitness = sp.map{|crit| crit.fitness}.reduce{|a,b| a+b} / sp.size
  end
end;T;+To;
;F;;G;;;I"!NEAT::Population.compactify!;F;[[I"	parm;T0;[[@�ik;F;:compactify!;;;[�;{�;IC;"�
;T; @�;/0;!F;[�;[�;I"�;T;0;'@�;(I"#def @species.compactify!(parm);T;)T;*I"�def @species.compactify!(parm)
  mutt = self[:mutt] = self.map { |k, splist| [k, splist]}.reject {|k, splist|
    splist.size >= parm.smallest_species
  }.map { |k, splist|
    self.delete k
    splist
  }.flatten

  # FIXME this code is not dry!!!!
  def mutt.fitness=(fit)
    @fitness = fit
  end

  def mutt.fitness
    @fitness
  end

  self.delete :mutt if self[:mutt].empty?
end;T;+To;
;F;;
;;;I"NEAT::Population#report;F;[�;[[@�i�;T;;7;;;[�;{�;IC;":== Generate a report on the state of this population.
;T;[�;[�;I";== Generate a report on the state of this population.
;T;0; @�;!F;"o;#;$F;%i�;&i�;'@�;(I"def report;T;)T;*I"�def report
  {
      fitness:         report_fitness,
      fitness_species: report_fitness_species,
      best_critter:    report_best_fit,
      worst_critter:   report_worst_fit,
  }
end;T;+To;
;F;;
;;;I""NEAT::Population#best_critter;F;[�;[[@�i�;T;:best_critter;;;[�;{�;IC;"WThe "best critter" is the critter with the lowest (closet to zero)
fitness rating.
;T;[�;[�;I"WThe "best critter" is the critter with the lowest (closet to zero)
fitness rating.;T;0; @
;!F;"o;#;$F;%i�;&i�;'@�;(I"def best_critter;T;)T;*I"�def best_critter
  unless @controller.compare_func.nil?
    @critters.min {|a, b| @controller.compare_func.(a.fitness, b.fitness) }
  else
    @critters.min {|a, b| a.fitness <=> b.fitness}
  end
end;T;+To;
;F;;
;;;I"#NEAT::Population#worst_critter;F;[�;[[@�i�;T;:worst_critter;;;[�;{�;IC;"YThe "worst critter" is the critter with the highest (away from zero)
fitness rating.
;T;[�;[�;I"YThe "worst critter" is the critter with the highest (away from zero)
fitness rating.;T;0; @;!F;"o;#;$F;%i�;&i�;'@�;(I"def worst_critter;T;)T;*I"�def worst_critter
  unless @controller.compare_func.nil?
    @critters.max {|a, b| @controller.compare_func.(a.fitness, b.fitness) }
  else
    @critters.max {|a, b| a.fitness <=> b.fitness}
  end
end;T;+To;
;F;;
;;;I"NEAT::Population#dump_s;F;[�;[[@�i�;F;;�;;;[�;{�;IC;"�
;T; @&;/0;!F;[�;[�;I"�;T;0;'@�;(I"def dump_s;T;)T;*I"^def dump_s
  to_s + "\npopulation:\n" + @critters.map{|crit| crit.dump_s }.join("\n")
end;T;+To;
;F;;
;;�;I"$NEAT::Population#report_fitness;F;[�;[[@�i�;T;:report_fitness;;;[�;{�;IC;"#report on many fitness metrics
;T;[�;[�;I"#report on many fitness metrics;T;0; @3;!F;"o;#;$F;%i�;&i�;'@�;(I"def report_fitness;T;)T;*I"�def report_fitness
  {
      overall: @critters.map{|critter| critter.fitness}.reduce{|m, f| m + f} / @critters.size,
      best: best_critter.fitness,
      worst: worst_critter.fitness,
  }
end;T;+To;
;F;;
;;�;I",NEAT::Population#report_fitness_species;F;[�;[[@�i�;T;:report_fitness_species;;;[�;{�;IC;")report on the best and worst species
;T;[�;[�;I")report on the best and worst species;T;0; @A;!F;"o;#;$F;%i�;&i�;'@�;(I"def report_fitness_species;T;)T;*I"Jdef report_fitness_species
  {
    best: nil,
    worst: nil,
  }
end;T;+To;
;F;;
;;�;I"%NEAT::Population#report_best_fit;F;[�;[[@�i�;T;:report_best_fit;;;[�;{�;IC;"Find the best fit critter
;T;[�;[�;I"Find the best fit critter;T;0; @O;!F;"o;#;$F;%i�;&i�;'@�;(I"def report_best_fit;T;)T;*I":def report_best_fit
  best_critter.phenotype.code
end;T;+To;
;F;;
;;�;I"&NEAT::Population#report_worst_fit;F;[�;[[@�i�;T;:report_worst_fit;;;[�;{�;IC;"Find the worst fit critter
;T;[�;[�;I"Find the worst fit critter;T;0; @];!F;"o;#;$F;%i�;&i�;'@�;(I"def report_worst_fit;T;)T;*I"<def report_worst_fit
  worst_critter.phenotype.code
end;T;+T;:@�;;IC;[�;:@�;<IC;[�;:@�;NIC;O{;GIC;O{�;PT;
IC;O{
;wIC;O{;x@�;y@�;PT;yIC;O{;x@�;y@�;PT;{IC;O{;x@�;y@�;PT;}IC;O{;x@�;y@�;PT;IC;O{;x@;y@;PT;0IC;O{;x@*;y0;PT;�IC;O{;x@8;y0;PT;�IC;O{;x@D;y0;PT;PT;PT;Q{�;R[�;[[@�i;T;:Population;;;;;[�;{�;IC;"�= Population of NEAT Critters.
The Population 
In ourselves we have the pool of neurons the critters all use.
the pool of neurons are indirects, of course, as during phenotype
expression, all the phenotypes shall be created individually.
;T;[�;[�;I"�= Population of NEAT Critters.
The Population 
In ourselves we have the pool of neurons the critters all use.
the pool of neurons are indirects, of course, as during phenotype
expression, all the phenotypes shall be created individually.
;T;0; @�;!F;"o;#;$F;%i	;&i;'@;I"NEAT::Population;F;To;=;>0;?0;@0;;r;'@;B@�;C0;+T;:@;;IC;[�;:@;<IC;[�;:@;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[[@i
[@Fi[@i[@�i[@ 	i[@�i6[@�i	[@[i[@�i;T;;};;;;;[�;{�;IC;"�= NEAT -- Module for RubyNEAT.

== Synopsis
We have a Population of Critters, and each Critter
represents a network of Neurons and a connection list specifying
how those Neurons are connected.

Each Neuron has an inplicit genotype and phenotype component. Neurons,
from the Ruby persoective, contain their own code to produce their own
phenotypes. 

There are input Neurons and output Neurons. The input Neurons are special, as
they do not contain any input from other nodes, but serve as interfaces
from the "real world". Thier range of inputs are open, and it shall be up to
the input Neuron's phenotype generators to condition those inputs, if need be,
to someething more suiable for the neural network.

== Issues
=== Multicore / Cloud Computing
Some thought needs to be given to how to make this anenable to multiple
processes so that we can leverage the power of multicore systems as well
as multiple computers in the Cloud, etc.

Our initial inclination  is to put all of that functionality in the Conroller.
;T;[�;[�;I"�= NEAT -- Module for RubyNEAT.

== Synopsis
We have a Population of Critters, and each Critter
represents a network of Neurons and a connection list specifying
how those Neurons are connected.

Each Neuron has an inplicit genotype and phenotype component. Neurons,
from the Ruby persoective, contain their own code to produce their own
phenotypes. 

There are input Neurons and output Neurons. The input Neurons are special, as
they do not contain any input from other nodes, but serve as interfaces
from the "real world". Thier range of inputs are open, and it shall be up to
the input Neuron's phenotype generators to condition those inputs, if need be,
to someething more suiable for the neural network.

== Issues
=== Multicore / Cloud Computing
Some thought needs to be given to how to make this anenable to multiple
processes so that we can leverage the power of multicore systems as well
as multiple computers in the Cloud, etc.

Our initial inclination  is to put all of that functionality in the Conroller.
;T;0; @;!F;"o;#;$F;%i;&i5;'@;I"	NEAT;F;:@;;IC;[�;:@;<IC;[o;=;>0;?I"NEAT::DSL;T;@@;;~;'@;B@
;C;D;:@;NIC;O{;GIC;O{�;PT;
IC;O{�;PT;PT;Q{�;R[�;[�;F;;�;;;;;[�;{�;IC;"�
;T; @;/0;!F;[�;[�;I"�;T;0;'0;I"�;T;}@:NEAT::DSL@
:NEAT::DSL#define@:NEAT::DSL#evolve@ :NEAT::DSL#query@0:NEAT::DSL#recurrence@@:NEAT::DSL#fitness@O:NEAT::DSL#compare@_:NEAT::DSL#cost@o:NEAT::DSL#stop_on_fitness@:'NEAT::DSL#condition_boolean_vector@�:)NEAT::DSL#uncondition_boolean_vector@�:#NEAT::DSL#simple_fitness_error@�:NEAT::DSL#report@�:NEAT::DSL#run_engine@�:NEAT::DSL#method_missing@�:NEAT::Graph@9: NEAT::Graph::GraphException@;:NEAT::Graph#clear_graph@O:NEAT::Graph#<<@]:NEAT::Graph#add@l:NEAT::Graph#inputs@|:$NEAT::Graph::DependencyResolver@�:/NEAT::Graph::DependencyResolver#initialize@�:'NEAT::Graph::DependencyResolver.[]@�:,NEAT::Graph::DependencyResolver#resolve@�:-NEAT::Graph::DependencyResolver#resolve!@�:)NEAT::Graph::DependencyResolver#rdep@�:NEAT::Neuron@5:NEAT::Neuron#genotype@7:NEAT::Neuron#trait@E:NEAT::Neuron#trait=@R:"NEAT::Neuron#heirarchy_number@e:#NEAT::Neuron#heirarchy_number=@s:NEAT::Neuron#output@�:NEAT::Neuron#output=@�:!NEAT::Neuron::@@neuron_types@�:NEAT::Neuron.input?@�:NEAT::Neuron#input?@�:NEAT::Neuron.bias?@�:NEAT::Neuron#bias?@�:NEAT::Neuron#output?@�:NEAT::Neuron.inherited@:NEAT::Neuron.neuron_types@:NEAT::Neuron#express@&:NEAT::BasicNeuronTypes@�:(NEAT::BasicNeuronTypes::InputNeuron@�:/NEAT::BasicNeuronTypes::InputNeuron.input?@�:0NEAT::BasicNeuronTypes::InputNeuron#express@:'NEAT::BasicNeuronTypes::BiasNeuron@�:-NEAT::BasicNeuronTypes::BiasNeuron.bias?@�:0NEAT::BasicNeuronTypes::BiasNeuron#neu_bias@�:1NEAT::BasicNeuronTypes::BiasNeuron#neu_bias=@�:2NEAT::BasicNeuronTypes::BiasNeuron#initialize@�:/NEAT::BasicNeuronTypes::BiasNeuron#express@�:*NEAT::BasicNeuronTypes::SigmoidNeuron@�:2NEAT::BasicNeuronTypes::SigmoidNeuron#express@�:'NEAT::BasicNeuronTypes::TanhNeuron@:/NEAT::BasicNeuronTypes::TanhNeuron#express@ :'NEAT::BasicNeuronTypes::SineNeuron@B:/NEAT::BasicNeuronTypes::SineNeuron#express@D:)NEAT::BasicNeuronTypes::CosineNeuron@f:1NEAT::BasicNeuronTypes::CosineNeuron#express@h:NEAT::Critter@�:NEAT::Critter#population@�:NEAT::Critter#genotype@�:NEAT::Critter#genotype=@�:NEAT::Critter#phenotype@�:NEAT::Critter#phenotype=@�:NEAT::Critter#fitness@�:NEAT::Critter#fitness=@:NEAT::Critter#novelty@:NEAT::Critter#novelty=@":NEAT::Critter#initialize@0:(NEAT::Critter#ready_for_expression!@J:NEAT::Critter#express!@X:&NEAT::Critter#initialize_neurons!@f:NEAT::Critter#evaluate!@t:NEAT::Critter::Genotype@�:$NEAT::Critter::Genotype#critter@�:%NEAT::Critter::Genotype#critter=@�:"NEAT::Critter::Genotype#genes@�:#NEAT::Critter::Genotype#genes=@�:$NEAT::Critter::Genotype#neurons@�:%NEAT::Critter::Genotype#neurons=@�:*NEAT::Critter::Genotype#neural_inputs@�:+NEAT::Critter::Genotype#neural_outputs@�:-NEAT::Critter::Genotype#dangling_neurons@�:.NEAT::Critter::Genotype#dangling_neurons=@�:.NEAT::Critter::Genotype#dangling_neurons?@:,NEAT::Critter::Genotype#neural_gene_map@:'NEAT::Critter::Genotype#initialize@(:&NEAT::Critter::Genotype#neucleate@A:/NEAT::Critter::Genotype#nuke_redundancies!@^:$NEAT::Critter::Genotype#forget!@l:"NEAT::Critter::Genotype#wire!@z:(NEAT::Critter::Genotype#add_neurons@�:&NEAT::Critter::Genotype#add_genes@�:'NEAT::Critter::Genotype#innervate!@�:#NEAT::Critter::Genotype#prune!@�:)NEAT::Critter::Genotype#fitness_cost@�:#NEAT::Critter::Genotype#dump_s@�:"NEAT::Critter::Genotype::Gene@�:+NEAT::Critter::Genotype::Gene#genotype@�:,NEAT::Critter::Genotype::Gene#genotype=@�:-NEAT::Critter::Genotype::Gene#innovation@:.NEAT::Critter::Genotype::Gene#innovation=@:,NEAT::Critter::Genotype::Gene#in_neuron@!:-NEAT::Critter::Genotype::Gene#in_neuron=@/:-NEAT::Critter::Genotype::Gene#out_neuron@=:.NEAT::Critter::Genotype::Gene#out_neuron=@I:)NEAT::Critter::Genotype::Gene#weight@W:*NEAT::Critter::Genotype::Gene#weight=@e:*NEAT::Critter::Genotype::Gene#enabled@s:+NEAT::Critter::Genotype::Gene#enabled=@�:-NEAT::Critter::Genotype::Gene#initialize@�:+NEAT::Critter::Genotype::Gene#enabled?@�:,NEAT::Critter::Genotype::Gene#disabled?@�:%NEAT::Critter::Genotype::Gene.[]@�:'NEAT::Critter::Genotype::Gene#to_s@�:)NEAT::Critter::Genotype::Gene#dump_s@�:NEAT::Critter::Phenotype@-:%NEAT::Critter::Phenotype#critter@/:&NEAT::Critter::Phenotype#critter=@=:"NEAT::Critter::Phenotype#code@K:#NEAT::Critter::Phenotype#code=@Y: NEAT::Critter::Phenotype.[]@g:&NEAT::Critter::Phenotype#express!@v:'NEAT::Critter::Phenotype#stimulate@�:"NEAT::Critter::Phenotype#to_s@�:NEAT::Critter#compare@�:NEAT::Critter#dump_s@�:NEAT::Critter#excess@�:NEAT::Critter#disjoint@�:NEAT::Critter#weight_diff@�:NEAT::Evolver@	:NEAT::Evolver#npop@	:NEAT::Evolver#initialize@)	:%NEAT::Evolver#gen_initial_genes!@=	:NEAT::Evolver#mutate!@M	:NEAT::Evolver#evolve@]	:&NEAT::Evolver#prepare_speciation!@m	:#NEAT::Evolver#prepare_fitness!@z	:#NEAT::Evolver#prepare_novelty!@�	:/NEAT::Evolver#mutate_perturb_gene_weights!@�	:.NEAT::Evolver#mutate_change_gene_weights!@�	:$NEAT::Evolver#mutate_add_genes!@�	:(NEAT::Evolver#mutate_disable_genes!@�	:)NEAT::Evolver#mutate_reenable_genes!@�	:&NEAT::Evolver#mutate_add_neurons!@�	:)NEAT::Evolver#mutate_change_neurons!@�	:NEAT::Evolver#mate!@�	:NEAT::Evolver#sex@
:NEAT::Evolver::CritterOp@
:(NEAT::Evolver::CritterOp#initialize@
:)NEAT::Evolver::CritterOp#add_neuron!@*
:'NEAT::Evolver::CritterOp#add_gene!@:
:+NEAT::Evolver::CritterOp#disable_gene!@J
:,NEAT::Evolver::CritterOp#reenable_gene!@Z
:NEAT.random_name_generator@�
:NEAT::STIMULUS@�
:NEAT.new_innovation@�
:NEAT.gaussian@�
:
NEAT.dpp@�
:NEAT::NeatOb@�:NEAT::NeatOb#name@�:NEAT::NeatOb#controller@:NEAT::NeatOb#log@:NEAT::NeatOb.log@:NEAT::NeatOb#initialize@*:NEAT::NeatOb#to_s@C:NEAT::NeatException@�
:NEAT::Operator@�
:NEAT::Trait@�
:NEAT::Controller@:$NEAT::Controller#glob_innov_num@:NEAT::Controller#seq_num@!:$NEAT::Controller#generation_num@/:$NEAT::Controller#neuron_catalog@=:%NEAT::Controller#neuron_catalog=@K:#NEAT::Controller#neural_inputs@Y:$NEAT::Controller#neural_inputs=@g:$NEAT::Controller#neural_outputs@u:%NEAT::Controller#neural_outputs=@�:#NEAT::Controller#neural_hidden@�:$NEAT::Controller#neural_hidden=@�:NEAT::Controller#parms@�:NEAT::Controller#parms=@�: NEAT::Controller#population@�:(NEAT::Controller#population_history@�:&NEAT::Controller#population_class@�:NEAT::Controller#expressor@�: NEAT::Controller#expressor=@�:%NEAT::Controller#expressor_class@:&NEAT::Controller#expressor_class=@:NEAT::Controller#evaluator@+: NEAT::Controller#evaluator=@8:%NEAT::Controller#evaluator_class@K:&NEAT::Controller#evaluator_class=@X:NEAT::Controller#evolver@k:NEAT::Controller#evolver=@x:#NEAT::Controller#evolver_class@�:$NEAT::Controller#evolver_class=@�:NEAT::Controller#verbosity@�: NEAT::Controller#verbosity=@�: NEAT::Controller#query_func@�:!NEAT::Controller#query_func=@�:"NEAT::Controller#fitness_func@�:#NEAT::Controller#fitness_func=@�:%NEAT::Controller#recurrence_func@�:&NEAT::Controller#recurrence_func=@

:"NEAT::Controller#compare_func@
:#NEAT::Controller#compare_func=@)
:NEAT::Controller#cost_func@7
: NEAT::Controller#cost_func=@C
:&NEAT::Controller#stop_on_fit_func@Q
:'NEAT::Controller#stop_on_fit_func=@]
:"NEAT::Controller#end_run_func@k
:#NEAT::Controller#end_run_func=@y
:!NEAT::Controller#report_hook@�
:"NEAT::Controller#report_hook=@�
:NEAT::Controller#log@�
:#NEAT::Controller::NeatSettings@�
:3NEAT::Controller::NeatSettings#hash_on_fitness@�
:4NEAT::Controller::NeatSettings#hash_on_fitness=@�
:4NEAT::Controller::NeatSettings#age_significance@�
:5NEAT::Controller::NeatSettings#age_significance=@�
:1NEAT::Controller::NeatSettings#babies_stolen@�
:2NEAT::Controller::NeatSettings#babies_stolen=@�
:;NEAT::Controller::NeatSettings#compatibility_threshold@	:<NEAT::Controller::NeatSettings#compatibility_threshold=@:8NEAT::Controller::NeatSettings#disjoint_coefficient@%:9NEAT::Controller::NeatSettings#disjoint_coefficient=@3:6NEAT::Controller::NeatSettings#excess_coefficient@A:7NEAT::Controller::NeatSettings#excess_coefficient=@M:6NEAT::Controller::NeatSettings#weight_coefficient@[:7NEAT::Controller::NeatSettings#weight_coefficient=@g:/NEAT::Controller::NeatSettings#max_species@u:0NEAT::Controller::NeatSettings#max_species=@�:/NEAT::Controller::NeatSettings#dropoff_age@�:0NEAT::Controller::NeatSettings#dropoff_age=@�:4NEAT::Controller::NeatSettings#smallest_species@�:5NEAT::Controller::NeatSettings#smallest_species=@�::NEAT::Controller::NeatSettings#interspecies_mate_rate@�:;NEAT::Controller::NeatSettings#interspecies_mate_rate=@�::NEAT::Controller::NeatSettings#linktrait_mutation_sig@�:;NEAT::Controller::NeatSettings#linktrait_mutation_sig=@�:<NEAT::Controller::NeatSettings#mate_multipoint_avg_prob@:=NEAT::Controller::NeatSettings#mate_multipoint_avg_prob=@:8NEAT::Controller::NeatSettings#mate_multipoint_prob@%:9NEAT::Controller::NeatSettings#mate_multipoint_prob=@2:2NEAT::Controller::NeatSettings#mate_only_prob@E:3NEAT::Controller::NeatSettings#mate_only_prob=@R:9NEAT::Controller::NeatSettings#mate_singlepoint_prob@e::NEAT::Controller::NeatSettings#mate_singlepoint_prob=@r:3NEAT::Controller::NeatSettings#max_generations@�:4NEAT::Controller::NeatSettings#max_generations=@�::NEAT::Controller::NeatSettings#max_population_history@�:;NEAT::Controller::NeatSettings#max_population_history=@�:8NEAT::Controller::NeatSettings#mutate_add_gene_prob@�:9NEAT::Controller::NeatSettings#mutate_add_gene_prob=@�::NEAT::Controller::NeatSettings#mutate_add_neuron_prob@�:;NEAT::Controller::NeatSettings#mutate_add_neuron_prob=@�:<NEAT::Controller::NeatSettings#mutate_gene_disable_prob@�:=NEAT::Controller::NeatSettings#mutate_gene_disable_prob=@
:=NEAT::Controller::NeatSettings#mutate_gene_reenable_prob@:>NEAT::Controller::NeatSettings#mutate_gene_reenable_prob=@*::NEAT::Controller::NeatSettings#mutate_gene_trait_prob@=:;NEAT::Controller::NeatSettings#mutate_gene_trait_prob=@J:DNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_prob@]:ENEAT::Controller::NeatSettings#mutate_perturb_gene_weights_prob=@k:BNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_sd@y:CNEAT::Controller::NeatSettings#mutate_perturb_gene_weights_sd=@�:CNEAT::Controller::NeatSettings#mutate_change_gene_weights_prob@�:DNEAT::Controller::NeatSettings#mutate_change_gene_weights_prob=@�:ANEAT::Controller::NeatSettings#mutate_change_gene_weights_sd@�:BNEAT::Controller::NeatSettings#mutate_change_gene_weights_sd=@�:<NEAT::Controller::NeatSettings#mutate_neuron_trait_prob@�:=NEAT::Controller::NeatSettings#mutate_neuron_trait_prob=@�:4NEAT::Controller::NeatSettings#mutate_only_prob@�:5NEAT::Controller::NeatSettings#mutate_only_prob=@�:<NEAT::Controller::NeatSettings#mutate_random_trait_prob@:=NEAT::Controller::NeatSettings#mutate_random_trait_prob=@:=NEAT::Controller::NeatSettings#mutate_toggle_enable_prob@':>NEAT::Controller::NeatSettings#mutate_toggle_enable_prob=@4:7NEAT::Controller::NeatSettings#mutdiff_coefficient@G:8NEAT::Controller::NeatSettings#mutdiff_coefficient=@T:1NEAT::Controller::NeatSettings#newlink_tries@g:2NEAT::Controller::NeatSettings#newlink_tries=@t:8NEAT::Controller::NeatSettings#neuron_trait_mut_sig@�:9NEAT::Controller::NeatSettings#neuron_trait_mut_sig=@�:;NEAT::Controller::NeatSettings#fitness_cost_per_neuron@�:<NEAT::Controller::NeatSettings#fitness_cost_per_neuron=@�:9NEAT::Controller::NeatSettings#fitness_cost_per_gene@�::NEAT::Controller::NeatSettings#fitness_cost_per_gene=@�:9NEAT::Controller::NeatSettings#start_population_size@�::NEAT::Controller::NeatSettings#start_population_size=@�:3NEAT::Controller::NeatSettings#population_size@�:4NEAT::Controller::NeatSettings#population_size=@:5NEAT::Controller::NeatSettings#start_sequence_at@:6NEAT::Controller::NeatSettings#start_sequence_at=@&:3NEAT::Controller::NeatSettings#end_sequence_at@9:4NEAT::Controller::NeatSettings#end_sequence_at=@F:/NEAT::Controller::NeatSettings#print_every@Y:0NEAT::Controller::NeatSettings#print_every=@f:3NEAT::Controller::NeatSettings#recur_only_prob@y:4NEAT::Controller::NeatSettings#recur_only_prob=@�:.NEAT::Controller::NeatSettings#recur_prob@�:/NEAT::Controller::NeatSettings#recur_prob=@�:6NEAT::Controller::NeatSettings#survival_threshold@�:7NEAT::Controller::NeatSettings#survival_threshold=@�:@NEAT::Controller::NeatSettings#survival_mininum_per_species@�:ANEAT::Controller::NeatSettings#survival_mininum_per_species=@�:8NEAT::Controller::NeatSettings#trait_mutation_power@�:9NEAT::Controller::NeatSettings#trait_mutation_power=@:8NEAT::Controller::NeatSettings#trait_param_mut_prob@:9NEAT::Controller::NeatSettings#trait_param_mut_prob=@":3NEAT::Controller::NeatSettings#weigh_mut_power@5:4NEAT::Controller::NeatSettings#weigh_mut_power=@B:<NEAT::Controller::NeatSettings#feature_selection_switch@U:=NEAT::Controller::NeatSettings#feature_selection_switch=@c:0NEAT::Controller::NeatSettings#hyper_switch@q:1NEAT::Controller::NeatSettings#hyper_switch=@:<NEAT::Controller::NeatSettings#evolved_substrate_switch@�:=NEAT::Controller::NeatSettings#evolved_substrate_switch=@�:4NEAT::Controller::NeatSettings#real_time_switch@�:5NEAT::Controller::NeatSettings#real_time_switch=@�:5NEAT::Controller::NeatSettings#recurrency_switch@�:6NEAT::Controller::NeatSettings#recurrency_switch=@�:.NEAT::Controller::NeatSettings#initialize@�: NEAT::Controller#initialize@;:$NEAT::Controller#new_innovation@\:NEAT::Controller#gaussian@i:NEAT::Controller#run@v:(NEAT::Controller#pre_run_initialize@�:NEAT.controller@�:NEAT.controller=@�:NEAT.create_controller@�:NEAT::Expressor@�:NEAT::Expressor#initialize@�:NEAT::Expressor#express!@:%NEAT::Expressor#express_neurons!@:#NEAT::Expressor#express_genes!@!:(NEAT::Expressor#express_expression!@1:NEAT::Evaluator@R:)NEAT::Evaluator#ready_for_evaluation@T:NEAT::Evaluator#evaluate!@e:)NEAT::Evaluator#analyze_for_fitness!@u:NEAT::Population@�:#NEAT::Population#input_neurons@�:$NEAT::Population#input_neurons=@�:$NEAT::Population#hidden_neurons@�:%NEAT::Population#hidden_neurons=@�:$NEAT::Population#output_neurons@�:%NEAT::Population#output_neurons=@�:NEAT::Population#traits@�:NEAT::Population#traits=@�:NEAT::Population#critters@:NEAT::Population#critters=@:NEAT::Population#fitness@*:NEAT::Population#novelty@8:NEAT::Population#species@D: NEAT::Population#initialize@R:0NEAT::Population#initialize_for_recurrence!@i:NEAT::Population#mutate!@w:NEAT::Population#express!@�:NEAT::Population#evaluate!@�:NEAT::Population#analyze!@�:NEAT::Population#evolve@�:NEAT::Population#speciate!@�:NEAT::Population.member?@�:NEAT::Population.evaluate!@�:!NEAT::Population.compactify!@�:NEAT::Population#report@�:"NEAT::Population#best_critter@
:#NEAT::Population#worst_critter@:NEAT::Population#dump_s@&:$NEAT::Population#report_fitness@3:,NEAT::Population#report_fitness_species@A:%NEAT::Population#report_best_fit@O:&NEAT::Population#report_worst_fit@]