Recent Releases of symforce

symforce - v0.10.1

Full Changelog: https://github.com/symforce-org/symforce/compare/v0.10.0...v0.10.1

  • https://github.com/symforce-org/symforce/commit/f16db0b42a4f402380f5b8dd58bf0f63140887cf Add typing_extensions dependency for py38

- C++
Published by aaron-skydio about 1 year ago

symforce - v0.10.0

Full Changelog: https://github.com/symforce-org/symforce/compare/v0.9.0...v0.10.0

It's been a while since we've tagged a release, so lots of minor improvements here, along with some cool new features.

🟩 Caspar

Caspar is an experimental extension of SymForce for generating high-performance CUDA kernels, along with an optimizer written in CUDA. Check out the README - more info coming soon!

  • ea19ebd1 [Caspar] Initial commit @emil-martens-skydio

🦀 Rust

SymForce has an experimental Rust backend! Generated functions are there, but some niceties like structs for geo and cam types with helper methods aren't there yet.

  • 079830ae Add minimal rust backend. @matte1

📦 Fixed-Size Optimizer

We've added a specialized optimizer for problems whose structure is known at compile time, which is more performant in those cases:

  • 2e276014 Add a fixed-size optimizer to symforce @nathan-skydio
  • 52f3e822 Split symforce optimizer code out into static helper functions @nathan-skydio
  • 3f5c9ceb Template LM solver on Values type @nathan-skydio

🚨 Breaking Changes & Deprecations

  • d0059eb8 Remove deprecated iteration_stats @aaron-skydio
  • 8fbab962 Remove deprecated methods @aaron-skydio
  • b897fd9d reset damping params in GNC @giorgio-tonetti-skydio
  • 575fd072 Generate eigen lcm matrix types @nathan-skydio
  • 94eab6d2 camera residuals take calibrations @aaron-skydio
  • f5a7e387 Symforce LCM optimizer params from floats to doubles @peter-skydio
  • 1978f1fd Mark ImuFactor constructor explicit @chao-qu-skydio

🦾 Optimizer

Some changes to optimizer behavior, around damping, early exit, and Graduated Non-Convexity: - 84803874 GNC update check @giorgio-tonetti-skydio - b897fd9d Reset damping params in GNC @giorgio-tonetti-skydio - 9ccf431f Add param to early exit LM optimizer if error is low @nathan-skydio - a693376e Add dynamic lambda update @aaron-skydio - be78c767 Exit if -tol / 10 < relative_reduction < tol @aaron-skydio

Along with lots of other cool things: - 5cc2e1bb std::bind support @aaron-skydio - 4f5f152c Add eigensparsesolver @aaron-skydio - 1d870c1e Add Optimizer::ComputeFullCovariance @aaron-skydio - d2c7d544 Optimizer::DumpGraph @aaron-skydio - 3cd72cec Add Values::MaybeGetIndexEntryAt @aaron-skydio - f26e332f Expose solver members @aaron-skydio - 376a22bc OptimizerParams convertible to/from lcm @aaron-skydio - bd7c2108 Optimizer improvements @aaron-skydio - 4adde6d3 Fix function_traits for (*const&) function pointers @aaron-skydio - 613aa03e Added additional modifiers to key @david-hug-skydio - 5d05ca12 Change format type of Iteration stats print from f to e @chao-qu-skydio - 001ff52f Cap indices in zero diagonal warning @ryan-brott-skydio

🔣 Codegen & Symbolic Toolkit

  • d0203757 Custom functions for (copy)signnozero @aaron-skydio
  • 99105e15 Improve support for 0-size matrices @aaron-skydio
  • 007b0b9c Enable OptimizationProblem to generate multiple factors @nathan-skydio
  • ae06f77f Latex-compatible symbols @aaron-skydio
  • ef181e55 Add jacobian to LieGroupOps @aaron-skydio
  • 308c3857 Allow symforce codegen C++ databuffer types to change @nathan-skydio
  • d5e3f941 Allow multiple shared types with different structures @nathan-skydio
  • f76cf3ea Values.(to|from)_dataclass @aaron-skydio
  • 617140e5 C++ custom methods have docstrings @aaron-skydio
  • 575fd072 Generate eigen lcm matrix types @nathan-skydio
  • 86efadf2 Add sf.integrate @aaron-skydio
  • 5a8cd756 Add lambdify to codegen @shreyas-skydio
  • 50c03dd5 Add util.specialize_[types, args] @aaron-skydio

🔷 Lie Group Types

  • adbbc08c Pose2/3 rotation normalization @giorgio-tonetti-skydio
  • 368af98b Add From(Yaw|Pitch|Roll) @aaron-skydio
  • c0eb0b04 Add Rot2.from_rotation_matrix @aaron-skydio
  • 127f0ec1 Add operator!= to C++ classes @aaron-skydio
  • 2aefe6d7 Add Random to generated Rot2 classes @aaron-skydio
  • 75c3b515 Add Rot3.to_tangent_norm @aaron-skydio
  • ef862209 Add to_angle for the Rot2 class @hflemmen
  • e2e11135 add Rot3.random() to python codegen @cedric-scheerlinck-skydio

🎦 Cameras

  • 4cdc5763 Add camera between/prior factors @ryan-skydio
  • 127f0ec1 Add operator!= to C++ classes @aaron-skydio
  • b82280a0 Add OrthographicCameraCal to Symforce @peter-skydio
  • c14064c4 Add tangential coefficients to SphericalCameraCal @ryan-skydio
  • 94eab6d2 camera residuals take calibrations @aaron-skydio
  • f23b83e4 Generalize reprojection residuals @aaron-skydio

📈 IMU Preintegration

  • 48d75051 StorageOps for PreintegratedImuMeasurements @aaron-skydio
  • 976495b6 Wrap ImuPreintegrator @aaron-skydio
  • 4dc75e45 IMU Preintegration symmetric covariance @aaron-skydio
  • cb5cf4c6 Add imu roll forward @aaron-skydio
  • e86f0852 Add ImuWithGravityDirectionFactor @aaron-skydio
  • 3616a56a Add ImuFactor with gravity @aaron-skydio
  • fbbe5fc9 IMU lcmtypes are printable @david-hug-skydio
  • 08248fa4 Added LCM support for IMU measurements @david-hug-skydio
  • 155d36f8 Modified constructors for IMU factors @david-hug-skydio
  • c28108c8 Add a method to return bias corrected delta in PIM @chao-qu-skydio

