symmetric_difference() returning 0 on different trees?

19 views
Skip to first unread message

Ruth Davidson

unread,
Oct 6, 2014, 1:52:49 PM10/6/14
to dendrop...@googlegroups.com
Dear Jeet:

I have been having issues that I thought originated with taxon names but now I am not sure.  I have a function that takes as input a list of gene trees and a list of taxon names that are subset of the taxon set of the gene trees, get_dist.  get_dist also takes as input dist_counter, a pair of lists initialized as a list of the 15 possible 5-leaf labeled unrooted tree topologies, and a list of 15 zeroes. the function get_dist (wants to return) the list of 5-element trees and the list of counts for how many of the gene trees match each 5-taxon tree when restricted to that leaf set.  The function get_dist only works, so far, when I run it using the first five labels from the list of labels from my species tree. Otherwise, it is returning a report that calling retain_taxa_with_labels on a list of 5 labels makes a tree with symmetric_distance zero from all 15 trees in my list of 5-leaf labeled tree topologies.  

I thought this was due to underscores, but I removed those from taxon names, and when I test on lists of taxa that have no underscores that are not the first 5 in the list I still get the same problem.  

These functions are part of my module InvariantScores.py. I include the code for the functions and then the problem outputs:  A[0] shows it works as intended, finding a match for all 424 of my gene trees, and and then B[0] shows it totally fails.  I am sure to initiate same taxon_set for all objects.  

