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

Mark A. Jensen maj at fortinbras.us
Fri Feb 6 09:34:03 EST 2009


Hilmar--

>> doesn't throw and returns 25, which is correct.
>
> If you replace 'y' with the root in the above, yes. Otherwise no.
>
Absolutely-- up the thread you'll see the late-night correction-

> 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?

Yes-- this snippet is actually what was present in remove_Descendent,
and what I proposed to delete -- sorry if that was confusing.
The commit was simply the deletion of this snippet.

> 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'.

Absolutely. Node deletion and pruning must be different
operations. I'm new to the code, but Sendu's splice() seems to
take care only to snip out requested nodes. It was the goodness
in splice() that sent me to remove_Descendent()

thanks!
MAJ


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


>
> 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
> -- 
> ===========================================================
> : Hilmar Lapp  -:-  Durham, NC  -:-  hlapp at gmx dot net :
> ===========================================================
>
>
>
> _______________________________________________
> 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