
    Pi                     .   d Z ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ dgZdej        dee         d	ej        d
ej        de
eej        f         f
dZ	 dd	ej        d
ej        de	ej                 dedej        f
dZd	ej        d
ej        dedej        fdZdS )zNon-negative least squares    N   )MAX_MEM_BLOCK)AnyOptionalTupleSequencennlsxshapeABreturnc                    |                      |          } t          j        d|| d          |z
  }d|j        z  dz  t          j        |dz            z  }d|j        z  t          j        d||d          z  }||                                fS )z+Compute the objective and gradient for NNLSzmf,...ft->...mtToptimizer   g      ?   zmf,...mt->...ft)reshapenpeinsumsizesumflatten)r
   r   r   r   diffvaluegrads          f/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/librosa/util/_nnls.py	_nnls_objr      s     	
		%A 9&1t<<<q@D Z3a0E J")$5q$NNNND $,,..      x_initkwargsc                 ~   |Mt          j        dt           j                            |           |d          }t          j        |dd|           |                    d| j        d                    d	g|j        z  }|j        }t          j	        j
        t          |f|| |f|d
|\  }}}|                    |          S )a  Solve the constrained problem over a single block

    Parameters
    ----------
    A : np.ndarray [shape=(m, d)]
        The basis matrix
    B : np.ndarray [shape=(m, N)]
        The regression targets
    x_init : np.ndarray [shape=(d, N)]
        An initial guess
    **kwargs
        Additional keyword arguments to `scipy.optimize.fmin_l_bfgs_b`

    Returns
    -------
    x : np.ndarray [shape=(d, N)]
        Non-negative matrix such that Ax ~= B
    Nfm,...mt->...ftTr   r   outmr   )r   N)argsbounds)r   r   linalgpinvclip
setdefaultr   r   scipyr   fmin_l_bfgs_br   r   )	r   r   r   r    r'   r   r
   	obj_valuediagnosticss	            r   _nnls_lbfgs_blockr0   *   s    . ~,binnQ.?.?TRRR
4V,,,, c171:&&& [6;&FLE !& <6!!&1f! !@F! !Ay+ 99Ur   c           	         |j         dk    r&t          j                            | |          d         S t	          t
          t          j        |j        dd                   | j	        z  z            }t          |d          }|j        d         |k    r&t          | |fi |                    | j                  S t          j        dt          j                            |           |d          }t          j        |dd|           |}t%          d|j        d         |          D ]K}t'          ||z   |j        d                   }t          | |d	||f         fd
|d	||f         i||d	||f<   L|S )a  Non-negative least squares.

    Given two matrices A and B, find a non-negative matrix X
    that minimizes the sum squared error::

        err(X) = sum_i,j ((AX)[i,j] - B[i, j])^2

    Parameters
    ----------
    A : np.ndarray [shape=(m, n)]
        The basis matrix
    B : np.ndarray [shape=(..., m, N)]
        The target array.  Additional leading dimensions are supported.
    **kwargs
        Additional keyword arguments to `scipy.optimize.fmin_l_bfgs_b`

    Returns
    -------
    X : np.ndarray [shape=(..., n, N), non-negative]
        A minimizing solution to ``|AX - B|^2``

    See Also
    --------
    scipy.optimize.nnls
    scipy.optimize.fmin_l_bfgs_b

    Examples
    --------
    Approximate a magnitude spectrum from its mel spectrogram

    >>> y, sr = librosa.load(librosa.ex('trumpet'), duration=3)
    >>> S = np.abs(librosa.stft(y, n_fft=2048))
    >>> M = librosa.feature.melspectrogram(S=S, sr=sr, power=1)
    >>> mel_basis = librosa.filters.mel(sr=sr, n_fft=2048, n_mels=M.shape[0])
    >>> S_recover = librosa.util.nnls(mel_basis, M)

    Plot the results

    >>> import matplotlib.pyplot as plt
    >>> fig, ax = plt.subplots(nrows=3, sharex=True, sharey=True)
    >>> librosa.display.specshow(librosa.amplitude_to_db(S, ref=np.max),
    ...                          y_axis='log', x_axis='time', ax=ax[2])
    >>> ax[2].set(title='Original spectrogram (1025 bins)')
    >>> ax[2].label_outer()
    >>> librosa.display.specshow(librosa.amplitude_to_db(M, ref=np.max),
    ...                          y_axis='mel', x_axis='time', ax=ax[0])
    >>> ax[0].set(title='Mel spectrogram (128 bins)')
    >>> ax[0].label_outer()
    >>> img = librosa.display.specshow(librosa.amplitude_to_db(S_recover, ref=np.max(S)),
    ...                          y_axis='log', x_axis='time', ax=ax[1])
    >>> ax[1].set(title='Reconstructed spectrogram (1025 bins)')
    >>> ax[1].label_outer()
    >>> fig.colorbar(img, ax=ax, format="%+2.0f dB")
    r   r   Nr"   Tr   r#   .r   )ndimr,   r   r	   intr   r   prodr   itemsizemaxr0   astypedtyper   r(   r)   r*   rangemin)r   r   r    	n_columnsr
   r   bl_sbl_ts           r   r	   r	   V   s   p 	v{{~""1a((++Mbgagcrcl&;&;aj&HIJJIIq!!I 	wr{i A000077@@@ 		#RY^^A%6%6DIIIAGAq$AFai00 
 
4)#QWR[11-qd4i 
 
)/T$Y)?
CI
 
#tDy. Hr   )N)__doc__numpyr   scipy.optimizer,   utilsr   typingr   r   r   r   __all__ndarrayr4   floatr   r0   r	    r   r   <module>rH      sX   !                       1 1 1 1 1 1 1 1 1 1 1 1 (!	z!"3-!,.J!;=:!
5"*! ! ! !, BF) )	z)j)*22:*>)QT)Z) ) ) )XLBJ L2: L L L L L L L Lr   