def registration_gmmtree(
    source: Union[np.ndarray, o3.geometry.PointCloud],
    target: Union[np.ndarray, o3.geometry.PointCloud],
    maxiter: int = 20,
    tol: float = 1.0e-4,
    callbacks: List[Callable] = [],
    **kwargs: Any,
) -> MstepResult:
    """GMMTree registration

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        maxitr (int, optional): Maximum number of iterations to EM algorithm.
        tol (float, optional): Tolerance for termination.
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Keyword Args:
        tree_level (int, optional): Maximum depth level of GMM tree.
        lambda_c (float, optional): Parameter that determine the pruning of GMM tree.
        lambda_s (float, optional): Parameter that tolerance for building GMM tree.
        tf_init_params (dict, optional): Parameters to initialize transformation.

    Returns:
        MstepResult: Result of the registration (transformation, q)
    """
    cv = lambda x: np.asarray(x.points if isinstance(x, o3.geometry.PointCloud) else x)
    gt = GMMTree(cv(source), **kwargs)
    gt.set_callbacks(callbacks)
    return gt.registration(cv(target), maxiter, tol)
GMMTree registration

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        maxitr (int, optional): Maximum number of iterations to EM algorithm.
        tol (float, optional): Tolerance for termination.
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Keyword Args:
        tree_level (int, optional): Maximum depth level of GMM tree.
        lambda_c (float, optional): Parameter that determine the pruning of GMM tree.
        lambda_s (float, optional): Parameter that tolerance for building GMM tree.
        tf_init_params (dict, optional): Parameters to initialize transformation.

    Returns:
        MstepResult: Result of the registration (transformation, q)
    
probreg/gmmtree.py