Files
Denso/srcs/RobotNet10/RobotApp/Communication/CeresSharp/Native/CeresNative.cs
2026-07-03 16:31:37 +07:00

1024 lines
43 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Text;
using CeresSharp.Exceptions;
namespace CeresSharp.Native;
/// <summary>
/// P/Invoke declarations for Ceres Wrapper C API.
/// This file contains all native function declarations for the Ceres Solver wrapper.
/// </summary>
internal static partial class CeresNative
{
private const string LibraryName = "libceres_wrapper.so";
// ============================================================================
// Error Handling
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_get_error_message(CeresErrorCode errorCode);
// ============================================================================
// Library Information and Version
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_get_version_string();
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_get_version_major();
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_get_version_minor();
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_get_version_revision();
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_get_detailed_version_string(
StringBuilder buffer,
int bufferSize);
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_get_library_info(
StringBuilder buffer,
int bufferSize);
// ============================================================================
// Official C API (for Problem creation/destruction)
// Note: These may need to be imported from libceres.so instead
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_create_problem();
[LibraryImport(LibraryName)]
internal static partial void ceres_free_problem(IntPtr problem);
// ============================================================================
// Solver Options
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_solver_options();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_solver_options(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_linear_solver_type(
IntPtr options, int linearSolverType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_linear_solver_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_minimizer_type(
IntPtr options, int minimizerType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_minimizer_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_num_iterations(
IntPtr options, int maxNumIterations);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_num_iterations(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_num_threads(
IntPtr options, int numThreads);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_num_threads(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_function_tolerance(
IntPtr options, double functionTolerance);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_function_tolerance(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_gradient_tolerance(
IntPtr options, double gradientTolerance);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_gradient_tolerance(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_parameter_tolerance(
IntPtr options, double parameterTolerance);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_parameter_tolerance(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_initial_trust_region_radius(
IntPtr options, double radius);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_initial_trust_region_radius(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_trust_region_radius(
IntPtr options, double radius);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_max_trust_region_radius(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_min_trust_region_radius(
IntPtr options, double radius);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_min_trust_region_radius(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_preconditioner_type(
IntPtr options, int preconditionerType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_preconditioner_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_trust_region_strategy_type(
IntPtr options, int trustRegionStrategyType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_trust_region_strategy_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_dogleg_type(
IntPtr options, int doglegType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_dogleg_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_use_nonmonotonic_steps(
IntPtr options, int useNonmonotonicSteps);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_use_nonmonotonic_steps(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_consecutive_nonmonotonic_steps(
IntPtr options, int maxSteps);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_consecutive_nonmonotonic_steps(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_num_consecutive_invalid_steps(
IntPtr options, int maxSteps);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_num_consecutive_invalid_steps(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_min_relative_decrease(
IntPtr options, double minRelativeDecrease);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_min_relative_decrease(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_logging_type(
IntPtr options, int loggingType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_logging_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_minimizer_progress_to_stdout(
IntPtr options, int minimizerProgressToStdout);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_minimizer_progress_to_stdout(IntPtr options);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern int ceres_wrapper_solver_options_is_valid(
IntPtr options, StringBuilder errorMessage, int errorMessageSize);
// Line search options
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_line_search_type(
IntPtr options, int lineSearchType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_line_search_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_line_search_direction_type(
IntPtr options, int lineSearchDirectionType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_line_search_direction_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_nonlinear_conjugate_gradient_type(
IntPtr options, int ncgType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_nonlinear_conjugate_gradient_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_lbfgs_rank(
IntPtr options, int maxLbfgsRank);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_lbfgs_rank(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_line_search_step_contraction(
IntPtr options, double maxStepContraction);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_max_line_search_step_contraction(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_min_line_search_step_contraction(
IntPtr options, double minStepContraction);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_min_line_search_step_contraction(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_num_line_search_step_size_iterations(
IntPtr options, int maxIterations);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_num_line_search_step_size_iterations(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_num_line_search_direction_restarts(
IntPtr options, int maxRestarts);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_num_line_search_direction_restarts(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_line_search_sufficient_function_decrease(
IntPtr options, double sufficientDecrease);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_line_search_sufficient_function_decrease(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_line_search_sufficient_curvature_decrease(
IntPtr options, double sufficientCurvatureDecrease);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_line_search_sufficient_curvature_decrease(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_line_search_step_expansion(
IntPtr options, double maxStepExpansion);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_max_line_search_step_expansion(IntPtr options);
// Trust region parameters
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_lm_diagonal(
IntPtr options, double maxLmDiagonal);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_max_lm_diagonal(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_min_lm_diagonal(
IntPtr options, double minLmDiagonal);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_min_lm_diagonal(IntPtr options);
// Linear solver options
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_sparse_linear_algebra_library_type(
IntPtr options, int sparseLibraryType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_sparse_linear_algebra_library_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_dense_linear_algebra_library_type(
IntPtr options, int denseLibraryType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_dense_linear_algebra_library_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_linear_solver_iterations(
IntPtr options, int maxIterations);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_max_linear_solver_iterations(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_min_linear_solver_iterations(
IntPtr options, int minIterations);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_min_linear_solver_iterations(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_linear_solver_tolerance(
IntPtr options, double tolerance);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_linear_solver_tolerance(IntPtr options);
// Inner iterations
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_use_inner_iterations(
IntPtr options, int useInnerIterations);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_use_inner_iterations(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_inner_iteration_tolerance(
IntPtr options, double tolerance);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_inner_iteration_tolerance(IntPtr options);
// Timing
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_max_solver_time_in_seconds(
IntPtr options, double maxTime);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_options_get_max_solver_time_in_seconds(IntPtr options);
// Checkpointing
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_update_state_every_iteration(
IntPtr options, int updateEveryIteration);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_options_get_update_state_every_iteration(IntPtr options);
// ============================================================================
// Solver Summary
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_solver_summary();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_solver_summary(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_termination_type(IntPtr summary);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern void ceres_wrapper_solver_summary_get_message(
IntPtr summary, StringBuilder message, int messageSize);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_initial_cost(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_final_cost(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_iterations(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_successful_steps(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_unsuccessful_steps(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_inner_iteration_steps(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_total_time_in_seconds(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_preprocessor_time_in_seconds(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_minimizer_time_in_seconds(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_postprocessor_time_in_seconds(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_linear_solver_time_in_seconds(IntPtr summary);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern void ceres_wrapper_solver_summary_get_full_report(
IntPtr summary, StringBuilder report, int reportSize);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_parameter_blocks(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_parameters(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_effective_parameters(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_residual_blocks(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_solver_summary_get_num_residuals(IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_solver_summary_get_cost_change(IntPtr summary);
// ============================================================================
// Solve
// ============================================================================
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_solve(
IntPtr problem,
IntPtr options,
IntPtr summary,
StringBuilder errorMessage,
int errorMessageSize);
// ============================================================================
// Problem Operations
// ============================================================================
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_problem_add_parameter_block(
IntPtr problem,
IntPtr parameters,
int size,
StringBuilder errorMessage,
int errorMessageSize);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_set_parameter_block_constant(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_set_parameter_block_variable(
IntPtr problem,
IntPtr parameters);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern CeresErrorCode ceres_wrapper_problem_remove_parameter_block(
IntPtr problem,
IntPtr parameters,
StringBuilder errorMessage,
int errorMessageSize);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern CeresErrorCode ceres_wrapper_problem_remove_residual_block(
IntPtr problem,
IntPtr residualBlockId,
StringBuilder errorMessage,
int errorMessageSize);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern CeresErrorCode ceres_wrapper_problem_add_residual_block(
IntPtr problem,
IntPtr costFunction,
IntPtr lossFunction,
IntPtr parameterBlocks,
int numParameterBlocks,
out IntPtr residualBlockId,
StringBuilder errorMessage,
int errorMessageSize);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_num_parameter_blocks(IntPtr problem);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_num_residual_blocks(IntPtr problem);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_num_parameters(IntPtr problem);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_num_residuals(IntPtr problem);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_has_parameter_block(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_is_parameter_block_constant(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_get_parameter_block_size(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_get_parameter_block_tangent_size(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_has_manifold(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_problem_get_manifold(
IntPtr problem,
IntPtr parameters);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_set_manifold(
IntPtr problem,
IntPtr parameters,
IntPtr manifold);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_set_parameter_lower_bound(
IntPtr problem,
IntPtr parameters,
int index,
double lowerBound);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_set_parameter_upper_bound(
IntPtr problem,
IntPtr parameters,
int index,
double upperBound);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_problem_get_parameter_lower_bound(
IntPtr problem,
IntPtr parameters,
int index);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_problem_get_parameter_upper_bound(
IntPtr problem,
IntPtr parameters,
int index);
// ============================================================================
// Loss Functions
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_huber_loss(double a);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_trivial_loss();
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_cauchy_loss(double a);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_softl1_loss(double a);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_arctan_loss(double a);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_tolerant_loss(double a, double b);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_loss_function(IntPtr loss);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_composed_loss(
IntPtr f, int ownershipF, IntPtr g, int ownershipG);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_scaled_loss(
IntPtr rho, double a, int ownership);
// ============================================================================
// Manifolds
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_quaternion_manifold();
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_sphere_manifold(int dimension);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_line_manifold(int dimension);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_euclidean_manifold(int dimension);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_subset_manifold(
IntPtr constantSubset,
int constantSubsetSize,
int ambientSize);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_product_manifold(
IntPtr manifolds,
int numManifolds);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_manifold(IntPtr manifold);
// AutoDiff Manifold callbacks
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int CeresAutoDiffManifoldPlus(
IntPtr userData,
IntPtr x,
IntPtr delta,
IntPtr xPlusDelta);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int CeresAutoDiffManifoldMinus(
IntPtr userData,
IntPtr y,
IntPtr x,
IntPtr yMinusX);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_autodiff_manifold(
int ambientSize,
int tangentSize,
CeresAutoDiffManifoldPlus plus,
CeresAutoDiffManifoldMinus minus,
IntPtr userData);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_autodiff_manifold(IntPtr manifold);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_manifold_ambient_size(IntPtr manifold);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_manifold_tangent_size(IntPtr manifold);
// ============================================================================
// Interpolators
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_bicubic_interpolator(
IntPtr data,
int rows,
int cols);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_bicubic_interpolator(IntPtr interpolator);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_bicubic_interpolator_evaluate(
IntPtr interpolator,
double x,
double y,
IntPtr value,
IntPtr gradientX,
IntPtr gradientY);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_cubic_interpolator(
IntPtr data,
int numValues);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_cubic_interpolator(IntPtr interpolator);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_cubic_interpolator_evaluate(
IntPtr interpolator,
double x,
IntPtr value,
IntPtr gradient);
// ============================================================================
// Cost Functions
// ============================================================================
// Callback delegate for AutoDiff cost function
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int CeresAutoDiffCostFunctionCallback(
IntPtr userData,
IntPtr parameters,
IntPtr residuals);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_autodiff_cost_function(
CeresAutoDiffCostFunctionCallback callback,
IntPtr userData,
int numResiduals,
int numParameterBlocks,
IntPtr parameterBlockSizes);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_dynamic_autodiff_cost_function(
CeresAutoDiffCostFunctionCallback callback,
IntPtr userData,
int numResiduals,
int numParameterBlocks,
IntPtr parameterBlockSizes);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_autodiff_cost_function(IntPtr costFunction);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_dynamic_autodiff_cost_function(IntPtr costFunction);
// Callback delegate for NumericDiff cost function
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int CeresNumericDiffCostFunctionCallback(
IntPtr parameters,
IntPtr residuals,
IntPtr userData);
// Note: NumericDiff uses a struct, we'll need to marshal it manually
[StructLayout(LayoutKind.Sequential)]
internal struct CeresNumericDiffOptions
{
public int numResiduals;
public int numParameterBlocks;
public IntPtr parameterBlockSizes;
public CeresNumericDiffCostFunctionCallback callback;
public IntPtr userData;
}
// Note: Using DllImport instead of LibraryImport because CeresNumericDiffOptions contains a delegate
// which is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr ceres_wrapper_create_numeric_diff_cost_function(
ref CeresNumericDiffOptions options,
int method);
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr ceres_wrapper_create_dynamic_numeric_diff_cost_function(
ref CeresNumericDiffOptions options,
int method);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_numeric_diff_cost_function(IntPtr costFunction);
// ============================================================================
// Problem Options
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_problem_options();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_problem_options(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_cost_function_ownership(
IntPtr options, int ownership);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_options_get_cost_function_ownership(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_loss_function_ownership(
IntPtr options, int ownership);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_options_get_loss_function_ownership(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_manifold_ownership(
IntPtr options, int ownership);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_options_get_manifold_ownership(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_enable_fast_removal(
IntPtr options, int enable);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_options_get_enable_fast_removal(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_disable_all_safety_checks(
IntPtr options, int disable);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_problem_options_get_disable_all_safety_checks(IntPtr options);
// Evaluation callback delegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void CeresEvaluationCallback(
IntPtr userData,
int numResiduals,
int numParameterBlocks,
IntPtr parameterBlockSizes);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_evaluation_callback(
IntPtr options,
CeresEvaluationCallback callback,
IntPtr userData);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_problem_with_options(IntPtr options);
// ============================================================================
// Iteration Callback
// ============================================================================
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int CeresIterationCallback(
IntPtr userData,
IntPtr summary);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_solver_options_set_iteration_callback(
IntPtr options,
CeresIterationCallback callback,
IntPtr userData);
// ============================================================================
// Covariance
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_covariance_options();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_covariance_options(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_num_threads(
IntPtr options, int numThreads);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_covariance_options_get_num_threads(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_sparse_linear_algebra_library_type(
IntPtr options, int libraryType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_covariance_options_get_sparse_linear_algebra_library_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_algorithm_type(
IntPtr options, int algorithmType);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_covariance_options_get_algorithm_type(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_min_reciprocal_condition_number(
IntPtr options, double minReciprocalConditionNumber);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_covariance_options_get_min_reciprocal_condition_number(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_null_space_rank(
IntPtr options, int nullSpaceRank);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_covariance_options_get_null_space_rank(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_covariance_options_set_apply_loss_function(
IntPtr options, int applyLossFunction);
[LibraryImport(LibraryName)]
internal static partial int ceres_wrapper_covariance_options_get_apply_loss_function(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_covariance();
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_covariance_with_options(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_covariance(IntPtr covariance);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_covariance_compute(
IntPtr covariance,
IntPtr problem,
IntPtr options,
IntPtr parameterBlocks,
int numParameterBlocks,
StringBuilder errorMessage,
int errorMessageSize);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_covariance_get_covariance_block(
IntPtr covariance,
IntPtr parameterBlock1,
IntPtr parameterBlock2,
IntPtr covarianceBlock,
StringBuilder errorMessage,
int errorMessageSize);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_covariance_get_covariance_matrix(
IntPtr covariance,
IntPtr parameterBlocks,
int numParameterBlocks,
IntPtr covarianceMatrix,
StringBuilder errorMessage,
int errorMessageSize);
// ============================================================================
// Gradient Checker
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_gradient_checker_options();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_gradient_checker_options(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_gradient_checker_options_set_gradient_check_relative_precision(
IntPtr options, double precision);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_gradient_checker_options_get_gradient_check_relative_precision(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_gradient_checker_options_set_gradient_check_numeric_derivative_relative_step_size(
IntPtr options, double stepSize);
[LibraryImport(LibraryName)]
internal static partial double ceres_wrapper_gradient_checker_options_get_gradient_check_numeric_derivative_relative_step_size(IntPtr options);
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_gradient_checker(
IntPtr costFunction,
IntPtr manifolds,
int numManifolds,
IntPtr options);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_gradient_checker(IntPtr checker);
// Note: Using DllImport instead of LibraryImport because StringBuilder is not supported by source-generated P/Invokes
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
internal static extern CeresErrorCode ceres_wrapper_gradient_checker_probe(
IntPtr checker,
IntPtr parameters,
double relativePrecision,
StringBuilder errorMessage,
int errorMessageSize);
// ============================================================================
// Context
// ============================================================================
[LibraryImport(LibraryName)]
internal static partial IntPtr ceres_wrapper_create_context();
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_free_context(IntPtr context);
[LibraryImport(LibraryName)]
internal static partial void ceres_wrapper_problem_options_set_context(
IntPtr options,
IntPtr context);
// ============================================================================
// Helper Methods
// ============================================================================
/// <summary>
/// Checks error code and throws exception if not successful.
/// </summary>
internal static void CheckError(CeresErrorCode errorCode)
{
if (errorCode != CeresErrorCode.Success)
{
var errorMessagePtr = ceres_wrapper_get_error_message(errorCode);
var errorMessage = errorMessagePtr != IntPtr.Zero
? Marshal.PtrToStringAnsi(errorMessagePtr)
: $"Unknown error code: {errorCode}";
throw new CeresException(errorCode, errorMessage);
}
}
}