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