This is an automated email from the git hooks/post-receive script. lkajan pushed a commit to branch master in repository libfreecontact-perl.
commit c8d248ab4956762db7732a59f5c2b3e316db0395 Author: Laszlo Kajan <[email protected]> Date: Mon Jun 17 16:30:13 2013 +0200 Imported Upstream version 0.06 --- Changes | 3 +++ FreeContact.xs | 3 +-- FreeContact.xsp | 72 +++++++++++++++++++++++++++++++++++++++++++++++----- META.yml | 2 +- lib/FreeContact.pm | 59 ++++++++++++++++++++++++++++++++++++------ t/01FreeContact.t | 2 +- t/02test.t | 23 ++++++++++++++--- typemap | 39 +++++++++++++++++++++++++++- typemap.xsp | 4 +-- 9 files changed, 181 insertions(+), 26 deletions(-) diff --git a/Changes b/Changes index 3ab1006..bafb435 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for Perl extension FreeContact. +0.06 Sun Jun 16 00:36:16 CEST 2013 + - New method get_seq_weights() for obtaining sequence weight vector and total weight of alignment. + 0.05 Fri Jun 7 21:24:38 CEST 2013 - New libfreecontact - added timout argument. diff --git a/FreeContact.xs b/FreeContact.xs index 54966d7..09fa024 100644 --- a/FreeContact.xs +++ b/FreeContact.xs @@ -17,6 +17,7 @@ extern "C" { using namespace freecontact; typedef freecontact::predictor::cont_res_t cont_res_t; typedef freecontact::predictor::time_res_t time_res_t; +typedef freecontact::predictor::freq_vec_t freq_vec_t; #define _XPUSHS_GET_PS(__ps) \ XPUSHs(sv_2mortal(newSVpvn("clustpc", 7)));\ @@ -41,8 +42,6 @@ typedef freecontact::predictor::time_res_t time_res_t; XPUSHs(sv_2mortal(newSViv((__ps).cov20)));\ XPUSHs(sv_2mortal(newSVpvn("gap_incovm", 10)));\ XPUSHs(sv_2mortal(newSViv((__ps).gap_incovm)));\ - XPUSHs(sv_2mortal(newSVpvn("veczw", 5)));\ - XPUSHs(sv_2mortal(newSViv((__ps).veczw)));\ XPUSHs(sv_2mortal(newSVpvn("rho", 3)));\ XPUSHs(sv_2mortal(newSVnv((__ps).rho))); diff --git a/FreeContact.xsp b/FreeContact.xsp index 76bf990..6c7e5ad 100644 --- a/FreeContact.xsp +++ b/FreeContact.xsp @@ -31,20 +31,49 @@ get_ps_psicov_sd() %name{_new} predictor(bool __dbg = false); ~predictor(); +/* void get_seq_weights( + freq_vec_t& __aliw, double& __wtot, + ali_t& __ali, double __clustpc, + bool __veczw = true, int __num_threads = 0 + );*/ + +%{ +void +predictor::_get_seq_weights( freq_vec_t* __aliw, double* __wtot, ali_t& __ali, double __clustpc, bool __veczw = true, int __num_threads = 0 ) + PREINIT: + freq_vec_t aliw; + double wtot; + CODE: + __aliw = &aliw; __wtot = &wtot; + try { + THIS->get_seq_weights( *( __aliw ), *( __wtot ), __ali, __clustpc, __veczw, __num_threads ); + } + catch (std::exception& e) { + croak("Caught C++ exception of type or derived from 'std::exception': %s", e.what()); + } + catch (...) { + croak("Caught C++ exception of unknown type"); + } + OUTPUT: + __aliw + __wtot +%} + // lkajan: I apparently can not use this to add an INIT: block to the XS -/* cont_res_t _run( ali_t& __ali, double __cp, double __dens, double __gapth, U16 __mincontsep, +/* cont_res_t run( ali_t& __ali, double __cp, + double __density, double __gapth, U16 __mincontsep, double __pseudocnt, double __pscnt_weight, bool __estimate_ivcov, double __shrink_lambda, - bool __cov20, bool __gap_incovm, bool __vecw, double __rho, - int __num_threads = 0, time_res_t *__timing = NULL + bool __cov20, bool __gap_incovm, double __rho, + bool __veczw = true, int __num_threads = 0, time_res_t *__timing = NULL );*/ }; %{ cont_res_t -predictor::_run( __ali, __cp, __dens, __gapth, __mincontsep, __pseudocnt, __pscnt_weight, __estimate_ivcov, __shrink_lambda, __cov20, __gap_incovm, __vecw, __rho, __num_threads = 0, __icme_timeout = 1800, __timing = NULL ) +predictor::_run( __ali, __cp, __density, __gapth, __mincontsep, __pseudocnt, __pscnt_weight, __estimate_ivcov, __shrink_lambda, __cov20, __gap_incovm, __rho, __veczw = true, __num_threads = 0, __icme_timeout = 1800, __timing = NULL ) ali_t& __ali double __cp - double __dens + double __density double __gapth U16 __mincontsep double __pseudocnt @@ -53,8 +82,8 @@ predictor::_run( __ali, __cp, __dens, __gapth, __mincontsep, __pseudocnt, __pscn double __shrink_lambda bool __cov20 bool __gap_incovm - bool __vecw double __rho + bool __veczw int __num_threads time_t __icme_timeout time_res_t* __timing @@ -63,7 +92,36 @@ predictor::_run( __ali, __cp, __dens, __gapth, __mincontsep, __pseudocnt, __pscn CODE: try { if(items>=17 && SvROK(ST(16)) && SvTYPE(SvRV(ST(16))) == SVt_PVHV) __timing = &timing; - RETVAL = THIS->run( __ali, __cp, __dens, __gapth, __mincontsep, __pseudocnt, __pscnt_weight, __estimate_ivcov, __shrink_lambda, __cov20, __gap_incovm, __vecw, __rho, __num_threads, __icme_timeout, __timing ); + RETVAL = THIS->run( __ali, __cp, __density, __gapth, __mincontsep, __pseudocnt, __pscnt_weight, __estimate_ivcov, __shrink_lambda, __cov20, __gap_incovm, __rho, __veczw, __num_threads, __icme_timeout, __timing ); + } + catch (freecontact::icme_timeout_error& e) + { + croak("Caught FreeContact timeout exception: %s", e.what()); + } + catch (std::exception& e) { + croak("Caught C++ exception of type or derived from 'std::exception': %s", e.what()); + } + catch (...) { + croak("Caught C++ exception of unknown type"); + } + OUTPUT: + __timing + RETVAL +%} + +%{ +cont_res_t +predictor::_run_with_seq_weights(ali_t& __ali, freq_vec_t &__aliw, double __wtot, double __density, double __gapth, U16 __mincontsep, double __pseudocnt, double __pscnt_weight, bool __estimate_ivcov, double __shrink_lambda, bool __cov20, bool __gap_incovm, double __rho, int __num_threads = 0, time_t __icme_timeout = 1800, time_res_t *__timing = NULL) + PREINIT: + time_res_t timing; + CODE: + try { + if(items>=17 && SvROK(ST(16)) && SvTYPE(SvRV(ST(16))) == SVt_PVHV) __timing = &timing; + RETVAL = THIS->run( __ali, __aliw, __wtot, + __density, __gapth, __mincontsep, + __pseudocnt, __pscnt_weight, __estimate_ivcov, __shrink_lambda, + __cov20, __gap_incovm, __rho, + __num_threads, __icme_timeout, __timing ); } catch (freecontact::icme_timeout_error& e) { diff --git a/META.yml b/META.yml index 48f94f2..a0bea3e 100644 --- a/META.yml +++ b/META.yml @@ -1,6 +1,6 @@ --- #YAML:1.0 name: FreeContact -version: 0.05 +version: 0.06 abstract: fast protein contact predictor author: - Laszlo Kajan <[email protected]> diff --git a/lib/FreeContact.pm b/lib/FreeContact.pm index c5ec6c2..8447299 100644 --- a/lib/FreeContact.pm +++ b/lib/FreeContact.pm @@ -35,7 +35,7 @@ our @EXPORT = qw( ); -our $VERSION = '0.05'; +our $VERSION = '0.06'; require XSLoader; XSLoader::load('FreeContact', $VERSION); @@ -51,16 +51,42 @@ sub FreeContact::Predictor::new ); } +sub FreeContact::Predictor::get_seq_weights +{ + my $self = shift(@_); + if(scalar(@_)%2){ confess("Odd number of arguments"); } + my %args = (get_ps_evfold(), @_); + my ($aliw, $wtot); + $self->_get_seq_weights($aliw, $wtot, + $args{ali}, $args{clustpc}, + defined($args{veczw}) ? $args{veczw} : 1, $args{num_threads} || 0 + ); + return ($aliw, $wtot); +} + sub FreeContact::Predictor::run { my $self = shift(@_); if(scalar(@_)%2){ confess("Odd number of arguments"); } my %args = (get_ps_evfold(), @_); - return $self->_run($args{ali}, - $args{clustpc}, $args{density}, $args{gapth}, $args{mincontsep}, + return $self->_run($args{ali}, $args{clustpc}, + $args{density}, $args{gapth}, $args{mincontsep}, + $args{pseudocnt}, $args{pscnt_weight}, $args{estimate_ivcov}, $args{shrink_lambda}, + $args{cov20}, $args{gap_incovm}, $args{rho}, + defined($args{veczw}) ? $args{veczw} : 1, $args{num_threads} || 0, defined($args{icme_timeout}) ? $args{icme_timeout} : 1800, $args{timing} + ); +} + +sub FreeContact::Predictor::run_with_seq_weights +{ + my $self = shift(@_); + if(scalar(@_)%2){ confess("Odd number of arguments"); } + my %args = (get_ps_evfold(), @_); + return $self->_run_with_seq_weights($args{ali}, $args{aliw}, $args{wtot}, + $args{density}, $args{gapth}, $args{mincontsep}, $args{pseudocnt}, $args{pscnt_weight}, $args{estimate_ivcov}, $args{shrink_lambda}, - $args{cov20}, $args{gap_incovm}, $args{veczw}, $args{rho}, - $args{num_threads} || 0, $args{icme_timeout} || 1800, $args{timing} + $args{cov20}, $args{gap_incovm}, $args{rho}, + $args{num_threads} || 0, defined($args{icme_timeout}) ? $args{icme_timeout} : 1800, $args{timing} ); } @@ -85,7 +111,11 @@ FreeContact - fast protein contact predictor my $predictor = FreeContact::Predictor->new(); my %parset = FreeContact::get_ps_evfold(); - my $contacts = $predictor->run(ali => \@aln, %parset, num_threads => 1 ); + my $contacts = $predictor->run(ali => \@aln, %parset, num_threads => 1); + + my $predictor = FreeContact::Predictor->new(); + my($aliw, $wtot) = $predictor->get_seq_weights(ali => \@aln, num_threads => 1); + my $contacts = $predictor->run_with_seq_weights(ali => \@aln, aliw => $aliw, wtot => $wtot, num_threads => 1); =head1 DESCRIPTION @@ -114,12 +144,19 @@ can be used to generate the alignments, for example. =item get_ps_evfold() +Get parameters for EVfold-mfDCA operating mode. + =item get_ps_psicov() +Get parameters for PSICOV (best performance) operating mode. + =item get_ps_psicov_sd() -These functions return a hash of arguments (clustpc => I<num>,...,rho => I<num>) that can be used -with run(). The arguments correspond to the published parametrization of the +Get parameters for PSICOV 'sensible default' operating mode. This is much faster than PSICOV for a +slight loss of precision. + +These get_ps_() functions return a hash of arguments (clustpc => I<num>,...,rho => I<num>) that can be used +with get_seq_weights(), run() or run_with_seq_weights(). The arguments correspond to the published parametrization of the respective method. =back @@ -140,6 +177,10 @@ Creates an "FreeContact::Predictor". =over +=item get_seq_weights() TODO + +Defaults for the arguments are obtained with get_ps_evfold(). + =item run( ali => I<[]>, clustpc => dbl, density => dbl, gapth => dbl, mincontsep => uint, pseudocnt => dbl, pscnt_weight => dbl, estimate_ivcov => bool, shrink_lambda => dbl, cov20 => bool, gap_incovm => bool, veczw => bool, rho => dbl, @@ -198,6 +239,8 @@ run() returns a hash reference of contact prediction results: l1norm => ... } +'fro' scores are recommended in EVfold + =back =head1 AUTHOR diff --git a/t/01FreeContact.t b/t/01FreeContact.t index 4d365c6..f9e76c0 100644 --- a/t/01FreeContact.t +++ b/t/01FreeContact.t @@ -15,6 +15,6 @@ BEGIN { use_ok('FreeContact') }; { can_ok('FreeContact', qw(get_ps_evfold get_ps_psicov get_ps_psicov_sd)); - can_ok('FreeContact::Predictor', qw(new _run run)); + can_ok('FreeContact::Predictor', qw(new _get_seq_weights get_seq_weights _run run)); } # vim:et:ts=4:ai: diff --git a/t/02test.t b/t/02test.t index 13b3f17..f99063e 100644 --- a/t/02test.t +++ b/t/02test.t @@ -2,14 +2,13 @@ use strict; use warnings; use Scalar::Util 'reftype'; -use Test::More tests => 8; +use Test::More tests => 10; BEGIN { use_ok('FreeContact') }; # /usr/share/doc/libextutils-xspp-perl/examples/Object-WithIntAndString/t/02test.t sub check_obj { my $o = shift; - isa_ok($o, 'FreeContact::Predictor' ); - can_ok($o, qw(new run _run) ); + isa_ok($o, 'FreeContact::Predictor'); } { @@ -30,8 +29,12 @@ sub check_obj { my $res = FreeContact::Predictor->new(dbg => 1)->run(ali => \@aln, num_threads => $num_threads, timing => $timing); + my $evfold_24_42 = 0.0129471030086279; # 0-based indices + is(reftype($res), 'HASH'); - ok(($res->{fro}->[126+125]->[2]-8.08998)/8.08998 < 1e-6, 'precision test'); # [ 2, 3, 8.08998+- ] + + #use Data::Dumper; warn(Dumper($res)); + ok(abs($res->{fro}->[2741]->[2]-$evfold_24_42)/$evfold_24_42 < 1e-6, 'precision test'); # 25 K 43 N 0.230969 0.0129471 ok($timing->{num_threads} == $num_threads, "timing results test"); #use Data::Dumper; warn(Dumper($timing)); @@ -41,6 +44,18 @@ sub check_obj { $res = FreeContact::Predictor->new(dbg => 1)->run(%test_parset, ali => \@aln, num_threads => $num_threads, icme_timeout => 2, timing => $timing); }; like($@, qr/^Caught FreeContact timeout exception:/); + + # aliw+wtot start test + { + my($aliw, $wtot) = FreeContact::Predictor->new(dbg => 1)->get_seq_weights(ali => \@aln, num_threads => $num_threads); + #use Data::Dumper; warn(Dumper($aliw, \$wtot)); + is(@$aliw, 1000); + ok(abs($wtot-620.777)/620.777 < 1e-6, 'wtot test'); + + my $res = FreeContact::Predictor->new(dbg => 1)->run_with_seq_weights(ali => \@aln, aliw => $aliw, wtot => $wtot, num_threads => $num_threads, timing => $timing); +warn($res->{fro}->[2741]->[2]); + ok(abs($res->{fro}->[2741]->[2]-$evfold_24_42)/$evfold_24_42 < 1e-6, 'wtot precision test'); # [ 2, 3, 8.08998+- ] + } } # vim:et:ts=4:ai: diff --git a/typemap b/typemap index a0cef51..3c814c6 100644 --- a/typemap +++ b/typemap @@ -6,9 +6,11 @@ # Example: /usr/share/perl/5.10.1/ExtUtils/typemap perlobject.map TYPEMAP cont_res_t T_CONT_RES +double* T_DOUBLE_PTR +freq_vec_t T_FREQ_VEC +freq_vec_t* T_FREQ_VEC_PTR predictor* O_OBJECT ali_t T_ALI -std::string T_PV time_res_t* T_TIME_RES_PTR INPUT @@ -50,6 +52,29 @@ T_ALI } else croak(\"${Package}::$func_name() -- $var is not an AV reference\"); } +T_DOUBLE_PTR +T_FREQ_VEC + { + if(SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV) + { + // form vector out of $arg = [ 1, 0.9, 0.7, ... ] + AV *arr = (AV*)SvRV($arg); + I32 wcnt = av_len(arr)+1; // av_len returns highest index + if(wcnt > 0) + { + $var = $type(wcnt); + for(I32 k = 0; k < wcnt; ++k) + { + SV** svptr = av_fetch(arr, k, false); + if(svptr != NULL && SvNIOK(*svptr)) + ($var)[k] = SvNV(*svptr); + else croak(\"${Package}::$func_name() -- $var\[%d\] is not a number\", k); + } + } + } + else croak(\"${Package}::$func_name() -- $var is not an AV reference\"); + } +T_FREQ_VEC_PTR T_TIME_RES_PTR OUTPUT @@ -80,6 +105,18 @@ T_CONT_RES sv_setsv($arg, newRV((SV*)res)); } +T_DOUBLE_PTR + sv_setnv($arg, (double)*$var); +T_FREQ_VEC_PTR + { + // return [ 1, 0.9, 0.7, ... ] + AV* res = (AV*)sv_2mortal((SV*)newAV()); av_extend(res, $var->size()-1); // extend to index + + for(freq_vec_t::const_iterator fv_i = $var->begin(), fv_e = $var->end(); fv_i != fv_e; ++fv_i) + av_push(res, newSVnv(*fv_i)); + + sv_setsv($arg, newRV((SV*)res)); + } T_TIME_RES_PTR if($var && SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) { diff --git a/typemap.xsp b/typemap.xsp index ba8e849..eb7ebfe 100644 --- a/typemap.xsp +++ b/typemap.xsp @@ -8,11 +8,11 @@ %typemap{parset_t}{simple}; %typemap{predictor*}{simple}; %typemap{ali_t&}{simple}; -%typemap{double}{simple}; +%typemap{double}; %typemap{U16}{simple}; %typemap{bool}{simple}; %typemap{std::map}{simple}; -%typemap{std::string}{simple}; +%typemap{freq_vec_t}; %typemap{time_res_t*}{simple}; // vim:noet:syntax=cpp:ts=4: -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/libfreecontact-perl.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
