[Bioperl-l] Unwise elimination of nodes inB:T:Node::remove_Descendent?

Mark A. Jensen maj at fortinbras.us
Fri Feb 6 14:59:16 UTC 2009


> I suppose the best way to deal with some of these questions (and  ensure 
> Node/Tree is acting as expected) is to come up with several  vetted test cases 
> indicating what we expect the proper behavior to be  for remove_Descendant(), 
> contract_linear_paths(), and any other  problematic Node/Tree/TreeFunctionI 
> methods.  In fact, I highly  recommend any code changes like this add tests to 
> the test suite  demonstrating the issue.

I can work the example of the thread into a test, adding some
of the points brought in by Hilmar-

>
> Possibly related to all this is a fairly significant lingering bug  dealing 
> with Bio::Tree::TreeFunctionsI::reroot() 
> (http://bugzilla.open-bio.org/show_bug.cgi?id=2456 ).  Any takers?

I take this one, if I have those privileges ( it is a privilege to serve, isn't 
it?)...

>
> chris
MAJ
----- Original Message ----- 
From: "Chris Fields" <cjfields at illinois.edu>
To: "Hilmar Lapp" <hlapp at gmx.net>
Cc: <bioperl-l at lists.open-bio.org>; "Mark A. Jensen" <maj at fortinbras.us>
Sent: Friday, February 06, 2009 9:46 AM
Subject: Re: [Bioperl-l] Unwise elimination of nodes 
inB:T:Node::remove_Descendent?


>
> On Feb 6, 2009, at 8:21 AM, Hilmar Lapp wrote:
>
>>
>> On Feb 6, 2009, at 12:49 AM, Mark A. Jensen wrote:
>>
>>> A   B   C   D   E
>>> |5  |5  |4  |4  |
>>> \   /   \   /   /
>>> x       y    /
>>> |2      |1  /
>>> \       /  /
>>>  \    _/  / 10
>>>   \  /   /
>>>    z    /
>>>    |3  /
>>>     \ /
>>>     ROOT
>>>
>>>> [...]
>>>> __DATA__
>>>> (((A:5,B:5)x:2,(C:4,D:4)y:1)z:3,E:10);
>>>> [...]
>>>
>>> The first problem was that the "complementary approaches" didn't give
>>> the same answer, and one threw an error. This is the bug in the
>>> code above. If you look at the tree, the nodes he really wants to  keep are
>>> the leaves [A,B,E], *plus* the internal nodes [x,y,z]; that is...
>>>
>>> $tree->splice(-keep_id=>[A,B,E,x,'y',z])
>>> $tree->total_branch_length
>>>
>>> doesn't throw and returns 25, which is correct.
>>
>> If you replace 'y' with the root in the above, yes. Otherwise no.
>>
>>> The second problem is that removing [C, D] also gives him 25, which  is
>>> what he wanted, but is not correct.
>>
>> Correct.
>>
>>> [...]The problem arises in this code at the end of remove_Descendent:
>>>
>>> # remove unecessary nodes if we have removed the part |||Node.pm  LINE 272
>>> # which branches.
>>>   my $a1 = $self->ancestor;
>>>   if( $a1 ) {
>>>       my $bl = $self->branch_length || 0;
>>>       my @d = $self->each_Descendent;
>>>       if (scalar @d == 1) {
>>>    $d[0]->branch_length($bl + ($d[0]->branch_length || 0));
>>>    $a1->add_Descendent($d[0]);
>>>    $a1->remove_Descendent($self);
>>>       }
>>>   }
>>>
>>> When node C is removed from the example tree, the node 'y' is removed
>>> by this code apparently as a convenience.
>>
>> I guess I'm confused by the above code snippet. If @d are the  descendants of 
>> $a1, then I don't understand what the purpose of  adding $d[0] as a 
>> descendant of $a1 is (after altering its branch  length). Furthermore, if $a1 
>> is the ancestor of $self, and $a1 has  only one descendant, wouldn't that 
>> mean that $d[0] == $self?
>>
>> What am I missing?
>>
>> I also think it's a bad idea to simplify the tree (or collapse  internal 
>> nodes of degree 1) as an implicit operation. It should be  explicit (and I 
>> believe there is a method simplify() or something  similar, isn't there? Ah - 
>> I see you quote contract_linear_paths()).
>>
>> Furthermore, I think it's also a bad idea to remove descendant leaf  nodes if 
>> you remove an internal node. What if you really just wanted  to remove the 
>> internal node because, for example, its branching  point isn't well 
>> supported? So removing node 'y' should make z a  node of degree 3, but not 
>> remove C and D unless you ask to remove  the subtree beginning at 'y'.
>>
>> -hilmar
>
> I suppose the best way to deal with some of these questions (and  ensure 
> Node/Tree is acting as expected) is to come up with several  vetted test cases 
> indicating what we expect the proper behavior to be  for remove_Descendant(), 
> contract_linear_paths(), and any other  problematic Node/Tree/TreeFunctionI 
> methods.  In fact, I highly  recommend any code changes like this add tests to 
> the test suite  demonstrating the issue.
>
> Possibly related to all this is a fairly significant lingering bug  dealing 
> with Bio::Tree::TreeFunctionsI::reroot() 
> (http://bugzilla.open-bio.org/show_bug.cgi?id=2456 ).  Any takers?
>
> chris
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l at lists.open-bio.org
> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>
> 




More information about the Bioperl-l mailing list