Skip to content

Commit

Permalink
alt and loc indices added to TrackNode
Browse files Browse the repository at this point in the history
  • Loading branch information
bver committed May 4, 2012
1 parent a671667 commit e57dac7
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 34 deletions.
21 changes: 12 additions & 9 deletions lib/mapper_base.rb
Expand Up @@ -9,7 +9,10 @@ module Mapper
# :symbol is the rule name used during a single genotype->phenotype mapping step,
# :from is the index of the first codon 'covered' by the rule,
# :to is the index of the last codon 'covered' by the rule.
TrackNode = Struct.new( 'TrackNode', :symbol, :from, :to, :back )
# :back is the reference to the parent TrackNode
# :alt_idx is the index of the expansion in a given rule so that grammar[symbol][alt_idx] is the selected expansion
# :loc_idx is the locus index in the parent expansion
TrackNode = Struct.new( 'TrackNode', :symbol, :from, :to, :back, :alt_idx, :loc_idx )

# The core Grammatical Evolution genotype->phenotype mapper.
# It generates a program (phenotype) according syntactic rules (Mapper::Grammar).
Expand Down Expand Up @@ -99,15 +102,15 @@ def phenotype genome

tsi1 = @used_length
return nil if @used_length > length_limit
selected_index = pick_locus( selected_indices, genome )
selected_index, loc_idx = pick_locus( selected_indices, genome )
selected_token = tokens[selected_index]

return nil if @used_length > length_limit
expansion = pick_rule( selected_token, genome )
expansion, alt_idx = pick_rule( selected_token, genome )
expansion.each { |t| t.depth = selected_token.depth+1 }

@complexity += selected_token.depth * expansion.arity + 1
track_expansion( selected_token, expansion, tsi1 ) if @track_support_on
track_expansion( selected_token, expansion, tsi1, alt_idx, loc_idx ) if @track_support_on

tokens = apply_expansion( tokens, expansion, selected_index )

Expand All @@ -131,13 +134,13 @@ def apply_expansion( tok, exp, i )
tok
end

def track_expansion( symbol_token, tokens, tsi1 )
def track_expansion( symbol_token, tokens, tsi1, alt_idx, loc_idx )
@track_support = [] if @track_support.nil?
tsi2 = @used_length-1
back = symbol_token.track

tokens.each { |t| t.track = @track_support.size if t.type == :symbol }
@track_support.push TrackNode.new( symbol_token.data, tsi1, tsi2, back )
@track_support.push TrackNode.new( symbol_token.data, tsi1, tsi2, back, alt_idx, loc_idx )

until back.nil?
@track_support[back].to = tsi2
Expand Down Expand Up @@ -177,7 +180,7 @@ def pick_rule( symbol_token, genome )

expansion = rule.at(alt_index).deep_copy
modify_expansion_base( expansion, genome )
return use_expansion( symbol_token, expansion )
return [ use_expansion( symbol_token, expansion ), alt_index ]
end

def find_nonterminals_by_depth( tokens, depth )
Expand All @@ -193,15 +196,15 @@ def find_nonterminals_by_depth( tokens, depth )
module LocusFirst
protected
def pick_locus( selected_indices, genome )
selected_indices.first
return [selected_indices.first, 0]
end
end

module LocusGenetic
protected
def pick_locus( selected_indices, genome )
index = @codon.interpret( selected_indices.size, read_genome( genome, selected_indices.size ) )
selected_indices[index]
return [selected_indices[index], index]
end
end

Expand Down
48 changes: 24 additions & 24 deletions test/tc_mappers.rb
Expand Up @@ -317,13 +317,13 @@ def test_mapper_track
assert_equal( '((x +y) *x)', m.phenotype( [2, 2, 0, 0, 1, 1, 0] ) )

track = [
Mapper::TrackNode.new( 'expr', 0, 6 ),
Mapper::TrackNode.new( 'expr', 1, 4, 0 ),
Mapper::TrackNode.new( 'expr', 2, 2, 1 ),
Mapper::TrackNode.new( 'aop', 3, 3, 1 ),
Mapper::TrackNode.new( 'expr', 4, 4, 1 ),
Mapper::TrackNode.new( 'aop', 5, 5, 0 ),
Mapper::TrackNode.new( 'expr', 6, 6, 0 )
Mapper::TrackNode.new( 'expr', 0, 6, nil, 2, 0 ),
Mapper::TrackNode.new( 'expr', 1, 4, 0, 2, 0 ),
Mapper::TrackNode.new( 'expr', 2, 2, 1, 0, 0 ),
Mapper::TrackNode.new( 'aop', 3, 3, 1, 0, 0 ),
Mapper::TrackNode.new( 'expr', 4, 4, 1, 1, 0 ),
Mapper::TrackNode.new( 'aop', 5, 5, 0, 1, 0 ),
Mapper::TrackNode.new( 'expr', 6, 6, 0, 0, 0 )
]
assert_equal( track, m.track_support )

Expand All @@ -340,13 +340,13 @@ def test_mapper_track2
assert_equal( '(y *(x +y))', m.phenotype( [2, 4, 3, 5, 0, 6, 1, 3, 5] ) )

