54 #define DISPATCH_ROBUST_KERNEL_FUNCTION(METHOD, scalar_t, scaling_parameter, \
55 shape_parameter, ...) \
57 scalar_t scale = static_cast<scalar_t>(scaling_parameter); \
58 if (METHOD == RobustKernelMethod::L2Loss) { \
59 auto GetWeightFromRobustKernel = \
60 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
63 return __VA_ARGS__(); \
64 } else if (METHOD == RobustKernelMethod::L1Loss) { \
65 auto GetWeightFromRobustKernel = \
66 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
67 return 1.0 / abs(residual); \
69 return __VA_ARGS__(); \
70 } else if (METHOD == RobustKernelMethod::HuberLoss) { \
71 auto GetWeightFromRobustKernel = \
72 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
73 return scale / max(abs(residual), scale); \
75 return __VA_ARGS__(); \
76 } else if (METHOD == RobustKernelMethod::CauchyLoss) { \
77 auto GetWeightFromRobustKernel = \
78 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
79 return 1.0 / (1.0 + Square(residual / scale)); \
81 return __VA_ARGS__(); \
82 } else if (METHOD == RobustKernelMethod::GMLoss) { \
83 auto GetWeightFromRobustKernel = \
84 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
85 return scale / Square(scale + Square(residual)); \
87 return __VA_ARGS__(); \
88 } else if (METHOD == RobustKernelMethod::TukeyLoss) { \
89 auto GetWeightFromRobustKernel = \
90 [=] OPEN3D_HOST_DEVICE(scalar_t residual) -> scalar_t { \
91 return Square(1.0 - Square(min((scalar_t)1.0, \
92 abs(residual) / scale))); \
94 return __VA_ARGS__(); \
95 } else if (METHOD == RobustKernelMethod::GeneralizedLoss) { \
96 if (open3d::IsClose(shape_parameter, 2.0, 1e-3)) { \
97 auto const_val = 1.0 / Square(scale); \
98 auto GetWeightFromRobustKernel = \
99 [=] OPEN3D_HOST_DEVICE( \
100 scalar_t residual) -> scalar_t { \
103 return __VA_ARGS__(); \
104 } else if (open3d::IsClose(shape_parameter, 0.0, 1e-3)) { \
105 auto GetWeightFromRobustKernel = \
106 [=] OPEN3D_HOST_DEVICE( \
107 scalar_t residual) -> scalar_t { \
108 return 2.0 / (Square(residual) + 2 * Square(scale)); \
110 return __VA_ARGS__(); \
111 } else if (shape_parameter < -1e7) { \
112 auto GetWeightFromRobustKernel = \
113 [=] OPEN3D_HOST_DEVICE( \
114 scalar_t residual) -> scalar_t { \
115 return exp(Square(residual / scale) / (-2.0)) / \
118 return __VA_ARGS__(); \
120 auto GetWeightFromRobustKernel = \
121 [=] OPEN3D_HOST_DEVICE( \
122 scalar_t residual) -> scalar_t { \
123 return pow((Square(residual / scale) / \
124 abs(shape_parameter - 2.0) + \
126 ((shape_parameter / 2.0) - 1.0)) / \
129 return __VA_ARGS__(); \
132 utility::LogError("Unsupported method."); \
RobustKernelMethod
Definition: RobustKernel.h:34