Ipc Toolkit Versions Save

A set of reusable functions to integrate IPC into an existing simulation.

v1.2.0

5 months ago

Various new features :rocket: and some bug fixes :bug:.

Highlights

  • Implement the improved max approximator as described in [Li et al. 2023]
  • Add a port of the Additive CCD method from [Li et al. 2021]
  • Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021]
  • Add missing codimensional collision support (point-point and point-edge)

What's Changed

  • Update website URL to ipctk.xyz in #54
  • Simplify tangential basis Jacobian calculation thanks to @halehOssadat and @jpanetta in #56
  • Update FindSIMD.cmake to now add support for Neon (Arm/Apple Silicon SIMD instruction set) in #58
  • Improve the max approximator used (i.e., sum over constraints) as described in [Li et al. 2023] in #55
    • Add a dtype to EE collisions to keep track of the distance type for mollified constraints
    • Initialize mesh adjacencies by default
    • Use edge length as the area weighting for codimensional edges
  • Improve documentation and tutorials in #61
    • Add documentation describing the convergent formulation
    • Add documentation describing the constraint offset/minimum distance
    • Add documentation for broad- and narrow-phase CCD
    • Add documentation for High-Order IPC
    • Also, renames CollisionConstraint::minimum_distance to CollisionConstraint::dmin
  • Add a port of the Additive CCD method from [Li et al. 2021] in #62
    • This is a modified version of the original open-source implementation which is under the Appache-2.0 License.
    • Modifications: remove broad phase functions, refactor code to use a single implementation of the additive_ccd algorithm, utilize our distance function rather than porting the Codim-IPC versions, return true if the initial distance is less than the minimum distance, and add an explicit tmax parameter rather than relying on the initial value of toi.
    • This is mostly for reference comparison and it is not integrated into the full code. This also includes the ability to pull the sample CCD queries and run them in a unit-test (requires GMP).
    • This adds missing feature mentioned in #63
  • Add Codecov to get a report of unit test code coverage in #64
    • Add more tests to improve code coverage and fix small bugs in #65
  • Fix the symmetric matrix assertion in project_to_psd and project_to_pd in #67
  • Handle codim. point-point collisions in #66
    • This adds missing feature as discussed in #63
  • Add tests of Python bindings using nose2 in #69
  • In CCD, check the initial distance when no motion occurs in #71
  • Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021] in #72
    • Generic nonlinear trajectories are specified through a NonlinearTrajectory virtual class. By default the maximum distance between the trajectory and a linearized version is computed using interval arithmetic. That is $\max_{t \in [0, 1]} \Vert p(\mathrm{lerp}(t_0, t_1, t)) - \mathrm{lerp}(p(t_0), p(t_1), t) \Vert_2 \leq \sup(\Vert p([t_0, t_1]) - \mathrm{lerp}(p(t_0), p(t_1), [0, 1]) \Vert_2)$ where $p$ is the point's position over time, $\mathrm{lerp}(a, b, t) := (b - a) t + a$ and $\sup([a,b]):=b$. Because this can be an overly conservative approximation, users can override the NonlinearTrajectory::max_distance_from_linear function to compute the max directly in closed form, if known.
    • We perform interval arithmetic using filib which has been shown to be "the only library that is correct, consistent, portable, and efficient" [Tang et al. 2022].
    • Add a nonlinear CCD tutorial to the docs in #78
  • Add additional compiler warnings and resolve them to be warning-free in #73
  • Add Python bindings for igl::predicate::segment_segment_intersect in #74
  • Integrate SimpleBVH as a broad-phase method in #75
  • Fix the shape derivative of mollified edge-edge contact in #76
    • Additionally, this makes the shape derivative computation object-oriented.
  • Update Python bindings with recent changes and unified comments in #77
  • Add support for collision between codimensional edges and points in 3D in #79
    • Implements missing features discussed in #63.

Full Changelog: https://github.com/ipc-sim/ipc-toolkit/compare/v1.1.1...v1.2.0

New Contributors

  • @halehOssadat made their first contribution in #56
  • @jpanetta made their first contribution in #56

v1.1.1

9 months ago

What's Changed

Full Changelog: https://github.com/ipc-sim/ipc-toolkit/compare/v1.1.0...v1.1.1

v1.1.0

9 months ago

Large refactoring to make the code more object-oriented rather than passing objects to functions. Other changes include the friction potential now being a function of velocity, bug fixes, and a new tutorial.

What's Changed

  • Large Refactor in #25
    • construct_collision_candidates(..., candidates) -> candidates.build(...)
    • is_step_collision_free(candidates, ...) -> candidates.is_step_collision_free(...)
    • compute_collision_free_stepsize(candidates, ...) -> candidates.compute_collision_free_stepsize(...)
    • compute_barrier_potential*(constraints, ...) -> constraints.compute_potential*(...)
    • compute_shape_derivative(constraints, ...) -> constraints.compute_shape_derivative(...)
    • compute_minimum_distance(constraints, ...) -> constraints.compute_minimum_distance(...)
    • construct_friction_constraint_set(..., friction_constraints) -> friction_constraints.build(...)
    • compute_friction_*(..., friction_constraints, ...) -> friction_constraints.compute_*(...)
    • Generic CollisionStencil parent class to Candidates, CollisionConstraints, and FrictionConstraints.
    • Renamed Constraints to CollisionConstraints
    • Replaced single letter variable names V, E, F with vertices/positions, edges, faces
    • Renamed *_index -> *_id
    • Replaced inflation_radius = min_distance / 1.99 with inflation_radius = min_distance / 2 and use rounding mode to conservativly inflate AABBs
    • CollisionConstraints::use_convergent_formulation and are_shape_derivatives_enabled must now be accessed through getter and setter functions
    • Friction potentials are now functions of velocity. Previously V0 and V1 were passed and U = V1-V0. This limited the integration scheme to implicit Euler. Upstream this means you need to multiply the potential by 1/(dv/dx) to get the correct friction force.
      • Change input $\epsilon_vh$ to $\epsilon_v$ in #37 to reflect the fact that friction is defined in terms of velocity instead of displacement now.
  • Changed default project_hessian_to_psd to false in #30
  • Update website with a tutorial (#31) and version dropdown list (#34)
  • Switch from templates to using Eigen::Ref in #28
  • Speed up the CCD by limiting the maximum minimum distance to 1e-4 in #43
  • Fix the bug pointed out in #41 in #42. Namely, to get units of distance in the barrier we should divide the original function by $\hat{d}\cdot(\hat{d} + 2d_\min)^2$ when using distance squared. Before it was being divided by $2d_\min \hat{d} + \hat{d}^2$.
  • Fix build for IPC_TOOLKIT_WITH_CORRECT_CCD=OFF in #44
  • Switched from FetchContent to CPM in #48. This provides better caching between builds. Additionally, made robin-map and Abseil optional dependencies.
  • Add the CFL-Inspired Culling of CCD as described in Section 3 of the Technical Supplement to IPC in #50

Full Changelog: https://github.com/ipc-sim/ipc-toolkit/compare/v1.0.0...v1.1.0

v1.0.0

1 year ago

This is the first official release. 🎉

This is a stable release of the toolkit prior to refactoring the code and making updates to the API.

New Contributors

Full Changelog: https://github.com/ipc-sim/ipc-toolkit/commits/v1.0.0