# Path: hub_toolbox/io.py
# def load_dexter():
# def check_is_nD_array(arr:np.ndarray, n:int, arr_type=''):
# def check_distance_matrix_shape(D:np.ndarray):
# def check_distance_matrix_shape_fits_vectors(D:np.ndarray, vectors:np.ndarray):
# def check_distance_matrix_shape_fits_labels(D:np.ndarray, classes:np.ndarray):
# def check_vector_matrix_shape_fits_labels(X:np.ndarray, classes:np.ndarray):
# def check_sample_shape_fits(D:np.ndarray, idx:np.ndarray):
# def check_valid_metric_parameter(metric:str):
# def matrix_split(rows, cols, elem_size=8, nr_matrices=4): # pragma: no cover
# def random_sparse_matrix(size, density=0.05):
# def save_csr_matrix(file, matrix):
# def load_csr_matrix(file):
#     def __init__(self, unit='kB'):
#     def _factor(self):
#     def total(self):
#     def used(self):
#     def used_real(self):
#     def shared(self):
#     def buffers(self):
#     def cached(self):
#     def user_free(self):
#     def swap(self):
#     def swap_free(self):
#     def swap_used(self):
#     D = cosine_distance(vectors)
#     S = sparse.rand(size, size, density, 'csr')
# class FreeMemLinux(object): # pragma: no cover


import sys
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix
from hub_toolbox import io
        Goodman-Kruskal index in ``[-1, 1]`` (higher=better)
    
    Notes
    -----
    This clustering quality measure relates the number of concordant (`Q_c`) 
    and discordant (`Q_d`) quadruples (`d_ij`, `d_kl`) of a distance matrix.
    We only consider tuples, so that `i`, `j` are from the same class 
    and `k`, `l` are from different classes. Then a quadruple is...
    concordant, if 
    
    .. math:: 
        d_{i,j} < d_{k,l}
    
    discordant, if 
    
    .. math:: 
        d_{i,j} > d_{k,l}
    
    and not counted, otherwise.
    
    The Goodman-Kruskal index gamma is then defined as: 
    
    .. math:: 
        gamma = \\frac{Q_c - Q_d}{Q_c + Q_d}
        
    `gamma` is bounded to ``[-1, 1]``, where larger values indicate better 
    clustering.
    """
    
    # Checking input

# Path: hub_toolbox/io.py
# def load_dexter():
# def check_is_nD_array(arr:np.ndarray, n:int, arr_type=''):
# def check_distance_matrix_shape(D:np.ndarray):
# def check_distance_matrix_shape_fits_vectors(D:np.ndarray, vectors:np.ndarray):
# def check_distance_matrix_shape_fits_labels(D:np.ndarray, classes:np.ndarray):
# def check_vector_matrix_shape_fits_labels(X:np.ndarray, classes:np.ndarray):
# def check_sample_shape_fits(D:np.ndarray, idx:np.ndarray):
# def check_valid_metric_parameter(metric:str):
# def matrix_split(rows, cols, elem_size=8, nr_matrices=4): # pragma: no cover
# def random_sparse_matrix(size, density=0.05):
# def save_csr_matrix(file, matrix):
# def load_csr_matrix(file):
#     def __init__(self, unit='kB'):
#     def _factor(self):
#     def total(self):
#     def used(self):
#     def used_real(self):
#     def shared(self):
#     def buffers(self):
#     def cached(self):
#     def user_free(self):
#     def swap(self):
#     def swap_free(self):
#     def swap_used(self):
#     D = cosine_distance(vectors)
#     S = sparse.rand(size, size, density, 'csr')
# class FreeMemLinux(object): # pragma: no cover


# Path: hub_toolbox/goodman_kruskal.py
import sys
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix
from hub_toolbox import io

        Goodman-Kruskal index in ``[-1, 1]`` (higher=better)
    
    Notes
    -----
    This clustering quality measure relates the number of concordant (`Q_c`) 
    and discordant (`Q_d`) quadruples (`d_ij`, `d_kl`) of a distance matrix.
    We only consider tuples, so that `i`, `j` are from the same class 
    and `k`, `l` are from different classes. Then a quadruple is...
    concordant, if 
    
    .. math:: 
        d_{i,j} < d_{k,l}
    
    discordant, if 
    
    .. math:: 
        d_{i,j} > d_{k,l}
    
    and not counted, otherwise.
    
    The Goodman-Kruskal index gamma is then defined as: 
    
    .. math:: 
        gamma = \\frac{Q_c - Q_d}{Q_c + Q_d}
        
    `gamma` is bounded to ``[-1, 1]``, where larger values indicate better 
    clustering.
    """
    
    # Checking input

    io.check_distance_matrix_shape(D)