File Coverage

blib/lib/Lingua/YaTeA/NodeSet.pm
Criterion Covered Total %
statement 90 247 36.4
branch 15 98 15.3
condition 26 78 33.3
subroutine 19 27 70.3
pod 22 23 95.6
total 172 473 36.3


line stmt bran cond sub pod time code
1             package Lingua::YaTeA::NodeSet;
2              
3 5     5   28 use strict;
  5         7  
  5         114  
4 5     5   29 use warnings;
  5         7  
  5         94  
5              
6 5     5   1886 use UNIVERSAL;
  5         46  
  5         20  
7 5     5   136 use Scalar::Util qw(blessed);
  5         8  
  5         11139  
8              
9             our $VERSION=$Lingua::YaTeA::VERSION;
10              
11             sub new
12             {
13 484     484 1 837 my ($class) = @_;
14 484         763 my $this = {};
15 484         736 bless ($this,$class);
16 484         896 $this->{ROOT_NODE} = ();
17 484         724 $this->{NODES} = [];
18 484         895 return $this;
19             }
20              
21              
22              
23             sub addNode
24             {
25 638     638 1 949 my ($this,$node) = @_;
26 638         782 push @{$this->{NODES}}, $node;
  638         1184  
27 638         1115 $this->updateRoot;
28             }
29              
30             sub getNodes
31             {
32 2438     2438 1 2911 my ($this) = @_;
33 2438         4199 return $this->{NODES};
34             }
35              
36              
37             sub setRoot
38             {
39 606     606 1 809 my ($this) = @_;
40 606         667 my $node;
41 606         654 foreach $node (@{$this->getNodes})
  606         826  
42             {
43 700 100 66     3222 if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
44             {
45 606         906 $this->{ROOT_NODE} = $node;
46 606         1279 return;
47             }
48             }
49 0         0 die "No root node\n";
50             }
51              
52              
53             sub getRoot
54             {
55 3203     3203 1 4366 my ($this,$root) = @_;
56 3203         9145 return $this->{ROOT_NODE};
57              
58             }
59              
60              
61              
62             sub getNode
63             {
64 0     0 1 0 my ($this,$index) = @_;
65 0         0 return $this->getNodes->[$index];
66             }
67              
68             sub updateRoot
69             {
70 710     710 1 974 my ($this) = @_;
71 710         857 my %nodes_id;
72             my $node;
73 710         790 foreach $node (@{$this->getNodes})
  710         1011  
74             {
75 1156         2120 $nodes_id{$node->getID}++;
76             }
77              
78 710 50       966 if(scalar @{$this->getNodes} == 0)
  710         961  
79             {
80 0         0 undef $this->{ROOT_NODE};
81             }
82             else
83             {
84 710 100 66     1074 if
      66        
      100        
85             (
86             (!defined $this->getRoot)
87             ||
88             (!exists $nodes_id{$this->getRoot->getID})
89             ||
90             ((blessed($this->getRoot)) && (!$this->getRoot->isa('Lingua::YaTeA::RootNode')))
91             )
92             {
93            
94 326         519 $this->setRoot;
95             }
96             }
97             }
98              
99              
100              
101             sub copy
102             {
103 204     204 1 281 my ($this) = @_;
104 204         390 my $new_set = Lingua::YaTeA::NodeSet->new;
105 204         347 my $node = $this->getRoot;
106 204         250 my $depth = 0;
107              
108 204         597 $node->copyRecursively($new_set, $depth);
109 204         452 $this->addFreeNodes($new_set);
110 204         463 return $new_set;
111             }
112              
113             sub addFreeNodes
114             {
115 204     204 1 300 my ($this,$new_set) = @_;
116 204         241 my $node;
117            
118 204         233 foreach $node (@{$this->getNodes})
  204         310  
119             {
120            
121 271 100 66     1170 if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode'))
      100        
122             &&
123             ($node ne $this->getRoot)
124             )
125            
126             {
127 4         11 $node->copyRecursively($new_set);
128             }
129             }
130              
131             }
132              
133             sub fillNodeLeaves
134             {
135 110     110 1 164 my ($this,$index_set) = @_;
136 110         130 my $counter = 0;
137            
138 110         176 $this->getRoot->fillLeaves(\$counter,$index_set, 0);
139             }
140              
141              
142              
143             sub updateLeaves
144             {
145 9     9 1 19 my ($this,$index_set) = @_;
146 9         15 my $counter = 0;
147 9         19 $this->getRoot->updateLeaves(\$counter,$index_set);
148             }
149              
150             sub searchFreeNodes
151             {
152 76     76 1 122 my ($this,$words_a) = @_;
153 76         93 my $node;
154             my @free_nodes;
155            
156             # print STDERR "sFN1\n";
157              
158 76         92 foreach $node (@{$this->getNodes})
  76         118  
159             {
160             # print STDERR "sFN2\n";
161 219 100 66     831 if((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
162             {
163 81         169 push @free_nodes, $node;
164             }
165             }
166              
167             # print STDERR "sFN3\n";
168              
169 76         224 return \@free_nodes;
170             }
171              
172              
173              
174             sub removeNodes{
175 0     0 0 0 my ($this,$root_node,$words_a,$fh) = @_;
176 0         0 my @tmp;
177             my $node;
178 0         0 my @unplugged;
179 0         0 my $previous;
180 0         0 while ($node = pop @{$this->getNodes})
  0         0  
181             {
182 0 0       0 if($node->getID == $root_node->getID)
183             {
184 0 0 0     0 if ((blessed($node)) && ($node->isa('Lingua::YaTeA::InternalNode')))
185             {
186 0 0 0     0 if(
      0        
187             (blessed($node->getFather->getLeftEdge)) && ($node->getFather->getLeftEdge->isa('Lingua::YaTeA::InternalNode' )
188             &&
189             ($node->getFather->getLeftEdge->getID == $node->getID)
190             )
191             )
192            
193             {
194 0         0 $node->{FATHER}->{LEFT_EDGE} = $node->searchHead(0);
195             }
196             else
197             {
198 0 0 0     0 if(
      0        
199             (blessed($node->getFather->getRightEdge)) && ($node->getFather->getRightEdge->isa('Lingua::YaTeA::InternalNode' )
200             &&
201             ($node->getFather->getRightEdge->getID == $node->getID)
202             )
203             )
204            
205             {
206 0         0 $node->{FATHER}->{RIGHT_EDGE} = $node->searchHead(0);
207             }
208             }
209             }
210 0 0 0     0 if ((blessed($node->getLeftEdge)) && ($node->getLeftEdge->isa('Lingua::YaTeA::Node')))
211             {
212             # print $fh "rebless left:" . $node->getLeftEdge->getID . "\n";
213 0         0 undef $node->getLeftEdge->{FATHER};
214 0         0 bless($node->getLeftEdge,'Lingua::YaTeA::RootNode');
215 0         0 $previous = -1;
216 0 0       0 if($node->getLeftEdge->isDiscontinuous(\$previous,$words_a,$fh)->[0] == -1)
217             {
218 0         0 push @unplugged,$node->getLeftEdge;
219             }
220 0         0 $node->{LEFT_EDGE} = $node->getLeftEdge->searchHead(0);
221            
222             }
223 0 0 0     0 if ((blessed($node->getRightEdge)) && ($node->getRightEdge->isa('Lingua::YaTeA::Node')))
224             {
225             # print $fh "rebless right:" . $node->getRightEdge->getID . "\n";
226 0         0 undef $node->getRightEdge->{FATHER};
227 0         0 bless($node->getRightEdge,'Lingua::YaTeA::RootNode');
228             # $node->getRightEdge->printRecursively($words_a,$fh);
229 0         0 $previous = -1;
230 0 0       0 if($node->getRightEdge->isDiscontinuous(\$previous,$words_a,$fh)->[0] == -1)
231             {
232 0         0 push @unplugged,$node->getRightEdge;
233             }
234 0         0 $node->{RIGHT_EDGE} = $node->getRightEdge->searchHead(0);
235             }
236             }
237             else
238             {
239 0         0 push @tmp,$node;
240             }
241             }
242            
243            
244 0         0 @{$this->getNodes} = @tmp;
  0         0  
245 0         0 $this->updateRoot;
246 0         0 return \@unplugged;
247             }
248              
249              
250              
251             sub hitchMore
252             {
253 0     0 1 0 my ($this,$added_node_set,$added_index_set,$words_a,$fh) = @_;
254 0         0 my $free_nodes_a = $this->searchFreeNodes($words_a);
255 0         0 my $node;
256             my $pivot;
257 0         0 my $hook_node;
258 0         0 my $hook_place;
259 0         0 my $below;
260 0         0 my %integrated;
261              
262 0 0       0 if(scalar @$free_nodes_a != 0)
263             {
264 0         0 foreach $node (@$free_nodes_a)
265             {
266            
267 0 0 0     0 if(
268             ($node != $added_node_set->getNode(0)->searchRoot)
269             &&
270             (!exists $integrated{$node->getID})
271             )
272             {
273 0         0 $pivot = $node->searchHead(0)->getIndex;
274 0 0       0 if($added_index_set->getLast == $pivot)
275             {
276 0         0 ($hook_node,$hook_place) = $node->getNodeOfLeaf($pivot,$added_index_set->getFirst,$words_a);
277             }
278             else
279             {
280 0 0       0 if($added_index_set->getFirst == $pivot)
281             {
282 0         0 ($hook_node,$hook_place) = $node->getNodeOfLeaf($pivot,$added_index_set->getLast,$words_a);
283             }
284             }
285            
286 0 0 0     0 if ((blessed($hook_node)) && ($hook_node->isa('Lingua::YaTeA::Node')))
287             {
288 0 0       0 if($hook_node->hitch($hook_place,$added_node_set->getRoot,$words_a))
289             {
290            
291 0         0 $integrated{$added_node_set->getRoot->getID}= 1;
292             }
293             }
294             }
295             }
296             }
297             }
298              
299              
300             sub findHierarchy
301             {
302 0     0 1 0 my ($this,$pivot,$added_index_set,$added_node_set) = @_;
303 0         0 my $node;
304             my $pivot_node;
305 0         0 my $pivot_place;
306 0         0 my $left_most;
307 0         0 my $right_most;
308 0         0 my $recorded;
309 0         0 my $depth = 0;
310            
311 0         0 foreach $node (@{$this->getNodes})
  0         0  
312             {
313 0         0 $depth = 0;
314 0 0 0     0 if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
315             {
316 0         0 ($pivot_node,$pivot_place) = $node->searchLeaf($pivot,\$depth);
317            
318 0 0 0     0 if ((blessed($pivot_node)) && ($pivot_node->isa('Lingua::YaTeA::Node')))
319             {
320 0         0 $left_most = $node->searchLeftMostLeaf;
321 0         0 $depth = 0;
322 0         0 $right_most = $node->searchRightMostLeaf(\$depth);
323 0         0 $recorded = $node;
324 0         0 last;
325             }
326             }
327             }
328              
329 0 0 0     0 if(
330             (defined $left_most)
331             &&
332             (defined $right_most)
333             )
334             {
335 0 0       0 if($right_most->getIndex == $added_index_set->getLast)
336             {
337 0 0       0 if($left_most->getIndex > $added_index_set->getFirst)
338             {
339 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
340 0         0 return ($pivot_node,$pivot_place,$recorded);
341             }
342 0 0       0 if($left_most->getIndex < $added_index_set->getFirst)
343             {
344 0         0 return ($pivot_node,$pivot_place,$added_node_set->getRoot);
345             }
346 0         0 die "not defined";
347             }
348              
349 0 0       0 if($right_most->getIndex == $added_index_set->getFirst)
350             {
351 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
352 0         0 return ($pivot_node,$pivot_place,$recorded);
353             }
354              
355 0 0       0 if($left_most->getIndex == $added_index_set->getLast)
356             {
357            
358 0 0       0 if($added_node_set->getRoot->searchHead(0)->getIndex == $left_most->getIndex)
359             {
360 0         0 return ($pivot_node,$pivot_place,$added_node_set->getRoot);
361             }
362             else
363             {
364 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
365 0         0 return ($pivot_node,$pivot_place,$recorded);
366             }
367             }
368              
369 0 0       0 if($left_most->getIndex == $added_index_set->getFirst)
370             {
371 0 0       0 if($right_most->getIndex > $added_index_set->getLast)
372             {
373 0         0 return ($pivot_node,$pivot_place,$added_node_set->getRoot);
374             }
375 0 0       0 if($right_most->getIndex < $added_index_set->getLast)
376             {
377 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
378 0         0 return ($pivot_node,$pivot_place,$recorded);
379             }
380             }
381 0 0       0 if($left_most->getIndex > $added_index_set->getFirst)
382             {
383 0 0       0 if($right_most->getIndex < $added_index_set->getLast)
384             {
385 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
386 0         0 return ($pivot_node,$pivot_place,$recorded);
387             }
388             else
389             {
390 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
391 0         0 return ($pivot_node,$pivot_place,$recorded);
392             }
393 0         0 die "not defined";
394             }
395              
396 0 0       0 if($left_most->getIndex < $added_index_set->getFirst)
397             {
398 0 0       0 if($right_most->getIndex > $added_index_set->getLast)
399             {
400 0         0 return ($pivot_node,$pivot_place,$added_node_set->getRoot->searchLeftMostNode);
401             }
402 0 0       0 if($recorded->searchHead(0)->getIndex == $pivot)
403             {
404            
405 0         0 ($pivot_node,$pivot_place) = $added_node_set->getRoot->searchLeaf($pivot,\$depth);
406 0         0 return ($pivot_node,$pivot_place,$recorded);
407             }
408             else
409             {
410 0         0 return;
411             }
412             }
413 0         0 die "not defined";
414             }
415             }
416              
417              
418             sub getNodeWithPivot
419             {
420 61     61 1 96 my ($this,$pivot) = @_;
421 61         73 my $node;
422            
423 61         78 foreach $node (@{$this->getNodes})
  61         100  
424             {
425 106 100 66     197 if (
      100        
426             (blessed($node->getLeftEdge)) && ($node->getLeftEdge->isa('Lingua::YaTeA::TermLeaf'))
427             &&
428             ($node->getLeftEdge->getIndex == $pivot)
429             )
430            
431             {
432 32         88 return ($node,"LEFT");
433             }
434              
435 74 100 66     174 if (
      100        
436             (blessed($node->getRightEdge)) && ($node->getRightEdge->isa('Lingua::YaTeA::TermLeaf'))
437             &&
438             ($node->getRightEdge->getIndex == $pivot)
439             )
440            
441             {
442 29         95 return ($node,"RIGHT");
443             }
444             }
445            
446 0         0 return;
447             }
448              
449              
450              
451             sub addNodes
452             {
453 63     63 1 117 my ($this,$node_set) = @_;
454 63         84 my $node;
455 63         84 foreach $node (@{$node_set->getNodes})
  63         105  
456             {
457 67         109 $this->addNode($node);
458             }
459             }
460              
461              
462              
463              
464             sub print
465             {
466 0     0 1 0 my ($this,$words_a,$fh) = @_;
467 0 0       0 if(scalar @{$this->getNodes} != 0)
  0         0  
468             {
469 0 0       0 if(defined $fh)
470             {
471 0 0       0 if(defined $this->getRoot)
472             {
473 0         0 print $fh "ROOT_NODE :" . $this->getRoot->getID . "\n";
474             }
475             else
476             {
477 0         0 print $fh "ROOT_NODE :NO ROOT NODE\n";
478             }
479 0         0 print $fh "NODES : \n";
480 0         0 $this->getRoot->printRecursively($words_a,$fh);
481             }
482             else
483             {
484 0 0       0 if(defined $this->getRoot)
485             {
486 0         0 print "ROOT_NODE :" . $this->getRoot->getID . "\n";
487             }
488             else
489             {
490 0         0 print "ROOT_NODE :NO ROOT NODE\n";
491             }
492 0         0 print "NODES : \n";
493 0         0 $this->getRoot->printRecursively($words_a);
494             }
495             }
496             else
497             {
498 0 0       0 if(defined $fh)
499             {
500 0         0 print $fh "NodeSet is empty\n";
501             }
502             else
503             {
504 0         0 print "NodeSet is empty\n";
505             }
506             }
507             }
508              
509              
510             sub printAllNodes
511             {
512 0     0 1 0 my ($this,$words_a,$fh) = @_;
513 0         0 my $node;
514 0 0       0 if(!defined $fh)
515             {
516 0         0 $fh = \*STDERR;
517             }
518 0 0       0 if(defined $this->getRoot)
519             {
520 0         0 print $fh "ROOT_NODE :" . $this->getRoot->getID . "\n";
521             }
522             else
523             {
524 0         0 print $fh "ROOT_NODE :NO ROOT NODE\n";
525             }
526 0         0 print $fh "NODES : \n";
527              
528 0         0 foreach $node (@{$this->getNodes})
  0         0  
529             {
530 0         0 $node->printSimple($words_a,$fh);
531             }
532 0         0 print $fh "\n";
533             }
534              
535              
536             sub printParenthesised
537             {
538 45     45 1 61 my ($this,$words_a,$fh) = @_;
539 45         56 my $analysis = "";
540              
541             # print STDERR $this->getRoot;
542 45 50       71 if(defined $fh)
543             {
544 45         66 $this->getRoot->buildParenthesised(\$analysis,$words_a);
545 45         209 print $fh $analysis . "\n";
546             }
547             else
548             {
549 0         0 $this->getRoot->buildParenthesised(\$analysis,$words_a);
550 0         0 print $analysis . "\n";
551             }
552             }
553              
554             sub searchRootNodeForLeaf
555             {
556 61     61 1 100 my ($this,$index) = @_;
557 61         145 my ($node,$place) = $this->getNodeWithPivot($index);
558 61 50       125 if (defined $node) {
559 61         157 return $node->searchRoot;
560             } else {
561 0           return ;
562             }
563             }
564              
565             sub fillIndexSet
566             {
567 0     0 1   my ($this,$index_set) = @_;
568 0           my $node;
569            
570 0           foreach $node (@{$this->getNodes})
  0            
571             {
572 0 0 0       if ((blessed($node)) && ($node->isa('Lingua::YaTeA::RootNode')))
573             {
574 0           $node->fillIndexSet($index_set);
575             }
576             }
577 0           $index_set->removeDoubles;
578             }
579              
580             sub searchHeads
581             {
582 0     0 1   my ($this,$words_a) = @_;
583 0           my %heads;
584             my $root;
585 0           my $root_head;
586 0           my $free_nodes_a = $this->searchFreeNodes($words_a);
587              
588 0           foreach $root (@$free_nodes_a)
589             {
590 0           $root_head = $root->searchHead(0);
591 0 0 0       if ((defined $root_head)&&((blessed($root_head)) && ($root_head->isa('Lingua::YaTeA::TermLeaf')))) {
      0        
592 0           $heads{$root_head->getIndex}++;
593             }
594             }
595 0           return \%heads;
596             }
597              
598             1;
599              
600             __END__