🚅 Performance Improvements

  • 8a99b7eb Add fast CreateIndex overload @aaron-skydio
  • 69a2db8b Avoid analyzing sparsity pattern twice @nathan-skydio
  • 4dc75e45 IMU Preintegration symmetric covariance @aaron-skydio
  • 7c7bbde8 build symforce_gen with -ffast-math @aaron-skydio
  • bd7c2108 Optimizer improvements @aaron-skydio
  • 7d5f4f71 hessianstoragecol_starts is flat @aaron-skydio

🖊️ SkyMarshal & eigen_lcm

Lots of cool new string formatting and reflection tools in the generated C++ bindings!

  • d0f4557a Added more eigen_lcm types @jianwei-sun-skydio
  • 34a8616b additional nodiscard @duncan-mazza-skydio
  • d3298b84 Add protolcm support for symmetric matrices @alvin-sun-skydio
  • e815020f Make hash types consistent @jerry-skydio
  • 42b8b836 Nvcc bug fix @eliot-hsu-skydio
  • 4119a3e8 Refactored creating custom eigen_lcm rectangular matrices @jianwei-sun-skydio
  • c8c512dc Fix includes for multi-dim bool arrays in lcm generated C++ @max-krogius-skydio
  • b896833d Java enum types @stevemo-skydio
  • 9958f0a3 Allow unknown properties @aaron-skydio
  • 9bd42c71 Support "omitenumwrapper" for #protobuf enums @jerry-skydio
  • 52872a39 Add char[] package type functions @aaron-skydio
  • 0f27a5a9 Turn formatfield into showfield @jerry-skydio
  • 4cc4add9 Fix storing for basic_string @jerry-skydio
  • b94088a3 Rename lcmjson -> lcmreflection @jerry-skydio
  • caa48bc8 lcm types can store values using pathspecs @jerry-skydio
  • 42e0a287 Pass field index to format instead of field name @jerry-skydio
  • 6b4f47e1 use real c++ bool as boolean type @jerry-skydio
  • 9d965f82 Fix build for eigen >= 3.4 @jerry-skydio
  • 1441f884 LCM types can produce formatted json @jerry-skydio

🐛 Bugfixes

  • 27e3ba5c Specify README Encoding in setup.py @DavidIngraham
  • 955b8fdb Fix build with spaces @aaron-skydio
  • 5f4079ee Fix BAL example @aaron-skydio
  • ebb33930 [SymEngine] Fix indexing in MatrixBase::hash @aaron-skydio
  • d395f5ae Fix sym.Rot3.from_rotation_matrix() so it is robust to 180 degree rotations @divyanshu-skydio
  • 8f86c6be Don't delete modules if the modules do not exist @nathan-skydio
  • 0381a712 Add FilterCameraOutliers outlier removal to BAL example @mariusud
  • 6798e499 Fix fromrotationmatrix @aaron-skydio
  • 83ac7608 Update rerunifneeded.py @chengguizi
  • 3862ebc2 Fix symbolic zeros in sparse factors @aaron-skydio
  • f8935811 Fix sorted optimized keys in residual cache @aaron-skydio
  • 9ec1de70 Fix singularity in barriers @aaron-skydio
  • 45249fb4 [SkyMarshal] Fix printing char-like things @aaron-skydio

...

And more!

- C++
Published by aaron-skydio about 1 year ago

symforce - v0.9.0

Full Changelog: https://github.com/symforce-org/symforce/compare/v0.8.0...v0.9.0

New in this release, we’ve added an experimental dense optimizer, greatly improved the docs, and made some additions to the core symbolic API and codegen API. We also have lots of under-the-hood changes, to the optimizer and the build in particular. Keep reading for more details, and thanks to everyone who contributed!

:rotating_light: Breaking Changes

We're removing a few things that have been marked as deprecated for several releases now. We're also switching our C++ API to use references for mandatory input-output arguments, and deprecating the versions that used pointers, for consistency with our styleguide and modern best practices. And finally, we've removed the early_exited field from the OptimizationStats in favor of a more comprehensive description of exit status.

  • 26838351 Remove deprecated stuff @aaron-skydio
  • b660c97b opt output-args by reference, not ptr @bradley-solliday-skydio
  • c3d2f3c9 Expose optimization status @aaron-skydio

:brain: Optimizer Changes

SymForce now has a dense optimizer! This is designed for problems where the problem linearization is dense enough that it's better to perform a dense Cholesky decomposition rather than a sparse one. It's currently in an experimental state, you can find example usage here.

As part of this, we've also made several changes to make it easier to swap out different parts of the optimizer like this.

Plus, we now expose more information about the result of an optimization beyond whether it just exited early - you can find that in status and failure_reason in the OptimizationStats.

  • 1c6ad68b Add basic test of Dense optimizer @bradley-solliday-skydio
  • d30d1b29 CheckDerivatives gets any linearizer @bradley-solliday-skydio
  • bdc665b9 Be Sparse/Dense Linearizer agnostic @bradley-solliday-skydio
  • 9d0e3e16 Allow dense linearization in optimizer @bradley-solliday-skydio
  • fd747762 OptimizationStats Linearizat'n agnostic @bradley-solliday-skydio
  • 6501a459 Add DenseCholeskySolver @bradley-solliday-skydio
  • c3d2f3c9 Expose optimization status @aaron-skydio
  • ff17a89e Overload ComputeCovariance for MatrixX @bradley-solliday-skydio
  • d792e993 Add dense linearizer @bradley-solliday-skydio
  • 47b4ccc6 Factor out core of ComputeFactorHelper @bradley-solliday-skydio
  • f5356d89 Rename opt/cholesky opt/sparse_cholesky @bradley-solliday-skydio
  • caea9da5 add in computeallcovariances to the py optimizer @harrison-skydio
  • f37a7836 Make LevenbergMarquardt Sparse agnostic @bradley-solliday-skydio
  • f8cad34b Add helpful err msg if unopt'zed factor @bradley-solliday-skydio
  • 6c3902d0 Template Linearization on sparsity @bradley-solliday-skydio
  • 7a34ec0c Rename linearizationsparsekey_helper @bradley-solliday-skydio
  • 0abeb62b Reduce # of public Linearizer methods @bradley-solliday-skydio
  • 978ea345 Make optimization stats sparse agnostic @bradley-solliday-skydio
  • 4f701197 Move ComputeKeysToOptimize to factor.h @bradley-solliday-skydio
  • f03e353f Correct init residual order @bradley-solliday-skydio
  • 8fd8c1c2 Update doc-string to reflect signature @bradley-solliday-skydio
  • 59a03099 output_arg& UpdateXXXFactorIntoTriplets @bradley-solliday-skydio
  • 7eda4932 Add PreallocatedLinearizedDenseFactors @bradley-solliday-skydio
  • a0668084 Reduce # of index lookups in linearizer @bradley-solliday-skydio
  • bdb848b4 Avoid second unordered_map lookup @bradley-solliday-skydio
  • f8743e78 rm index from LinearizedFactor types @bradley-solliday-skydio
  • d1b538c8 Add shape to sparsity pattern in stats @aaron-skydio
  • b660c97b opt output-args by reference, not ptr @bradley-solliday-skydio
  • 9266eb54 Add full stats to Python result object @aaron-skydio
  • 596e3bc4 Explicit instantiations for opt @bradley-solliday-skydio
  • e37758d7 Add missing pragma once @bradley-solliday-skydio
  • 52fc289e Declare explicit instantiation @bradley-solliday-skydio

