Lingua-YaTeA
view release on metacpan or search on metacpan
lib/Lingua/YaTeA/NodeSet.pm view on Meta::CPAN
our $VERSION=$Lingua::YaTeA::VERSION;
sub new
{
my ($class) = @_;
my $this = {};
bless ($this,$class);
$this->{ROOT_NODE} = ();
$this->{NODES} = [];
return $this;
}
sub addNode
{
my ($this,$node) = @_;
push @{$this->{NODES}}, $node;
$this->updateRoot;
}
sub getNodes
{
my ($this) = @_;
return $this->{NODES};
}
sub setRoot
{
my ($this) = @_;
my $node;
foreach $node (@{$this->getNodes})
{
if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
{
$this->{ROOT_NODE} = $node;
return;
}
}
die "No root node\n";
}
sub getRoot
{
my ($this,$root) = @_;
return $this->{ROOT_NODE};
}
sub getNode
{
my ($this,$index) = @_;
return $this->getNodes->[$index];
}
sub updateRoot
{
my ($this) = @_;
my %nodes_id;
my $node;
foreach $node (@{$this->getNodes})
{
$nodes_id{$node->getID}++;
}
if(scalar @{$this->getNodes} == 0)
{
undef $this->{ROOT_NODE};
}
else
{
if
(
(!defined $this->getRoot)
||
(!exists $nodes_id{$this->getRoot->getID})
||
((blessed($this->getRoot)) && (!$this->getRoot->isa('Lingua::YaTeA::RootNode')))
)
{
$this->setRoot;
}
}
}
sub copy
{
my ($this) = @_;
my $new_set = Lingua::YaTeA::NodeSet->new;
my $node = $this->getRoot;
my $depth = 0;
$node->copyRecursively($new_set, $depth);
$this->addFreeNodes($new_set);
return $new_set;
}
sub addFreeNodes
{
my ($this,$new_set) = @_;
my $node;
foreach $node (@{$this->getNodes})
{
if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode'))
&&
($node ne $this->getRoot)
)
{
$node->copyRecursively($new_set);
}
}
}
sub fillNodeLeaves
{
my ($this,$index_set) = @_;
my $counter = 0;
$this->getRoot->fillLeaves(\$counter,$index_set, 0);
}
sub updateLeaves
{
my ($this,$index_set) = @_;
my $counter = 0;
$this->getRoot->updateLeaves(\$counter,$index_set);
}
sub searchFreeNodes
{
my ($this,$words_a) = @_;
my $node;
my @free_nodes;
# print STDERR "sFN1\n";
foreach $node (@{$this->getNodes})
{
# print STDERR "sFN2\n";
if((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
{
push @free_nodes, $node;
}
}
# print STDERR "sFN3\n";
return \@free_nodes;
}
sub removeNodes{
my ($this,$root_node,$words_a,$fh) = @_;
my @tmp;
my $node;
my @unplugged;
my $previous;
while ($node = pop @{$this->getNodes})
{
if($node->getID == $root_node->getID)
{
if ((blessed($node)) && ($node->isa('Lingua::YaTeA::InternalNode')))
{
if(
(blessed($node->getFather->getLeftEdge)) && ($node->getFather->getLeftEdge->isa('Lingua::YaTeA::InternalNode' )
&&
($node->getFather->getLeftEdge->getID == $node->getID)
)
)
{
$node->{FATHER}->{LEFT_EDGE} = $node->searchHead(0);
}
else
{
if(
(blessed($node->getFather->getRightEdge)) && ($node->getFather->getRightEdge->isa('Lingua::YaTeA::InternalNode' )
&&
($node->getFather->getRightEdge->getID == $node->getID)
)
)
( run in 4.260 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )