Package: vorpy
VorpyA Python package for (usually math-related) code that I've written that finds use over and over.Vorpy is short for "VictOR dods' PYthon package".  Plus if you Google "vorpy", you come up with some prettyhilariousshit, so it seems like a good name choice.Contentsvorpy: The root module for the vorpy package.vorpy.apply_along_axes: Multi-dimensional
generalization ofnumpy.apply_along_axis.vorpy.pickle: A module which facilitates disk-based caching of
data via pickle files.  Useful when using data that is time-consuming to generate but does not often change.vorpy.symbolic: Symbolic calculus module.  This module eases
use ofsympy, facilitating the use of vector/tensor calculus (vianumpy.ndarrays of symbols),  and which allows compilation
of symbolic functions into Python code, caching the generated code if desired.  That process is known as 'lambdification' insympy.  Take a look at thecached_lambdifiedfunction within this source.vorpy.symplectic_integration: Module implementing
symplectic integrators; available is a family of separable Hamiltonian integrators and a nonseparable Hamiltonian integrator.vorpy.tensor: Module providing functions for working with tensor values, notably thecontractfunction, which does the same thing asnumpy.einsumbut allowsdtype=object.How to InstallVorpy can be installed viapipusing the following command:pip install vorpyOr, it can be installed directly from this github.com repository using the following command:pip install --upgrade git+https://github.com/vdods/vorpy.gitInstallation can also be made from a local copy of the vorpy package repo:pip install --upgrade path/to/vorpywhere path/to/vorpy is the root directory of the project; the path containing setup.py (as well as this README.md file).  Apropos: seepip install --editable <path/url>To uninstall, use the following obvious command:pip uninstall vorpyA tarball of a particular tagged version can be obtained from github using a particular link.  The latest version, with
git tagv0.4.3, can be downloaded from:https://github.com/vdods/vorpy/archive/v0.4.3.tar.gzExtracting this will create and populate thevorpy-0.4.3directory.Running TestsThe suite of unit tests can be run via the command:python setup.py testRelease Notes0.9.0: Addedintegrate_tangent_flow, added stuff tovorpy.tensorandvorpy.symplectic, added code for Bernstein polynomials and Bezier curves, some experimental work on strongly typed manifolds concepts, and a bunch of other miscellaneous work and improvements.0.8.0: Added thevorpy.linalgmodule.0.7.0: Modification to the symbolic polynomial generating functions.0.6.0: Added thevorpy.manifoldandvorpy.symplecticmodules, which implement some basic calculus in those categories.0.5.1: Fixed a bug where the Python 2reducewas moved to thefunctoolsmodule, and so caused a NameError in Python 3.0.5.0: Addedvorpy.tensor.0.4.3: More updates to be able to submit topypi.  Made tests generate files to thetest_artifactsdirectory.0.4.2: Updates to be able to submit topypi-- the Python Package Index.  Also a minor exception printing improvement.0.4.1: Changedvorpy.pickleto use thedillmodule (which can pickle lambda expressions) instead of the builtinpicklemodule.0.4.0: Addedvorpy.pickle.0.3.1: Added a means to salvage results from symplectic integration if an exception is raised during integration.0.3.0: Addedvorpy.symplectic_integration.nonseparable_hamiltonian.0.2.0: Addedvorpy.symplectic_integration.separable_hamiltonian.0.1.0: Addedvorpy.apply_along_axes.0.0.0: Initial release.  Addedvorpy.symbolic.To-Do ListMaybe use boost's python numpy stuff to write C++ using numpy constructs (ndarray) --https://jitcode.readthedocs.io/en/v1.4.0/Look into using JiTCODE to make fast numerics --https://jitcode.readthedocs.io/en/v1.4.0/Use L^inf norm for local truncation error estimate, instead of L^2 norm.  This should be faster to compute.Need to add a shape check invorpy.symbolic.lambdifiedto verify that the argument has the expected shape.  Ran into
a hard-to-find bug that was the result of passing in the wrong shape and it happily not complaining.Make a version ofvorpy.tensor.contractwhich allows for general contractions, instead of fixed letter-based contractions.Reorganize module structure to reflect the category theory of the subjects (e.g.vorpy.manfor the category of manifolds,vorpy.vecfor the category of vector spaces,vorpy.man.symplfor the category of symplectic manifolds,vorpy.man.riemfor the category of Riemannian manifolds, etc).Add parsing of 'ij,kl->iljk' style string (as innumpy.einsum) tovorpy.tensor.contract, which will just replace
theoutputkwarg.Make suretestsdoesn't get installed (it looks like it is).  OR, put tests under vorpy module (this is probably better).Look into using pytorch for faster numerics.Consolidate vorpy.symbolic.multiindex_iterator and vorpy.tensor.multiindex_iterator (probably use the one in
symbolic because it looks fancier, but it does belong within the vorpy.tensor module).Include tests in the dist package, so they can be tested at the install site.Make thesymbolicmodule aware of vectorized operations so that fastnumpy-implementedndarrayfunctions
can be used instead of structure-forgetting symbolic expressions that are fully written out.  For example,
the 1st and 2nd total derivatives of a quadratic form are simply matrix expressions which have simplenumpyexpressions.Verify thatvorpy.apply_along_axesis automatically parallelized.Requirenumpy.ndarrayortuplebe the type of the input array(s) forapply_along_axes, so that extra parens
to form a trivial tuple are not necessary in the basic case where there is a single input array.Inapply_along_axes, allow the base case whereinput_array_v[0].shape == ()andinput_axis_v == [].Increasing the order of Tao's nonseparable Hamiltonian integrator doesn't actually do what it should, even when
using very small timesteps (expected behavior is that the error is orders smaller, but what actually happens is
that it's of the same order as say order=2).  Examine why this is happening (perhaps published version of Tao
paper is updated with correction).Create a [symplectic] integrator using theJacobi-Maupertuis principle.Specify an upper bound for integrator on H error, which abs(H - H(qp(0))).  When computing the next step, if the
H error is above the upper bound, recompute that step with a lower dt.  This will involve defining a search
strategy for dt that doesn't make it too small.MovePendulumNdandKeplerNdfrom tests dir into vorpy and write tests to symbolically verify all the formulas
are correct.  The goal would be to create more of these to provide a whole family of dynamical systems that can
be used and experimented with.Have tests create atest_artifactssubdir which all files that the tests produce are put in, so there's an
easy single thing to delete after tests run (or tests can clean this up themselves).Switch topytest.Forsys.stderr.write-based warnings, create a flag that can be set within thevorpymodule to silence them.Usehashlibfor data caching layer on top ofvorpy.pickle.Make a human-readable hash, which concatenates words to represent elements of a hash space.  This should be
convertable to/from a binary string.  Examples:StupidlyWalkingPerson
BigThing
TreeMaybe also tack on the remaining bits to the end as a decimal or hex number.  Examples:StupidlyWalkingPersonA07BE5
Tree10034Seethis.Use hashing invorpy.symbolic.cached_lambdifiedon what gets lambdified so that changes to the function automatically
cause the cache to be updated.Make a module that provides a nice abstraction for concurrent.futures.ProcessPoolExecutor for parallel processing.Allow multiply-nested dirs for cache_dirname in cached_lambdified -- this would correspond to multiply-nested modules
for the cached code.  Use os.makedirs instead of os.mkdirReferencesMaintainer Release Instructions[http://docs.python-guide.org/en/latest/writing/structure/][https://en.wikipedia.org/wiki/Symplectic_integrator][https://en.wikipedia.org/wiki/Energy_drift][https://journals.aps.org/pre/abstract/10.1103/PhysRevE.94.043303] - Molei Tao - Explicit symplectic approximation
of nonseparable Hamiltonians: Algorithm and long time performanceThe package index fordill(which is imported byvorpy.pickle) makes the following request:If you use dill to do research that leads to publication, we ask that you acknowledge use of dill by citing the following in your publication:

    M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis,
    "Building a framework for predictive science", Proceedings of
    the 10th Python in Science Conference, 2011;
    http://arxiv.org/pdf/1202.1056

    Michael McKerns and Michael Aivazis,
    "pathos: a framework for heterogeneous computing", 2010- ;
    http://trac.mystic.cacr.caltech.edu/project/pathos

Please see http://trac.mystic.cacr.caltech.edu/project/pathos or http://arxiv.org/pdf/1202.1056 for further information.