:books: Documentation Improvements

We've made multiple improvements to our docs for this release, both in readability and content. We have a new theme (with dark mode :sunglasses: ), and the API docs now have things formatted and cross-linked correctly. Check them out at https://symforce.org!

  • 3aef619b Add note about numerical epsilon @aaron-skydio
  • c1d1ecb7 More docs @aaron-skydio
  • ee77f270 Fix returns in docstrings @aaron-skydio
  • 2dc5dda4 Clean up python sym docs @aaron-skydio
  • 43cdfff9 Switch docs theme to Furo @aaron-skydio
  • 12529d3a Clean up opt docs @aaron-skydio
  • 0e0fafc0 Partially clean up sym opt C++ docs @aaron-skydio
  • cce64be3 Fix links from generated to symbolic classes @aaron-skydio
  • caf55f42 Docs cleanup, take 2 @aaron-skydio
  • e75ffb09 Docs cleanup, take 1 @aaron-skydio
  • e8339037 Update cameras tutorial @xipengwang
  • 8ad6bab7 Added example code for initialization of sf.Rot3 using a quaternion @VineetTambe
  • fb0e6cb3 Fix docs for Pose*.(retract|local_coordinates) @aaron-skydio
  • dfa4d18f Add comment on sf.atan2 @aaron-skydio
  • 7269521e Reorder optimizer.py docstring @aaron-skydio
  • 40f129ce Clean up tangentDstorage @aaron-skydio

:pen: Codegen Improvements

We've made improvements and additions to codegen usage, and to the Python and PyTorch backends. In particular, we've added lambdify and numbify functions, to easily convert symbolic functions to numerical ones for fast evaluation in Python. For example,

```python def foo(x: sf.Scalar, R: sf.Rot3) -> sf.Scalar: return (R * sf.V3(x, 0, 0)).x

foo_numeric = symforce.util.lambdify(foo)

foo_numeric(5.0, sym.Rot3()) ```

  • 13872972 Broadcast tensors before stacking in pytorch backend @zachary-teed-skydio
  • 5c0d48d1 TemplateList.render supports specifying external search paths @gareth-cross
  • b7bc6992 Add updatetemplatedata to CodegenConfig @gareth-cross
  • 03fc8be0 Add lambdify, numbify @aaron-skydio
  • 5a36e4c0 Use Codegen.name as python function name @bradley-solliday-skydio
  • d8056975 NumericFactor sets return2dvectors @aaron-skydio
  • 6adfbee0 Add evict option for load_generated_function @aaron-skydio
  • 68f39241 Generate Rot3.(fromangleaxis, fromtwounit_vectors) @aaron-skydio

:symbols: Symbolic API Improvements

  • 5bb0bddb Consolidate lists of types @aaron-skydio
  • c1b37fdc no more logmapacosclamp_max @aaron-skydio
  • c1fdca12 Check types of geo constructor arguments @aaron-skydio
  • d337809d Add Matrix.det() @aaron-skydio

:gear: Buildsystem / Infra Changes

  • df4f86c7 Print out fmt and spdlog version when finding packages @chao-qu-skydio
  • e64a1d8f Small fix to tl-optional handling in cmakelists @chao-qu-skydio
  • fe2a559d Fix symengine_wrapper search @aaron-skydio
  • ae2173a2 Clarify error on failed symengine import @aaron-skydio
  • f9c21ade Specify fmt version in find_package @chao-qu-skydio
  • d7a40fae Bump cmakeminimumrequired version to 3.19 @chao-qu-skydio
  • 5bce25cc Upgrade requirements @aaron-skydio
  • c2283dbd Fix test include paths @aaron-skydio
  • 33f46d89 Packaging cleanup @aaron-skydio
  • 6c54bf5b Force pybind11 version @asaba96
  • c91bd036 Add max cmake policy version @aaron-skydio
  • db687f01 Remove unnecessary tl::optional alias @aaron-skydio
  • d56c10c7 Install symforce slam @johhat
  • 951884c9 Use URL for FetchContent @aaron-skydio
  • c7de4670 Fix symforce dependency of TartanLlama/optional @arturo-skydio
  • 8545df66 Upgrade dependencies @aaron-skydio
  • 30bd18e3 Drop bionic from CI @aaron-skydio
  • ee6ac287 build_wheels works on forks @aaron-skydio
  • 29b1ad11 Upgrade pylint @aaron-skydio

:police_officer: SkyMarshal

  • 7714ea70 [SkyMarshal] Print eigen_lcm types @aaron-skydio
  • fd6543b1 [SkyMarshal] Enums have getTypeNameArrayPtr @aaron-skydio
  • 61d70f03 skymarshal: only parse argfiles for the first argument @william-smith-skydio
  • ccb56201 [SkyMarshal] Make enums mypy-checkable @aaron-skydio
  • 5815fbd1 Add/fix some type annotations in skymarshal @aaron-skydio

:sparkles: Misc

  • 0940fa5b Fix new_symbol on py3.10+ @aaron-skydio
  • 2afcce34 Objects returned from generated functions are const @aaron-skydio
  • ace29ab9 More stuff includes-what-it-uses @aaron-skydio
  • 024818fb SYM_ASSERT takes messages @aaron-skydio
  • df0a8d2f Remove redundant virtual in GncOptimizer @chao-qu-skydio
  • b8821c9d A couple of random typos @chao-qu-skydio
  • 3cc60618 Replace empty ctor with =default in factor and values @chao-qu-skydio
  • 82d3a1ab Use range-based for instead of index-based @chao-qu-skydio
  • 07a53fd2 Finish removing os.path @aaron-skydio
  • 5be27bda Fix a shadowing declaration in PopulateIterationStats @chao-qu-skydio
  • 4539394c Add a SetNew method that throws if key already exists @chao-qu-skydio
  • 72c45e43 Use the _t variant instead of ::type @chao-qu-skydio
  • cfa72f1a Replace a couple of typedefs with using @chao-qu-skydio
  • 0f0c8023 Remove redundant static in an unnamed namespace @chao-qu-skydio
  • 7b221083 Add Unit3 to cc_sym @aaron-skydio
  • 35fd2d9d return sizet instead of int32t from values::NumEntries() @chao-qu-skydio

