SuchTree


NameSuchTree JSON
Version 1.1 PyPI version JSON
download
home_pagehttps://github.com/ryneches/SuchTree
SummaryA python library for doing fast, thread-safe computations on phylogenetic trees
upload_time2024-05-17 07:52:00
maintainerNone
docs_urlNone
authorRussell Neches
requires_pythonNone
licenseBSD
keywords biology bio phylogenetics phylogeny tree
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SuchTree

A Python library for doing fast, thread-safe computations with
phylogenetic trees.

[![Actions Status](https://github.com/ryneches/SuchTree/workflows/Build/badge.svg)](https://github.com/ryneches/SuchTree/actions) [![codecov](https://codecov.io/gh/ryneches/SuchTree/branch/master/graph/badge.svg)](https://codecov.io/gh/ryneches/SuchTree) [![License](https://img.shields.io/badge/license-BSD--3-blue.svg)](https://raw.githubusercontent.com/ryneches/SuchTree/master/LICENSE) [![JOSS](http://joss.theoj.org/papers/23bac1ae69cfaf201203dd52d7dd5610/status.svg)](http://joss.theoj.org/papers/23bac1ae69cfaf201203dd52d7dd5610) ![GitHub all releases](https://img.shields.io/github/downloads/ryneches/SuchTree/total?label=downloads&logo=github) ![PyPI - Downloads](https://img.shields.io/pypi/dd/SuchTree?logo=PyPI)

### Release notes

New for SuchTree v1.1

* Basic support for support values provided by `SuchTree.get_support( node_id )`
* Relative evolutionary divergence (RED)
* Bipartitions
* Node generators for in-order and preorder traversal
* Summary of leaf relationships via `SuchTree.relationships()`

### High-performance sampling of very large trees

You have a phylogenetic tree. You want to do some statistics with it. No
problem! There are lots of packages in Python that let you manipulate
phylogenies, like [`dendropy`](http://www.dendropy.org/),
[`scikit-bio`](http://scikit-bio.org/docs/latest/tree.html) and
[`ete3`](http://etetoolkit.org/). If your tree isn't *too* big and your statistical
method doesn't require *too* many traversals, you you have a lot of great
options. If you're working with about a thousand taxa or less, you should
have no problem. You can forget about `SuchTree` and use a tree package that
has lots of cool features.

However, if you are working with trees that include tens of thousands, or
maybe even millions of organisms, you are going to run into problems. `ete3`,
`dendropy` and `scikit-bio`'s `TreeNode` are all designed to give you lots of
flexibility. You can re-root trees, use different traversal schemes, attach
metadata to nodes, attach and detach nodes, splice sub-trees into or out of
the main tree, plot trees for publication figures and do lots of other useful
things. That power and flexibility comes with a price -- speed.

For trees of moderate size, it is possible to solve the speed issue by
working with matrix representations of the tree. Unfortunately, most
representations scale quadratically with the number of taxa in the tree.
A distance matrix for a tree of 100,000 taxa will consume about 20GB 
of RAM. If your method performs sampling, then almost every operation
will be a cache miss. Even if you have the RAM, it will be painfully slow.

### Sampling linked trees

Suppose you have more than one group of organisms, and you want to study
the way their interactions have influenced their evolution. Now, you have
several trees that link together to form a generalized graph. Oh no, not
graph theory!

Calm yourself! `SuchLinkedTrees` has you covered. At the moment,
`SuchLinkedTrees` supports trees of two interacting groups, but work is
underway to generalize it to any number of groups. Like `SuchTree`,
`SuchLinkedTrees` is not intended to be a general-purpose graph theory
package. Instead, it leverages `SuchTree` to efficiently handle the 
problem-specific tasks of working with co-phylogeny systems. It will load
your datasets. It will build the graphs. It will let you subset the graphs
using their phylogenetic or ecological properties. It will generate
weighted adjacency and Laplacian matrixes of the whole graph or of subgraphs
you have selected. It will generate spectral decompositions of subgraphs if
spectral graph theory is your thing.

And, if that doesn't solve your problem, it will emit sugraphs as `Graph`
objects for use with the [`igraph`](http://igraph.org/) network analysis
package, or node and edge data for building graphs in 
[`networkx`](https://networkx.github.io/). Now you can do even more things. 
Maybe you want to get all crazy with some 
[graph kernels](https://github.com/BorgwardtLab/GraphKernels)?
Well, now you can.

### Benchmarks

`SuchTree` is motivated by a simple the observation. A distance matrix of
100,000 taxa is quite bulky, but the tree it represents can be made to fit
into about 7.6MB of RAM if implemented using only `C` primitives. This is
small enough to fit into L2 cache on many modern microprocessors. This comes
at the cost of traversing the tree for every calculation (about 16 hops from
leaf to root for a 100,000 taxa tree), but, as these operations all happen
on-chip, the processor can take full advantage of 
[pipelining](https://en.wikipedia.org/wiki/Instruction_pipelining),
[speculative execution](https://en.wikipedia.org/wiki/Speculative_execution) 
and other optimizations available in modern CPUs.

Here, we use `SuchTree` to compare the topology of two trees built
from the same 54,327 sequences using two methods : neighbor joining
and Morgan Price's [`FastTree`](http://www.microbesonline.org/fasttree/)
approximate maximum likelihood algorithm. Using one million randomly
chosen pairs of leaf nodes, we look at the patristic distances in each
of the two trees, plot them against one another, and compute
correlation coefficients.

On an Intel i7-3770S, `SuchTree` completes the two million distance
calculations in a little more than ten seconds.

```python
from SuchTree import SuchTree
import random

T1 = SuchTree( 'data/bigtrees/ml.tree' )
T2 = SuchTree( 'data/bigtrees/nj.tree' )

print( 'nodes : %d, leafs : %d' % ( T1.length, len(T1.leafs) ) )
print( 'nodes : %d, leafs : %d' % ( T2.length, len(T2.leafs) ) )
```

```
nodes : 108653, leafs : 54327
nodes : 108653, leafs : 54327
```

```python
N = 1000000
v = list( T1.leafs.keys() )

pairs = []
for i in range(N) :
    pairs.append( ( random.choice( v ), random.choice( v ) ) )

%time D1 = T1.distances_by_name( pairs ); D2 = T2.distances_by_name( pairs )
```

```
CPU times: user 10.1 s, sys: 0 ns, total: 10.1 s
Wall time: 10.1 s
```

<img src="https://github.com/ryneches/SuchTree/raw/master/docs/nj_vs_ml.png" width=500>

```python
from scipy.stats import kendalltau, pearsonr

print( 'Kendall\'s tau : %0.3f' % kendalltau( D1, D2 )[0] )
print( 'Pearson\'s r   : %0.3f' % pearsonr( D1, D2 )[0] )
```
```
Kendall's tau : 0.709
Pearson's r   : 0.969
```

### Installation

`SuchTree` depends on the following packages :

* `scipy`
* `numpy`
* `dendropy`
* `cython`
* `pandas`

To install the current release, you can install from PyPI :

```
pip install SuchTree
```

If you install using `pip`, binary packages
([`wheels`](https://realpython.com/python-wheels/)) are available for CPython 3.6, 3.7,
3.8, 3.9, 3.10 and 3.11 on Linux x86_64 and on MacOS with Intel and Apple
silicon. If your platform isn't in that list, but it is supported by
[`cibuildwheel`](https://github.com/pypa/cibuildwheel), please file an issue
to request your platform! I would be absolutely _delighted_ if someone was
actually running `SuchTree` on an exotic embedded system or a mainframe.

To install the most recent development version :

```
git clone https://github.com/ryneches/SuchTree.git
cd SuchTree
./setup.py install
```

### Basic usage

`SuchTree` will accept either a URL or a file path :

```python
from SuchTree import SuchTree

T = SuchTree( 'test.tree' )
T = SuchTree( 'https://github.com/ryneches/SuchTree/blob/master/data/gopher-louse/gopher.tree' )
```

The available properties are :

* `length` : the number of nodes in the tree
* `depth` : the maximum depth of the tree
* `root` : the id of the root node
* `leafs` : a dictionary mapping leaf names to their ids
* `leafnodes` : a dictionary mapping leaf node ids to leaf names

The available methods are :

* `get_parent` : for a given node id or leaf name, return the parent id
* `get_children` : for a given node id or leaf name, return the ids of
the child nodes (leaf nodes have no children, so their child node ids will
always be -1)
* `get_distance_to_root` : for a given node id or leaf name, return
the integrated phylogenetic distance to the root node
* `mrca` : for a given pair of node ids or leaf names, return the id
of the nearest node that is parent to both
* `distance` : for a given pair of node ids or leaf names, return the
patristic distance between the pair
* `distances` : for an (n,2) array of pairs of node ids, return an (n)
array of patristic distances between the pairs
* `distances_by_name` for an (n,2) list of pairs of leaf names, return
an (n) list of patristic distances between each pair
* `dump_array` : print out the entire tree (for debugging only! May
produce pathologically gigantic output.)

### Example datasets

For analysis of ecological interactions, `SuchTree` is distributed
with a curated collection of several different examples from the
literature. Additionally, a collection of simulated interactions with
various properties, along with an annotated notebook of `Python` code
for generating them, is also included. Interactions are registered in
a JSON object (`data/studies.json`).

#### Host/Parasite

* **gopher-louse** Hafner, M.S. & Nadler, S.A. 1988. *Phylogenetic trees support the coevolution of parasites and their hosts.* Nature 332: 258-259)
* **dove-louse** Dale H. Clayton, Sarah E. Bush, Brad M. Goates, and Kevin P. Johnson. 2003. *Host defense reinforces host–parasite cospeciation.* PNAS. 
* **sedge-smut** Escudero, Marcial. 2015. *Phylogenetic congruence of parasitic
smut fungi (Anthracoidea, Anthracoideaceae) and their host plants (Carex,
Cyperaceae): Cospeciation or host-shift speciation?* American journal of
botany.
* **fish-worm** Maarten P. M. Vanhove, Antoine Pariselle, Maarten Van Steenberge,
Joost A. M. Raeymaekers, Pascal I. Hablützel, Céline Gillardin, Bart Hellemans,
Floris C. Breman, Stephan Koblmüller, Christian Sturmbauer, Jos Snoeks,
Filip A. M. Volckaert & Tine Huyse. 2015. *Hidden biodiversity in an ancient lake: phylogenetic congruence between Lake Tanganyika tropheine cichlids and their monogenean flatworm parasites*, Scientific Reports. 

#### Plant/Pollinator (visitor) interactions

These were originally collected by Enrico Rezende *et al.* :

> Enrico L. Rezende, Jessica E. Lavabre, Paulo R. Guimarães, Pedro Jordano & Jordi Bascompte 
"[Non-random coextinctions in phylogenetically structured mutualistic networks](http://www.nature.com/nature/journal/v448/n7156/abs/nature05956.html)," *Nature*, 2007

* **arr1**	Arroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.
* **arr2**	Arroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.
* **arr3**	Arroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.
* **bahe**	Barrett, S. C. H., and K. Helenurm. 1987. *The Reproductive-Biology of Boreal Forest Herbs.1. Breeding Systems and Pollination.* Canadian Journal of Botany 65:2036-2046.
* **cllo**	Clements, R. E., and F. L. Long. 1923, Experimental pollination. An outline of the ecology of flowers and insects. Washington, D.C., USA, Carnegie Institute of Washington.
* **dihi**	Dicks, LV, Corbet, SA and Pywell, RF 2002. *Compartmentalization in plant–insect flower visitor webs.* J. Anim. Ecol. 71: 32–43
* **dish**	Dicks, LV, Corbet, SA and Pywell, RF 2002. *Compartmentalization in plant–insect flower visitor webs.* J. Anim. Ecol. 71: 32–43
* **dupo**	Dupont YL, Hansen DM and Olesen JM 2003 *Structure of a plant-flower-visitor network in the high-altitude sub-alpine desert of Tenerife, Canary Islands.* Ecography 26:301-310 
* **eol**	Elberling, H., and J. M. Olesen. 1999. *The structure of a high latitude plant-flower visitor system: the dominance of flies.* Ecography 22:314-323.
* **eolz**	Elberling & Olesen unpubl.
* **eski**	Eskildsen et al. unpubl.
* **herr**	Herrera, J. 1988 *Pollination relatioships in southern spanish mediterranean shrublands.* Journal of Ecology 76: 274-287.
* **hock**	Hocking, B. 1968. *Insect-flower associations in the high Arctic with special reference to nectar.* Oikos 19:359-388.
* **inpk**	Inouye, D. W., and G. H. Pyke. 1988. *Pollination biology in the Snowy Mountains of Australia: comparisons with montane Colorado, USA.* Australian Journal of Ecology 13:191-210.
* **kevn**	Kevan P. G. 1970. *High Arctic insect-flower relations: The interrelationships of arthropods and flowers at Lake Hazen, Ellesmere Island, Northwest Territories, Canada.* Ph.D. thesis, University of Alberta, Edmonton, 399 pp.
* **kt90**	Kato, M., Kakutani, T., Inoue, T. and Itino, T. (1990). *Insect-flower relationship in the primary beech forest of Ashu, Kyoto: An overview of the flowering phenology and the seasonal pattern of insect visits.* Contrib. Biol. Lab., Kyoto, Univ., 27, 309-375.
* **med1**	Medan, D., N. H. Montaldo, M. Devoto, A. Mantese, V. Vasellati, and N. H. Bartoloni. 2002. *Plant-pollinator relationships at two altitudes in the Andes of Mendoza, Argentina.* Arctic Antarctic and Alpine Research 34:233-241.
* **med2**	Medan, D., N. H. Montaldo, M. Devoto, A. Mantese, V. Vasellati, and N. H. Bartoloni. 2002. *Plant-pollinator relationships at two altitudes in the Andes of Mendoza, Argentina.* Arctic Antarctic and Alpine Research 34:233-241.
* **memm**	Memmott J. 1999. *The structure of a plant-pollinator food web.* Ecology Letters 2:276-280.
* **moma**	Mosquin, T., and J. E. H. Martin. 1967. *Observations on the pollination biology of plants on Melville Island, N.W.T., Canada.* Canadian Field Naturalist 81:201-205.
* **mott**	Motten, A. F. 1982. *Pollination Ecology of the Spring Wildflower Community in the Deciduous Forests of Piedmont North Carolina.* Doctoral Dissertation thesis, Duke University, Duhram, North Carolina, USA; Motten, A. F. 1986. Pollination ecology of the spring wildflower community of a temperate deciduous forest. Ecological Monographs 56:21-42.
* **mull**	McMullen 1993
* **oflo**	Olesen unpubl.
* **ofst**	Olesen unpubl.
* **olau**	Olesen unpubl.
* **olle**	Ollerton, J., S. D. Johnson, L. Cranmer, and S. Kellie. 2003. *The pollination ecology of an assemblage of grassland asclepiads in South Africa.* Annals of Botany 92:807-834.
* **perc**	Percival, M. 1974. *Floral ecology of coastal scrub in sotheast Jamaica.* Biotropica, 6, 104-129.
* **prap**	Primack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333, AB.
* **prca**	Primack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333. Cass
* **prcg**	Primack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333. Craigieb.
* **ptnd**	Petanidou, T. 1991. *Pollination ecology in a phryganic ecosystem.* Unp. PhD. Thesis, Aristotelian University, Thessaloniki.
* **rabr**	Ramirez, N., and Y. Brito. 1992. *Pollination Biology in a Palm Swamp Community in the Venezuelan Central Plains.* Botanical Journal of the Linnean Society 110:277-302.
* **rmrz**	Ramirez, N. 1989. *Biología de polinización en una comunidad arbustiva tropical de la alta Guyana Venezolana.* Biotropica 21, 319-330.
* **schm**	Schemske, D. W., M. F. Willson, M. N. Melampy, L. J. Miller, L. Verner, K. M. Schemske, and L. B. Best. 1978. *Flowering Ecology of Some Spring Woodland Herbs.* Ecology 59:351-366.
* **smal**	Small, E. 1976. *Insect pollinators of the Mer Bleue peat bog of Ottawa.* Canadian Field Naturalist 90:22-28. 
* **smra**	Smith-Ramírez C., P. Martinez, M. Nuñez, C. González and J. J. Armesto 2005 *Diversity, flower visitation frequency and generalism of pollinators in temperate rain forests of Chiloé Island,Chile.* Botanical Journal of the Linnean Society, 2005, 147, 399–416.

#### Frugivory interactions

* **bair**	Baird, J.W. 1980. *The selection and use of fruit by birds in an eastern forest.* Wilson Bulletin 92: 63-73.
* **beeh**	Beehler, B. 1983. *Frugivory and polygamy in birds of paradise.* Auk, 100: 1-12.
* **cacg**	Carlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131
* **caci**	Carlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131
* **caco**	Carlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131
* **cafr**	Carlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131
* **crom**	Crome, F.H.J. 1975. *The ecology of fruit pigeons in tropical Northern Queensland.* Australian Journal of Wildlife Research, 2: 155-185.
* **fros**	Frost, P.G.H. 1980. *Fruit-frugivore interactions in a South African coastal dune forest.* Pages 1179-1184 in: R. Noring (ed.). Acta XVII Congresus Internationalis Ornithologici, Deutsches Ornithologische Gessenshaft, Berlin.
* **gen1**	Galetti, M., Pizo, M.A. 1996. *Fruit eating birds in a forest fragment in southeastern Brazil.* Ararajuba, Revista Brasileira de Ornitologia, 4: 71-79.
* **gen2**	Galetti, M., Pizo, M.A. 1996. *Fruit eating birds in a forest fragment in southeastern Brazil.* Ararajuba, Revista Brasileira de Ornitologia, 4: 71-79.
* **hamm**	Hammann, A. & Curio, B. 1999. *Interactions among frugivores and fleshy fruit trees in a Philippine submontane rainforest*
* **hrat**	Jordano P. 1985. *El ciclo anual de los paseriformes frugívoros en el matorral mediterráneo del sur de España: importancia de su invernada y variaciones interanuales.* Ardeola, 32, 69-94.
* **kant**	Kantak, G.E. 1979. *Observations on some fruit-eating birds in Mexico.* Auk, 96: 183-186.
* **lamb**	Lambert F. 1989. *Fig-eating by birds in a Malaysian lowland rain forest.* J. Trop. Ecol., 5, 401-412.
* **lope**	Tutin, C.E.G., Ham, R.M., White, L.J.T., Harrison, M.J.S. 1997. *The primate community of the Lopé Reserve, Gabon: diets, responses to fruit scarcity, and effects on biomass.* American Journal of Primatology, 42: 1-24.
* **mack**	Mack, AL and Wright, DD. 1996. *Notes on occurrence and feeding of birds at Crater Mountain Biological Research Station, Papua New Guinea.* Emu 96: 89-101. 
* **mont**	Wheelwright, N.T., Haber, W.A., Murray, K.G., Guindon, C. 1984. *Tropical fruit-eating birds and their food plants: a survey of a Costa Rican lower montane forest.* Biotropica, 16: 173-192.
* **ncor**	P. Jordano, unpubl.
* **nnog**	P. Jordano, unpubl.
* **sapf**	Noma, N. 1997. *Annual fluctuations of sapfruits production and synchronization within and inter species in a warm temperate forest on Yakushima Island, Japan.* Tropics, 6: 441-449.
* **snow**	Snow, B.K., Snow, D.W. 1971. *The feeding ecology of tanagers and honeycreepers in Trinidad.* Auk, 88: 291-322.
* **wes**	Silva, W.R., P. De Marco, E. Hasui, and V.S.M. Gomes, 2002. *Patterns of fruit-frugivores interactions in two Atlantic Forest bird communities of South-eastern Brazil: implications for conservation.* Pp. 423-435. In: D.J. Levey, W.R. Silva and M. Galetti (eds.) Seed dispersal and frugivory: ecology, evolution and conservation. Wallinford: CAB International.
* **wyth**	Snow B.K. & Snow D.W. 1988. *Birds and berries, Calton, England.*


### Thanks

Special thanks to [@camillescott](https://github.com/camillescott) and 
[@pmarkowsky](https://github.com/pmarkowsky) for their many helpful
suggestions (and for their patience).


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ryneches/SuchTree",
    "name": "SuchTree",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "biology, bio, phylogenetics, phylogeny, tree",
    "author": "Russell Neches",
    "author_email": "science@vort.org",
    "download_url": "https://files.pythonhosted.org/packages/c5/9d/c702697f00bc7e6689b460a978e04a1f0ef137aa69d888663daae450776e/suchtree-1.1.tar.gz",
    "platform": null,
    "description": "# SuchTree\n\nA Python library for doing fast, thread-safe computations with\nphylogenetic trees.\n\n[![Actions Status](https://github.com/ryneches/SuchTree/workflows/Build/badge.svg)](https://github.com/ryneches/SuchTree/actions) [![codecov](https://codecov.io/gh/ryneches/SuchTree/branch/master/graph/badge.svg)](https://codecov.io/gh/ryneches/SuchTree) [![License](https://img.shields.io/badge/license-BSD--3-blue.svg)](https://raw.githubusercontent.com/ryneches/SuchTree/master/LICENSE) [![JOSS](http://joss.theoj.org/papers/23bac1ae69cfaf201203dd52d7dd5610/status.svg)](http://joss.theoj.org/papers/23bac1ae69cfaf201203dd52d7dd5610) ![GitHub all releases](https://img.shields.io/github/downloads/ryneches/SuchTree/total?label=downloads&logo=github) ![PyPI - Downloads](https://img.shields.io/pypi/dd/SuchTree?logo=PyPI)\n\n### Release notes\n\nNew for SuchTree v1.1\n\n* Basic support for support values provided by `SuchTree.get_support( node_id )`\n* Relative evolutionary divergence (RED)\n* Bipartitions\n* Node generators for in-order and preorder traversal\n* Summary of leaf relationships via `SuchTree.relationships()`\n\n### High-performance sampling of very large trees\n\nYou have a phylogenetic tree. You want to do some statistics with it. No\nproblem! There are lots of packages in Python that let you manipulate\nphylogenies, like [`dendropy`](http://www.dendropy.org/),\n[`scikit-bio`](http://scikit-bio.org/docs/latest/tree.html) and\n[`ete3`](http://etetoolkit.org/). If your tree isn't *too* big and your statistical\nmethod doesn't require *too* many traversals, you you have a lot of great\noptions. If you're working with about a thousand taxa or less, you should\nhave no problem. You can forget about `SuchTree` and use a tree package that\nhas lots of cool features.\n\nHowever, if you are working with trees that include tens of thousands, or\nmaybe even millions of organisms, you are going to run into problems. `ete3`,\n`dendropy` and `scikit-bio`'s `TreeNode` are all designed to give you lots of\nflexibility. You can re-root trees, use different traversal schemes, attach\nmetadata to nodes, attach and detach nodes, splice sub-trees into or out of\nthe main tree, plot trees for publication figures and do lots of other useful\nthings. That power and flexibility comes with a price -- speed.\n\nFor trees of moderate size, it is possible to solve the speed issue by\nworking with matrix representations of the tree. Unfortunately, most\nrepresentations scale quadratically with the number of taxa in the tree.\nA distance matrix for a tree of 100,000 taxa will consume about 20GB \nof RAM. If your method performs sampling, then almost every operation\nwill be a cache miss. Even if you have the RAM, it will be painfully slow.\n\n### Sampling linked trees\n\nSuppose you have more than one group of organisms, and you want to study\nthe way their interactions have influenced their evolution. Now, you have\nseveral trees that link together to form a generalized graph. Oh no, not\ngraph theory!\n\nCalm yourself! `SuchLinkedTrees` has you covered. At the moment,\n`SuchLinkedTrees` supports trees of two interacting groups, but work is\nunderway to generalize it to any number of groups. Like `SuchTree`,\n`SuchLinkedTrees` is not intended to be a general-purpose graph theory\npackage. Instead, it leverages `SuchTree` to efficiently handle the \nproblem-specific tasks of working with co-phylogeny systems. It will load\nyour datasets. It will build the graphs. It will let you subset the graphs\nusing their phylogenetic or ecological properties. It will generate\nweighted adjacency and Laplacian matrixes of the whole graph or of subgraphs\nyou have selected. It will generate spectral decompositions of subgraphs if\nspectral graph theory is your thing.\n\nAnd, if that doesn't solve your problem, it will emit sugraphs as `Graph`\nobjects for use with the [`igraph`](http://igraph.org/) network analysis\npackage, or node and edge data for building graphs in \n[`networkx`](https://networkx.github.io/). Now you can do even more things. \nMaybe you want to get all crazy with some \n[graph kernels](https://github.com/BorgwardtLab/GraphKernels)?\nWell, now you can.\n\n### Benchmarks\n\n`SuchTree` is motivated by a simple the observation. A distance matrix of\n100,000 taxa is quite bulky, but the tree it represents can be made to fit\ninto about 7.6MB of RAM if implemented using only `C` primitives. This is\nsmall enough to fit into L2 cache on many modern microprocessors. This comes\nat the cost of traversing the tree for every calculation (about 16 hops from\nleaf to root for a 100,000 taxa tree), but, as these operations all happen\non-chip, the processor can take full advantage of \n[pipelining](https://en.wikipedia.org/wiki/Instruction_pipelining),\n[speculative execution](https://en.wikipedia.org/wiki/Speculative_execution) \nand other optimizations available in modern CPUs.\n\nHere, we use `SuchTree` to compare the topology of two trees built\nfrom the same 54,327 sequences using two methods : neighbor joining\nand Morgan Price's [`FastTree`](http://www.microbesonline.org/fasttree/)\napproximate maximum likelihood algorithm. Using one million randomly\nchosen pairs of leaf nodes, we look at the patristic distances in each\nof the two trees, plot them against one another, and compute\ncorrelation coefficients.\n\nOn an Intel i7-3770S, `SuchTree` completes the two million distance\ncalculations in a little more than ten seconds.\n\n```python\nfrom SuchTree import SuchTree\nimport random\n\nT1 = SuchTree( 'data/bigtrees/ml.tree' )\nT2 = SuchTree( 'data/bigtrees/nj.tree' )\n\nprint( 'nodes : %d, leafs : %d' % ( T1.length, len(T1.leafs) ) )\nprint( 'nodes : %d, leafs : %d' % ( T2.length, len(T2.leafs) ) )\n```\n\n```\nnodes : 108653, leafs : 54327\nnodes : 108653, leafs : 54327\n```\n\n```python\nN = 1000000\nv = list( T1.leafs.keys() )\n\npairs = []\nfor i in range(N) :\n    pairs.append( ( random.choice( v ), random.choice( v ) ) )\n\n%time D1 = T1.distances_by_name( pairs ); D2 = T2.distances_by_name( pairs )\n```\n\n```\nCPU times: user 10.1 s, sys: 0 ns, total: 10.1 s\nWall time: 10.1 s\n```\n\n<img src=\"https://github.com/ryneches/SuchTree/raw/master/docs/nj_vs_ml.png\" width=500>\n\n```python\nfrom scipy.stats import kendalltau, pearsonr\n\nprint( 'Kendall\\'s tau : %0.3f' % kendalltau( D1, D2 )[0] )\nprint( 'Pearson\\'s r   : %0.3f' % pearsonr( D1, D2 )[0] )\n```\n```\nKendall's tau : 0.709\nPearson's r   : 0.969\n```\n\n### Installation\n\n`SuchTree` depends on the following packages :\n\n* `scipy`\n* `numpy`\n* `dendropy`\n* `cython`\n* `pandas`\n\nTo install the current release, you can install from PyPI :\n\n```\npip install SuchTree\n```\n\nIf you install using `pip`, binary packages\n([`wheels`](https://realpython.com/python-wheels/)) are available for CPython 3.6, 3.7,\n3.8, 3.9, 3.10 and 3.11 on Linux x86_64 and on MacOS with Intel and Apple\nsilicon. If your platform isn't in that list, but it is supported by\n[`cibuildwheel`](https://github.com/pypa/cibuildwheel), please file an issue\nto request your platform! I would be absolutely _delighted_ if someone was\nactually running `SuchTree` on an exotic embedded system or a mainframe.\n\nTo install the most recent development version :\n\n```\ngit clone https://github.com/ryneches/SuchTree.git\ncd SuchTree\n./setup.py install\n```\n\n### Basic usage\n\n`SuchTree` will accept either a URL or a file path :\n\n```python\nfrom SuchTree import SuchTree\n\nT = SuchTree( 'test.tree' )\nT = SuchTree( 'https://github.com/ryneches/SuchTree/blob/master/data/gopher-louse/gopher.tree' )\n```\n\nThe available properties are :\n\n* `length` : the number of nodes in the tree\n* `depth` : the maximum depth of the tree\n* `root` : the id of the root node\n* `leafs` : a dictionary mapping leaf names to their ids\n* `leafnodes` : a dictionary mapping leaf node ids to leaf names\n\nThe available methods are :\n\n* `get_parent` : for a given node id or leaf name, return the parent id\n* `get_children` : for a given node id or leaf name, return the ids of\nthe child nodes (leaf nodes have no children, so their child node ids will\nalways be -1)\n* `get_distance_to_root` : for a given node id or leaf name, return\nthe integrated phylogenetic distance to the root node\n* `mrca` : for a given pair of node ids or leaf names, return the id\nof the nearest node that is parent to both\n* `distance` : for a given pair of node ids or leaf names, return the\npatristic distance between the pair\n* `distances` : for an (n,2) array of pairs of node ids, return an (n)\narray of patristic distances between the pairs\n* `distances_by_name` for an (n,2) list of pairs of leaf names, return\nan (n) list of patristic distances between each pair\n* `dump_array` : print out the entire tree (for debugging only! May\nproduce pathologically gigantic output.)\n\n### Example datasets\n\nFor analysis of ecological interactions, `SuchTree` is distributed\nwith a curated collection of several different examples from the\nliterature. Additionally, a collection of simulated interactions with\nvarious properties, along with an annotated notebook of `Python` code\nfor generating them, is also included. Interactions are registered in\na JSON object (`data/studies.json`).\n\n#### Host/Parasite\n\n* **gopher-louse** Hafner, M.S. & Nadler, S.A. 1988. *Phylogenetic trees support the coevolution of parasites and their hosts.* Nature 332: 258-259)\n* **dove-louse** Dale H. Clayton, Sarah E. Bush, Brad M. Goates, and Kevin P. Johnson. 2003. *Host defense reinforces host\u2013parasite cospeciation.* PNAS. \n* **sedge-smut** Escudero, Marcial. 2015. *Phylogenetic congruence of parasitic\nsmut fungi (Anthracoidea, Anthracoideaceae) and their host plants (Carex,\nCyperaceae): Cospeciation or host-shift speciation?* American journal of\nbotany.\n* **fish-worm** Maarten P. M. Vanhove, Antoine Pariselle, Maarten Van Steenberge,\nJoost A. M. Raeymaekers, Pascal I. Habl\u00fctzel, C\u00e9line Gillardin, Bart Hellemans,\nFloris C. Breman, Stephan Koblm\u00fcller, Christian Sturmbauer, Jos Snoeks,\nFilip A. M. Volckaert & Tine Huyse. 2015. *Hidden biodiversity in an ancient lake: phylogenetic congruence between Lake Tanganyika tropheine cichlids and their monogenean flatworm parasites*, Scientific Reports. \n\n#### Plant/Pollinator (visitor) interactions\n\nThese were originally collected by Enrico Rezende *et al.* :\n\n> Enrico L. Rezende, Jessica E. Lavabre, Paulo R. Guimar\u00e3es, Pedro Jordano & Jordi Bascompte \n\"[Non-random coextinctions in phylogenetically structured mutualistic networks](http://www.nature.com/nature/journal/v448/n7156/abs/nature05956.html),\" *Nature*, 2007\n\n* **arr1**\tArroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.\n* **arr2**\tArroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.\n* **arr3**\tArroyo, M.T.K., R. Primack & J.J. Armesto. 1982. *Community studies in pollination ecology in the high temperate Andes of central Chile. I. Pollination mechanisms and altitudinal variation.* Amer. J. Bot. 69:82-97.\n* **bahe**\tBarrett, S. C. H., and K. Helenurm. 1987. *The Reproductive-Biology of Boreal Forest Herbs.1. Breeding Systems and Pollination.* Canadian Journal of Botany 65:2036-2046.\n* **cllo**\tClements, R. E., and F. L. Long. 1923, Experimental pollination. An outline of the ecology of flowers and insects. Washington, D.C., USA, Carnegie Institute of Washington.\n* **dihi**\tDicks, LV, Corbet, SA and Pywell, RF 2002. *Compartmentalization in plant\u2013insect flower visitor webs.* J. Anim. Ecol. 71: 32\u201343\n* **dish**\tDicks, LV, Corbet, SA and Pywell, RF 2002. *Compartmentalization in plant\u2013insect flower visitor webs.* J. Anim. Ecol. 71: 32\u201343\n* **dupo**\tDupont YL, Hansen DM and Olesen JM 2003 *Structure of a plant-flower-visitor network in the high-altitude sub-alpine desert of Tenerife, Canary Islands.* Ecography 26:301-310 \n* **eol**\tElberling, H., and J. M. Olesen. 1999. *The structure of a high latitude plant-flower visitor system: the dominance of flies.* Ecography 22:314-323.\n* **eolz**\tElberling & Olesen unpubl.\n* **eski**\tEskildsen et al. unpubl.\n* **herr**\tHerrera, J. 1988 *Pollination relatioships in southern spanish mediterranean shrublands.* Journal of Ecology 76: 274-287.\n* **hock**\tHocking, B. 1968. *Insect-flower associations in the high Arctic with special reference to nectar.* Oikos 19:359-388.\n* **inpk**\tInouye, D. W., and G. H. Pyke. 1988. *Pollination biology in the Snowy Mountains of Australia: comparisons with montane Colorado, USA.* Australian Journal of Ecology 13:191-210.\n* **kevn**\tKevan P. G. 1970. *High Arctic insect-flower relations: The interrelationships of arthropods and flowers at Lake Hazen, Ellesmere Island, Northwest Territories, Canada.* Ph.D. thesis, University of Alberta, Edmonton, 399 pp.\n* **kt90**\tKato, M., Kakutani, T., Inoue, T. and Itino, T. (1990). *Insect-flower relationship in the primary beech forest of Ashu, Kyoto: An overview of the flowering phenology and the seasonal pattern of insect visits.* Contrib. Biol. Lab., Kyoto, Univ., 27, 309-375.\n* **med1**\tMedan, D., N. H. Montaldo, M. Devoto, A. Mantese, V. Vasellati, and N. H. Bartoloni. 2002. *Plant-pollinator relationships at two altitudes in the Andes of Mendoza, Argentina.* Arctic Antarctic and Alpine Research 34:233-241.\n* **med2**\tMedan, D., N. H. Montaldo, M. Devoto, A. Mantese, V. Vasellati, and N. H. Bartoloni. 2002. *Plant-pollinator relationships at two altitudes in the Andes of Mendoza, Argentina.* Arctic Antarctic and Alpine Research 34:233-241.\n* **memm**\tMemmott J. 1999. *The structure of a plant-pollinator food web.* Ecology Letters 2:276-280.\n* **moma**\tMosquin, T., and J. E. H. Martin. 1967. *Observations on the pollination biology of plants on Melville Island, N.W.T., Canada.* Canadian Field Naturalist 81:201-205.\n* **mott**\tMotten, A. F. 1982. *Pollination Ecology of the Spring Wildflower Community in the Deciduous Forests of Piedmont North Carolina.* Doctoral Dissertation thesis, Duke University, Duhram, North Carolina, USA; Motten, A. F. 1986. Pollination ecology of the spring wildflower community of a temperate deciduous forest. Ecological Monographs 56:21-42.\n* **mull**\tMcMullen 1993\n* **oflo**\tOlesen unpubl.\n* **ofst**\tOlesen unpubl.\n* **olau**\tOlesen unpubl.\n* **olle**\tOllerton, J., S. D. Johnson, L. Cranmer, and S. Kellie. 2003. *The pollination ecology of an assemblage of grassland asclepiads in South Africa.* Annals of Botany 92:807-834.\n* **perc**\tPercival, M. 1974. *Floral ecology of coastal scrub in sotheast Jamaica.* Biotropica, 6, 104-129.\n* **prap**\tPrimack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333, AB.\n* **prca**\tPrimack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333. Cass\n* **prcg**\tPrimack, R.B. 1983. *Insect pollination in the New Zealand mountain flora.* New Zealand J. Bot. 21, 317-333. Craigieb.\n* **ptnd**\tPetanidou, T. 1991. *Pollination ecology in a phryganic ecosystem.* Unp. PhD. Thesis, Aristotelian University, Thessaloniki.\n* **rabr**\tRamirez, N., and Y. Brito. 1992. *Pollination Biology in a Palm Swamp Community in the Venezuelan Central Plains.* Botanical Journal of the Linnean Society 110:277-302.\n* **rmrz**\tRamirez, N. 1989. *Biolog\u00eda de polinizaci\u00f3n en una comunidad arbustiva tropical de la alta Guyana Venezolana.* Biotropica 21, 319-330.\n* **schm**\tSchemske, D. W., M. F. Willson, M. N. Melampy, L. J. Miller, L. Verner, K. M. Schemske, and L. B. Best. 1978. *Flowering Ecology of Some Spring Woodland Herbs.* Ecology 59:351-366.\n* **smal**\tSmall, E. 1976. *Insect pollinators of the Mer Bleue peat bog of Ottawa.* Canadian Field Naturalist 90:22-28. \n* **smra**\tSmith-Ram\u00edrez C., P. Martinez, M. Nu\u00f1ez, C. Gonz\u00e1lez and J. J. Armesto 2005 *Diversity, flower visitation frequency and generalism of pollinators in temperate rain forests of Chilo\u00e9 Island,Chile.* Botanical Journal of the Linnean Society, 2005, 147, 399\u2013416.\n\n#### Frugivory interactions\n\n* **bair**\tBaird, J.W. 1980. *The selection and use of fruit by birds in an eastern forest.* Wilson Bulletin 92: 63-73.\n* **beeh**\tBeehler, B. 1983. *Frugivory and polygamy in birds of paradise.* Auk, 100: 1-12.\n* **cacg**\tCarlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131\n* **caci**\tCarlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131\n* **caco**\tCarlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131\n* **cafr**\tCarlo et al. 2003. *Avian fruit preferences across a Puerto Rican forested landscape: pattern consistency and implications for seed removal.* Oecologia 134: 119-131\n* **crom**\tCrome, F.H.J. 1975. *The ecology of fruit pigeons in tropical Northern Queensland.* Australian Journal of Wildlife Research, 2: 155-185.\n* **fros**\tFrost, P.G.H. 1980. *Fruit-frugivore interactions in a South African coastal dune forest.* Pages 1179-1184 in: R. Noring (ed.). Acta XVII Congresus Internationalis Ornithologici, Deutsches Ornithologische Gessenshaft, Berlin.\n* **gen1**\tGaletti, M., Pizo, M.A. 1996. *Fruit eating birds in a forest fragment in southeastern Brazil.* Ararajuba, Revista Brasileira de Ornitologia, 4: 71-79.\n* **gen2**\tGaletti, M., Pizo, M.A. 1996. *Fruit eating birds in a forest fragment in southeastern Brazil.* Ararajuba, Revista Brasileira de Ornitologia, 4: 71-79.\n* **hamm**\tHammann, A. & Curio, B. 1999. *Interactions among frugivores and fleshy fruit trees in a Philippine submontane rainforest*\n* **hrat**\tJordano P. 1985. *El ciclo anual de los paseriformes frug\u00edvoros en el matorral mediterr\u00e1neo del sur de Espa\u00f1a: importancia de su invernada y variaciones interanuales.* Ardeola, 32, 69-94.\n* **kant**\tKantak, G.E. 1979. *Observations on some fruit-eating birds in Mexico.* Auk, 96: 183-186.\n* **lamb**\tLambert F. 1989. *Fig-eating by birds in a Malaysian lowland rain forest.* J. Trop. Ecol., 5, 401-412.\n* **lope**\tTutin, C.E.G., Ham, R.M., White, L.J.T., Harrison, M.J.S. 1997. *The primate community of the Lop\u00e9 Reserve, Gabon: diets, responses to fruit scarcity, and effects on biomass.* American Journal of Primatology, 42: 1-24.\n* **mack**\tMack, AL and Wright, DD. 1996. *Notes on occurrence and feeding of birds at Crater Mountain Biological Research Station, Papua New Guinea.* Emu 96: 89-101. \n* **mont**\tWheelwright, N.T., Haber, W.A., Murray, K.G., Guindon, C. 1984. *Tropical fruit-eating birds and their food plants: a survey of a Costa Rican lower montane forest.* Biotropica, 16: 173-192.\n* **ncor**\tP. Jordano, unpubl.\n* **nnog**\tP. Jordano, unpubl.\n* **sapf**\tNoma, N. 1997. *Annual fluctuations of sapfruits production and synchronization within and inter species in a warm temperate forest on Yakushima Island, Japan.* Tropics, 6: 441-449.\n* **snow**\tSnow, B.K., Snow, D.W. 1971. *The feeding ecology of tanagers and honeycreepers in Trinidad.* Auk, 88: 291-322.\n* **wes**\tSilva, W.R., P. De Marco, E. Hasui, and V.S.M. Gomes, 2002. *Patterns of fruit-frugivores interactions in two Atlantic Forest bird communities of South-eastern Brazil: implications for conservation.* Pp. 423-435. In: D.J. Levey, W.R. Silva and M. Galetti (eds.) Seed dispersal and frugivory: ecology, evolution and conservation. Wallinford: CAB International.\n* **wyth**\tSnow B.K. & Snow D.W. 1988. *Birds and berries, Calton, England.*\n\n\n### Thanks\n\nSpecial thanks to [@camillescott](https://github.com/camillescott) and \n[@pmarkowsky](https://github.com/pmarkowsky) for their many helpful\nsuggestions (and for their patience).\n\n",
    "bugtrack_url": null,
    "license": "BSD",
    "summary": "A python library for doing fast, thread-safe computations on phylogenetic trees",
    "version": "1.1",
    "project_urls": {
        "Homepage": "https://github.com/ryneches/SuchTree"
    },
    "split_keywords": [
        "biology",
        " bio",
        " phylogenetics",
        " phylogeny",
        " tree"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "766ca9b340c1aaeb48cb15341a477d7be7981200ca3f76ed11e10dd86e0a424c",
                "md5": "dce3cd625296f534825a9fbc0189fbe3",
                "sha256": "ed25b10a2f9ebc8fd6c3b24261c65392ee11a63362058ba646e44647e1c4443a"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dce3cd625296f534825a9fbc0189fbe3",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 246549,
            "upload_time": "2024-05-17T07:51:22",
            "upload_time_iso_8601": "2024-05-17T07:51:22.798639Z",
            "url": "https://files.pythonhosted.org/packages/76/6c/a9b340c1aaeb48cb15341a477d7be7981200ca3f76ed11e10dd86e0a424c/SuchTree-1.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3bb8a5e1cff6a89106fd20822b442898988c7ce486844c93a4c28aa6742e476a",
                "md5": "caf6b3876cffbe37f8420a90404758f7",
                "sha256": "1f08718861f457dff00dba76c7794f631954bf633bc8e74e26a0dec59abdad43"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "caf6b3876cffbe37f8420a90404758f7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 226893,
            "upload_time": "2024-05-17T07:51:25",
            "upload_time_iso_8601": "2024-05-17T07:51:25.533740Z",
            "url": "https://files.pythonhosted.org/packages/3b/b8/a5e1cff6a89106fd20822b442898988c7ce486844c93a4c28aa6742e476a/SuchTree-1.1-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5504b58ff6570f3d6290927d4ecae3cdb8572f638462fc173001060f8aa8ffcb",
                "md5": "c3e1bd5e38294ccbab344011a094c2f8",
                "sha256": "126f17d71883c3d6c4d781a8f9c2475467c843fa7f1fc075718a22993af35d10"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c3e1bd5e38294ccbab344011a094c2f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 1359682,
            "upload_time": "2024-05-17T07:51:28",
            "upload_time_iso_8601": "2024-05-17T07:51:28.451633Z",
            "url": "https://files.pythonhosted.org/packages/55/04/b58ff6570f3d6290927d4ecae3cdb8572f638462fc173001060f8aa8ffcb/SuchTree-1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4ef050ad1892a55c94c269ef61cc5481364622422dfefd846f2f63c15083b1c2",
                "md5": "2373050788b008fccd73e15bac40a60a",
                "sha256": "aa8062ace8743c5781a4b251ba68c4a831378961e13dcf350adf84a165a76028"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2373050788b008fccd73e15bac40a60a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 1385116,
            "upload_time": "2024-05-17T07:51:31",
            "upload_time_iso_8601": "2024-05-17T07:51:31.647481Z",
            "url": "https://files.pythonhosted.org/packages/4e/f0/50ad1892a55c94c269ef61cc5481364622422dfefd846f2f63c15083b1c2/SuchTree-1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7483482232387c7ab71ecf18b50ad1b2f55c9a22a99615dfdbc14d44093f7e78",
                "md5": "588676558df28011a6867a2d36fadc7e",
                "sha256": "cb60fc618b9fc87a7edbe7eab29585c88f863c1f6de20099b8cef658439f0d03"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "588676558df28011a6867a2d36fadc7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 205792,
            "upload_time": "2024-05-17T07:51:34",
            "upload_time_iso_8601": "2024-05-17T07:51:34.137571Z",
            "url": "https://files.pythonhosted.org/packages/74/83/482232387c7ab71ecf18b50ad1b2f55c9a22a99615dfdbc14d44093f7e78/SuchTree-1.1-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "41f2463c3030b5d5ae7c1081881989355e574e486afc42e1c56f26140631b418",
                "md5": "f51320900c3d3e6b7d2f79f3b46871d9",
                "sha256": "e9db35c229a6eb29cd24920142d4ba95747ec2bb2ce079a98716a8364780b2ce"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f51320900c3d3e6b7d2f79f3b46871d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 247254,
            "upload_time": "2024-05-17T07:51:36",
            "upload_time_iso_8601": "2024-05-17T07:51:36.741803Z",
            "url": "https://files.pythonhosted.org/packages/41/f2/463c3030b5d5ae7c1081881989355e574e486afc42e1c56f26140631b418/SuchTree-1.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "98105be3c4dcee32bc660a2721a63c2eaaed3432cfda963bf9e35ecd535b1732",
                "md5": "34031abf5ad51cd4cc7d365a61ce5656",
                "sha256": "0a1d1b3163a44fa9738eb6a9507be37d7f189d402e5caaa10d22c4da1c339b6d"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "34031abf5ad51cd4cc7d365a61ce5656",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 227119,
            "upload_time": "2024-05-17T07:51:39",
            "upload_time_iso_8601": "2024-05-17T07:51:39.105592Z",
            "url": "https://files.pythonhosted.org/packages/98/10/5be3c4dcee32bc660a2721a63c2eaaed3432cfda963bf9e35ecd535b1732/SuchTree-1.1-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "81285d394b2b22889e1730478236161c8097acb20527c5a648111721a87cc968",
                "md5": "40e3e10cb25c0280f790c7409f663749",
                "sha256": "e636fc7af6e2220f3774304c59bf6b426e12c21d096f883118f59dc049df13b2"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "40e3e10cb25c0280f790c7409f663749",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 1474806,
            "upload_time": "2024-05-17T07:51:41",
            "upload_time_iso_8601": "2024-05-17T07:51:41.272000Z",
            "url": "https://files.pythonhosted.org/packages/81/28/5d394b2b22889e1730478236161c8097acb20527c5a648111721a87cc968/SuchTree-1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "16241203f29ca921ecde416da185035c6a5d5b0fcb7931b991e242448f98afc9",
                "md5": "dc10ff8060cc0bcf50732c973a25b603",
                "sha256": "b063324910108724c9a04b1f33a28c08ff34e6d8938d142b8cf94053ae3ea881"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dc10ff8060cc0bcf50732c973a25b603",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 1502721,
            "upload_time": "2024-05-17T07:51:43",
            "upload_time_iso_8601": "2024-05-17T07:51:43.536502Z",
            "url": "https://files.pythonhosted.org/packages/16/24/1203f29ca921ecde416da185035c6a5d5b0fcb7931b991e242448f98afc9/SuchTree-1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "87eac8feffc0e670d05c6df42ed674cc9deeabef1e601adc347e8bc73de57ee8",
                "md5": "80a1bc71120015ea82409f46421d9a8a",
                "sha256": "d15f702f7d2ddf52ed61c7bdfc691de3c5f8effcfd97fdbefddc0caf3559d55f"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "80a1bc71120015ea82409f46421d9a8a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 206166,
            "upload_time": "2024-05-17T07:51:46",
            "upload_time_iso_8601": "2024-05-17T07:51:46.259404Z",
            "url": "https://files.pythonhosted.org/packages/87/ea/c8feffc0e670d05c6df42ed674cc9deeabef1e601adc347e8bc73de57ee8/SuchTree-1.1-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "42cbe8800f7768e0ed9b07c45e596ecc892eea6fb56063ea5002b7768e3926da",
                "md5": "842f4556b51de562f266387ab356f3cb",
                "sha256": "c969612bbe2d52ca1843c0ec1ca4b204d3a802941b58deccb3de22d012418654"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "842f4556b51de562f266387ab356f3cb",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 249468,
            "upload_time": "2024-05-17T07:51:48",
            "upload_time_iso_8601": "2024-05-17T07:51:48.820575Z",
            "url": "https://files.pythonhosted.org/packages/42/cb/e8800f7768e0ed9b07c45e596ecc892eea6fb56063ea5002b7768e3926da/SuchTree-1.1-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1fdf2e8cba6405a05fa09f2a0ec0d7dcf4488124206e369547cc1ce4395d9eba",
                "md5": "67cb859cf4618a5f18881c53dbf8f3f1",
                "sha256": "8a4505e0beddb6aa550111ff16adbce05d330d56b4ef766da61066dd8714c0bb"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "67cb859cf4618a5f18881c53dbf8f3f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 227165,
            "upload_time": "2024-05-17T07:51:51",
            "upload_time_iso_8601": "2024-05-17T07:51:51.322482Z",
            "url": "https://files.pythonhosted.org/packages/1f/df/2e8cba6405a05fa09f2a0ec0d7dcf4488124206e369547cc1ce4395d9eba/SuchTree-1.1-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f14fdb4653312673f7848bec602fa2338c10a10ad782e855ac2a5e5b4fba9cf6",
                "md5": "5c59f94d411c839dbfe4814496567701",
                "sha256": "98b946b9aa5b243cb489c9d33f88dc333701bf5a20ca9531835d386e2e71acdf"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "5c59f94d411c839dbfe4814496567701",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 1441042,
            "upload_time": "2024-05-17T07:51:54",
            "upload_time_iso_8601": "2024-05-17T07:51:54.320106Z",
            "url": "https://files.pythonhosted.org/packages/f1/4f/db4653312673f7848bec602fa2338c10a10ad782e855ac2a5e5b4fba9cf6/SuchTree-1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6ec6bb21462d4c216236738e76abdff2a3e9166cb3c5104abca7aa38c3c683cb",
                "md5": "67d61f9596f4690bec583346fe327b66",
                "sha256": "6b60013efb80b76291893dc43cc4c4f8ad0c962c03f9fd930d9a4e9d5b723374"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "67d61f9596f4690bec583346fe327b66",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 1489550,
            "upload_time": "2024-05-17T07:51:56",
            "upload_time_iso_8601": "2024-05-17T07:51:56.618177Z",
            "url": "https://files.pythonhosted.org/packages/6e/c6/bb21462d4c216236738e76abdff2a3e9166cb3c5104abca7aa38c3c683cb/SuchTree-1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "becb7c2fd3d73f3c8878304bec2e0a2e15cec91da3212d569f0aa42fcc73cf80",
                "md5": "d8854841b3f781992821386f17c37bc3",
                "sha256": "c4927205bfb08777a8b425a0ff165ad701cf13c3625b4d82fdcaf19dd3c37f70"
            },
            "downloads": -1,
            "filename": "SuchTree-1.1-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d8854841b3f781992821386f17c37bc3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 206298,
            "upload_time": "2024-05-17T07:51:58",
            "upload_time_iso_8601": "2024-05-17T07:51:58.807529Z",
            "url": "https://files.pythonhosted.org/packages/be/cb/7c2fd3d73f3c8878304bec2e0a2e15cec91da3212d569f0aa42fcc73cf80/SuchTree-1.1-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c59dc702697f00bc7e6689b460a978e04a1f0ef137aa69d888663daae450776e",
                "md5": "10e8ea5e4e13a72a6ee7342334b1c65a",
                "sha256": "184ec8a0b5d20e0e7dccc88c134bb25353749e929a39455eb0d2c0994b5a9c35"
            },
            "downloads": -1,
            "filename": "suchtree-1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "10e8ea5e4e13a72a6ee7342334b1c65a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 336279,
            "upload_time": "2024-05-17T07:52:00",
            "upload_time_iso_8601": "2024-05-17T07:52:00.897456Z",
            "url": "https://files.pythonhosted.org/packages/c5/9d/c702697f00bc7e6689b460a978e04a1f0ef137aa69d888663daae450776e/suchtree-1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-17 07:52:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ryneches",
    "github_project": "SuchTree",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "suchtree"
}
        
Elapsed time: 0.33579s