
    {Kg                         d dl Zd dlmZ ddlmZmZ ddlmZm	Z	 dgZ
d Zd Zd	 Z eegege ed
h      gdd      d
dd       Zy)    N)linear_sum_assignment   )
StrOptionsvalidate_params)check_arraycheck_consistent_lengthconsensus_scorec                 p    t        |   t        |  d }t        ||       \  }}t        ||      \  }}||||fS )z9Unpacks the row and column arrays and checks their shape.c                     t        | d      S )NF)	ensure_2d)r   )xs    f/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/metrics/cluster/_bicluster.py<lambda>z)_check_rows_and_columns.<locals>.<lambda>   s    {16    )r   map)abchecksa_rowsa_colsb_rowsb_colss          r   _check_rows_and_columnsr   
   sD    QQ6F^NFF^NFF666))r   c                     | |z  j                         ||z  j                         z  }| j                         |j                         z  }|j                         |j                         z  }|||z   |z
  z  S )z:Jaccard coefficient on the elements of the two biclusters.)sum)r   r   r   r   intersectiona_sizeb_sizes          r   _jaccardr      sf    VO((*fvo-B-B-DDLZZ\FJJL(FZZ\FJJL(F6F?\9::r   c                 .   t        | |      \  }}}}|j                  d   }|j                  d   }t        j                  t	        |      D 	
cg c]0  }	t	        |      D 
cg c]  }
 |||	   ||	   ||
   ||
          c}
2 c}
}	      }|S c c}
w c c}
}	w )zComputes pairwise similarity matrix.

    result[i, j] is the Jaccard coefficient of a's bicluster i and b's
    bicluster j.

    r   )r   shapenparrayrange)r   r   
similarityr   r   r   r   n_an_bijresults               r   _pairwise_similarityr+      s     &=Q%B"FFFF
,,q/C
,,q/CXX 3Z	
 NSSVZXZZq	6!9fQiCZX	
F M	 Y	
s   B
B=B
B
jaccard)r   r   r%   T)prefer_skip_nested_validation)r%   c                    |dk(  rt         }t        | ||      }t        d|z
        \  }}t        | d         }t        |d         }|||f   j	                         t        ||      z  S )ad  The similarity of two sets of biclusters.

    Similarity between individual biclusters is computed. Then the best
    matching between sets is found by solving a linear sum assignment problem,
    using a modified Jonker-Volgenant algorithm.
    The final score is the sum of similarities divided by the size of
    the larger set.

    Read more in the :ref:`User Guide <biclustering>`.

    Parameters
    ----------
    a : tuple (rows, columns)
        Tuple of row and column indicators for a set of biclusters.

    b : tuple (rows, columns)
        Another set of biclusters like ``a``.

    similarity : 'jaccard' or callable, default='jaccard'
        May be the string "jaccard" to use the Jaccard coefficient, or
        any function that takes four arguments, each of which is a 1d
        indicator vector: (a_rows, a_columns, b_rows, b_columns).

    Returns
    -------
    consensus_score : float
       Consensus score, a non-negative value, sum of similarities
       divided by size of larger set.

    See Also
    --------
    scipy.optimize.linear_sum_assignment : Solve the linear sum assignment problem.

    References
    ----------
    * Hochreiter, Bodenhofer, et. al., 2010. `FABIA: factor analysis
      for bicluster acquisition
      <https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2881408/>`__.

    Examples
    --------
    >>> from sklearn.metrics import consensus_score
    >>> a = ([[True, False], [False, True]], [[False, True], [True, False]])
    >>> b = ([[False, True], [True, False]], [[True, False], [False, True]])
    >>> consensus_score(a, b, similarity='jaccard')
    np.float64(1.0)
    r,   g      ?r   )r   r+   r   lenr   max)r   r   r%   matrixrow_indicescol_indicesr&   r'   s           r   r	   r	   1   sq    p Y
!!Q
3F4S6\BK
ad)C
ad)C+{*+//1CSMAAr   )numpyr"   scipy.optimizer   utils._param_validationr   r   utils.validationr   r   __all__r   r   r+   tuplecallabler	    r   r   <module>r<      sk     0 B D
*;& WWYK!89
 #' )2 6B6Br   