- C++
Published by aaron-skydio almost 3 years ago

symforce - v0.8.0

Full Changelog: https://github.com/symforce-org/symforce/compare/v0.7.0...v0.8.0

This is probably our biggest release yet, with multiple major additions - we have built-in IMU Preintegration, new backends for CUDA and PyTorch, and a new symbolic type for unit vectors on S(2). Plus, we've made major improvements to memory usage in the C++ optimizer, made lots of additions to the symbolic API, and made plenty of improvements under the hood.

:rotating_light: Breaking Changes

  • ae434760 Slices of 1D matrices are matrices, not lists - taking a 1D slice of a geo.Matrix now returns a geo.Matrix, previously it would return a list.
  • f60180e6 Add includejacobians flag - by default, the Optimizer will now not allocate or populate the problem jacobian, since it is not needed for optimization. If you'd like it to be filled out, set `includejacobianstotrue`.
  • There are some simplifications to the sym::Factor API, described in Code Cleanup / Refactoring below. Most users should be unaffected.
  • Generated Python functions return vectors as 1D ndarrays - see the description below

:chartwithupwards_trend: IMU Factor

SymForce has IMU Preintegration! We have a C++ ImuFactor with preintegration and linearization functions generated from a symbolic implementation. See the PRs #279 and #280 for more information, and see imu_factor.h for an example. - ab1c6211 Add an on manifold Imu Factor @bradley-solliday-skydio

:mechanical_arm: CUDA Backend

The CUDA backend generates __host__ __device__ functions, i.e. functions that you can call from within a CUDA kernel. It's currently in an experimental state, and supports scalars, vectors/matrices, and sf.DataBuffer in the APIs of generated functions; other types like geo and cam objects can be passed via their storage vectors. See the commit for more examples. - 45b2ce2c CUDA Backend @aaron-skydio

:fire: PyTorch Backend

The PyTorch backend generates python functions that operate on PyTorch tensors, with each symbolic op becoming one PyTorch op. It supports broadcasting these operations across multiple optional batch dimensions. Like the CUDA backend, this is currently experimental - it supports scalars and vectors/matrices in generated functions APIs, and is not particularly optimized for performance. - a5341d81 PyTorch backend @aaron-skydio - 5835edf9 Better PyTorch test coverage @aaron-skydio

:white_circle: geo.Unit3

The Unit3 symbolic type lets you represent unit vectors in 3D, including optimizing unit vector variables and performing manifold operations on them. - 6dadff98 Add geo.Unit3 to model directions in R^3 @chao-qu-skydio

:arrow_right: Generated Python functions return vectors as 1D ndarrays

By default, generated python functions will now return 1d ndarrays for outputs that are row or column vectors (including 1x1 matrices). This includes member functions of generated python types, such as sym.Pose3.position(). See the commit for more information. - 718d0614 return 1d vectors if !return2dvectors @bradley-solliday-skydio

:dash: Optimizer Performance/API Improvements

Major improvements to memory usage in the C++ optimizer, especially for large problems like bundle adjustment that have lots of small factors. Also, converting a sym::Values to LCM is significantly faster. - f60180e6 Add includejacobians flag @ryan-brott-skydio - 5b756a65 Linearizer: stop storing dense linearized factors @ryan-brott-skydio - 1c1268a3 Turn off sortby_offset for keys when get LCM message @xipeng-wang-skydio - c7b2715a Factor Jacobian factory functions are constructors @aaron-skydio - 8111eb28 Factor supports more functor types @samuel-wang-skydio

:symbols: Symbolic API additions

  • 892885bd Default to automatically picking output_names @aaron-skydio
  • ae434760 Slices of 1D matrices are matrices, not lists @nathan-skydio
  • 652bc74a Add CSCFormat.to_matrix @nathan-skydio
  • bd42ee96 Add metadata field to ResidualBlock @nathan-skydio
  • a9598269 Simplify geofactorscodegen w/ skipdirnesting @bradley-solliday-skydio
  • fc4b4d5d More logic methods @aaron-skydio
  • 6ed28d93 Add V2.x,y and V3.x,y,z @aaron-skydio
  • 42b9694f Add sf.clamp @aaron-skydio
  • 9769ee34 Add unit_* shorthands to Matrix @aaron-skydio
  • 1c44a943 Pipe sparse_matrices through Codegen.function @aaron-skydio
  • 24eaf202 Add CodegenConfig.custom_preamble @aaron-skydio
  • a4d4bbc2 Check that namespaces are valid identifiers @aaron-skydio
  • 04acf8a9 Allow setting default epsilon to same value @aaron-skydio
  • f8f7eb46 Assert Matrix shape is correct when copying matrix @bradley-solliday-skydio
  • 23b1f84a Change default epsilon value to symbol @bradley-solliday-skydio

:broom: Code Cleanup / Refactoring

  • 6c3cc2d5 Cache factor indexes in the Linearizer @aaron-skydio
  • 9774673e Raise exception during codegen if name is not valid @nathan-skydio
  • 3e11ebd1 Check sparse matrix condition for Jacobian and Hessian constructors @changh95
  • 783ede7c Reduce the overload set of Factor constructors @chao-qu-skydio
  • af42fd81 DataBuffers not marked as unused @aaron-skydio
  • 305387d6 Reduce surface area of keystofunc and keystooptimize @chao-qu-skydio
  • 1244d2ce Move Factor::IsSparse to the Helpers section @chao-qu-skydio
  • af2dff09 Optimizer asserts keys and factors are nonempty @aaron-skydio
  • 4a3fd727 Clear before reserve in OptimizationStats.Reset() @chao-qu-skydio
  • b2cceee3 Use the correct default epsilon in optimizer @chao-qu-skydio
  • 49018a4a Use operator bool of std::function to determine is_sparse @chao-qu-skydio
  • 91719064 Pass sink parameters by value and move @chao-qu-skydio
  • d3bb744b Change some usages of ScalarType to Scalar @chao-qu-skydio
  • 474f1bd5 Fix a linter error when a geo type does not define @chao-qu-skydio
  • 26dfa72b Matrix types cleanup @aaron-skydio
  • c835dbdc Reduce number of functor copies in factor creation @chao-qu-skydio
  • ecdeeef7 Make Key constexpr @chao-qu-skydio
  • da7b88d1 Include cstdint instead of stdint.h @chao-qu-skydio

