def registration_gmmreg(
    source: np.ndarray, target: np.ndarray, tf_type_name: str = "rigid", callbacks: List = [], **kargs
):
    """GMMReg.

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        tf_type_name (str, optional): Transformation type('rigid', 'nonrigid')
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Returns:
        probreg.Transformation: Transformation from source to target.
    """
    cv = lambda x: np.asarray(x.points if isinstance(x, o3.geometry.PointCloud) else x)
    if tf_type_name == "rigid":
        gmmreg = RigidGMMReg(cv(source), **kargs)
    elif tf_type_name == "nonrigid":
        gmmreg = TPSGMMReg(cv(source), **kargs)
    else:
        raise ValueError("Unknown transform type %s" % tf_type_name)
    gmmreg.set_callbacks(callbacks)
    return gmmreg.registration(cv(target))
GMMReg.

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        tf_type_name (str, optional): Transformation type('rigid', 'nonrigid')
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Returns:
        probreg.Transformation: Transformation from source to target.
    
probreg/l2dist_regs.py