Bio-SeqAlignment-Components-SeqMapping

 view release on metacpan or  search on metacpan

lib/Bio/SeqAlignment/Components/SeqMapping/Dataflow/LinearLinear.pm  view on Meta::CPAN


package Bio::SeqAlignment::Components::SeqMapping::Dataflow::LinearLinear;
$Bio::SeqAlignment::Components::SeqMapping::Dataflow::LinearLinear::VERSION = '0.03';
use strict;
use warnings;

use Moose::Role;
use Carp;
use MCE;
use MCE::Candy;
use namespace::autoclean;

requires 'seq_align';          ## the method that does (pseudo)alignment
requires 'extract_sim_metric'; ## extract the similarity metric from the search
requires 'reduce_sim_metric';  ## reduce the similarity metric to a single value
requires 'cleanup';

sub sim_seq_search {

    my ( $self, $workload, %args ) = @_;

    croak 'expect an array(ref) as workload' unless ref $workload eq 'ARRAY';

    my $max_workers = $args{max_workers}
      // 1;    # set default value if not defined
    my $chunk_size = $args{chunk_size} // 1;  # set default value if not defined
    my $cleanup    = $args{cleanup}    // 1;  # set default value if not defined
    my @results;

    if ( $max_workers == 1 ) {
        foreach my $chunk ( @{$workload} ) {
            my $seq_align      = $self->seq_align($chunk);
            my $sim_metric     = $self->extract_sim_metric($seq_align);
            my $reduced_metric = $self->reduce_sim_metric($sim_metric);
            push @results, $reduced_metric;
            $self->cleanup( $seq_align, $sim_metric, $reduced_metric )
              if $cleanup;
        }
        return \@results;
    }
    else {
        my $mce = MCE->new(
            max_workers => $max_workers,
            chunk_size  => $chunk_size,
            gather      => MCE::Candy::out_iter_array( \@results ),
            posix_exit  => 1,
            user_func   => sub {
                my ( $mce, $chunk_ref, $chunk_id ) = @_;
                foreach my $chunk ( @{$chunk_ref} ) {
                    my $seq_align  = $self->seq_align($chunk);
                    my $sim_metric = $self->extract_sim_metric($seq_align);
                    my $reduced_metric =
                      $self->reduce_sim_metric($sim_metric);
                    push @results, $reduced_metric;
                    $self->cleanup( $seq_align, $sim_metric, $reduced_metric )
                      if $cleanup;
                }
                $mce->gather( $chunk_id, @results );
            }
        );
        $mce->process($workload);
        $mce->shutdown();
    }
    return \@results;
}


1;

=head1 NAME



( run in 0.947 second using v1.01-cache-2.11-cpan-39bf76dae61 )