Collection of math-related utilities developed at Body Labs.
This library is deprecated. The following libraries were broken out from this package and now are maintained on their own:
- vg is a vector-geometry toolbelt for 3D points and vectors.
- Was
blmath.numerics.vector_shortcuts
- Was
- polliwog provides low-level functions for working with 2D and 3D
geometry, optimized for cloud computation.
- Was
blmath.geometry
- Was
- ounce is a simple package for manipulating units of measure.
- Was
blmath.units
- Was
- entente provides functions for working with meshes and pointclouds
having vertexwise correspondence.
- Includes
blmath.geometry.transform.find_rigid_transform
- Includes
Also related is lacecore (the primary successor to lace) which provides polygonal meshes optimized for cloud computation.
Special mention is given to hyla, a TypeScript counterpart to polliwog.
On macOS:
brew install homebrew/science/suite-sparse
brew install homebrew/science/opencv --without-numpy
On Linux:
sudo apt-get install python-opencv libsuitesparse-dev
pip install blmath
And import it just like the upstream library:
from blmath.numerics import vx
A collection of math related utilities used by many bits of BodyLabs' code.
Functions for manipulating numeric arrays, numbers, and linear algebra.
The most commonly used of these are directly imported into
blmath.numerics
.
- blmath.numerics.vx is a namespace of common linear algebra operations. These are easily expressed in numpy, but abstracted for readability purposes.
- blmath.numerics.coercion contains a validation function
as_numeric_array
, which produces useful error messages up front on bad inputs, in place of cryptic messages like "cannot broadcast..." later on. - blmath.numerics.operations contains basic numerical
operations such as
zero_safe_divide
. - blmath.numerics.predicates contains functions like
isnumeric
. - blmath.numerics.rounding contains functions including
"round to nearest" and
roundedlist
. - blmath.numerics.numpy_ext contains numpy utility functions.
- blmath.numerics.matlab contains some matlab shortcuts which have no numpy equivalent. At MPI the fitting code was originally written in Matlab before it was ported to Python.
blmath.numerics.linalg contains linear algebra operations.
- blmath.numerics.linalg.sparse_cg contains a faster matrix solve optimized for sparse Jacobians.
- blmath.numerics.linalg.lchol contains a Cythonized implementation of Cholesky factorization.
- blmath.numerics.linalg.isomorphism computes the isomorphism between two bases.
- blmath.numerics.linalg.gram_schmidt provides a function for orthonormalization.
Geometric operations, transforms, and primitives, in 2D and 3D.
The most commonly used of these are directly imported into
blmath.geometry
.
- blmath.geometry.Box represents an axis-aligned cuboid.
- blmath.geometry.Plane represents a 2-D plane in 3-space (not a hyperplane).
- blmath.geometry.Polyline represents an unconstrained polygonal chain in 3-space.
blmath.geometry.transform
includes code for 3D transforms.
- blmath.geometry.transform.CompositeTransform represents a composite transform using homogeneous coordinates. (Thanks avd!)
- blmath.geometry.transform.CoordinateManager provides a convenient interface for named reference frames within a stack of transforms and projecting points from one reference frame to another.
- blmath.geometry.transform.find_rigid_transform
finds a rotation and translation that closely transforms one set of points to
another. Its cousin
find_rigid_rotation
does the same, but only allows rotation, not translation. - blmath.geometry.transform.rotation.rotation_from_up_and_look produces a rotation matrix that gets a mesh into the canonical reference frame from "up" and "look" vectors.
Other modules:
- blmath.geometry.apex provides functions for finding the most extreme point.
- blmath.geometry.barycentric provides a function for projecting a point to a triangle using barycentric coordinates.
- blmath.geometry.convexify provides a function for producing a convex hull from a mostly-planar curve.
- blmath.geometry.segment provides functions for working with line segments in n-space.
Class for wrapping and manipulating value
/units
pairs.
TODO write something here
- blmath.console.input_float reads and returns a float from console.
- blmath.console.input_value combines
units
with a float input from console and returnsValue
object.
pip install -r requirements_dev.txt
pip install -e . # builds the native extension
rake unittest
rake lint
Tests are configured to run in both python 2.7 and 3.6 locally via tox as well as in CircleCI.
To run tests in multiple versions of python, run tox
:
pip install -r requirements_dev.txt
tox
You need to make sure that python2.7
and python3.6
are valid commands; this can be done in pyenv via pyenv global 3.6.5 2.7.15
This collection was developed at Body Labs and includes a combination of code developed at Body Labs, from legacy code and significant new portions by Eric Rachlin, Alex Weiss, and Paul Melnikow. It was extracted from the Body Labs codebase and open-sourced by Alex Weiss. In 2018 it was forked by Paul Melnikow and published as metablmath. Thanks to a repository and package transfer from Body Labs, the fork has been merged back into the original.
The project is licensed under the two-clause BSD license.