package Lingua::Align::LinkSearch::GreedyFinalAnd; # # do some base alignment and then greedily add links between nodes # that are not aligned yet (without wellformedness check!) # use 5.005; use strict; use vars qw($VERSION @ISA); @ISA = qw(Lingua::Align::LinkSearch::GreedyFinal); $VERSION = '0.01'; use Lingua::Align::LinkSearch; sub new{ my $class=shift; my %attr=@_; my $self={}; bless $self,$class; foreach (keys %attr){ $self->{$_}=$attr{$_}; } my $BaseSearch = $attr{-link_search} || 'greedy_final_and'; $BaseSearch =~s/\_?[Aa]nd//; $attr{-link_search} = $BaseSearch; $self->{BASESEARCH} = new Lingua::Align::LinkSearch(%attr); # for tree manipulation $self->{TREES} = new Lingua::Align::Corpus::Treebank(); return $self; } sub search{ my $self=shift; my ($linksST,$scores,$min_score, $src,$trg, $stree,$ttree,$linksTS)=@_; if (ref($linksTS) ne 'HASH'){$linksTS={};} # first do the base search algorithm $self->{BASESEARCH}->search($linksST,$scores,$min_score, $src,$trg, $stree,$ttree,$linksTS); foreach my $n (sort {$$scores[$b] <=> $$scores[$a]} (0..$#{$scores})){ last if ($$scores[$n] < $min_score); next if (exists $$linksST{$$src[$n]}); next if (exists $$linksTS{$$trg[$n]}); # print STDERR "final_and: add link between $$src[$n] & $$trg[$n]\n"; $$linksST{$$src[$n]}{$$trg[$n]}=$$scores[$n]; $$linksTS{$$trg[$n]}{$$src[$n]}=$$scores[$n]; } $self->remove_already_linked($linksST,$linksTS,$scores,$src,$trg); return 1; } 1;