track = [
Mapper::TrackNode.new( 'expr', 0, 6 ),
Mapper::TrackNode.new( 'expr', 1, 1, 0 ),
Mapper::TrackNode.new( 'aop', 2, 2, 0 ),
Mapper::TrackNode.new( 'expr', 3, 6, 0 ),
Mapper::TrackNode.new( 'expr', 4, 4, 3 ),
Mapper::TrackNode.new( 'aop', 5, 5, 3 ),
Mapper::TrackNode.new( 'expr', 6, 6, 3 ),
Mapper::TrackNode.new( 'expr', 0, 6, nil, 2, 0 ),
Mapper::TrackNode.new( 'expr', 1, 1, 0, 1, 0 ),
Mapper::TrackNode.new( 'aop', 2, 2, 0, 1, 0 ),
Mapper::TrackNode.new( 'expr', 3, 6, 0, 2, 0 ),
Mapper::TrackNode.new( 'expr', 4, 4, 3, 0, 0 ),
Mapper::TrackNode.new( 'aop', 5, 5, 3, 0, 0 ),
Mapper::TrackNode.new( 'expr', 6, 6, 3, 1, 0 ),
]
assert_equal( track, m.track_support )
end
Expand All @@ -361,16 +361,16 @@ def test_depth_locus_track_bugfix
# o = + / *

track = [
Mapper::TrackNode.new( 'expr', 0, 19, nil ), # 0:[ ,2] <e> <o> <e>
Mapper::TrackNode.new( 'expr', 2, 9, 0 ), # 1:[2,2] <e> <o> (<e> <o> <e>)
Mapper::TrackNode.new( 'aop', 4, 5, 1 ), # 2:[1,0] <e> <o> (<e> + <e>)
Mapper::TrackNode.new( 'expr', 6, 7, 1 ), # 3:[0,1] <e> <o> ( y + <e>)
Mapper::TrackNode.new( 'expr', 8, 9, 1 ), # 4:[ ,0] <e> <o> ( y + x )
Mapper::TrackNode.new( 'expr',10, 17, 0 ), # 5:[0,2] (<e> <o> <e>) <o> ( y + x )
Mapper::TrackNode.new( 'aop', 12, 13, 5 ), # 6:[1,0] (<e> + <e>) <o> ( y + x )
Mapper::TrackNode.new( 'expr',14, 15, 5 ), # 7:[0,0] ( x + <e>) <o> ( y + x )
Mapper::TrackNode.new( 'expr',16, 17, 5 ), # 8:[ ,1] ( x + y ) <o> ( y + x )
Mapper::TrackNode.new( 'aop', 18, 19, 0 ), # 9:[ ,1] ( x + y ) * ( y + x )
Mapper::TrackNode.new( 'expr', 0, 19, nil, 2, 0 ), # 0:[ ,2] <e> <o> <e>
Mapper::TrackNode.new( 'expr', 2, 9, 0, 2, 2 ), # 1:[2,2] <e> <o> (<e> <o> <e>)
Mapper::TrackNode.new( 'aop', 4, 5, 1, 0, 1 ), # 2:[1,0] <e> <o> (<e> + <e>)
Mapper::TrackNode.new( 'expr', 6, 7, 1, 1, 0 ), # 3:[0,1] <e> <o> ( y + <e>)
Mapper::TrackNode.new( 'expr', 8, 9, 1, 0, 0 ), # 4:[ ,0] <e> <o> ( y + x )
Mapper::TrackNode.new( 'expr',10, 17, 0, 2, 0 ), # 5:[0,2] (<e> <o> <e>) <o> ( y + x )
Mapper::TrackNode.new( 'aop', 12, 13, 5, 0, 1 ), # 6:[1,0] (<e> + <e>) <o> ( y + x )
Mapper::TrackNode.new( 'expr',14, 15, 5, 0, 0 ), # 7:[0,0] ( x + <e>) <o> ( y + x )
Mapper::TrackNode.new( 'expr',16, 17, 5, 1, 0 ), # 8:[ ,1] ( x + y ) <o> ( y + x )
Mapper::TrackNode.new( 'aop', 18, 19, 0, 1, 0 ), # 9:[ ,1] ( x + y ) * ( y + x )
]
assert_equal( track, m.track_support )

Expand Down
5 changes: 4 additions & 1 deletion tools/gpmap.rb
Expand Up @@ -78,7 +78,10 @@
phenotype = mapper.phenotype genotype
next if phenotype.nil?
puts phenotype unless supress
mapper.track_support.each_with_index { |node,i| puts "#{i}. #{node.symbol} genome:#{node.from}..#{node.to} parent:#{node.back}" } if track
mapper.track_support.each_with_index do |node,i|
text = (grammar[node.symbol][node.alt_idx].map {|token| token.type == :symbol ? %Q[<#{token.data}>] : %Q["#{token.data}"] }).join(' ')
puts "#{i}. #{node.symbol} genome:#{node.from}..#{node.to} parent:#{node.back} locus:#{node.loc_idx} expansion:'#{text}'"
end if track
puts "used_length = #{mapper.used_length}" if used
end

Expand Down

0 comments on commit e57dac7

Please sign in to comment.