:gear: Infra / Buildsystem changes

  • 9741edff Set min version of lazy-object-proxy to 1.9.0 @bradley-solliday-skydio
  • 0f4ca330 Fix symengine python_requires for setuptools 67 @aaron-skydio
  • 4c368815 Run tests once @aaron-skydio
  • 4a0e69b1 Update requirements @aaron-skydio
  • 2207030f requirements_test supports running from different locations @aaron-skydio
  • 1f53590f Add clang to CI, simplify matrix @aaron-skydio
  • a04ae351 symforce/test/*.py covered by pylint @aaron-skydio
  • 02e86d90 Use gcc 5.5 instead of 5.3 in CI @aaron-skydio
  • 791347a1 GitHub Actions Workflow Updates @aaron-skydio

:police_officer: SkyMarshal

  • 732ce358 Typescript updates @vincent-lecrubier-skydio
  • faeb8d18 All name functions are constexpr @aaron-skydio
  • 61846938 Remove unused variable @aaron-skydio
  • aaa593e5 Typescript changes @rachel-skydio
  • 6dc889a2 Add support for optional UNKNOWN=0 alias for enums in LCM protobuf generation. @karl-rosaen-skydio
  • 78ad2292 Require python LCM arguments to construct using from_all_fields @peter-skydio

- C++
Published by aaron-skydio over 3 years ago

symforce - v0.7.0

Full Changelog: https://github.com/symforce-org/symforce/compare/v0.6.0...v0.7.0

:rotating_light: Breaking Changes

sf.Pose2_SE2 and sf.Pose3_SE3 are now in geo.unsupported (also accessible through sf.unsupported). We haven't removed any functionality, just moved them to clarify that they are not intended to be supported by much of SymForce and we do not intend to add more support for them. The sf.Pose2 and sf.Pose3 classes should be used instead, since they use more efficient representations. - 1c1cfd10 Move SE(n) classes to geo.unsupported @aaron-skydio

:snake: Python 3.11 Support

SymForce now supports Python 3.11! As of this release you should be able to build symforce from source or install it with pip on Python 3.11.

  • 84f0fc71 Add py3.11 to list of supported versions @aaron-skydio
  • 0bc8ea66 Python 3.11 support @aaron-skydio
  • 443997a4 Update requirements @aaron-skydio

:spiral_notepad: Documentation and Examples Improvements

  • 68280302 Fix links and warnings in tutorials @aaron-skydio
  • 982ac127 Add internship callout, video link @aaron-skydio
  • c55badc9 Add note to README about epsilon @aaron-skydio
  • 6f100c51 Fix robot2dlocalization plotting @aaron-skydio
  • 5d816800 Add info on make install to README @aaron-skydio
  • fd644ff5 Create Values before Factors in examples @aaron-skydio

:chartwithdownwards_trend: Optimizer Improvements

  • e11c49f8 unique ID for Values and reset factor index_entries when input values changes @samuel-wang-skydio
  • da76e738 Count linearized factors then allocate @aaron-skydio
  • 22737378 Initialize default key contructor @simutisernestas
  • d9132d2c Expose jacobian and cholesky factor sparsity patterns @aaron-skydio

:hammerandwrench: Buildsystem / Infrastructure / Testing Improvements

  • b9795e1e Use checkout@v3 everywhere @aaron-skydio
  • 417f5662 Fix make test_update on macos @bradley-solliday-skydio
  • ec17afd1 stubs codegen test doesn't require the manifest @aaron-skydio
  • d2bb8a42 Add symforceroot and symforcedata_root @aaron-skydio
  • aaa78465 Move unused-import pylint ignore to one line @aaron-skydio
  • 352116fc Add workflow_dispatch trigger for CI @aaron-skydio
  • 3de6517c Remove unused interface library @bradley-solliday-skydio
  • 3571634a Update Catch2 to v3.1.1; Test on ubuntu jammy @bradley-solliday-skydio
  • af296202 Forward CMAKEPREFIXPATH to symengine @brian-kubisiak-skydio
  • 7ca1e438 Fix lcmtypes install during editable installation @bradley-solliday-skydio
  • cfa8e045 Editable install test fixes @aaron-skydio

:police_officer: SkyMarshal

SkyMarshal C++ bindings can now serialize and deserialize messages larger than 2GiB

  • 1552cbdb Use ptrdiff_t for encode/decode sizes @aaron-skydio
  • 95dd10b0 Misc typescript change @vincent-lecrubier-skydio

:sparkles: Misc

  • 694e2ca7 Add _symengine_ attr to matrix class @roy-vorster-skydio
  • 96192292 Added assert to prevent codgen with nested databuffers @nathan-skydio
  • 5cf18404 Fix bug that caused symengine symbols types to be pass-by-ref @roy-vorster-skydio
  • d7220a07 More dataclasses over dicts @aaron-skydio
  • 6447174e Purge os.path @aaron-skydio
  • b16b2cb3 Add codegenutil.loadgenerated_function @bradley-solliday-skydio
  • 238765e9 Add interpolate lie group operation @roy-vorster-skydio
  • 3e543e8e Always raise IndexError if wrong shape genned code @bradley-solliday-skydio
  • 7d58556f Default log level is info @aaron-skydio
  • f0ef3289 sym class constructors accept column vectors @bradley-solliday-skydio

- C++
Published by aaron-skydio over 3 years ago

symforce - v0.6.0

History: v0.5.0...v0.6.0

:symbols: Default Epsilon Configuration

Building on the tools from v0.5 for enabling configurable default epsilons for library functions, add checks to enable confidently generating code without worrying about forgetting to pass an epsilon somewhere, which would previously result in an unsafe generated function. Generating a function without calling symforce.set_epsilon_to_symbol() or symforce.set_epsilon_to_number() will produce a warning, since this allows unintentionally calling functions with singularities with an epsilon of 0. Similarly, setting epsilon to a symbol, but then attemptting to generate a function that doesn't take an argument for epsilon, will yield a descriptive error message. This behavior is also configurable through new additions to the CodegenConfig. The error messages are intended to have thorough explanations, so let us know if they don't make sense by creating an issue! - 559e521f Set the default epsilon to a symbol for codegen - f17d8b20 Run python tests with ctest - 713a00af Add sym.epsilon

:heavyplussign: Call User-Defined Functions from Generated C++

The code generator supports replacing builtin functions with user-provided alternatives. For instance, a custom my_lib::fast_sin function can be replaced for std::sin. The CppConfig has a new argument override_methods which can be used to specify these functions.

Shoutout to Roy Vorster for contributing this!

  • 7f9cf250 Add function specific overwrites to sympy CPP printer

:factory: More methods on generated types

Add more methods to bring generated Python types up to parity with generated C++ types. In addition, automatically generate some previously handwritten methods.

  • 48f69680 Codegen PoseX.position and rotation
  • 90f14a01 Generate handwritten sym geo methods
  • 81fa5025 Uniform position/rotation accessors
  • 1e958632 Generate tohomogenousmatrix for pose types
  • 8e2b19ca Codegen ToYawPitchRoll for C++ Rot3

:snake: Generated Python functions are more rigorous about Matrix shapes

PythonConfig supports options for whether generated Python functions should expect all matrix inputs to be 2D arrays, or allow vectors to be 1D arrays. This fixes the previous unintuitive behavior of expecting storage arrays.

  • c163cb61 Reshape matrix inputs to be rank 2
  • 652eb97a Add matrix accessor format function to config and remove matrixis1d param

:wrench: CI/CD

Add a continuous testing suite on main and on pull requests across compilers and Python versions. In addition, add automatic deployment of the symforce docs to https://symforce.org.

  • ff5a34b2 Rerun tests with output on failure
  • 716befd8 Add docs as an artifact of CI runs
  • 6dd9f9a8 Run CI on push to main and build badge
  • d9633f32 Preserve downloads symforce-org.github.io
  • de296a87 Auto-deploy docs on push to main
  • 20548c31 Add SymForce CI

:broom: Code Quality Improvements

Various internal improvements, fixing C++ build warnings, sorting imports, and refactoring internal modules

  • d10ac9a5 Sort imports with isort
  • 6d1c918d Fix warnings
  • 322faba3 Sort some imports
  • b268447f Removed unused imports in symforce python function codegen template
  • c3d0a255 Move things to typing_util
  • 525f229f Misc changes to tests
  • a7999d60 TemplateListEntry -> dataclass
  • d154598a Modify optionality of template_dir arg
  • 3f467fa9 Make TemplateList.add arg order match
  • 429e6ac5 Take relative path in render_template

:police_officer: SkyMarshal

  • 58e37ea3 [SkyMarshal] Sort imports
  • a815051f [SkyMarshal] static functions in lcmcoretypes are `attribute_((unused))`
  • d2760d7d [SkyMarshal] Explicitly static_cast hashes to int64

:gift: Misc

  • 693f2702 Clarify docstrings on SE(n) classes
  • da612a98 Update installation instructions
  • 8f01c0d9 Bump version to 0.6
  • a948a315 Add failing test for factor cache with custom jacobians
  • 9b3c47bf More factor cache fixes
  • 48fd72d6 Use corrected runpaths w/ setup.py develop too
  • 29310df2 dev_requirements.txt errors on py < 3.8
  • d2181a84 Add note about building from a release
  • 94d1bfab SparseCholesky is MPL2
  • b3d6edb2 Fix of pip install -e . on both macos and ubuntu
  • e97a5fda Upgrade to sympy 1.11
  • 9a20a812 Fix factor cache
  • 48699d1a Add more named Matrix types
  • 47f4adbe Fix values_tutorial link
  • 324bba21 LM Optimizer prints out id with iteration stats
  • 40a6c9e0 Pull in the latest tl::optional
  • b339396c Add numba to dev_requirements.txt
  • e2ed9624 Symforce add sparse_linearization option to factor.py
  • 7289ce0f Don't add symengine to sys.modules if import fails
  • e131eae9 Use SYMFORCEPYTHON for rerunif_needed
  • 75201b6e Fix build on cmake >=3.23
  • d8e992f7 Fix broken links in README
  • 71d36b08 Raise ValueError if subs args are different lengths
  • 73d5dbe5 Symforce Values.from_storage allow different scalar types
  • 73b22a5f Allow symforce storage ops to return numeric types
  • d50dbba2 Fix docs for Group and LieGroup
  • eeadcee9 Added getter function for symforce optimizer params
  • cea8701d Move error message for wrong number of keys
  • 367eeb85 Added helper function for converting Symforce Values to dicts
  • 68384d0b Dataclass ops support T.Tuple
  • 2d1a615e Codegen performance improvements
  • e9ef4029 LinearCameraCal doesn't take Abs(z)
  • 65f6d008 Use sf.sympy.Eq in symboliccomputationspeedups.ipynb
  • 52d2b5d1 Regenerate with make testupdateall
  • 87c031b5 Better errors from wrong factor results
  • c0933d07 Fix type annotation
  • f6496d68 Remove local Catch2 (instead fetch it)
  • cdf8560e fix bug w/ lcm gen for large matrix
  • d614535b Make cc_sym types pickleable

- C++
Published by aaron-skydio over 3 years ago

symforce - v0.5.0

History: https://github.com/symforce-org/symforce/compare/v0.4.0...v0.5.0

:rotatinglight: Symbolic API moved to symforce.symbolic :rotatinglight:

The symbolic math components of SymForce are now unified under one import for ease of use:

python import symforce.symbolic as sf

The symforce.symbolic module contains the SymForce-modified SymPy (or SymEngine) API, with our added logic functions and helper functions (i.e. things that were previously accessible from symforce.sympy), geometric lie group types (from symforce.geo), and camera types (from symforce.cam). If you just want the geo or cam types, those modules still exist and can be imported instead.

Usage of symforce.sympy is deprecated, you should use symforce.symbolic instead. It will be removed in a future release.

  • 46dc58bf matrix.fixedtypefromshape -> matrixtypefromshape
  • b34909bc Add deprecated symforce.sympy stub
  • 5e0afd5f Add T.Scalar to sf
  • a26a9d54 Add geo and cam to symforce.symbolic
  • 192f5cf8 Move sympy api to symforce.symbolic

:symbols: Configurable default epsilons for library functions

SymForce now provides more flexibility around setting the default value of epsilon, its mechanism for handling singularity points.

Many library functions require an argument for epsilon, and previously defaulted it to 0 for ease of prototyping e.g. in a notebook. For runtime code, however, this can be a potential source of issues, since it can be easy to unintentionally forget to pass epsilon to one of these functions, meaning that an unhandled singularity creeps in. To address this, we have added a function sf.epsilon() which should be used as the default epsilon argument for library functions. The value that this returns is configurable - the default is 0 (so by default, behavior is the same). However, it can also be set to a symbol with sf.set_epsilon_to_symbol(), which is recommended for generating production code. Similarly, it can be set to a numerical value with sf.set_epsilon_to_number(). Either of these must be called before importing symforce.symbolic.

  • f63171cc Fixed default epsilon
  • 71339479 Use sm.epsilon() as default eps
  • 8965840c sm.defaultepsilon -> sm.numericepsiln

:gear: Unified mechanism for adding code generation backends

We've unified much of the backend-specific differences, so that it should be easier to add new code generation backends going forward. See the PR and the example of adding a JavaScript backend for more information.

  • e4c2d19c Centralize code for creating new code generation backends

:police_officer: SkyMarshal Updates

  • 90c48913 Enable skymarshal printing by default
  • 5fb13f75 Allow unknown notations in skymarshal
  • 06be0d83 [Skymarshal] Generate operator<< for all types

:hammerandwrench: Build System Fixes

  • 2e14e4d1 Add minimum spdlog version
  • fba4ae81 Workflow and build support for pip wheels
  • 7f59396c Bump default pybind to 2.9.2
  • ea82c15c Remove spdlog (and eigen and catch2) from the manifest
  • 7efa7cd6 Misc docs, CMake, and packaging fixes
  • 322c5642 Upgrade pip requirements
  • c321ca01 Install eigen_lcm headers
  • aba8ef79 Fix install paths

:gift: Misc other changes

  • e7fea68f Fix spelling of word perturbation in lie-group docstrings
  • 7c778ccd Use spdlog::set_level instead of sym::internal::SetLogLevel
  • 411c8456 Retry symforcedocstest 3 times on failure
  • 3915767e Copy robot2dlocalization example
  • 234f8275 Make robot3dlocalization comment true
  • 41fbca04 Remove duplicate epsilon files
  • 7bee06e7 Change formatpydir to take T.Openable
  • 5f4b9fc6 Emit a warning if optimizing factors that don't touch any keys
  • 84a1ca2c Call modifysymbolicapi once per sympy
  • cccb324a Fix up C++ example in README
  • 43c2dfd9 Fix derivatives of sm.Mod
  • 165b0974 Fix plotting code for robot3dlocalization example
  • 9e08a786 fix factor_utils failing to compile on clang-6.0
  • 60c9ccf6 Ret Path (!str) in generatelcmtypes
  • bdd50e94 Enable sparse cc_sym.Factor creation

- C++
Published by aaron-skydio almost 4 years ago

symforce - v0.4.0

v0.4.0 is the first public release of SymForce outside the early-access program, and the first release after the paper was accepted to RSS 2022. SymForce can now be pip installed on Linux and Mac with pre-built wheels.

History: https://github.com/symforce-org/symforce/compare/v0.3.0...v0.4.0

✨ Support for sparse matrices and factors in Python

Previously, SymForce could generate C++ functions of sparse matrices (in Eigen) and use them in the C++ optimizer, but it could not generate Python functions of sparse matrices or use Python optimizer. This release adds support for generating Python functions that use SciPy's sparse matrix format, and also the ability to convert them to Eigen in the pybind wrapper, so they can be used with the optimizer from Python.

  • 77b8678 Add sym::Factor::SparseJacobianFunc
  • 3ec069c Calculate hessian & rhs in one place
  • eef1c9c Add sparse outputs to generate py code
  • 3d8cd89 Expose symbolic jacobians computed by factor
  • a43a296 Factor out py residual wrapper - cc_sym
  • 2f91fb2 Make sparsematrixinit more readable
  • 357507e Replace Matrix arg with CSCFormat arg
  • d2b1042 Remove None check in C++ sparse mat gen
  • 4e2e586 More arguments passed through OptimizationProblem and Factor
  • ff6cd01 getsparsemat_data to CSCFormat method
  • 1fab87c Consistent Matrix storage order
  • e2fbce0 CSCFormat type instead of dict

🧊 Data Buffers

Added initial support for data buffers, which are external arrays of data passed in to symbolic expressions, for example lookup tables, images, or volumetric maps. Code generation is currently supported, but not optimization.

  • 2cd9dfe Initial work for values to support DataBuffer entries
  • 236e27f don't allow DataBuffer to be iterable
  • e0db744 Allow symengine to simplify DatabufferElement index expressions
  • a550ed0 fix bug w/ databuffer storage ops
  • 9f1345b databuffer tests
  • 981d48a implement databuffer

⏱️ Code Generation

Many improvements to code generation quality and speed for large problems.

  • 0c67bb8 Allow specific explicit template instantiations
  • 0f03029 Give generate_function return type
  • e7c1388 Convert matrix elements to float in to_numerical()
  • 9a1069e Fix return type: str -> sm.Symbol
  • ca55474 fix bug w/ symbol formatting in codegen_util
  • 33184aa Remove unused codegen_util code
  • aea7eb0 Rename outputterms to denseterms
  • 2862b26 Remove dead jinja code
  • 7414072 Fixed codegen bug with dataclasses
  • a626932 Allow explicit template instantiation for C++ codegen
  • d094cda add an option to symengine wrapper to skip eval on sympy
  • 04c6274 Changed codegen folder names from python2.7 to python
  • 6aa7e0d add dontflattenargs to getsubs_dict
  • c1d482d Disable code format when generating temp factors
  • e654de2 move lazy imports outside for loop
  • e76c6d6 Fix SymforceCodegenTest doc-string
  • 015e968 Allow symforce to generate code from functions w/ dataclasses as args

👁️ Bundle Adjustment in the Large

Added an example that optimizes the datasets from Bundle Adjustment in the Large to parallel the GTSAM and Ceres examples. This is not yet a benchmark optimized for performance.

  • bad1035 Bundle-Adjustment-in-the-Large Example

🥇 Optimization

Improve the optimization library based on testing larger multi-objective problems.

  • 4540121 Fixed typo in optimizer
  • 304654e Explicit template intantiate Optimizer
  • af280a3 Added a type check on optimized values
  • 34e6c17 fix bug w/ custom jacobians
  • 46e8a0c Added some useful timestep objectives
  • 2c926e8 Added support for loading factors from files

🛠️ Build System

Support pip install symforce with pre-built wheels, and upgrade dependencies.

  • af687c1 Pin pip requirements
  • 92c30f7 Support pip install [-e] .
  • a3b2dc0 Bump skymarshal required cmake version to 3.19
  • 24e9601 Split CMakeLists
  • 3769c2d Upgrade sympy to version 1.10.1

✍🏼 Documentation

Improved the README, tutorials, and examples across the board to prepare for public release.

  • ad2a796 Epsilon tutorial, rename ops tutorial
  • 0bb830d Tweak README to prepare for public beta
  • 0c2f9f2 Fix images in README
  • d6eb5cc Add issue templates
  • 91e0b18 Add arXiv link to README
  • 94b1abd Add citation to repo, README
  • bd26812 New Images
  • d451552 Fix docs version and date
  • 340c74d Regenerate after README and version updates
  • 60042bb Update README.md
  • 76e785e Update README.md
  • a1da5b0 Minor README update
  • 982f6d4 Update matrix multiplication benchmark

🎁 Miscellaneous

  • 78d7844 [Skymarshal] lextab updates
  • fb1bd27 Delete cholesky/assert
  • f127562 Autoformat with clang-format 14
  • 8591d8f Include cassert where we use it
  • 185be31 Simplify ArrayStorageOps
  • d32d14b Have ndarray ops use AbstractVectorOps
  • 359bf11 [Skymarshal] Optional printing
  • 5d52d76 Allow geo.M.setitem with np.float64
  • 97a47dc Assert geo.Matrix shape == arg shape
  • 69ea6d6 Diffs in test failures
  • cfc0b87 Remove #hashable from sym.key_t.

- C++
Published by aaron-skydio about 4 years ago

symforce - v0.3.0

:camera: Support for CameraCal types in C++ Values and optimizations

You can now use camera calibration objects directly as inputs to Factors for optimization, either as optimized variables or as constants.

  • 1db2d85 camera cals in cc_sym.Values
  • 73af9cc Add camera cals to python sym
  • c230173 Auto-generate C++ cam cal constructors
  • 523b5a1 Rework camera cal constructors
  • f7987ee Add camera cal types to BYTYPEHELPER
  • b26be84 Define template specializations of [Lie]GroupOps for camera cals in C++
  • e43406e Register CameraCal with LieGroupOps in python
  • 2509e29 Add all the camera cals to types_t and define TypeEnum

🐍 More support for dataclasses

We recently added some support for using Dataclasses in various places, such as in Values and with Ops. We've now added more thorough support for them in more places:

  • dd017bf Fixed size dataclass ops with sequences
  • 184238d Added ops support for NoneTypes so that Dataclasses can have optional fields
  • 4a079ce Added Group and Lie Group Ops for Dataclasses
  • 05debd6 Added better support for indexing dataclasses stored in Values objects
  • db4585f Added clearer error message for dynamically created dataclasses stored in Values objects

🎲 Lots more examples and benchmarks

  • ea6c6a4 Examples and Benchmarks

⛸️ std::complex in generated C++ code

Generated C++ functions can now handle complex scalars! If the support_complex flag is true, generated functions will be allowed to contain complex constants and otherwise work correctly if instantiated with Scalar = std::complex<T>.

  • 94d37e9 Add support for std::complex in C++ functions

⏱️ Code generation performance improvements

Some changes to speed up code generation by eliminating a lot of unnecessary work

  • c26926d [SymEngine] Add symbols argument to CSE
  • 45c4eb3 Cache generated residuals in Factor
  • 2294616 Cache jinja environment
  • d8563ed Speed up assert in Codegen construction
  • 6a4fb41 Don't autoformat python, for real
  • 3e13c3a Speed up symforcepyoptimizer_test.py
  • d907c37 Lazily print code in Codegen
  • 630e0d3 codegen exposes an option to disable autoformatting

🧮 Barrier functions for optimization

A set of functions with standard interfaces to make it easy to create soft constraints in optimization problems

  • d8300cb Added min/max centering barrier function
  • cd04ffd Added one-sided barrier functions
  • 1149e8a Min/max barrier function
  • 93a8727 Added symmetric barrier function

🎶 More noise models

  • e48e590 Added pseudo huber noise model
  • 48a42c7 Isotropic and diagonal noise models

✍🏼 Documentation

  • 90bdf74 Add missing docstrings for cc_sym
  • f93ae35 Add docstrings for cc_sym.Key
  • d5c66f3 Add module-level docstring to cc_sym
  • 958b098 Get cc_sym docs to generate correctly
  • 8dba435 Fix custom jacobian func argument name, docstring
  • f0d5922 Update comment on indexentryt.offset

🎁 Misc other changes

  • 1fabece ComputeKeysToOptimize defaults comparator to LexicalLessThan
  • f89f60d add in databuffer + databuffer element to symengine
  • efe830e fix bug w/ symengine floor + ceil
  • 367beef Add omega property to ATANCameraCal
  • e4834f0 Added "length" metadata reader to timestep sub problem
  • d93c486 Tie tic tocs to log level
  • 8d94d38 Enable setting c++ log level from python
  • 9317314 Add property setters for DoubleSphereCC
  • 38f89cc Consolidate version numbers
  • c04b86a Pose2 tangent space matches Pose3
  • 88192d9 count ops after sympy-ification
  • 7d4f5c5 Replace sympy.count_ops w/ better impl
  • 202affc Remove extra quote in CLASS.py.jinja
  • ff98cd4 Wrap Optimizer.factors
  • 6e879fa Wrap Factor.IsSparse in cc_sym
  • 77e34c9 Add Rot2.from_angle
  • 12f6025 Better variable naming in opt factor construction
  • ccef9e6 Improve symengine.count_ops
  • 8f645a9 Misc documentation and EAP fixes
  • a2fa9ae Changed "assertNear" to "assertStorageNear"
  • c5ee7aa compute_jacobians is a method of ResidualBlock
  • 8484b2d Implemented group and lie group ops for ndarrays.
  • e2049f9 Add custom jacobian support to OptimizationProblem
  • 83a9be4 Add function to fetch variable position in problem ordering
  • 3c9dc21 Update license to Apache 2.0
  • faf77d2 Add option to prune the values object used for optimization.
  • 93cb131 Added support for pickling and unpickling Values objects
  • 3cf8854 change Matrix.dot to only support vector dot product
  • 36ebdde Default C++ log level to warning
  • 67f99e4 Downgrade METIS

👮🏼‍♀️ SkyMarshal

  • 4b8b9f3 Move _computeHash into class declaration
  • f5d2a13 Introduce #cpp_display notation for structs with primitive types

- C++
Published by aaron-skydio about 4 years ago