A new major release of pyvolve! Key new features include..
1. When calling an Evolver instance, you can specify the *algorithm* of simulation to be the Gillespie ("jump chain") algorithm. Rather than exponentiating the matrix to simulate substitutions, this algorithm simulates waiting times for individual changes. **Activate with the argument `algorithm=1`**. The default (exponentiation) is `algorithm=0`.
2. Pyvolve will now track the number of substitutions which occur along each branch. These values are guaranteed to be accurate when setting `algorithm=1`, but will almost certainly be underestimates when `algorithm=0`. When `algorithm=1`, individual substitutions are directly recorded, but with `algorithm=0` the calculations are simply P-distance calculations, which might be correct at very small branch lengths but don't trust it. There are two ways to access this information:
+ call up the Evolver attribute, e.g. for a variable called `my_evolver`, as `my_evolver.branch_substitution_counts`. This will give a __dictionary__ of counts for each relevant class of substitutions (nucleotide, amino acid, synonymous changes, or custom if you are using a custom code) for each branch. If internal nodes are not labeled, `pyvolve` will do it for you; examine this by printing the processed tree with `print_tree()`.
+ specify a `countfile` when calling your Evolver instance, e.g. `countfile = "my_countfile.csv"`. This will write a CSV to that file containing all the information in the dictionary.
Happy pyvolving!