I timed the DARE unit tests, and the new solver is 0 to 100% faster in all cases (that is, it's at least as fast as Drake's and up to 2x faster in some cases). The new solver is also much simpler, takes less time to compile, and drops the libwpimath.so size from 325 MB to 301 MB. I think most of the compilation time is coming from the eigenvalue decompositions used to enforce argument preconditions.
Upstream utils
Layout
Each thirdparty library has a Python script for updating it. They generally:
- Check out a thirdparty Git repository to a specific commit or tag
- Apply patch files to the thirdparty repo to fix things specific to our build
- Copy a subset of the thirdparty files into our repo
- Comment out any header includes that were invalidated, if needed
upstream_utils.py contains utilities common to these update scripts.
Patches are generated in the thirdparty repo with
git format-patch --no-signature so they can be applied as individual commits
and easily rebased onto newer versions. Each library has its own patch directory
(e.g., lib_patches).
Updating thirdparty library version
The example below will update a hypothetical library called lib to the tag
2.0.
Start in the upstream_utils folder. Restore the original repo.
./update_lib.py
Navigate to the repo.
cd /tmp/lib
Fetch the desired version using one of the following methods.
# Fetch a full branch or tag
git fetch origin 2.0
# Fetch just a tag (useful for expensive-to-clone repos)
git fetch --depth 1 origin tag 2.0
Rebase any patches onto the new version.
git rebase 2.0
Generate patch files for the new version.
git format-patch 2.0..HEAD --no-signature
Move the patch files to upstream_utils.
mv *.patch allwpilib/upstream_utils/lib_patches
Navigate back to upstream_utils
cd allwpilib/upstream_utils
Modify the version number in the call to setup_upstream_repo() in
update_lib.py, then rerun update_lib.py to reimport the thirdparty files.
./update_lib.py