def dist_counter(l,listofgenetrees):

    M = listofgenetrees.taxon_set

    t1 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[1]+'),' +l[2]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t2 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[1]+'),' +l[3]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t3 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[1]+'),' +l[4]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick', taxon_set = M)

    t4 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[2]+'),' +l[1]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t5 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[2]+'),' +l[3]+ ',(' +l[1]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t6 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[2]+'),' +l[4]+ ',(' +l[1]+ ',' +l[3]+ '))', schema = 'newick', taxon_set = M)

    t7 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[3]+'),' +l[1]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t8 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[3]+'),' +l[2]+ ',(' +l[1]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t9 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[3]+'),' +l[4]+ ',(' +l[1]+ ',' +l[2]+ '))', schema = 'newick', taxon_set = M)

    t10 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[4]+'),' +l[1]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick', taxon_set = M)

    t11 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[4]+'),' +l[2]+ ',(' +l[1]+ ',' +l[3]+ '))', schema = 'newick', taxon_set = M)

    t12 = dendropy.Tree.get_from_string('((' +l[0]+ ',' +l[4]+'),' +l[3]+ ',(' +l[1]+ ',' +l[2]+ '))', schema = 'newick', taxon_set = M)

    t13 = dendropy.Tree.get_from_string('((' +l[1]+ ',' +l[2]+'),' +l[0]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t14 = dendropy.Tree.get_from_string('((' +l[1]+ ',' +l[3]+'),' +l[0]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick', taxon_set = M)

    t15 = dendropy.Tree.get_from_string('((' +l[1]+ ',' +l[4]+'),' +l[0]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick', taxon_set = M)

    counter1 = [t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15]

    counter2 = [0 for i in range(15)]

    return [counter1, counter2]


# I should merge this next with dist_counter after I test them both

def get_dist(l,treelist):

    #treelist = dendropy.TreeList(inputtreelist)

    dist = dist_counter(l, treelist)

    #pp.pprint(dist)

    viztrees = [dist[0][k].as_string("newick") for k in range(15)]

    print viztrees

    garbage = []

    for i in range(len(treelist)):

        smalltree = dendropy.Tree(treelist[i])

        smalltree.retain_taxa_with_labels(l)

        smalltree.update_splits()

        trace = [dendropy.treecalc.symmetric_difference(smalltree,dist[0][j]) for j in range(15)]

        if trace.count(0) > 1:

            garbage.append(['error: too many zeroes', smalltree.as_string("newick"), smalltree,  treelist[i], trace])

        elif 0 in trace:

            dist[1][trace.index(0)] = dist[1][trace.index(0)] + 1

        else:

            garbage.append([smalltree.as_newick_string(), treelist[i].as_newick_string(), min(trace)])

    return [dist, garbage]



>>> import dendropy

>>> import InvariantScores

>>> treelist = dendropy.TreeList.get_from_path("nardtest_song_mammals.424.gene.tre", "newick")

>>> S = dendropy.Tree.get_from_path("nardtest_song_mammals.species.tre", "newick", taxon_set = treelist.taxon_set)

>>> leaves = [n.get_node_str() for n in S.leaf_iter()]

>>> L = [leaves[i] for i in range(5)]

>>> M = [leaves[i] for i in range(3,8)]

>>> A  = InvariantScores.get_dist(L,treelist)

['[&U] ((Chicken,Platypus),Opossum,(Wallaby,Sloth));\n', '[&U] ((Chicken,Platypus),Wallaby,(Opossum,Sloth));\n', '[&U] ((Chicken,Platypus),Sloth,(Opossum,Wallaby));\n', '[&U] ((Chicken,Opossum),Platypus,(Wallaby,Sloth));\n', '[&U] ((Chicken,Opossum),Wallaby,(Platypus,Sloth));\n', '[&U] ((Chicken,Opossum),Sloth,(Platypus,Wallaby));\n', '[&U] ((Chicken,Wallaby),Platypus,(Opossum,Sloth));\n', '[&U] ((Chicken,Wallaby),Opossum,(Platypus,Sloth));\n', '[&U] ((Chicken,Wallaby),Sloth,(Platypus,Opossum));\n', '[&U] ((Chicken,Sloth),Platypus,(Opossum,Wallaby));\n', '[&U] ((Chicken,Sloth),Opossum,(Platypus,Wallaby));\n', '[&U] ((Chicken,Sloth),Wallaby,(Platypus,Opossum));\n', '[&U] ((Platypus,Opossum),Chicken,(Wallaby,Sloth));\n', '[&U] ((Platypus,Wallaby),Chicken,(Opossum,Sloth));\n', '[&U] ((Platypus,Sloth),Chicken,(Opossum,Wallaby));\n']

>>> A[0]

[[<Tree object at 0x1075e28d0>, <Tree object at 0x1075e2a50>, <Tree object at 0x1075e2f50>, <Tree object at 0x1075e2e50>, <Tree object at 0x1075d93d0>, <Tree object at 0x1075e9bd0>, <Tree object at 0x1075ec110>, <Tree object at 0x1075ec610>, <Tree object at 0x1075ecb10>, <Tree object at 0x1075f0050>, <Tree object at 0x1075ecf10>, <Tree object at 0x1075e9b10>, <Tree object at 0x1075f0a10>, <Tree object at 0x1075f0f10>, <Tree object at 0x1075f4450>], [0, 1, 312, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 59]]

>>> B = InvariantScores.get_dist(M,treelist)

['[&U] ((Wallaby,Sloth),Armadillos,(LesserHedgehogTenrec,Hyrax));\n', '[&U] ((Wallaby,Sloth),LesserHedgehogTenrec,(Armadillos,Hyrax));\n', '[&U] ((Wallaby,Sloth),Hyrax,(Armadillos,LesserHedgehogTenrec));\n', '[&U] ((Wallaby,Armadillos),Sloth,(LesserHedgehogTenrec,Hyrax));\n', '[&U] ((Wallaby,Armadillos),LesserHedgehogTenrec,(Sloth,Hyrax));\n', '[&U] ((Wallaby,Armadillos),Hyrax,(Sloth,LesserHedgehogTenrec));\n', '[&U] ((Wallaby,LesserHedgehogTenrec),Sloth,(Armadillos,Hyrax));\n', '[&U] ((Wallaby,LesserHedgehogTenrec),Armadillos,(Sloth,Hyrax));\n', '[&U] ((Wallaby,LesserHedgehogTenrec),Hyrax,(Sloth,Armadillos));\n', '[&U] ((Wallaby,Hyrax),Sloth,(Armadillos,LesserHedgehogTenrec));\n', '[&U] ((Wallaby,Hyrax),Armadillos,(Sloth,LesserHedgehogTenrec));\n', '[&U] ((Wallaby,Hyrax),LesserHedgehogTenrec,(Sloth,Armadillos));\n', '[&U] ((Sloth,Armadillos),Wallaby,(LesserHedgehogTenrec,Hyrax));\n', '[&U] ((Sloth,LesserHedgehogTenrec),Wallaby,(Armadillos,Hyrax));\n', '[&U] ((Sloth,Hyrax),Wallaby,(Armadillos,LesserHedgehogTenrec));\n']

>>> B[0]

[[<Tree object at 0x107610dd0>, <Tree object at 0x107608d90>, <Tree object at 0x1076ddd50>, <Tree object at 0x1076e1390>, <Tree object at 0x1076eb6d0>, <Tree object at 0x1076ef7d0>, <Tree object at 0x107610950>, <Tree object at 0x1076a5210>, <Tree object at 0x1076cb310>, <Tree object at 0x107629950>, <Tree object at 0x1076db950>, <Tree object at 0x1076fdb90>, <Tree object at 0x1076fd4d0>, <Tree object at 0x1076fdd90>, <Tree object at 0x1076c44d0>], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

>>> L

['Chicken', 'Platypus', 'Opossum', 'Wallaby', 'Sloth']

>>> M

['Wallaby', 'Sloth', 'Armadillos', 'LesserHedgehogTenrec', 'Hyrax']

>>>  
Message has been deleted

Ruth Davidson

unread,
Oct 6, 2014, 1:58:16 PM10/6/14
to dendrop...@googlegroups.com
Also I have a github that has all the code and the files for the test:

https://github.com/redavids/invariant_rooting

Jeet Sukumaran

unread,
Oct 6, 2014, 10:42:57 PM10/6/14
to dendrop...@googlegroups.com
What version of DendroPy are you using?

I cannot replicate the error using 3.12.1 (eeaeb2b) or the nascent 4.x.

Here is the result from running 3.12.1:

############################################
#! /usr/bin/env python
import dendropy
import InvariantScores

treelist =
dendropy.TreeList.get_from_path("nardtest_song_mammals.424.gene.tre",
"newick")
S =
dendropy.Tree.get_from_path("nardtest_song_mammals.species.tre",
"newick", taxon_set = treelist.taxon_set)
leaves = [n.taxon.label for n in S.leaf_iter()]
L = [leaves[i] for i in range(5)]
M = [leaves[i] for i in range(3,8)]
A = InvariantScores.get_dist(L,treelist)
print("A[0] = {}".format(A[0]))
B = InvariantScores.get_dist(M,treelist)
print("\nB[0] = {}".format(B[0]))

A[0] = [[<Tree object at 0x107e6c050>, <Tree object at
0x107e6c1d0>, <Tree object at 0x107e6c6d0>, <Tree object at
0x107e6c9d0>, <Tree object at 0x107e6ced0>, <Tree object at
0x107e6f410>, <Tree object at 0x107e6f910>, <Tree object at
0x107e6fe10>, <Tree object at 0x107e6fcd0>, <Tree object at
0x107e6c910>, <Tree object at 0x107e75910>, <Tree object at
0x107e75e10>, <Tree object at 0x107e79350>, <Tree object at
0x107e79850>, <Tree object at 0x107e79d50>], [0, 1, 312, 0, 0, 0, 0, 0,
0, 52, 0, 0, 0, 0, 59]]

B[0] = [[<Tree object at 0x107efd190>, <Tree object at
0x10849eb10>, <Tree object at 0x107ebebd0>, <Tree object at
0x107ee9a10>, <Tree object at 0x107e8d850>, <Tree object at
0x107ee40d0>, <Tree object at 0x107ed9210>, <Tree object at
0x108905290>, <Tree object at 0x107ed9c10>, <Tree object at
0x1084295d0>, <Tree object at 0x1084c03d0>, <Tree object at
0x108900dd0>, <Tree object at 0x1084b7110>, <Tree object at
0x1084fb910>, <Tree object at 0x1084b7dd0>], [3, 0, 0, 1, 0, 0, 0, 0,
14, 0, 0, 3, 403, 0, 0]]
############################################

Of course, I do not quite know what to expect from B[0], but I am not
seeing an all-0 vector as your run had. Check the results I have above
and see if they fit with what you would expect. If so, check the version
of DendroPy you are running and see if it is 3.12.1. If both of these
are True, report back here and see if we can figure out what else is the
issue.

Incidentally, I do not think that passing around the string labels is
the most efficient or robust way of going about this. Even then,
`get_node_str()` is a debugging function, and should not be used in
production code to get the taxon label. It is faster, simpler, more
efficient, more direct and more correct to simply dereference the taxon
object's labels: `node.taxon.label`. Even better, for this usage, is not
to rely on the string labels but use the `Taxon` object as the 'key' or
'handle'. That is what the 'Taxon' objects were designed for:
consistent, reliable, and stable referencing of operational taxonomic
unit concepts across data objects and files.

Also note that NEWICK-strings are typically semi-colon terminated. The
published standards are ambiguous as to whether or not a NEWICK tree
statement without a terminating semi-colon is in error or not. DendroPy
3 was relaxed about the terminating semi-colon, allowing for its
omissions. However, I have noticed sufficient issues arising from tree
statements (typically pasted in from different source) not being
separated by semi-colons that in DendroPy 4 an error will be raised
unless the keyword argument ``terminating_semicolon_required=False`` is
explicitly passed into the reader.

In any case, none of these issues are the cause of the problem, because,
even with them in place, I get a non-zero vector for B[0] (assuming that
is correct). Of course, the code will not run under DendroPy 4 without
changing 'n.get_node_str()' to 'n.taxon.label' and ensuring that the
newick string generation function adds a semi-colon to the end the
newick strings. But other than that, the problem lies elsewhere.
> --
> You received this message because you are subscribed to the Google
> Groups "DendroPy Users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to dendropy-user...@googlegroups.com
> <mailto:dendropy-user...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout.

--



--------------------------------------
Jeet Sukumaran
--------------------------------------
jeetsu...@gmail.com
--------------------------------------
Blog/Personal Pages:
http://jeetworks.org/
GitHub Repositories:
http://github.com/jeetsukumaran
Photographs (as stream):
http://www.flickr.com/photos/jeetsukumaran/
Photographs (by galleries):
http://www.flickr.com/photos/jeetsukumaran/sets/
--------------------------------------

Ruth Davidson

unread,
Oct 7, 2014, 12:24:12 PM10/7/14
to dendrop...@googlegroups.com
Hi Jeet, thanks for your prompt reply and I really appreciate your running my code on your machine.  Indeed the problem is the zeroes vector.  It is saying essentially the symmetric difference between a pruned tree is zero with all 15 possible tree shapes. I am running dendropy 3.12.0 and Python 2.7.5 (see output)I applied your suggestions about the semicolons and n.taxon.label and the same error is occurring, though as you see I have used a different pair of files. These are available at https://github.com/redavids/invariant_rooting

Macintosh-0026b0d5f8d0:invariant_rooting ruthdavidson$ python

Python 2.7.5 (default, Mar  9 2014, 22:15:05) 

[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import dendropy

>>> dendropy.__version__

'3.12.0'

>>> import InvariantScores

>>> treelist = dendropy.TreeList.get_from_path("true-trees-1X.tre", "newick")

>>> S = dendropy.Tree.get_from_path("species-1X.tre", "newick", taxon_set = treelist.taxon_set)

>>> leaves = [n.taxon.label for n in S.leaf_nodes()]

>>> L = [leaves[i] for i in range(5)]

>>> M = [leaves[m] for m in range(4,9)]

>>> A = InvariantScores.get_dist(L,treelist)

['[&U] ((MON,MAC),ORN,(GAL,ECH));\n', '[&U] ((MON,MAC),GAL,(ORN,ECH));\n', '[&U] ((MON,MAC),ECH,(ORN,GAL));\n', '[&U] ((MON,ORN),MAC,(GAL,ECH));\n', '[&U] ((MON,ORN),GAL,(MAC,ECH));\n', '[&U] ((MON,ORN),ECH,(MAC,GAL));\n', '[&U] ((MON,GAL),MAC,(ORN,ECH));\n', '[&U] ((MON,GAL),ORN,(MAC,ECH));\n', '[&U] ((MON,GAL),ECH,(MAC,ORN));\n', '[&U] ((MON,ECH),MAC,(ORN,GAL));\n', '[&U] ((MON,ECH),ORN,(MAC,GAL));\n', '[&U] ((MON,ECH),GAL,(MAC,ORN));\n', '[&U] ((MAC,ORN),MON,(GAL,ECH));\n', '[&U] ((MAC,GAL),MON,(ORN,ECH));\n', '[&U] ((MAC,ECH),MON,(ORN,GAL));\n']

>>> A[0]

[[<Tree object at 0x1172b97d0>, <Tree object at 0x1172b9cd0>, <Tree object at 0x1172bf2d0>, <Tree object at 0x1172bf890>, <Tree object at 0x1172bfe50>, <Tree object at 0x1172c3450>, <Tree object at 0x1172c3a10>, <Tree object at 0x1172bf350>, <Tree object at 0x1172c34d0>, <Tree object at 0x1172c72d0>, <Tree object at 0x1172c7890>, <Tree object at 0x1172c7e50>, <Tree object at 0x1172cb450>, <Tree object at 0x1172cba10>, <Tree object at 0x1172c3950>], [583, 610, 2608, 0, 19, 4, 3, 16, 0, 49, 21, 29, 5, 3, 50]]

>>> B = InvariantScores.get_dist(M,treelist)

['[&U] ((ECH,PRO),LOX,(CHO,DAS));\n', '[&U] ((ECH,PRO),CHO,(LOX,DAS));\n', '[&U] ((ECH,PRO),DAS,(LOX,CHO));\n', '[&U] ((ECH,LOX),PRO,(CHO,DAS));\n', '[&U] ((ECH,LOX),CHO,(PRO,DAS));\n', '[&U] ((ECH,LOX),DAS,(PRO,CHO));\n', '[&U] ((ECH,CHO),PRO,(LOX,DAS));\n', '[&U] ((ECH,CHO),LOX,(PRO,DAS));\n', '[&U] ((ECH,CHO),DAS,(PRO,LOX));\n', '[&U] ((ECH,DAS),PRO,(LOX,CHO));\n', '[&U] ((ECH,DAS),LOX,(PRO,CHO));\n', '[&U] ((ECH,DAS),CHO,(PRO,LOX));\n', '[&U] ((PRO,LOX),ECH,(CHO,DAS));\n', '[&U] ((PRO,CHO),ECH,(LOX,DAS));\n', '[&U] ((PRO,DAS),ECH,(LOX,CHO));\n']

>>> B[0]

[[<Tree object at 0x117ae9690>, <Tree object at 0x117b04550>, <Tree object at 0x117c1be10>, <Tree object at 0x1179ab990>, <Tree object at 0x117bbeb90>, <Tree object at 0x117927f10>, <Tree object at 0x117cb40d0>, <Tree object at 0x117affb10>, <Tree object at 0x117c921d0>, <Tree object at 0x117cafe50>, <Tree object at 0x117c9b0d0>, <Tree object at 0x117cf4050>, <Tree object at 0x117cafb50>, <Tree object at 0x117c1bed0>, <Tree object at 0x117cc1f50>], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

>>> 

On Monday, October 6, 2014 12:52:49 PM UTC-5, Ruth Davidson wrote:

Jeet Sukumaran

unread,
Oct 7, 2014, 12:42:13 PM10/7/14
to dendrop...@googlegroups.com
Running your modified code (see attached, "t.py") on my machine also
does not return an all-0 vector for B[0], but instead "[171, 0, 0, 208,
0, 0, 0, 0, 0, 0, 0, 2, 3619, 0, 0]" (see attached, "output.txt").

Note that I am running Dendropy 3.12.1, while you are running 3.12.0.
Have you tried running under the former?

-- jeet

#########################

[venv:dendropy3-python2.7][invariant_rooting:master:775cc4c:+U]$ p
t.py
Running: DendroPy 3.12.1
---
['[&U] ((MON,MAC),ORN,(GAL,ECH));\n', '[&U]
((MON,MAC),GAL,(ORN,ECH));\n', '[&U] ((MON,MAC),ECH,(ORN,GAL));\n',
'[&U] ((MON,ORN),MAC,(GAL,ECH));\n', '[&U]
((MON,ORN),GAL,(MAC,ECH));\n', '[&U] ((MON,ORN),ECH,(MAC,GAL));\n',
'[&U] ((MON,GAL),MAC,(ORN,ECH));\n', '[&U]
((MON,GAL),ORN,(MAC,ECH));\n', '[&U] ((MON,GAL),ECH,(MAC,ORN));\n',
'[&U] ((MON,ECH),MAC,(ORN,GAL));\n', '[&U]
((MON,ECH),ORN,(MAC,GAL));\n', '[&U] ((MON,ECH),GAL,(MAC,ORN));\n',
'[&U] ((MAC,ORN),MON,(GAL,ECH));\n', '[&U]
((MAC,GAL),MON,(ORN,ECH));\n', '[&U] ((MAC,ECH),MON,(ORN,GAL));\n']
---
A[0] = [[<Tree object at 0x13ed360d0>, <Tree object at
0x13ed36690>, <Tree object at 0x13ed36c50>, <Tree object at
0x13ed36c90>, <Tree object at 0x13ed3c3d0>, <Tree object at
0x13ed3c990>, <Tree object at 0x13ed3cf50>, <Tree object at
0x13ed42550>, <Tree object at 0x13ed42b10>, <Tree object at
0x13ed3c410>, <Tree object at 0x13ed424d0>, <Tree object at
0x13ed463d0>, <Tree object at 0x13ed46990>, <Tree object at
0x13ed46f50>, <Tree object at 0x13ed4b550>], [583, 610, 2608, 0, 19, 4,
3, 16, 0, 49, 21, 29, 5, 3, 50]]

['[&U] ((ECH,PRO),LOX,(CHO,DAS));\n', '[&U]
((ECH,PRO),CHO,(LOX,DAS));\n', '[&U] ((ECH,PRO),DAS,(LOX,CHO));\n',
'[&U] ((ECH,LOX),PRO,(CHO,DAS));\n', '[&U]
((ECH,LOX),CHO,(PRO,DAS));\n', '[&U] ((ECH,LOX),DAS,(PRO,CHO));\n',
'[&U] ((ECH,CHO),PRO,(LOX,DAS));\n', '[&U]
((ECH,CHO),LOX,(PRO,DAS));\n', '[&U] ((ECH,CHO),DAS,(PRO,LOX));\n',
'[&U] ((ECH,DAS),PRO,(LOX,CHO));\n', '[&U]
((ECH,DAS),LOX,(PRO,CHO));\n', '[&U] ((ECH,DAS),CHO,(PRO,LOX));\n',
'[&U] ((PRO,LOX),ECH,(CHO,DAS));\n', '[&U]
((PRO,CHO),ECH,(LOX,DAS));\n', '[&U] ((PRO,DAS),ECH,(LOX,CHO));\n']
---
B[0] = [[<Tree object at 0x142a153d0>, <Tree object at
0x143097090>, <Tree object at 0x143064bd0>, <Tree object at
0x142a1f810>, <Tree object at 0x14146a9d0>, <Tree object at
0x14146af90>, <Tree object at 0x1425a8590>, <Tree object at
0x141470ed0>, <Tree object at 0x1425a8810>, <Tree object at
0x1425a8dd0>, <Tree object at 0x1425a73d0>, <Tree object at
0x1425a7990>, <Tree object at 0x1425a7f50>, <Tree object at
0x1425a8e50>, <Tree object at 0x142594250>], [171, 0, 0, 208, 0, 0, 0,
0, 0, 0, 0, 2, 3619, 0, 0]]

############################
output.txt
t.py

Ruth Davidson

unread,
Oct 7, 2014, 12:45:12 PM10/7/14
to dendrop...@googlegroups.com
Wow, thanks. Ok, so I should re-install to get version 3.12.1?

For more options, visit https://groups.google.com/d/optout.

--



--------------------------------------
Jeet Sukumaran
--------------------------------------
jeetsu...@gmail.com
--------------------------------------
Blog/Personal Pages:
   http://jeetworks.org/
GitHub Repositories:
   http://github.com/jeetsukumaran
Photographs (as stream):
   http://www.flickr.com/photos/jeetsukumaran/
Photographs (by galleries):
   http://www.flickr.com/photos/jeetsukumaran/sets/
--------------------------------------

--
You received this message because you are subscribed to a topic in the Google Groups "DendroPy Users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/dendropy-users/Lgv7dEBYIJc/unsubscribe.
To unsubscribe from this group and all its topics, send an email to dendropy-users+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
Ruth Davidson
Department of Mathematics, NC State University

Ruth Davidson

unread,
Oct 7, 2014, 12:48:02 PM10/7/14
to dendrop...@googlegroups.com
Dear Jeet;

A friend running 3.12.0 got a different type of error:  both output vectors were nonzero but did not sum to 4000! Do I need to re-install dendropy to get 3.12.1?

Jeet Sukumaran

unread,
Oct 7, 2014, 1:05:38 PM10/7/14
to dendrop...@googlegroups.com
I have just submitted release 3.12.2 to the Python Package Index. If you
run:

pip install -U dendropy

you should upgrade your installation (assuming you have pip on your system).

If you are not using pip (and you should!), then you can download the
tar package and run: ``python setup.py install`` as normal.

-- jeet

On 10/7/14, 12:45 PM, Ruth Davidson wrote:
> Wow, thanks. Ok, so I should re-install to get version 3.12.1?
>
> On Tue, Oct 7, 2014 at 11:42 AM, Jeet Sukumaran <jeetsu...@gmail.com
> <mailto:jeetsu...@gmail.com>> wrote:
>
> Running your modified code (see attached, "t.py") on my machine also
> does not return an all-0 vector for B[0], but instead "[171, 0, 0,
> 208, 0, 0, 0, 0, 0, 0, 0, 2, 3619, 0, 0]" (see attached, "output.txt").
>
> Note that I am running Dendropy 3.12.1, while you are running
> 3.12.0. Have you tried running under the former?
>
> -- jeet
>
> #########################
>
>
> [venv:dendropy3-python2.7][__invariant_rooting:master:__775cc4c:+U]$
> available at https://github.com/redavids/__invariant_rooting
> <https://github.com/redavids/invariant_rooting>
>
> Macintosh-0026b0d5f8d0:__invariant_rooting ruthdavidson$ python
>
> Python 2.7.5 (default, Mar 9 2014, 22:15:05)
>
> [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
>
> Type "help", "copyright", "credits" or "license" for more
> information.
>
> >>> import dendropy
>
> >>> dendropy.__version__
>
> '3.12.0'
>
> >>> import InvariantScores
>
> >>> treelist =
> dendropy.TreeList.get_from___path("true-trees-1X.tre",
> "newick")
>
> >>> S = dendropy.Tree.get_from_path("__species-1X.tre", "newick",
> taxon_set = treelist.taxon_set)
>
> >>> leaves = [n.taxon.label for n in S.leaf_nodes()]
>
> >>> L = [leaves[i] for i in range(5)]
>
> >>> M = [leaves[m] for m in range(4,9)]
>
> >>> A = InvariantScores.get_dist(L,__treelist)
>
> ['[&U] ((MON,MAC),ORN,(GAL,ECH));\n', '[&U]
> ((MON,MAC),GAL,(ORN,ECH));\n', '[&U] ((MON,MAC),ECH,(ORN,GAL));\n',
> '[&U] ((MON,ORN),MAC,(GAL,ECH));\n', '[&U]
> ((MON,ORN),GAL,(MAC,ECH));\n', '[&U] ((MON,ORN),ECH,(MAC,GAL));\n',
> '[&U] ((MON,GAL),MAC,(ORN,ECH));\n', '[&U]
> ((MON,GAL),ORN,(MAC,ECH));\n', '[&U] ((MON,GAL),ECH,(MAC,ORN));\n',
> '[&U] ((MON,ECH),MAC,(ORN,GAL));\n', '[&U]
> ((MON,ECH),ORN,(MAC,GAL));\n', '[&U] ((MON,ECH),GAL,(MAC,ORN));\n',
> '[&U] ((MAC,ORN),MON,(GAL,ECH));\n', '[&U]
> ((MAC,GAL),MON,(ORN,ECH));\n', '[&U] ((MAC,ECH),MON,(ORN,GAL));\n']
>
> >>> A[0]
>
> [[<Tree object at 0x1172b97d0>, <Tree object at 0x1172b9cd0>, <Tree
> object at 0x1172bf2d0>, <Tree object at 0x1172bf890>, <Tree
> object at
> 0x1172bfe50>, <Tree object at 0x1172c3450>, <Tree object at
> 0x1172c3a10>, <Tree object at 0x1172bf350>, <Tree object at
> 0x1172c34d0>, <Tree object at 0x1172c72d0>, <Tree object at
> 0x1172c7890>, <Tree object at 0x1172c7e50>, <Tree object at
> 0x1172cb450>, <Tree object at 0x1172cba10>, <Tree object at
> 0x1172c3950>], [583, 610, 2608, 0, 19, 4, 3, 16, 0, 49, 21, 29,
> 5, 3, 50]]
>
> >>> B = InvariantScores.get_dist(M,__treelist)
> def dist_counter(l,__listofgenetrees):
>
> M = listofgenetrees.taxon_set
>
> t1 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[1]+'),'
> +l[2]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t2 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[1]+'),'
> +l[3]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t3 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[1]+'),'
> +l[4]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick',
> taxon_set = M)
>
> t4 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[2]+'),'
> +l[1]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t5 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[2]+'),'
> +l[3]+ ',(' +l[1]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t6 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[2]+'),'
> +l[4]+ ',(' +l[1]+ ',' +l[3]+ '))', schema = 'newick',
> taxon_set = M)
>
> t7 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[3]+'),'
> +l[1]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t8 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[3]+'),'
> +l[2]+ ',(' +l[1]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t9 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[3]+'),'
> +l[4]+ ',(' +l[1]+ ',' +l[2]+ '))', schema = 'newick',
> taxon_set = M)
>
> t10 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[4]+'),'
> +l[1]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick',
> taxon_set = M)
>
> t11 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[4]+'),'
> +l[2]+ ',(' +l[1]+ ',' +l[3]+ '))', schema = 'newick',
> taxon_set = M)
>
> t12 = dendropy.Tree.get_from_string(__'((' +l[0]+ ','
> +l[4]+'),'
> +l[3]+ ',(' +l[1]+ ',' +l[2]+ '))', schema = 'newick',
> taxon_set = M)
>
> t13 = dendropy.Tree.get_from_string(__'((' +l[1]+ ','
> +l[2]+'),'
> +l[0]+ ',(' +l[3]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t14 = dendropy.Tree.get_from_string(__'((' +l[1]+ ','
> +l[3]+'),'
> +l[0]+ ',(' +l[2]+ ',' +l[4]+ '))', schema = 'newick',
> taxon_set = M)
>
> t15 = dendropy.Tree.get_from_string(__'((' +l[1]+ ','
> +l[4]+'),'
> +l[0]+ ',(' +l[2]+ ',' +l[3]+ '))', schema = 'newick',
> taxon_set = M)
>
> counter1 = [t1, t2, t3, t4, t5, t6, t7, t8, t9, t10,
> t11, t12,
> t13, t14, t15]
>
> counter2 = [0 for i in range(15)]
>
> return [counter1, counter2]
>
>
> # I should merge this next with dist_counter after I test
> them both
>
> def get_dist(l,treelist):
>
> #treelist = dendropy.TreeList(__inputtreelist)
>
> dist = dist_counter(l, treelist)
>
> #pp.pprint(dist)
>
> viztrees = [dist[0][k].as_string("newick"__) for k in
> range(15)]
>
> print viztrees
>
> garbage = []
>
> for i in range(len(treelist)):
>
> smalltree = dendropy.Tree(treelist[i])
>
> smalltree.retain_taxa_with___labels(l)
>
> smalltree.update_splits()
>
> trace =
>
> [dendropy.treecalc.symmetric___difference(smalltree,dist[0][__j]) for
> j
> in range(15)]
>
> if trace.count(0) > 1:
>
> garbage.append(['error: too many zeroes',
> smalltree.as_string("newick"), smalltree, treelist[i], trace])
>
> elif 0 in trace:
>
> dist[1][trace.index(0)] =
> dist[1][trace.index(0)] + 1
>
> else:
>
> garbage.append([smalltree.as___newick_string(),
> treelist[i].as_newick_string()__, min(trace)])
>
> return [dist, garbage]
>
>
>
> >>> import dendropy
>
> >>> import InvariantScores
>
> >>> treelist =
>
> dendropy.TreeList.get_from___path("nardtest_song_mammals.__424.gene.tre",
> "newick")
>
> >>> S =
>
> dendropy.Tree.get_from_path("__nardtest_song_mammals.species.__tre",
> "newick", taxon_set = treelist.taxon_set)
>
> >>> leaves = [n.get_node_str() for n in S.leaf_iter()]
>
> >>> L = [leaves[i] for i in range(5)]
>
> >>> M = [leaves[i] for i in range(3,8)]
>
> >>> A = InvariantScores.get_dist(L,__treelist)
>
> ['[&U] ((Chicken,Platypus),Opossum,(__Wallaby,Sloth));\n',
> '[&U]
> ((Chicken,Platypus),Wallaby,(__Opossum,Sloth));\n', '[&U]
> ((Chicken,Platypus),Sloth,(__Opossum,Wallaby));\n', '[&U]
> ((Chicken,Opossum),Platypus,(__Wallaby,Sloth));\n', '[&U]
> ((Chicken,Opossum),Wallaby,(__Platypus,Sloth));\n', '[&U]
> ((Chicken,Opossum),Sloth,(__Platypus,Wallaby));\n', '[&U]
> ((Chicken,Wallaby),Platypus,(__Opossum,Sloth));\n', '[&U]
> ((Chicken,Wallaby),Opossum,(__Platypus,Sloth));\n', '[&U]
> ((Chicken,Wallaby),Sloth,(__Platypus,Opossum));\n', '[&U]
> ((Chicken,Sloth),Platypus,(__Opossum,Wallaby));\n', '[&U]
> ((Chicken,Sloth),Opossum,(__Platypus,Wallaby));\n', '[&U]
> ((Chicken,Sloth),Wallaby,(__Platypus,Opossum));\n', '[&U]
> ((Platypus,Opossum),Chicken,(__Wallaby,Sloth));\n', '[&U]
> ((Platypus,Wallaby),Chicken,(__Opossum,Sloth));\n', '[&U]
> ((Platypus,Sloth),Chicken,(__Opossum,Wallaby));\n']
>
> >>> A[0]
>
> [[<Tree object at 0x1075e28d0>, <Tree object at
> 0x1075e2a50>, <Tree
> object at 0x1075e2f50>, <Tree object at 0x1075e2e50>, <Tree
> object
> at 0x1075d93d0>, <Tree object at 0x1075e9bd0>, <Tree object at
> 0x1075ec110>, <Tree object at 0x1075ec610>, <Tree object at
> 0x1075ecb10>, <Tree object at 0x1075f0050>, <Tree object at
> 0x1075ecf10>, <Tree object at 0x1075e9b10>, <Tree object at
> 0x1075f0a10>, <Tree object at 0x1075f0f10>, <Tree object at
> 0x1075f4450>], [0, 1, 312, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
> 0, 59]]
>
> >>> B = InvariantScores.get_dist(M,__treelist)
>
> ['[&U]
>
> ((Wallaby,Sloth),Armadillos,(__LesserHedgehogTenrec,Hyrax));\__n',
> '[&U]
>
> ((Wallaby,Sloth),__LesserHedgehogTenrec,(__Armadillos,Hyrax));\n',
> '[&U]
>
> ((Wallaby,Sloth),Hyrax,(__Armadillos,__LesserHedgehogTenrec));\n',
> '[&U]
>
> ((Wallaby,Armadillos),Sloth,(__LesserHedgehogTenrec,Hyrax));\__n',
> '[&U]
>
> ((Wallaby,Armadillos),__LesserHedgehogTenrec,(Sloth,__Hyrax));\n',
> '[&U]
>
> ((Wallaby,Armadillos),Hyrax,(__Sloth,LesserHedgehogTenrec));\__n',
> '[&U]
>
> ((Wallaby,__LesserHedgehogTenrec),Sloth,(__Armadillos,Hyrax));\n',
> '[&U]
>
> ((Wallaby,__LesserHedgehogTenrec),__Armadillos,(Sloth,Hyrax));\n',
> '[&U]
>
> ((Wallaby,__LesserHedgehogTenrec),Hyrax,(__Sloth,Armadillos));\n',
> '[&U]
>
> ((Wallaby,Hyrax),Sloth,(__Armadillos,__LesserHedgehogTenrec));\n',
> '[&U]
>
> ((Wallaby,Hyrax),Armadillos,(__Sloth,LesserHedgehogTenrec));\__n',
> '[&U]
>
> ((Wallaby,Hyrax),__LesserHedgehogTenrec,(Sloth,__Armadillos));\n',
> '[&U]
>
> ((Sloth,Armadillos),Wallaby,(__LesserHedgehogTenrec,Hyrax));\__n',
> '[&U]
>
> ((Sloth,LesserHedgehogTenrec),__Wallaby,(Armadillos,Hyrax));\__n',
> '[&U]
>
> ((Sloth,Hyrax),Wallaby,(__Armadillos,__LesserHedgehogTenrec));\n']
>
> >>> B[0]
>
> [[<Tree object at 0x107610dd0>, <Tree object at
> 0x107608d90>, <Tree
> object at 0x1076ddd50>, <Tree object at 0x1076e1390>, <Tree
> object
> at 0x1076eb6d0>, <Tree object at 0x1076ef7d0>, <Tree object at
> 0x107610950>, <Tree object at 0x1076a5210>, <Tree object at
> 0x1076cb310>, <Tree object at 0x107629950>, <Tree object at
> 0x1076db950>, <Tree object at 0x1076fdb90>, <Tree object at
> 0x1076fd4d0>, <Tree object at 0x1076fdd90>, <Tree object at
> 0x1076c44d0>], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>
> >>> L
>
> ['Chicken', 'Platypus', 'Opossum', 'Wallaby', 'Sloth']
>
> >>> M
>
> ['Wallaby', 'Sloth', 'Armadillos', 'LesserHedgehogTenrec',
> 'Hyrax']
>
> >>>
>
> --
> You received this message because you are subscribed to the Google
> Groups "DendroPy Users" group.
> To unsubscribe from this group and stop receiving emails from
> it, send
> an email to dendropy-users+unsubscribe@__googlegroups.com
> <mailto:dendropy-users%2Bunsu...@googlegroups.com>
> <mailto:dendropy-users...@googlegroups.com
> <mailto:dendropy-users%2Bunsu...@googlegroups.com>>.
> For more options, visit https://groups.google.com/d/__optout
> <https://groups.google.com/d/optout>.
>
>
> --
>
>
>
> ------------------------------__--------
> Jeet Sukumaran
> ------------------------------__--------
> jeetsu...@gmail.com <mailto:jeetsu...@gmail.com>
> ------------------------------__--------
> Blog/Personal Pages:
> http://jeetworks.org/
> GitHub Repositories:
> http://github.com/__jeetsukumaran <http://github.com/jeetsukumaran>
> Photographs (as stream):
> http://www.flickr.com/photos/__jeetsukumaran/
> <http://www.flickr.com/photos/jeetsukumaran/>
> Photographs (by galleries):
> http://www.flickr.com/photos/__jeetsukumaran/sets/
> <http://www.flickr.com/photos/jeetsukumaran/sets/>
> ------------------------------__--------
>
> --
> You received this message because you are subscribed to a topic in
> the Google Groups "DendroPy Users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/__topic/dendropy-users/__Lgv7dEBYIJc/unsubscribe
> <https://groups.google.com/d/topic/dendropy-users/Lgv7dEBYIJc/unsubscribe>.
> To unsubscribe from this group and all its topics, send an email to
> dendropy-users+unsubscribe@__googlegroups.com
> <mailto:dendropy-users%2Bunsu...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/__optout
> <https://groups.google.com/d/optout>.
>
>
>
>
> --
> Ruth Davidson
> Department of Mathematics, NC State University
> http://www4.ncsu.edu/~redavids/
>
> --
> You received this message because you are subscribed to the Google
> Groups "DendroPy Users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to dendropy-user...@googlegroups.com
> <mailto:dendropy-user...@googlegroups.com>.

Ruth Davidson

unread,
Oct 7, 2014, 1:35:39 PM10/7/14
to dendrop...@googlegroups.com
Ok, I think this is working now:

Here is code for 1XTests.py (at github too)

import dendropy

import InvariantScores


treelist = dendropy.TreeList.get_from_path("true-trees-1X.tre""newick")


S = dendropy.Tree.get_from_path("species-1X.tre""newick", taxon_set = treelist.taxon_set)


print S.taxon_set == treelist.taxon_set

print len(treelist)


leaves = [n.taxon.label for n in S.leaf_nodes()]


L = [leaves[i] for i in range(5)]


M = [leaves[m] for m in range(4,9)]


A = InvariantScores.get_dist(L,treelist)

print A[0]

print sum(A[0][1])


B = InvariantScores.get_dist(M,treelist)

print B[0]

print sum(B[0][1])

~                       


Here is output:


Macintosh-0026b0d5f8d0:invariant_rooting ruthdavidson$ python 1XTests.py 

True

4000

['[&U] ((MON,MAC),ORN,(GAL,ECH));\n', '[&U] ((MON,MAC),GAL,(ORN,ECH));\n', '[&U] ((MON,MAC),ECH,(ORN,GAL));\n', '[&U] ((MON,ORN),MAC,(GAL,ECH));\n', '[&U] ((MON,ORN),GAL,(MAC,ECH));\n', '[&U] ((MON,ORN),ECH,(MAC,GAL));\n', '[&U] ((MON,GAL),MAC,(ORN,ECH));\n', '[&U] ((MON,GAL),ORN,(MAC,ECH));\n', '[&U] ((MON,GAL),ECH,(MAC,ORN));\n', '[&U] ((MON,ECH),MAC,(ORN,GAL));\n', '[&U] ((MON,ECH),ORN,(MAC,GAL));\n', '[&U] ((MON,ECH),GAL,(MAC,ORN));\n', '[&U] ((MAC,ORN),MON,(GAL,ECH));\n', '[&U] ((MAC,GAL),MON,(ORN,ECH));\n', '[&U] ((MAC,ECH),MON,(ORN,GAL));\n']

[[<Tree object at 0x116c65d90>, <Tree object at 0x116c6c390>, <Tree object at 0x116c6c950>, <Tree object at 0x116c6c450>, <Tree object at 0x116c700d0>, <Tree object at 0x116c70690>, <Tree object at 0x116c70c50>, <Tree object at 0x116c74250>, <Tree object at 0x116c74810>, <Tree object at 0x116c6c410>, <Tree object at 0x116c74b50>, <Tree object at 0x116c79150>, <Tree object at 0x116c79710>, <Tree object at 0x116c79cd0>, <Tree object at 0x116c7f2d0>], [583, 610, 2608, 0, 19, 4, 3, 16, 0, 49, 21, 29, 5, 3, 50]]

4000

['[&U] ((ECH,PRO),LOX,(CHO,DAS));\n', '[&U] ((ECH,PRO),CHO,(LOX,DAS));\n', '[&U] ((ECH,PRO),DAS,(LOX,CHO));\n', '[&U] ((ECH,LOX),PRO,(CHO,DAS));\n', '[&U] ((ECH,LOX),CHO,(PRO,DAS));\n', '[&U] ((ECH,LOX),DAS,(PRO,CHO));\n', '[&U] ((ECH,CHO),PRO,(LOX,DAS));\n', '[&U] ((ECH,CHO),LOX,(PRO,DAS));\n', '[&U] ((ECH,CHO),DAS,(PRO,LOX));\n', '[&U] ((ECH,DAS),PRO,(LOX,CHO));\n', '[&U] ((ECH,DAS),LOX,(PRO,CHO));\n', '[&U] ((ECH,DAS),CHO,(PRO,LOX));\n', '[&U] ((PRO,LOX),ECH,(CHO,DAS));\n', '[&U] ((PRO,CHO),ECH,(LOX,DAS));\n', '[&U] ((PRO,DAS),ECH,(LOX,CHO));\n']

[[<Tree object at 0x117346290>, <Tree object at 0x117350d50>, <Tree object at 0x11734b390>, <Tree object at 0x1173b9c90>, <Tree object at 0x1171addd0>, <Tree object at 0x117346c90>, <Tree object at 0x1173551d0>, <Tree object at 0x117350510>, <Tree object at 0x11734b610>, <Tree object at 0x117346dd0>, <Tree object at 0x1171b5310>, <Tree object at 0x11717ab50>, <Tree object at 0x1171be490>, <Tree object at 0x1171908d0>, <Tree object at 0x117346350>], [171, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 2, 3619, 0, 0]]

4000


On Tuesday, October 7, 2014 11:42:13 AM UTC-5, Jeet Sukumaran wrote:
Reply all
Reply to author
Forward
0 new messages