pymomentum-cpu 0.0.0__cp312-cp312-manylinux_2_39_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pymomentum-cpu might be problematic. Click here for more details.
- include/axel/BoundingBox.h +58 -0
- include/axel/Bvh.h +708 -0
- include/axel/BvhBase.h +75 -0
- include/axel/BvhCommon.h +43 -0
- include/axel/BvhEmbree.h +86 -0
- include/axel/BvhFactory.h +34 -0
- include/axel/Checks.h +21 -0
- include/axel/KdTree.h +199 -0
- include/axel/Log.h +22 -0
- include/axel/MeshToSdf.h +123 -0
- include/axel/Profile.h +64 -0
- include/axel/Ray.h +45 -0
- include/axel/SignedDistanceField.h +237 -0
- include/axel/SimdKdTree.h +515 -0
- include/axel/TriBvh.h +157 -0
- include/axel/TriBvhEmbree.h +57 -0
- include/axel/common/Constants.h +27 -0
- include/axel/common/Types.h +21 -0
- include/axel/common/VectorizationTypes.h +58 -0
- include/axel/math/BoundingBoxUtils.h +54 -0
- include/axel/math/ContinuousCollisionDetection.h +48 -0
- include/axel/math/CoplanarityCheck.h +30 -0
- include/axel/math/EdgeEdgeDistance.h +31 -0
- include/axel/math/MeshHoleFilling.h +98 -0
- include/axel/math/PointTriangleProjection.h +34 -0
- include/axel/math/PointTriangleProjectionDefinitions.h +209 -0
- include/axel/math/RayTriangleIntersection.h +36 -0
- include/momentum/character/blend_shape.h +91 -0
- include/momentum/character/blend_shape_base.h +70 -0
- include/momentum/character/blend_shape_skinning.h +96 -0
- include/momentum/character/character.h +272 -0
- include/momentum/character/character_state.h +108 -0
- include/momentum/character/character_utility.h +128 -0
- include/momentum/character/collision_geometry.h +80 -0
- include/momentum/character/collision_geometry_state.h +130 -0
- include/momentum/character/fwd.h +243 -0
- include/momentum/character/inverse_parameter_transform.h +58 -0
- include/momentum/character/joint.h +82 -0
- include/momentum/character/joint_state.h +241 -0
- include/momentum/character/linear_skinning.h +139 -0
- include/momentum/character/locator.h +82 -0
- include/momentum/character/locator_state.h +43 -0
- include/momentum/character/marker.h +48 -0
- include/momentum/character/parameter_limits.h +144 -0
- include/momentum/character/parameter_transform.h +250 -0
- include/momentum/character/pose_shape.h +65 -0
- include/momentum/character/skeleton.h +85 -0
- include/momentum/character/skeleton_state.h +181 -0
- include/momentum/character/skeleton_utility.h +38 -0
- include/momentum/character/skin_weights.h +67 -0
- include/momentum/character/skinned_locator.h +80 -0
- include/momentum/character/types.h +202 -0
- include/momentum/character_sequence_solver/fwd.h +200 -0
- include/momentum/character_sequence_solver/model_parameters_sequence_error_function.h +62 -0
- include/momentum/character_sequence_solver/multipose_solver.h +63 -0
- include/momentum/character_sequence_solver/multipose_solver_function.h +80 -0
- include/momentum/character_sequence_solver/sequence_error_function.h +95 -0
- include/momentum/character_sequence_solver/sequence_solver.h +144 -0
- include/momentum/character_sequence_solver/sequence_solver_function.h +126 -0
- include/momentum/character_sequence_solver/state_sequence_error_function.h +106 -0
- include/momentum/character_sequence_solver/vertex_sequence_error_function.h +125 -0
- include/momentum/character_solver/aim_error_function.h +112 -0
- include/momentum/character_solver/collision_error_function.h +88 -0
- include/momentum/character_solver/collision_error_function_stateless.h +71 -0
- include/momentum/character_solver/constraint_error_function-inl.h +321 -0
- include/momentum/character_solver/constraint_error_function.h +241 -0
- include/momentum/character_solver/distance_error_function.h +74 -0
- include/momentum/character_solver/error_function_utils.h +60 -0
- include/momentum/character_solver/fixed_axis_error_function.h +139 -0
- include/momentum/character_solver/fwd.h +924 -0
- include/momentum/character_solver/gauss_newton_solver_qr.h +62 -0
- include/momentum/character_solver/limit_error_function.h +53 -0
- include/momentum/character_solver/model_parameters_error_function.h +61 -0
- include/momentum/character_solver/normal_error_function.h +73 -0
- include/momentum/character_solver/orientation_error_function.h +74 -0
- include/momentum/character_solver/plane_error_function.h +102 -0
- include/momentum/character_solver/point_triangle_vertex_error_function.h +140 -0
- include/momentum/character_solver/pose_prior_error_function.h +76 -0
- include/momentum/character_solver/position_error_function.h +75 -0
- include/momentum/character_solver/projection_error_function.h +90 -0
- include/momentum/character_solver/simd_collision_error_function.h +95 -0
- include/momentum/character_solver/simd_normal_error_function.h +151 -0
- include/momentum/character_solver/simd_plane_error_function.h +154 -0
- include/momentum/character_solver/simd_position_error_function.h +155 -0
- include/momentum/character_solver/skeleton_error_function.h +136 -0
- include/momentum/character_solver/skeleton_solver_function.h +72 -0
- include/momentum/character_solver/skinned_locator_error_function.h +163 -0
- include/momentum/character_solver/skinned_locator_triangle_error_function.h +138 -0
- include/momentum/character_solver/skinning_weight_iterator.h +80 -0
- include/momentum/character_solver/state_error_function.h +90 -0
- include/momentum/character_solver/transform_pose.h +80 -0
- include/momentum/character_solver/trust_region_qr.h +78 -0
- include/momentum/character_solver/vertex_error_function.h +154 -0
- include/momentum/character_solver/vertex_projection_error_function.h +118 -0
- include/momentum/character_solver/vertex_vertex_distance_error_function.h +143 -0
- include/momentum/common/aligned.h +155 -0
- include/momentum/common/checks.h +27 -0
- include/momentum/common/exception.h +70 -0
- include/momentum/common/filesystem.h +20 -0
- include/momentum/common/fwd.h +27 -0
- include/momentum/common/log.h +173 -0
- include/momentum/common/log_channel.h +17 -0
- include/momentum/common/memory.h +71 -0
- include/momentum/common/profile.h +79 -0
- include/momentum/common/progress_bar.h +37 -0
- include/momentum/common/string.h +52 -0
- include/momentum/diff_ik/ceres_utility.h +73 -0
- include/momentum/diff_ik/fully_differentiable_body_ik.h +58 -0
- include/momentum/diff_ik/fully_differentiable_distance_error_function.h +69 -0
- include/momentum/diff_ik/fully_differentiable_motion_error_function.h +46 -0
- include/momentum/diff_ik/fully_differentiable_orientation_error_function.h +109 -0
- include/momentum/diff_ik/fully_differentiable_pose_prior_error_function.h +76 -0
- include/momentum/diff_ik/fully_differentiable_position_error_function.h +133 -0
- include/momentum/diff_ik/fully_differentiable_projection_error_function.h +65 -0
- include/momentum/diff_ik/fully_differentiable_skeleton_error_function.h +160 -0
- include/momentum/diff_ik/fully_differentiable_state_error_function.h +54 -0
- include/momentum/diff_ik/fwd.h +385 -0
- include/momentum/diff_ik/union_error_function.h +63 -0
- include/momentum/gui/rerun/eigen_adapters.h +70 -0
- include/momentum/gui/rerun/logger.h +102 -0
- include/momentum/gui/rerun/logging_redirect.h +27 -0
- include/momentum/io/character_io.h +56 -0
- include/momentum/io/common/gsl_utils.h +50 -0
- include/momentum/io/common/stream_utils.h +65 -0
- include/momentum/io/fbx/fbx_io.h +109 -0
- include/momentum/io/fbx/fbx_memory_stream.h +66 -0
- include/momentum/io/fbx/openfbx_loader.h +49 -0
- include/momentum/io/fbx/polygon_data.h +60 -0
- include/momentum/io/gltf/gltf_builder.h +135 -0
- include/momentum/io/gltf/gltf_file_format.h +19 -0
- include/momentum/io/gltf/gltf_io.h +136 -0
- include/momentum/io/gltf/utils/accessor_utils.h +299 -0
- include/momentum/io/gltf/utils/coordinate_utils.h +60 -0
- include/momentum/io/gltf/utils/json_utils.h +102 -0
- include/momentum/io/legacy_json/legacy_json_io.h +70 -0
- include/momentum/io/marker/c3d_io.h +29 -0
- include/momentum/io/marker/conversions.h +57 -0
- include/momentum/io/marker/coordinate_system.h +30 -0
- include/momentum/io/marker/marker_io.h +54 -0
- include/momentum/io/marker/trc_io.h +27 -0
- include/momentum/io/motion/mmo_io.h +97 -0
- include/momentum/io/shape/blend_shape_io.h +70 -0
- include/momentum/io/shape/pose_shape_io.h +21 -0
- include/momentum/io/skeleton/locator_io.h +41 -0
- include/momentum/io/skeleton/mppca_io.h +26 -0
- include/momentum/io/skeleton/parameter_limits_io.h +25 -0
- include/momentum/io/skeleton/parameter_transform_io.h +41 -0
- include/momentum/io/skeleton/parameters_io.h +20 -0
- include/momentum/io/urdf/urdf_io.h +26 -0
- include/momentum/io/usd/usd_io.h +36 -0
- include/momentum/marker_tracking/app_utils.h +62 -0
- include/momentum/marker_tracking/marker_tracker.h +213 -0
- include/momentum/marker_tracking/process_markers.h +58 -0
- include/momentum/marker_tracking/tracker_utils.h +90 -0
- include/momentum/math/constants.h +82 -0
- include/momentum/math/covariance_matrix.h +84 -0
- include/momentum/math/fmt_eigen.h +23 -0
- include/momentum/math/fwd.h +132 -0
- include/momentum/math/generalized_loss.h +61 -0
- include/momentum/math/intersection.h +32 -0
- include/momentum/math/mesh.h +84 -0
- include/momentum/math/mppca.h +67 -0
- include/momentum/math/online_householder_qr.h +516 -0
- include/momentum/math/random-inl.h +404 -0
- include/momentum/math/random.h +310 -0
- include/momentum/math/simd_generalized_loss.h +40 -0
- include/momentum/math/transform.h +229 -0
- include/momentum/math/types.h +461 -0
- include/momentum/math/utility.h +251 -0
- include/momentum/rasterizer/camera.h +453 -0
- include/momentum/rasterizer/fwd.h +102 -0
- include/momentum/rasterizer/geometry.h +83 -0
- include/momentum/rasterizer/image.h +18 -0
- include/momentum/rasterizer/rasterizer.h +583 -0
- include/momentum/rasterizer/tensor.h +140 -0
- include/momentum/rasterizer/utility.h +268 -0
- include/momentum/simd/simd.h +221 -0
- include/momentum/solver/fwd.h +131 -0
- include/momentum/solver/gauss_newton_solver.h +136 -0
- include/momentum/solver/gradient_descent_solver.h +65 -0
- include/momentum/solver/solver.h +155 -0
- include/momentum/solver/solver_function.h +126 -0
- include/momentum/solver/subset_gauss_newton_solver.h +109 -0
- include/rerun/archetypes/annotation_context.hpp +157 -0
- include/rerun/archetypes/arrows2d.hpp +271 -0
- include/rerun/archetypes/arrows3d.hpp +257 -0
- include/rerun/archetypes/asset3d.hpp +262 -0
- include/rerun/archetypes/asset_video.hpp +275 -0
- include/rerun/archetypes/bar_chart.hpp +261 -0
- include/rerun/archetypes/boxes2d.hpp +293 -0
- include/rerun/archetypes/boxes3d.hpp +369 -0
- include/rerun/archetypes/capsules3d.hpp +333 -0
- include/rerun/archetypes/clear.hpp +180 -0
- include/rerun/archetypes/depth_image.hpp +425 -0
- include/rerun/archetypes/ellipsoids3d.hpp +384 -0
- include/rerun/archetypes/encoded_image.hpp +250 -0
- include/rerun/archetypes/geo_line_strings.hpp +166 -0
- include/rerun/archetypes/geo_points.hpp +177 -0
- include/rerun/archetypes/graph_edges.hpp +152 -0
- include/rerun/archetypes/graph_nodes.hpp +206 -0
- include/rerun/archetypes/image.hpp +434 -0
- include/rerun/archetypes/instance_poses3d.hpp +221 -0
- include/rerun/archetypes/line_strips2d.hpp +289 -0
- include/rerun/archetypes/line_strips3d.hpp +270 -0
- include/rerun/archetypes/mesh3d.hpp +387 -0
- include/rerun/archetypes/pinhole.hpp +385 -0
- include/rerun/archetypes/points2d.hpp +333 -0
- include/rerun/archetypes/points3d.hpp +369 -0
- include/rerun/archetypes/recording_properties.hpp +132 -0
- include/rerun/archetypes/scalar.hpp +170 -0
- include/rerun/archetypes/scalars.hpp +153 -0
- include/rerun/archetypes/segmentation_image.hpp +305 -0
- include/rerun/archetypes/series_line.hpp +274 -0
- include/rerun/archetypes/series_lines.hpp +271 -0
- include/rerun/archetypes/series_point.hpp +265 -0
- include/rerun/archetypes/series_points.hpp +251 -0
- include/rerun/archetypes/tensor.hpp +213 -0
- include/rerun/archetypes/text_document.hpp +200 -0
- include/rerun/archetypes/text_log.hpp +211 -0
- include/rerun/archetypes/transform3d.hpp +925 -0
- include/rerun/archetypes/video_frame_reference.hpp +295 -0
- include/rerun/archetypes/view_coordinates.hpp +393 -0
- include/rerun/archetypes.hpp +43 -0
- include/rerun/arrow_utils.hpp +32 -0
- include/rerun/as_components.hpp +90 -0
- include/rerun/blueprint/archetypes/background.hpp +113 -0
- include/rerun/blueprint/archetypes/container_blueprint.hpp +259 -0
- include/rerun/blueprint/archetypes/dataframe_query.hpp +178 -0
- include/rerun/blueprint/archetypes/entity_behavior.hpp +130 -0
- include/rerun/blueprint/archetypes/force_center.hpp +115 -0
- include/rerun/blueprint/archetypes/force_collision_radius.hpp +141 -0
- include/rerun/blueprint/archetypes/force_link.hpp +136 -0
- include/rerun/blueprint/archetypes/force_many_body.hpp +124 -0
- include/rerun/blueprint/archetypes/force_position.hpp +132 -0
- include/rerun/blueprint/archetypes/line_grid3d.hpp +178 -0
- include/rerun/blueprint/archetypes/map_background.hpp +104 -0
- include/rerun/blueprint/archetypes/map_zoom.hpp +103 -0
- include/rerun/blueprint/archetypes/near_clip_plane.hpp +109 -0
- include/rerun/blueprint/archetypes/panel_blueprint.hpp +95 -0
- include/rerun/blueprint/archetypes/plot_legend.hpp +118 -0
- include/rerun/blueprint/archetypes/scalar_axis.hpp +116 -0
- include/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp +146 -0
- include/rerun/blueprint/archetypes/tensor_slice_selection.hpp +167 -0
- include/rerun/blueprint/archetypes/tensor_view_fit.hpp +95 -0
- include/rerun/blueprint/archetypes/view_blueprint.hpp +170 -0
- include/rerun/blueprint/archetypes/view_contents.hpp +142 -0
- include/rerun/blueprint/archetypes/viewport_blueprint.hpp +200 -0
- include/rerun/blueprint/archetypes/visible_time_ranges.hpp +116 -0
- include/rerun/blueprint/archetypes/visual_bounds2d.hpp +109 -0
- include/rerun/blueprint/archetypes/visualizer_overrides.hpp +113 -0
- include/rerun/blueprint/archetypes.hpp +29 -0
- include/rerun/blueprint/components/active_tab.hpp +82 -0
- include/rerun/blueprint/components/apply_latest_at.hpp +79 -0
- include/rerun/blueprint/components/auto_layout.hpp +77 -0
- include/rerun/blueprint/components/auto_views.hpp +77 -0
- include/rerun/blueprint/components/background_kind.hpp +66 -0
- include/rerun/blueprint/components/column_share.hpp +78 -0
- include/rerun/blueprint/components/component_column_selector.hpp +81 -0
- include/rerun/blueprint/components/container_kind.hpp +65 -0
- include/rerun/blueprint/components/corner2d.hpp +64 -0
- include/rerun/blueprint/components/enabled.hpp +77 -0
- include/rerun/blueprint/components/filter_by_range.hpp +74 -0
- include/rerun/blueprint/components/filter_is_not_null.hpp +77 -0
- include/rerun/blueprint/components/force_distance.hpp +82 -0
- include/rerun/blueprint/components/force_iterations.hpp +82 -0
- include/rerun/blueprint/components/force_strength.hpp +82 -0
- include/rerun/blueprint/components/grid_columns.hpp +78 -0
- include/rerun/blueprint/components/grid_spacing.hpp +78 -0
- include/rerun/blueprint/components/included_content.hpp +86 -0
- include/rerun/blueprint/components/lock_range_during_zoom.hpp +82 -0
- include/rerun/blueprint/components/map_provider.hpp +64 -0
- include/rerun/blueprint/components/near_clip_plane.hpp +82 -0
- include/rerun/blueprint/components/panel_state.hpp +61 -0
- include/rerun/blueprint/components/query_expression.hpp +89 -0
- include/rerun/blueprint/components/root_container.hpp +77 -0
- include/rerun/blueprint/components/row_share.hpp +78 -0
- include/rerun/blueprint/components/selected_columns.hpp +76 -0
- include/rerun/blueprint/components/tensor_dimension_index_slider.hpp +90 -0
- include/rerun/blueprint/components/timeline_name.hpp +76 -0
- include/rerun/blueprint/components/view_class.hpp +76 -0
- include/rerun/blueprint/components/view_fit.hpp +61 -0
- include/rerun/blueprint/components/view_maximized.hpp +79 -0
- include/rerun/blueprint/components/view_origin.hpp +81 -0
- include/rerun/blueprint/components/viewer_recommendation_hash.hpp +82 -0
- include/rerun/blueprint/components/visible_time_range.hpp +77 -0
- include/rerun/blueprint/components/visual_bounds2d.hpp +74 -0
- include/rerun/blueprint/components/visualizer_override.hpp +86 -0
- include/rerun/blueprint/components/zoom_level.hpp +78 -0
- include/rerun/blueprint/components.hpp +41 -0
- include/rerun/blueprint/datatypes/component_column_selector.hpp +61 -0
- include/rerun/blueprint/datatypes/filter_by_range.hpp +59 -0
- include/rerun/blueprint/datatypes/filter_is_not_null.hpp +61 -0
- include/rerun/blueprint/datatypes/selected_columns.hpp +62 -0
- include/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp +63 -0
- include/rerun/blueprint/datatypes.hpp +9 -0
- include/rerun/c/arrow_c_data_interface.h +111 -0
- include/rerun/c/compiler_utils.h +10 -0
- include/rerun/c/rerun.h +627 -0
- include/rerun/c/sdk_info.h +28 -0
- include/rerun/collection.hpp +496 -0
- include/rerun/collection_adapter.hpp +43 -0
- include/rerun/collection_adapter_builtins.hpp +138 -0
- include/rerun/compiler_utils.hpp +61 -0
- include/rerun/component_batch.hpp +163 -0
- include/rerun/component_column.hpp +111 -0
- include/rerun/component_descriptor.hpp +142 -0
- include/rerun/component_type.hpp +35 -0
- include/rerun/components/aggregation_policy.hpp +76 -0
- include/rerun/components/albedo_factor.hpp +74 -0
- include/rerun/components/annotation_context.hpp +102 -0
- include/rerun/components/axis_length.hpp +74 -0
- include/rerun/components/blob.hpp +73 -0
- include/rerun/components/class_id.hpp +71 -0
- include/rerun/components/clear_is_recursive.hpp +75 -0
- include/rerun/components/color.hpp +99 -0
- include/rerun/components/colormap.hpp +99 -0
- include/rerun/components/depth_meter.hpp +84 -0
- include/rerun/components/draw_order.hpp +79 -0
- include/rerun/components/entity_path.hpp +83 -0
- include/rerun/components/fill_mode.hpp +72 -0
- include/rerun/components/fill_ratio.hpp +79 -0
- include/rerun/components/gamma_correction.hpp +80 -0
- include/rerun/components/geo_line_string.hpp +63 -0
- include/rerun/components/graph_edge.hpp +75 -0
- include/rerun/components/graph_node.hpp +79 -0
- include/rerun/components/graph_type.hpp +57 -0
- include/rerun/components/half_size2d.hpp +91 -0
- include/rerun/components/half_size3d.hpp +95 -0
- include/rerun/components/image_buffer.hpp +86 -0
- include/rerun/components/image_format.hpp +84 -0
- include/rerun/components/image_plane_distance.hpp +77 -0
- include/rerun/components/interactive.hpp +76 -0
- include/rerun/components/keypoint_id.hpp +74 -0
- include/rerun/components/lat_lon.hpp +89 -0
- include/rerun/components/length.hpp +77 -0
- include/rerun/components/line_strip2d.hpp +73 -0
- include/rerun/components/line_strip3d.hpp +73 -0
- include/rerun/components/magnification_filter.hpp +63 -0
- include/rerun/components/marker_shape.hpp +82 -0
- include/rerun/components/marker_size.hpp +74 -0
- include/rerun/components/media_type.hpp +157 -0
- include/rerun/components/name.hpp +83 -0
- include/rerun/components/opacity.hpp +77 -0
- include/rerun/components/pinhole_projection.hpp +94 -0
- include/rerun/components/plane3d.hpp +75 -0
- include/rerun/components/pose_rotation_axis_angle.hpp +73 -0
- include/rerun/components/pose_rotation_quat.hpp +71 -0
- include/rerun/components/pose_scale3d.hpp +102 -0
- include/rerun/components/pose_transform_mat3x3.hpp +87 -0
- include/rerun/components/pose_translation3d.hpp +96 -0
- include/rerun/components/position2d.hpp +86 -0
- include/rerun/components/position3d.hpp +90 -0
- include/rerun/components/radius.hpp +98 -0
- include/rerun/components/range1d.hpp +75 -0
- include/rerun/components/resolution.hpp +88 -0
- include/rerun/components/rotation_axis_angle.hpp +72 -0
- include/rerun/components/rotation_quat.hpp +71 -0
- include/rerun/components/scalar.hpp +76 -0
- include/rerun/components/scale3d.hpp +102 -0
- include/rerun/components/series_visible.hpp +76 -0
- include/rerun/components/show_labels.hpp +79 -0
- include/rerun/components/stroke_width.hpp +74 -0
- include/rerun/components/tensor_data.hpp +94 -0
- include/rerun/components/tensor_dimension_index_selection.hpp +77 -0
- include/rerun/components/tensor_height_dimension.hpp +71 -0
- include/rerun/components/tensor_width_dimension.hpp +71 -0
- include/rerun/components/texcoord2d.hpp +101 -0
- include/rerun/components/text.hpp +83 -0
- include/rerun/components/text_log_level.hpp +110 -0
- include/rerun/components/timestamp.hpp +76 -0
- include/rerun/components/transform_mat3x3.hpp +92 -0
- include/rerun/components/transform_relation.hpp +66 -0
- include/rerun/components/translation3d.hpp +96 -0
- include/rerun/components/triangle_indices.hpp +85 -0
- include/rerun/components/value_range.hpp +78 -0
- include/rerun/components/vector2d.hpp +92 -0
- include/rerun/components/vector3d.hpp +96 -0
- include/rerun/components/video_timestamp.hpp +120 -0
- include/rerun/components/view_coordinates.hpp +346 -0
- include/rerun/components/visible.hpp +74 -0
- include/rerun/components.hpp +77 -0
- include/rerun/config.hpp +52 -0
- include/rerun/datatypes/angle.hpp +76 -0
- include/rerun/datatypes/annotation_info.hpp +76 -0
- include/rerun/datatypes/blob.hpp +67 -0
- include/rerun/datatypes/bool.hpp +57 -0
- include/rerun/datatypes/channel_datatype.hpp +87 -0
- include/rerun/datatypes/class_description.hpp +92 -0
- include/rerun/datatypes/class_description_map_elem.hpp +69 -0
- include/rerun/datatypes/class_id.hpp +62 -0
- include/rerun/datatypes/color_model.hpp +68 -0
- include/rerun/datatypes/dvec2d.hpp +76 -0
- include/rerun/datatypes/entity_path.hpp +60 -0
- include/rerun/datatypes/float32.hpp +62 -0
- include/rerun/datatypes/float64.hpp +62 -0
- include/rerun/datatypes/image_format.hpp +107 -0
- include/rerun/datatypes/keypoint_id.hpp +63 -0
- include/rerun/datatypes/keypoint_pair.hpp +65 -0
- include/rerun/datatypes/mat3x3.hpp +105 -0
- include/rerun/datatypes/mat4x4.hpp +119 -0
- include/rerun/datatypes/pixel_format.hpp +142 -0
- include/rerun/datatypes/plane3d.hpp +60 -0
- include/rerun/datatypes/quaternion.hpp +110 -0
- include/rerun/datatypes/range1d.hpp +59 -0
- include/rerun/datatypes/range2d.hpp +55 -0
- include/rerun/datatypes/rgba32.hpp +94 -0
- include/rerun/datatypes/rotation_axis_angle.hpp +67 -0
- include/rerun/datatypes/tensor_buffer.hpp +529 -0
- include/rerun/datatypes/tensor_data.hpp +100 -0
- include/rerun/datatypes/tensor_dimension_index_selection.hpp +58 -0
- include/rerun/datatypes/tensor_dimension_selection.hpp +56 -0
- include/rerun/datatypes/time_int.hpp +62 -0
- include/rerun/datatypes/time_range.hpp +55 -0
- include/rerun/datatypes/time_range_boundary.hpp +175 -0
- include/rerun/datatypes/uint16.hpp +62 -0
- include/rerun/datatypes/uint32.hpp +62 -0
- include/rerun/datatypes/uint64.hpp +62 -0
- include/rerun/datatypes/utf8.hpp +76 -0
- include/rerun/datatypes/utf8pair.hpp +62 -0
- include/rerun/datatypes/uuid.hpp +60 -0
- include/rerun/datatypes/uvec2d.hpp +76 -0
- include/rerun/datatypes/uvec3d.hpp +80 -0
- include/rerun/datatypes/uvec4d.hpp +59 -0
- include/rerun/datatypes/vec2d.hpp +76 -0
- include/rerun/datatypes/vec3d.hpp +80 -0
- include/rerun/datatypes/vec4d.hpp +84 -0
- include/rerun/datatypes/video_timestamp.hpp +67 -0
- include/rerun/datatypes/view_coordinates.hpp +87 -0
- include/rerun/datatypes/visible_time_range.hpp +57 -0
- include/rerun/datatypes.hpp +51 -0
- include/rerun/demo_utils.hpp +75 -0
- include/rerun/entity_path.hpp +20 -0
- include/rerun/error.hpp +180 -0
- include/rerun/half.hpp +10 -0
- include/rerun/image_utils.hpp +187 -0
- include/rerun/indicator_component.hpp +59 -0
- include/rerun/loggable.hpp +54 -0
- include/rerun/recording_stream.hpp +960 -0
- include/rerun/rerun_sdk_export.hpp +25 -0
- include/rerun/result.hpp +86 -0
- include/rerun/rotation3d.hpp +33 -0
- include/rerun/sdk_info.hpp +20 -0
- include/rerun/spawn.hpp +21 -0
- include/rerun/spawn_options.hpp +57 -0
- include/rerun/string_utils.hpp +16 -0
- include/rerun/third_party/cxxopts.hpp +2198 -0
- include/rerun/time_column.hpp +288 -0
- include/rerun/timeline.hpp +38 -0
- include/rerun/type_traits.hpp +40 -0
- include/rerun.hpp +86 -0
- lib/cmake/rerun_sdk/rerun_sdkConfig.cmake +70 -0
- lib/cmake/rerun_sdk/rerun_sdkConfigVersion.cmake +83 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets-release.cmake +19 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets.cmake +108 -0
- lib/libarrow.a +0 -0
- lib/libarrow_bundled_dependencies.a +0 -0
- lib/librerun_c__linux_x64.a +0 -0
- lib/librerun_sdk.a +0 -0
- lib64/cmake/axel/axel-config.cmake +45 -0
- lib64/cmake/axel/axelTargets-release.cmake +19 -0
- lib64/cmake/axel/axelTargets.cmake +108 -0
- lib64/cmake/momentum/Findre2.cmake +52 -0
- lib64/cmake/momentum/momentum-config.cmake +67 -0
- lib64/cmake/momentum/momentumTargets-release.cmake +269 -0
- lib64/cmake/momentum/momentumTargets.cmake +445 -0
- lib64/libaxel.a +0 -0
- lib64/libmomentum_app_utils.a +0 -0
- lib64/libmomentum_character.a +0 -0
- lib64/libmomentum_character_sequence_solver.a +0 -0
- lib64/libmomentum_character_solver.a +0 -0
- lib64/libmomentum_common.a +0 -0
- lib64/libmomentum_diff_ik.a +0 -0
- lib64/libmomentum_io.a +0 -0
- lib64/libmomentum_io_common.a +0 -0
- lib64/libmomentum_io_fbx.a +0 -0
- lib64/libmomentum_io_gltf.a +0 -0
- lib64/libmomentum_io_legacy_json.a +0 -0
- lib64/libmomentum_io_marker.a +0 -0
- lib64/libmomentum_io_motion.a +0 -0
- lib64/libmomentum_io_shape.a +0 -0
- lib64/libmomentum_io_skeleton.a +0 -0
- lib64/libmomentum_io_urdf.a +0 -0
- lib64/libmomentum_marker_tracker.a +0 -0
- lib64/libmomentum_math.a +0 -0
- lib64/libmomentum_online_qr.a +0 -0
- lib64/libmomentum_process_markers.a +0 -0
- lib64/libmomentum_rasterizer.a +0 -0
- lib64/libmomentum_rerun.a +0 -0
- lib64/libmomentum_simd_constraints.a +0 -0
- lib64/libmomentum_simd_generalized_loss.a +0 -0
- lib64/libmomentum_skeleton.a +0 -0
- lib64/libmomentum_solver.a +0 -0
- pymomentum/axel.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/backend/__init__.py +16 -0
- pymomentum/backend/skel_state_backend.py +614 -0
- pymomentum/backend/trs_backend.py +871 -0
- pymomentum/backend/utils.py +224 -0
- pymomentum/geometry.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/marker_tracking.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/quaternion.py +740 -0
- pymomentum/renderer.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/skel_state.py +514 -0
- pymomentum/solver.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/solver2.cpython-312-x86_64-linux-gnu.so +0 -0
- pymomentum/torch/character.py +809 -0
- pymomentum/torch/parameter_limits.py +494 -0
- pymomentum/torch/utility.py +20 -0
- pymomentum/trs.py +535 -0
- pymomentum_cpu-0.0.0.dist-info/METADATA +209 -0
- pymomentum_cpu-0.0.0.dist-info/RECORD +555 -0
- pymomentum_cpu-0.0.0.dist-info/WHEEL +5 -0
- pymomentum_cpu-0.0.0.dist-info/licenses/LICENSE +21 -0
- pymomentum_cpu.libs/libabsl_base-86f3b38c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_city-31b65ca2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_debugging_internal-38680253.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_decode_rust_punycode-750652c3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_internal-9a0351a3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_rust-71629506.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_examine_stack-57661ecd.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hash-8c523b7e.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hashtablez_sampler-b5c3e343.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_int128-295bfed5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_kernel_timeout_internal-29296ac1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_globals-6cfa8af5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_format-a5c79460.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_globals-481e9a7c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_log_sink_set-ac08f942.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_message-7dfe150a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_nullguard-883adc72.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_proto-a5da8c75.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_structured_proto-e601fd9b.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_sink-894261b2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_low_level_hash-a3284638.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_malloc_internal-814569de.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_hash_set-922d64ad.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_logging_internal-477f78ec.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_spinlock_wait-8b85a473.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_stacktrace-7369e71d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_str_format_internal-98de729d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strerror-39a52998.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings-a57d5127.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings_internal-ed8c7c0d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_symbolize-eba17dd1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_synchronization-2f8cf326.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time-066c0dde.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time_zone-72867365.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_tracing_internal-021e37ee.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_utf8_for_code_point-de2a4d4a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libconsole_bridge-f26e11cc.so.1.0 +0 -0
- pymomentum_cpu.libs/libdeflate-577b71e3.so.0 +0 -0
- pymomentum_cpu.libs/libdispenso-67ac1721.so.1.4.0 +0 -0
- pymomentum_cpu.libs/libezc3d-4a95ab2c.so +0 -0
- pymomentum_cpu.libs/libre2-985fb83c.so.11 +0 -0
- pymomentum_cpu.libs/libtinyxml2-8d10763c.so.11.0.0 +0 -0
- pymomentum_cpu.libs/liburdfdom_model-7b26ae88.so.4.0 +0 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <momentum/common/checks.h>
|
|
11
|
+
|
|
12
|
+
#include <Eigen/Core>
|
|
13
|
+
#include <gsl/span>
|
|
14
|
+
|
|
15
|
+
#include <deque>
|
|
16
|
+
#include <vector>
|
|
17
|
+
|
|
18
|
+
namespace momentum {
|
|
19
|
+
|
|
20
|
+
void validateColumnIndices(gsl::span<const Eigen::Index> colIndices, Eigen::Index maxEntry);
|
|
21
|
+
|
|
22
|
+
// Remaps the matrix such that A_new.col(i) = A_orig.col(colIndices[i]).
|
|
23
|
+
// This can be used to perform QR on a subset of the matrix columns.
|
|
24
|
+
template <typename MatrixType>
|
|
25
|
+
class ColumnIndexedMatrix {
|
|
26
|
+
public:
|
|
27
|
+
using VectorType = Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, 1>;
|
|
28
|
+
|
|
29
|
+
explicit ColumnIndexedMatrix(Eigen::Ref<MatrixType> mat) : mat_(mat), useColumnIndices_(false) {}
|
|
30
|
+
|
|
31
|
+
explicit ColumnIndexedMatrix(Eigen::Ref<MatrixType> mat, gsl::span<const Eigen::Index> colIndices)
|
|
32
|
+
: mat_(mat), columnIndices_(colIndices), useColumnIndices_(true) {
|
|
33
|
+
validateColumnIndices(colIndices, mat.cols());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
[[nodiscard]] auto col(Eigen::Index colIdx) {
|
|
37
|
+
if (useColumnIndices_) {
|
|
38
|
+
return mat_.col(columnIndices_[colIdx]);
|
|
39
|
+
} else {
|
|
40
|
+
return mat_.col(colIdx);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[[nodiscard]] auto rows() const {
|
|
45
|
+
return mat_.rows();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
[[nodiscard]] auto cols() const {
|
|
49
|
+
if (useColumnIndices_) {
|
|
50
|
+
return (Eigen::Index)columnIndices_.size();
|
|
51
|
+
} else {
|
|
52
|
+
return mat_.cols();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
[[nodiscard]] gsl::span<const Eigen::Index> columnIndices() const {
|
|
57
|
+
return columnIndices_;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[[nodiscard]] VectorType transpose_times(Eigen::Ref<VectorType> b) const {
|
|
61
|
+
if (useColumnIndices_) {
|
|
62
|
+
VectorType result(columnIndices_.size());
|
|
63
|
+
for (Eigen::Index iCol = 0; iCol < (Eigen::Index)columnIndices_.size(); ++iCol) {
|
|
64
|
+
result[iCol] = mat_.col(iCol).dot(b);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
} else {
|
|
68
|
+
return mat_.transpose() * b;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private:
|
|
73
|
+
Eigen::Ref<MatrixType> mat_;
|
|
74
|
+
gsl::span<const Eigen::Index> columnIndices_;
|
|
75
|
+
bool useColumnIndices_;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// The native Eigen matrix type reallocates the matrix every time you call
|
|
79
|
+
// either resize() or conservativeResize(), which means there is no way to
|
|
80
|
+
// have a matrix that reuses memory. This is inconvenient, because there are
|
|
81
|
+
// definitely cases where we want to be able to reuse the same memory over
|
|
82
|
+
// and over for slightly different matrix sizes (for example, if we are computing
|
|
83
|
+
// our Jacobian blockwise).
|
|
84
|
+
template <typename T>
|
|
85
|
+
class ResizeableMatrix {
|
|
86
|
+
public:
|
|
87
|
+
using MatrixType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
|
88
|
+
|
|
89
|
+
ResizeableMatrix() = default;
|
|
90
|
+
explicit ResizeableMatrix(Eigen::Index rows, Eigen::Index cols = 1) {
|
|
91
|
+
resizeAndSetZero(rows, cols);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void resizeAndSetZero(Eigen::Index rows, Eigen::Index cols = 1) {
|
|
95
|
+
rows_ = rows;
|
|
96
|
+
cols_ = cols;
|
|
97
|
+
|
|
98
|
+
// This will not reallocate unless needed.
|
|
99
|
+
data_.resize(rows * cols);
|
|
100
|
+
std::fill(std::begin(data_), std::end(data_), T(0));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
[[nodiscard]] Eigen::Index rows() const {
|
|
104
|
+
return rows_;
|
|
105
|
+
}
|
|
106
|
+
[[nodiscard]] Eigen::Index cols() const {
|
|
107
|
+
return cols_;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Eigen::Map<MatrixType, Eigen::Aligned16> mat() {
|
|
111
|
+
return Eigen::Map<MatrixType, Eigen::Aligned16>(data_.data(), rows_, cols_);
|
|
112
|
+
}
|
|
113
|
+
Eigen::Map<const MatrixType, Eigen::Aligned16> mat() const {
|
|
114
|
+
return Eigen::Map<const MatrixType, Eigen::Aligned16>(data_.data(), rows_, cols_);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private:
|
|
118
|
+
Eigen::Index rows_ = 0;
|
|
119
|
+
Eigen::Index cols_ = 0;
|
|
120
|
+
std::vector<T> data_;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// This class is designed to solve least squares problems of the form:
|
|
124
|
+
// min || A * x - b ||_2
|
|
125
|
+
// where
|
|
126
|
+
// a. n is small-ish,
|
|
127
|
+
// b. A is tall and _sparse_ (m >> n), BUT
|
|
128
|
+
// c. (A^T * A) is _dense_.
|
|
129
|
+
//
|
|
130
|
+
// This turns out to be the common case for hand model IK, because:
|
|
131
|
+
// a. The hand has only ~22 DOF,
|
|
132
|
+
// b. Each constraint touches only a few DOFs (typically the 3-4 on a single finger), but
|
|
133
|
+
// c. Constraints that touch the global DOFs tend to densify A^T*A.
|
|
134
|
+
// From the perspective of a QR factorization: since the R matrix
|
|
135
|
+
// has the same sparsity pattern as the L matrix in the Cholesky factorization of
|
|
136
|
+
// A^T*A, there is no point trying to exploit sparsity in the computation of R
|
|
137
|
+
// (e.g. by reordering columns). So instead, we'll accept the O(n^2) cost of
|
|
138
|
+
// having a dense R and try to exploit sparsity in A.
|
|
139
|
+
//
|
|
140
|
+
// It turns out that it is possible to exploit sparsity in A if you do the factorization
|
|
141
|
+
// _row-wise_ instead of column-wise as is generally done. One paper that uses Givens
|
|
142
|
+
// rotations to zero out one row at a time is this one:
|
|
143
|
+
// Solution of Sparse Linear Squares Problems using Givens Rotations (1980)
|
|
144
|
+
// by Alan George and Michael T. Heath
|
|
145
|
+
//
|
|
146
|
+
// However, Givens rotations aren't really ideal for our case because you have
|
|
147
|
+
// to compute a c/s pair for each entry of the matrix, and it involves a square
|
|
148
|
+
// root. Also, row-wise operations are kind of slow in general due to poor
|
|
149
|
+
// cache locality on Eigen matrices. What we can do instead is to apply
|
|
150
|
+
// Householder reflections to (k x n) blocks of the matrix; computing a
|
|
151
|
+
// Householder vector for a whole column only requires one square root, and
|
|
152
|
+
// it can be applied as a level-2 BLAS operation. Moreover, this maps
|
|
153
|
+
// perfectly to our problem; a Jacobian matrix from a single constraint has
|
|
154
|
+
// the sparsity pattern where entire columns are dropped, and these zero
|
|
155
|
+
// columns can just be skipped entirely by the Householder process provided
|
|
156
|
+
// we are careful about the order we process them in. And by processing the
|
|
157
|
+
// J submatrices one at a time, we need never assemble the full A matrix,
|
|
158
|
+
// eliminating one major disadvantage of QR relative to the normal equations
|
|
159
|
+
// (hence the name "OnlineHouseholderQR").
|
|
160
|
+
//
|
|
161
|
+
// Even better, we can do the whole operation in-place: the caller passes in
|
|
162
|
+
// the J and r matrix, and the columns of the J matrix are rotated out one by
|
|
163
|
+
// one, revealing the R matrix. At the end, a simple back-substitution using
|
|
164
|
+
// R gives the x vector. (in fact, the answer for the current submatrix of
|
|
165
|
+
// A,b is always available, as a consequence of doing the factorization sort-of
|
|
166
|
+
// row-wise).
|
|
167
|
+
//
|
|
168
|
+
// Note that because we apply the transforms as we go, this method is not currently
|
|
169
|
+
// suitable for multiple right-hand-sides.
|
|
170
|
+
template <typename T>
|
|
171
|
+
class OnlineHouseholderQR {
|
|
172
|
+
public:
|
|
173
|
+
using MatrixType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
|
174
|
+
using VectorType = Eigen::Matrix<T, Eigen::Dynamic, 1>;
|
|
175
|
+
|
|
176
|
+
// The lambda here lets you pass in a lambda for a Gauss-Newton/Levenberg-Marquardt solver.
|
|
177
|
+
// Basically this emulates solving the following system, but without needing to append the
|
|
178
|
+
// extra matrix:
|
|
179
|
+
// | [ lambda * I ] [ x ] - [ 0 ] |^2
|
|
180
|
+
// | [ A ] [ b ] |
|
|
181
|
+
explicit OnlineHouseholderQR(Eigen::Index n, T lambda = T(0));
|
|
182
|
+
|
|
183
|
+
void addMutating(Eigen::Ref<MatrixType> A, Eigen::Ref<VectorType> b) {
|
|
184
|
+
addMutating(ColumnIndexedMatrix<MatrixType>(A), b);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// We require passing in both A and rhs so that we can multiply rhs by Q
|
|
188
|
+
// as R is being constructed.
|
|
189
|
+
// This is an 'in-place' version which computes the factorization inside the
|
|
190
|
+
// passed-in matrix; it is here so that use cases that don't need to re-use
|
|
191
|
+
// the matrix can avoid copying.
|
|
192
|
+
void addMutating(ColumnIndexedMatrix<MatrixType> A, Eigen::Ref<VectorType> b);
|
|
193
|
+
|
|
194
|
+
// This version can be made efficient if you std::move() the passed-in matrices.
|
|
195
|
+
void add(MatrixType A, VectorType b);
|
|
196
|
+
|
|
197
|
+
[[nodiscard]] VectorType result() const;
|
|
198
|
+
|
|
199
|
+
[[nodiscard]] const MatrixType& R() const {
|
|
200
|
+
return R_;
|
|
201
|
+
}
|
|
202
|
+
[[nodiscard]] const VectorType& y() const {
|
|
203
|
+
return y_;
|
|
204
|
+
}
|
|
205
|
+
[[nodiscard]] VectorType At_times_b() const;
|
|
206
|
+
|
|
207
|
+
void reset();
|
|
208
|
+
void reset(Eigen::Index n, T lambda = T(0));
|
|
209
|
+
|
|
210
|
+
private:
|
|
211
|
+
// R is defined by
|
|
212
|
+
// Q*A = ( R )
|
|
213
|
+
// ( 0 )
|
|
214
|
+
MatrixType R_;
|
|
215
|
+
|
|
216
|
+
// We define y as
|
|
217
|
+
// Q*b = y
|
|
218
|
+
VectorType y_;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// This class is designed to solve least squares problems of the form:
|
|
222
|
+
// min || A * x - b ||_2
|
|
223
|
+
// where A has the block structure:
|
|
224
|
+
// [ A_11 A_1n ]
|
|
225
|
+
// [ A_22 A_2n ]
|
|
226
|
+
// [ A_33 A_3n ]
|
|
227
|
+
// [ ... ... ]
|
|
228
|
+
//
|
|
229
|
+
// Basically, you have these blocks along the diagonal where each set of
|
|
230
|
+
// x parameters is disjoint and then you have a set of x's that are common
|
|
231
|
+
// to all blocks.
|
|
232
|
+
//
|
|
233
|
+
// This is basically the case for calibration problems, where each hand
|
|
234
|
+
// pose is independent but you have a set of common calibration parameters
|
|
235
|
+
// that connect them.
|
|
236
|
+
//
|
|
237
|
+
// Besides the blockwise structure, the behavior of this solver should be
|
|
238
|
+
// identical to the OnlineHouseholderQR solver above, so please see those
|
|
239
|
+
// note for more details. The key takeaway is that this can be used in an
|
|
240
|
+
// _online_ fashion, so you can pass in the individual poses one at a time
|
|
241
|
+
// and then throw away the Jacobians (in fact, a future version of this class
|
|
242
|
+
// could even consider throwing away the intermediate R matrices if memory
|
|
243
|
+
// becomes an issue).
|
|
244
|
+
template <typename T>
|
|
245
|
+
class OnlineBlockHouseholderQR {
|
|
246
|
+
public:
|
|
247
|
+
using MatrixType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
|
248
|
+
using VectorType = Eigen::Matrix<T, Eigen::Dynamic, 1>;
|
|
249
|
+
|
|
250
|
+
// The lambda here lets you pass in a lambda for a Gauss-Newton/Levenberg-Marquardt solver.
|
|
251
|
+
// Basically this emulates solving the following system, but without needing to append the
|
|
252
|
+
// extra matrix:
|
|
253
|
+
// | [ lambda * I ] [ x ] - [ 0 ] |^2
|
|
254
|
+
// | [ A ] [ b ] |
|
|
255
|
+
explicit OnlineBlockHouseholderQR(Eigen::Index n_common, T lambda = T(0));
|
|
256
|
+
|
|
257
|
+
void add(size_t iBlock, MatrixType A_diag, MatrixType A_common, VectorType b) {
|
|
258
|
+
addMutating(iBlock, A_diag, A_common, b);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// We require passing in both A and rhs so that we can multiply rhs by Q
|
|
262
|
+
// as R is being constructed.
|
|
263
|
+
// This is an 'in-place' version which computes the factorization inside the
|
|
264
|
+
// passed-in matrix; it is here so that use cases that don't need to re-use
|
|
265
|
+
// the matrix can avoid copying.
|
|
266
|
+
void addMutating(
|
|
267
|
+
size_t iBlock,
|
|
268
|
+
Eigen::Ref<MatrixType> A_diag,
|
|
269
|
+
Eigen::Ref<MatrixType> A_common,
|
|
270
|
+
Eigen::Ref<VectorType> b) {
|
|
271
|
+
addMutating(
|
|
272
|
+
iBlock,
|
|
273
|
+
ColumnIndexedMatrix<MatrixType>(A_diag),
|
|
274
|
+
ColumnIndexedMatrix<MatrixType>(A_common),
|
|
275
|
+
b);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Mutating addition operator that also remaps the columns, allowing passing in arbitrary subsets
|
|
279
|
+
// of the columns in A_diag and A_common.
|
|
280
|
+
void addMutating(
|
|
281
|
+
size_t iBlock,
|
|
282
|
+
ColumnIndexedMatrix<MatrixType> A_diag,
|
|
283
|
+
ColumnIndexedMatrix<MatrixType> A_common,
|
|
284
|
+
Eigen::Ref<VectorType> b);
|
|
285
|
+
|
|
286
|
+
// You can retrieve the result x in one of two ways:
|
|
287
|
+
// 1. As a single, dense vector, which solves everything simultaneously, or
|
|
288
|
+
// 2. A block at a time.
|
|
289
|
+
// The latter is a little bit slower because it re-does the back-substitution
|
|
290
|
+
// for the final rows every time, but for the common case where the last set
|
|
291
|
+
// of variables is very small this should not be an issue.
|
|
292
|
+
|
|
293
|
+
// Retrieve the full dense result:
|
|
294
|
+
[[nodiscard]] VectorType x_dense() const;
|
|
295
|
+
|
|
296
|
+
// Retrieve the answer for a single block:
|
|
297
|
+
[[nodiscard]] VectorType x_i(size_t iBlock) const;
|
|
298
|
+
|
|
299
|
+
// Retrieve the answer for just the final "common" rows.
|
|
300
|
+
[[nodiscard]] VectorType x_n() const;
|
|
301
|
+
|
|
302
|
+
[[nodiscard]] const MatrixType& R_ii(size_t iBlock) const {
|
|
303
|
+
return R_ii_[iBlock];
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
[[nodiscard]] const VectorType& y_i(size_t iBlock) const {
|
|
307
|
+
return y_i_[iBlock];
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
[[nodiscard]] MatrixType R_dense() const;
|
|
311
|
+
[[nodiscard]] MatrixType y_dense() const;
|
|
312
|
+
|
|
313
|
+
[[nodiscard]] VectorType At_times_b_i(size_t iBlock) const;
|
|
314
|
+
[[nodiscard]] VectorType At_times_b_n() const;
|
|
315
|
+
[[nodiscard]] VectorType At_times_b_dense() const;
|
|
316
|
+
[[nodiscard]] T At_times_b_dot(Eigen::Ref<const VectorType> rhs) const;
|
|
317
|
+
|
|
318
|
+
void reset();
|
|
319
|
+
|
|
320
|
+
private:
|
|
321
|
+
const double lambda_;
|
|
322
|
+
|
|
323
|
+
// R is defined by
|
|
324
|
+
// Q*A = ( R )
|
|
325
|
+
// ( 0 )
|
|
326
|
+
// R looks like:
|
|
327
|
+
// [ R_ii[0] R_in[0] ]
|
|
328
|
+
// [ R_ii[1] R_in[1] ]
|
|
329
|
+
// [ R_ii[2] R_in[2] ]
|
|
330
|
+
// [ R_nn ]
|
|
331
|
+
std::deque<MatrixType> R_ii_;
|
|
332
|
+
std::deque<MatrixType> R_in_;
|
|
333
|
+
MatrixType R_nn_;
|
|
334
|
+
|
|
335
|
+
// We define y as
|
|
336
|
+
// Q*b = y
|
|
337
|
+
// y looks like:
|
|
338
|
+
// [ y_i ]
|
|
339
|
+
// [ ... ]
|
|
340
|
+
// [ y_n ]
|
|
341
|
+
std::deque<VectorType> y_i_;
|
|
342
|
+
VectorType y_n_;
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
// Another online QR solver, but for matrices that have a particular
|
|
346
|
+
// type of band structure. The left-hand part of the matrix is
|
|
347
|
+
// required to have a limited bandwidth, and we permit a "common"
|
|
348
|
+
// section at the right-hand side of the matrix, like this:
|
|
349
|
+
// ...b a n d e d... common
|
|
350
|
+
// [ a_11 a_15 ]
|
|
351
|
+
// [ a_21 a_22 a_25 ]
|
|
352
|
+
// [ a_31 a_32 a_35 ]
|
|
353
|
+
// [ a_42 a_43 a_45 ]
|
|
354
|
+
// [ a_53 a_54 a_55 ]
|
|
355
|
+
// [ a_64 a_65 ]
|
|
356
|
+
// Here, the "bandwidth" is in _columns_; that is, the above matrix
|
|
357
|
+
// has a bandwidth of 2 because no row spans more than two columns (excepting
|
|
358
|
+
// the "common" section).
|
|
359
|
+
// We also allow a "common" section at the right-hand side of the matrix
|
|
360
|
+
// which contains parameters that are allowed to be shared between all rows.
|
|
361
|
+
// This might seem very specialized, but it maps to an extremely common
|
|
362
|
+
// set of problems, where the band structure maps to the time dimension
|
|
363
|
+
// (where smoothness constraints tend to connect adjacent timepoints) while
|
|
364
|
+
// common parameters map to a set of common optimized parameters. For example:
|
|
365
|
+
// body tracking: band structure maps to smoothness constraints between adjacent frames,
|
|
366
|
+
// while common parameters control body scale
|
|
367
|
+
// camera calibration: band structure maps to smoothness constraints between
|
|
368
|
+
// adjacent frames of the extrinsics, while common parameters refer to
|
|
369
|
+
// intrinsics.
|
|
370
|
+
template <typename T>
|
|
371
|
+
class OnlineBandedHouseholderQR {
|
|
372
|
+
public:
|
|
373
|
+
using MatrixType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
|
374
|
+
using VectorType = Eigen::Matrix<T, Eigen::Dynamic, 1>;
|
|
375
|
+
|
|
376
|
+
// The lambda here lets you pass in a lambda for a Gauss-Newton/Levenberg-Marquardt solver.
|
|
377
|
+
// Basically this emulates solving the following system, but without needing to append the
|
|
378
|
+
// extra matrix:
|
|
379
|
+
// | [ lambda * I ] [ x ] - [ 0 ] |^2
|
|
380
|
+
// | [ A ] [ b ] |
|
|
381
|
+
explicit OnlineBandedHouseholderQR(
|
|
382
|
+
Eigen::Index n_band,
|
|
383
|
+
Eigen::Index n_common,
|
|
384
|
+
Eigen::Index bandwidth,
|
|
385
|
+
T lambda = T(0));
|
|
386
|
+
|
|
387
|
+
void add(size_t iCol_offset, MatrixType A_band, MatrixType A_common, VectorType b) {
|
|
388
|
+
addMutating(iCol_offset, A_band, A_common, b);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
void add(MatrixType A_common, VectorType b) {
|
|
392
|
+
addMutating(A_common, b);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// We require passing in both A and rhs so that we can multiply rhs by Q
|
|
396
|
+
// as R is being constructed.
|
|
397
|
+
// This is an 'in-place' version which computes the factorization inside the
|
|
398
|
+
// passed-in matrix; it is here so that use cases that don't need to re-use
|
|
399
|
+
// the matrix can avoid copying.
|
|
400
|
+
void addMutating(
|
|
401
|
+
const Eigen::Index iCol_offset,
|
|
402
|
+
Eigen::Ref<MatrixType> A_band,
|
|
403
|
+
Eigen::Ref<MatrixType> A_common,
|
|
404
|
+
Eigen::Ref<VectorType> b) {
|
|
405
|
+
addMutating(
|
|
406
|
+
iCol_offset,
|
|
407
|
+
ColumnIndexedMatrix<MatrixType>(A_band),
|
|
408
|
+
ColumnIndexedMatrix<MatrixType>(A_common),
|
|
409
|
+
b);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
void addMutating(Eigen::Ref<MatrixType> A_common, Eigen::Ref<VectorType> b) {
|
|
413
|
+
addMutating(ColumnIndexedMatrix<MatrixType>(A_common), b);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Mutating addition operator that also remaps the columns, allowing passing in arbitrary subsets
|
|
417
|
+
// of the columns in A_diag and A_common.
|
|
418
|
+
void addMutating(
|
|
419
|
+
Eigen::Index iCol_offset,
|
|
420
|
+
ColumnIndexedMatrix<MatrixType> A_band,
|
|
421
|
+
ColumnIndexedMatrix<MatrixType> A_common,
|
|
422
|
+
Eigen::Ref<VectorType> b);
|
|
423
|
+
|
|
424
|
+
void addMutating(ColumnIndexedMatrix<MatrixType> A_common, Eigen::Ref<VectorType> b);
|
|
425
|
+
|
|
426
|
+
// Zeroes out just the banded part of the matrix; applies Householder rotations that
|
|
427
|
+
// zero out everything in A_band. The A_common will still have nonzero entries so
|
|
428
|
+
// after calling this you should call addMutating(A_common, b) to complete adding the
|
|
429
|
+
// columns to the matrix.
|
|
430
|
+
//
|
|
431
|
+
// Why is this useful? If you are careful about it, you can call zeroBandedPart on
|
|
432
|
+
// multiple non-overlapping segments of the banded matrix at a time, but processing
|
|
433
|
+
// A_common must be serialized. Since in many problems the number of common variables
|
|
434
|
+
// is much smaller than the number of banded variables this can provide a substantial
|
|
435
|
+
// speedup in practice.
|
|
436
|
+
void zeroBandedPart(
|
|
437
|
+
Eigen::Index iCol_offset,
|
|
438
|
+
ColumnIndexedMatrix<MatrixType> A_band,
|
|
439
|
+
ColumnIndexedMatrix<MatrixType> A_common,
|
|
440
|
+
Eigen::Ref<VectorType> b);
|
|
441
|
+
|
|
442
|
+
// You can retrieve the result x in one of two ways:
|
|
443
|
+
// 1. As a single, dense vector, which solves everything simultaneously, or
|
|
444
|
+
// 2. A block at a time.
|
|
445
|
+
// The latter is a little bit slower because it re-does the back-substitution
|
|
446
|
+
// for the final rows every time, but for the common case where the last set
|
|
447
|
+
// of variables is very small this should not be an issue.
|
|
448
|
+
|
|
449
|
+
// Retrieve the full dense result:
|
|
450
|
+
[[nodiscard]] VectorType x_dense() const;
|
|
451
|
+
[[nodiscard]] MatrixType R_dense() const;
|
|
452
|
+
[[nodiscard]] MatrixType y_dense() const {
|
|
453
|
+
return y_;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
[[nodiscard]] VectorType At_times_b() const;
|
|
457
|
+
|
|
458
|
+
void reset();
|
|
459
|
+
|
|
460
|
+
[[nodiscard]] Eigen::Index bandwidth() const {
|
|
461
|
+
return R_band_.rows();
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
[[nodiscard]] Eigen::Index n_band() const {
|
|
465
|
+
return R_band_.cols();
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
[[nodiscard]] Eigen::Index n_common() const {
|
|
469
|
+
return R_common_.cols();
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
private:
|
|
473
|
+
// Sets the diagonal of the R matrix to lambda.
|
|
474
|
+
void initializeDiagonal();
|
|
475
|
+
|
|
476
|
+
[[nodiscard]] T R_band_entry(Eigen::Index iRow, Eigen::Index jCol) const {
|
|
477
|
+
const auto bandwidth = R_band_.rows();
|
|
478
|
+
MT_CHECK(iRow <= jCol);
|
|
479
|
+
MT_CHECK(jCol - iRow <= bandwidth);
|
|
480
|
+
return R_band_(bandwidth + iRow - jCol - 1, jCol);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
[[nodiscard]] T& R_band_entry(Eigen::Index iRow, Eigen::Index jCol) {
|
|
484
|
+
const auto bandwidth = R_band_.rows();
|
|
485
|
+
MT_CHECK(iRow <= jCol);
|
|
486
|
+
MT_CHECK(jCol - iRow <= bandwidth);
|
|
487
|
+
return R_band_(bandwidth + iRow - jCol - 1, jCol);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const double lambda_;
|
|
491
|
+
|
|
492
|
+
// R is defined by
|
|
493
|
+
// Q*A = ( R )
|
|
494
|
+
// ( 0 )
|
|
495
|
+
// R looks like:
|
|
496
|
+
// [ * * * * * ]
|
|
497
|
+
// [ * * * * * ]
|
|
498
|
+
// [ * * * * * ]
|
|
499
|
+
// [ * * * * ]
|
|
500
|
+
// [ * * * ]
|
|
501
|
+
// [ * * ]
|
|
502
|
+
// [ * ]
|
|
503
|
+
// ^^^^^^^^^ ^^^^
|
|
504
|
+
// R_band_ R_common_
|
|
505
|
+
MatrixType R_common_;
|
|
506
|
+
|
|
507
|
+
// Uses "banded" storage, which looks like this:
|
|
508
|
+
// [ r_11 r_12 ]
|
|
509
|
+
// [ r_22 r_23 ]
|
|
510
|
+
// [ r_33 r_34 ]
|
|
511
|
+
MatrixType R_band_;
|
|
512
|
+
|
|
513
|
+
VectorType y_;
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
} // namespace momentum
|