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 )