Skip to content

Releases: ipc-sim/ipc-toolkit

v1.3.1

08 Nov 22:33
Compare
Choose a tag to compare

What's Changed

  • Move test data to an external repository by @zfergus in #113
    • Download test data at compile time as needed using CMake
  • Bump actions/download-artifact from 3 to 4.1.7 in /.github/workflows by @dependabot in #119
  • Individual convergent formulation flags by @zfergus in #120
    • Replace the use_convergent_formulation flag in Collisions with two flags: use_area_weighting and use_improved_max_approximator.
    • Move the physical barrier rescaling from collision weights into the BarrierPotential using a flag use_physcial_barrier.
  • Replace scalar tbb::enumerable_thread_specific with tbb::parallel_reduce by @zfergus in #121
  • Fix missing max_iterations and tolerance variables in compute_collision_free_stepsize when using SWEEP_AND_TINIEST_QUEUE by @antoinebou12 in #123
  • Add cuda.yml to test if the code compile with CUDA enabled by @zfergus in #125
  • Update filib to allow shared library build by @zfergus in #122
  • Fix friction_collisions.build tutorial (Issue #126) by @zfergus in #127
  • Sort includes using clang-format by @zfergus in #129
  • Add frequently asked questions page to the tutorial documentation
  • Fix barrier API documentation
  • On Apple, link Eigen against Accelerate as a BLAS/LAPACK backend
    • Requires brew install lapack to install LAPACKE headers

New Contributors

Full Changelog: v1.3.0...v1.3.1

v1.3.0

03 Aug 05:01
Compare
Choose a tag to compare

Highlights

  • Separated the collision set and potential computations. This allows us to more easily add new potentials in the future. This will require updating calls to compute_potential_*. See the tutorial for details.
  • Add a Barrier class to enable dynamic selection of barrier function.
  • Add a NarrowPhaseCCD class to enable dynamic selection of narrow-phase CCD method.

What's Changed

  • Refactor potentials by @zfergus in #83
    • Replace "constraint" and "contact" names with "collision"
    • Removed compute_potential_* from Collision and Collisions
    • Add a new class hierarchy Potential which represents computing the sum of individual potentials per collision
      • Implement the barrier potential and friction dissipative potential as Potentials: BarrierPotential and FrictionPotential
    • Now, Collisions serve solely as the set of active collisions
    • Add the distance mollifier to all collisions with a is_mollified() function
      • The default mollifier is $m(x) = 1$, and only EdgeEdgeCollision overrides this
    • Remove versions of compute_distance and ccd from CollisionStencil which take the full mesh as input
      • Instead, expose the versions that take the collision stencil's vertex positions directly
  • Polymorphic barrier in #84
    • Make the barrier function an object so it can be changed at runtime
    • Add a virtual class Barrier as an interface for generic barriers
    • Add ClampedLogBarrier class which implements the smoothly clamped log barrier functions from [Li et al. 2020]
    • barrier_gradient and barrier_hessian renamed to barrier_first_derivative and barrier_second_derivative respectively
    • Co-authored by @arvigj
  • Update compiler warnings in #88
    • Add -Werror=enum-conversion and -Wfloat-conversion
  • Fix 🐛 hash when not using Abseil in #90
  • Clean-up SpatialHash Broad Phase in #91
    • Replace IPC_TOOLKIT_WITH_CORRECT_CCD with IPC_TOOLKIT_WITH_INEXACT_CCD
      • Always include Tight Inclusion CCD because it is used by Nonlinear CCD
    • Add support for face-face collision (not used anywhere but for completeness and future-proof nonlinear face-face)
    • Add and use generic functions to SpatialHash
    • Replace camelCase with snake_case in SpatialHash and HashGrid
  • Update Scalable CCD in #92
    • Updated Scalable CCD (i.e., Sweep and Tiniest Queue and CUDA Tight Inclusion CCD) to the unified repository with support for generic collision pairs.
    • Renamed SWEEP_AND_TINIEST_QUEUE to SWEEP_AND_PRUNE to reflect that it is a standard implementation of the sweep and prune algorithm (see, e.g., "Real-Time Collision Detection" [Ericson 2004])
    • Renamed SWEEP_AND_TINIEST_QUEUE_GPU to SWEEP_AND_TINIEST_QUEUE to reflect that it is the only existing implementation of the sweep and tiniest queue algorithm
  • Mark single argument constructors explicit in #93
    • Mark BarrierPotential(double) and FrictionPotential(double) as explicit constructors to avoid implicit conversions from double
  • Fix compatibility with the latest Eigen by @teseoch in #94
  • Add clang-format check action in #96
  • Add new project PSD option by @Huangzizhou in #95
    • Instead of clamping the negative eigenvalues to zero, add the option to flips the sign of negative eigenvalues according to [Chen et al. 2024]
  • Fix 🐛 Python bindings for Numpy 2 in #100
  • Make faces an optional parameter to CollisionMesh in #105
  • Fix Python documentation by @rc in #108
  • Polymorphic CCD in #110
    • Add narrow phase CCD parent class; pass CCD object to choose method
    • Replace tolerance and max_iterations parameters with const NarrowPhaseCCD& narrow_phase_ccd parameter
    • NarrowPhaseCCD is a virtual class containing the CCD methods for point-point, point-edge, edge-edge, and point-triangle CCD
    • NarrowPhaseCCD is implemented by InexactCCD, TightInclusionCCD, and AdditiveCCD classes
    • [Breaking] The optional parameter order to is_step_collision_free and compute_collision_free_stepsize is changed from
      const BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD,
      const double min_distance = 0.0,
      const double tolerance = DEFAULT_CCD_TOLERANCE,
      const long max_iterations = DEFAULT_CCD_MAX_ITERATIONS);
      to
      const double min_distance = 0.0,
      const BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD,
      const NarrowPhaseCCD& narrow_phase_ccd = DEFAULT_NARROW_PHASE_CCD);
    • The inexact floating-point CCD can be enabled beside the Tight Inclusion CCD rather than replacing it

New Contributors

Full Changelog: v1.2.1...v1.3.0

v1.2.1

13 Jul 11:06
Compare
Choose a tag to compare

Bug fixes 🐛 :

  • Update Pybind11 to support Numpy 2.0. Fixes segmentation fault as described in #102.

Full Changelog: v1.2.0...v1.2.1

v1.2.0

12 Dec 03:11
f9969cb
Compare
Choose a tag to compare

Various new features 🚀 and some bug fixes 🐛.

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: v1.1.1...v1.2.0

New Contributors

v1.1.1

19 Aug 01:11
Compare
Choose a tag to compare

What's Changed

  • Logo by @zfergus in #52
  • Fix vertex-vertex == and < functions to be order independent
    • This allows vertex-vertex constraints merge correctly
  • Update Tight Inclusion CCD

Full Changelog: v1.1.0...v1.1.1

v1.1.0

25 Jul 16:05
Compare
Choose a tag to compare

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: v1.0.0...v1.1.0

v1.0.0

20 Mar 05:16
Compare
Choose a tag to compare

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