Algorithm-Evolutionary
view release on metacpan or search on metacpan
lib/Algorithm/Evolutionary/Individual/Tree.pm view on Meta::CPAN
Prints a node
=cut
sub nodePrint {
my $node = shift;
my $options = shift;
my $strRef = $options->{str};
${$strRef} .= ($node->attributes()->{constant}?($node->attributes()->{constant}. "*"):""). $node->name();
if ( $options->{primitives}{$node->name()}[0] > 0 ) { #That's the arity
${$strRef} .= "( ";
} elsif ( $options->{primitives}{$node->name()}[0] == 0 ){ #Add comma
if ($node->right_sister() ) {
${$strRef} .= ", ";
}
}
}
=head2 closeParens
Internal subrutine: closes node parenthesis
=cut
sub closeParens {
my $node = shift;
my $options = shift;
my $strRef = $options->{str};
if ( $options->{primitives}{$node->name()}[0] > 0 ) { #That's the arity
${$strRef} .= " ) ";
if ($node->right_sister() ) {
${$strRef} .= ", ";
}
}
}
=head2 Atom
Returns the tree, which is atomic by itself. Cannot be used as lvalue
=cut
sub Atom {
my $self = shift;
return $self->{'_tree'};
}
=head2 asXML
Prints it as XML. It prints the tree as String, which does not mean
you will be able to get it back from this form. It's done just for
compatibity, reading from this format will be available. In the future.
=cut
sub asXML {
my $self = shift;
my $str = $self->SUPER::asXML();
# my $str2 = ">\n<atom><![CDATA[".$self->asString()."]]></atom> ";
my $str2 = ">\n<atom><![CDATA[dummy root node]]></atom> ";
$str =~ s/\/>/$str2/e ;
return $str.$str2."\n</indi>";
}
=head2 addAtom
Dummy sub
=cut
sub addAtom {
my $self = shift;
$self->{_tree} = Tree::DAG_Node->new();
$self->{'_tree'}->name( "dummy root node" ); #Root node
$self->{'_tree'}->attributes( { constant => 0 } );
}
=head2 lolprint
Print the list of lists that composes the tree, using prefix notation
=cut
sub lolprint {
my @ar = @_;
my $str;
if ( $#ar > 0 ) {
$str = $ar[$#ar]."(";
for ( @ar[0..$#ar-1] ) {
if ( ref $_ eq 'ARRAY' ) {
$str .= lolprint( @$_ );
} else {
$str .= $_;
}
$str .= ", " if ($_ != $ar[$#ar-1]);
}
$str .= " )";
} else {
$str = $ar[0];
}
return $str;
}
=head2 growSubTree
Grows a random tree, with primitives as indicated, and a certain depth. Depth
defaults to 4
=cut
sub growSubTree {
my $self = shift;
my $tree = shift;
my $depth = shift || 4;
return if $depth == 1;
for ( my $i = 0; $i < $self->{_primitives}{$tree->name()}[0]; $i++ ) {
( run in 1.388 second using v1.01-cache-2.11-cpan-ceb78f64989 )