ó
    Eñi9†  ã                   óž   • S SK rS SKJr  S SKJrJrJr  S/r " S S\5      r	 " S S\5      r
 " S S	\5      r " S
 S\5      r " S S5      rg)é    N)ÚLinearOperator)ÚkronÚ	eye_arrayÚ	dia_arrayÚLaplacianNdc                   ó”   ^ • \ rS rSrSrS\R                  S.U 4S jjrS rSS jr	S r
S	 rSS
 jrS rS rS rS rS rS rSrU =r$ )r   é
   aI  
The grid Laplacian in ``N`` dimensions and its eigenvalues/eigenvectors.

Construct Laplacian on a uniform rectangular grid in `N` dimensions
and output its eigenvalues and eigenvectors.
The Laplacian ``L`` is square, negative definite, real symmetric array
with signed integer entries and zeros otherwise.

Parameters
----------
grid_shape : tuple
    A tuple of integers of length ``N`` (corresponding to the dimension of
    the Lapacian), where each entry gives the size of that dimension. The
    Laplacian matrix is square of the size ``np.prod(grid_shape)``.
boundary_conditions : {'neumann', 'dirichlet', 'periodic'}, optional
    The type of the boundary conditions on the boundaries of the grid.
    Valid values are ``'dirichlet'`` or ``'neumann'``(default) or
    ``'periodic'``.
dtype : dtype
    Numerical type of the array. Default is ``np.int8``.

Methods
-------
toarray()
    Construct a dense array from Laplacian data
tosparse()
    Construct a sparse array from Laplacian data
eigenvalues(m=None)
    Construct a 1D array of `m` largest (smallest in absolute value)
    eigenvalues of the Laplacian matrix in ascending order.
eigenvectors(m=None):
    Construct the array with columns made of `m` eigenvectors (``float``)
    of the ``Nd`` Laplacian corresponding to the `m` ordered eigenvalues.

.. versionadded:: 1.12.0

Notes
-----
Compared to the MATLAB/Octave implementation [1] of 1-, 2-, and 3-D
Laplacian, this code allows the arbitrary N-D case and the matrix-free
callable option, but is currently limited to pure Dirichlet, Neumann or
Periodic boundary conditions only.

The Laplacian matrix of a graph (`scipy.sparse.csgraph.laplacian`) of a
rectangular grid corresponds to the negative Laplacian with the Neumann
conditions, i.e., ``boundary_conditions = 'neumann'``.

All eigenvalues and eigenvectors of the discrete Laplacian operator for
an ``N``-dimensional  regular grid of shape `grid_shape` with the grid
step size ``h=1`` are analytically known [2].

References
----------
.. [1] https://github.com/lobpcg/blopex/blob/master/blopex_tools/matlab/laplacian/laplacian.m
.. [2] "Eigenvalues and eigenvectors of the second derivative", Wikipedia
       https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors_of_the_second_derivative

Examples
--------
>>> import numpy as np
>>> from scipy.sparse.linalg import LaplacianNd
>>> from scipy.sparse import diags_array, csgraph
>>> from scipy.linalg import eigvalsh

The one-dimensional Laplacian demonstrated below for pure Neumann boundary
conditions on a regular grid with ``n=6`` grid points is exactly the
negative graph Laplacian for the undirected linear graph with ``n``
vertices using the sparse adjacency matrix ``G`` represented by the
famous tri-diagonal matrix:

>>> n = 6
>>> G = diags_array(np.ones(n - 1), offsets=1, format='csr')
>>> Lf = csgraph.laplacian(G, symmetrized=True, form='function')
>>> grid_shape = (n, )
>>> lap = LaplacianNd(grid_shape, boundary_conditions='neumann')
>>> np.array_equal(lap.matmat(np.eye(n)), -Lf(np.eye(n)))
True

Since all matrix entries of the Laplacian are integers, ``'int8'`` is
the default dtype for storing matrix representations.

>>> lap.tosparse()
<DIAgonal sparse array of dtype 'int8'
    with 16 stored elements (3 diagonals) and shape (6, 6)>
>>> lap.toarray()
array([[-1,  1,  0,  0,  0,  0],
       [ 1, -2,  1,  0,  0,  0],
       [ 0,  1, -2,  1,  0,  0],
       [ 0,  0,  1, -2,  1,  0],
       [ 0,  0,  0,  1, -2,  1],
       [ 0,  0,  0,  0,  1, -1]], dtype=int8)
>>> np.array_equal(lap.matmat(np.eye(n)), lap.toarray())
True
>>> np.array_equal(lap.tosparse().toarray(), lap.toarray())
True

Any number of extreme eigenvalues and/or eigenvectors can be computed.

>>> lap = LaplacianNd(grid_shape, boundary_conditions='periodic')
>>> lap.eigenvalues()
array([-4., -3., -3., -1., -1.,  0.])
>>> lap.eigenvalues()[-2:]
array([-1.,  0.])
>>> lap.eigenvalues(2)
array([-1.,  0.])
>>> lap.eigenvectors(1)
array([[0.40824829],
       [0.40824829],
       [0.40824829],
       [0.40824829],
       [0.40824829],
       [0.40824829]])
>>> lap.eigenvectors(2)
array([[ 0.28867513,  0.40824829],
       [ 0.57735027,  0.40824829],
       [ 0.28867513,  0.40824829],
       [-0.28867513,  0.40824829],
       [-0.57735027,  0.40824829],
       [-0.28867513,  0.40824829]])
>>> lap.eigenvectors()
array([[ 0.40824829,  0.5       ,  0.28867513,  0.28867513,  0.5       ,
         0.40824829],
       [-0.40824829,  0.        , -0.57735027,  0.57735027,  0.        ,
         0.40824829],
       [ 0.40824829, -0.5       ,  0.28867513,  0.28867513, -0.5       ,
         0.40824829],
       [-0.40824829,  0.5       ,  0.28867513, -0.28867513, -0.5       ,
         0.40824829],
       [ 0.40824829,  0.        , -0.57735027, -0.57735027,  0.        ,
         0.40824829],
       [-0.40824829, -0.5       ,  0.28867513, -0.28867513,  0.5       ,
         0.40824829]])

The two-dimensional Laplacian is illustrated on a regular grid with
``grid_shape = (2, 3)`` points in each dimension.

>>> grid_shape = (2, 3)
>>> n = np.prod(grid_shape)

Numeration of grid points is as follows:

>>> np.arange(n).reshape(grid_shape + (-1,))
array([[[0],
        [1],
        [2]],
<BLANKLINE>
       [[3],
        [4],
        [5]]])

Each of the boundary conditions ``'dirichlet'``, ``'periodic'``, and
``'neumann'`` is illustrated separately; with ``'dirichlet'``

>>> lap = LaplacianNd(grid_shape, boundary_conditions='dirichlet')
>>> lap.tosparse()
<Compressed Sparse Row sparse array of dtype 'int8'
    with 20 stored elements and shape (6, 6)>
>>> lap.toarray()
array([[-4,  1,  0,  1,  0,  0],
       [ 1, -4,  1,  0,  1,  0],
       [ 0,  1, -4,  0,  0,  1],
       [ 1,  0,  0, -4,  1,  0],
       [ 0,  1,  0,  1, -4,  1],
       [ 0,  0,  1,  0,  1, -4]], dtype=int8)
>>> np.array_equal(lap.matmat(np.eye(n)), lap.toarray())
True
>>> np.array_equal(lap.tosparse().toarray(), lap.toarray())
True
>>> lap.eigenvalues()
array([-6.41421356, -5.        , -4.41421356, -3.58578644, -3.        ,
       -1.58578644])
>>> eigvals = eigvalsh(lap.toarray().astype(np.float64))
>>> np.allclose(lap.eigenvalues(), eigvals)
True
>>> np.allclose(lap.toarray() @ lap.eigenvectors(),
...             lap.eigenvectors() @ np.diag(lap.eigenvalues()))
True

with ``'periodic'``

>>> lap = LaplacianNd(grid_shape, boundary_conditions='periodic')
>>> lap.tosparse()
<Compressed Sparse Row sparse array of dtype 'int8'
    with 24 stored elements and shape (6, 6)>
>>> lap.toarray()
    array([[-4,  1,  1,  2,  0,  0],
           [ 1, -4,  1,  0,  2,  0],
           [ 1,  1, -4,  0,  0,  2],
           [ 2,  0,  0, -4,  1,  1],
           [ 0,  2,  0,  1, -4,  1],
           [ 0,  0,  2,  1,  1, -4]], dtype=int8)
>>> np.array_equal(lap.matmat(np.eye(n)), lap.toarray())
True
>>> np.array_equal(lap.tosparse().toarray(), lap.toarray())
True
>>> lap.eigenvalues()
array([-7., -7., -4., -3., -3.,  0.])
>>> eigvals = eigvalsh(lap.toarray().astype(np.float64))
>>> np.allclose(lap.eigenvalues(), eigvals)
True
>>> np.allclose(lap.toarray() @ lap.eigenvectors(),
...             lap.eigenvectors() @ np.diag(lap.eigenvalues()))
True

and with ``'neumann'``

>>> lap = LaplacianNd(grid_shape, boundary_conditions='neumann')
>>> lap.tosparse()
<Compressed Sparse Row sparse array of dtype 'int8'
    with 20 stored elements and shape (6, 6)>
>>> lap.toarray()
array([[-2,  1,  0,  1,  0,  0],
       [ 1, -3,  1,  0,  1,  0],
       [ 0,  1, -2,  0,  0,  1],
       [ 1,  0,  0, -2,  1,  0],
       [ 0,  1,  0,  1, -3,  1],
       [ 0,  0,  1,  0,  1, -2]], dtype=int8)
>>> np.array_equal(lap.matmat(np.eye(n)), lap.toarray())
True
>>> np.array_equal(lap.tosparse().toarray(), lap.toarray())
True
>>> lap.eigenvalues()
array([-5., -3., -3., -2., -1.,  0.])
>>> eigvals = eigvalsh(lap.toarray().astype(np.float64))
>>> np.allclose(lap.eigenvalues(), eigvals)
True
>>> np.allclose(lap.toarray() @ lap.eigenvectors(),
...             lap.eigenvectors() @ np.diag(lap.eigenvalues()))
True

Úneumann)Úboundary_conditionsÚdtypec                ó”   >• US;  a  [        SU< S35      eXl        X l        [        R                  " U5      n[
        TU ]  X4U4S9  g )N)Ú	dirichletr
   ÚperiodiczUnknown value zv is given for 'boundary_conditions' parameter. The valid options are 'dirichlet', 'periodic', and 'neumann' (default).©r   Úshape)Ú
ValueErrorÚ
grid_shaper   ÚnpÚprodÚsuperÚ__init__)Úselfr   r   r   ÚNÚ	__class__s        €Úg/home/mande/repo/quber/.venv/lib/python3.13/site-packages/scipy/sparse/linalg/_special_sparse_arrays.pyr   ÚLaplacianNd.__init__õ   s_   ø€ ð Ð&JÓJÜØ Ð!4Ñ 7ð 8Dð Dóð ð %ŒØ#6Ô ä�GŠG�JÓˆÜ‰Ñ˜u°¨FÐÒ3ó    c           
      óŒ  • U R                   nUc-  [        R                  " U5      n[        R                  " U5      nOX[	        U[        [        R                  " U5      U-  5      5      n[        R                  " U5      n[        R                  " U5      n[        X25       Hè  u  pgU R                  S:X  a>  US[        R                  " [        R                  US-   -  SUS-   -  -  5      S-  -  -  nMS  U R                  S:X  a8  US[        R                  " [        R                  U-  SU-  -  5      S-  -  -  nM›  US[        R                  " [        R                  [        R                  " US-   S-  5      -  U-  5      S-  -  -  nMê     UR                  5       n[        R                  " U5      n	X‰   n
Ub
  X¡* S n
X‘* S n	X©4$ )z�Compute `m` largest eigenvalues in each of the ``N`` directions,
i.e., up to ``m * N`` total, order them and return `m` largest.
Nr   éüÿÿÿé   é   r
   )r   r   ÚindicesÚzerosÚminÚtupleÚ	ones_likeÚzipr   ÚsinÚpiÚfloorÚravelÚargsort)r   Úmr   r"   ÚLeigÚgrid_shape_minÚjÚnÚ
Leig_ravelÚindÚeigenvaluess              r   Ú_eigenvalue_orderingÚ LaplacianNd._eigenvalue_ordering  s�  € ð —_‘_ˆ
Ø‰9Ü—j’j Ó,ˆGÜ—8’8˜JÓ'‰Dä  Ü!&¤r§|¢|°JÓ'?À!Ñ'CÓ!DóFˆNä—j’j Ó0ˆGÜ—8’8˜NÓ+ˆDä˜Ö,‰DˆAØ×'Ñ'¨;Ó6Ø˜œRŸVšV¤B§E¡E¨Q°©U¡O°q¸AÀ¹E±{Ñ$CÓDÈÑIÑIÑI’Ø×)Ñ)¨YÓ6Ø˜œRŸVšV¤B§E¡E¨A¡I°°Q±Ñ$7Ó8¸AÑ=Ñ=Ñ=’à˜œRŸVšV¤B§E¡E¬B¯HªH°a¸!±e¸q±[Ó,AÑ$AÀAÑ$EÓFÈ!ÑKÑKÑK’ñ -ð —Z‘Z“\ˆ
Ü�jŠj˜Ó$ˆØ ‘oˆØ‰=Ø% b cÐ*ˆKØ�b�c�(ˆCàÐÐr   c                 ó,   • U R                  U5      u  p#U$ )a>  Return the requested number of eigenvalues.

Parameters
----------
m : int, optional
    The positive number of smallest eigenvalues to return.
    If not provided, then all eigenvalues will be returned.

Returns
-------
eigenvalues : float array
    The requested `m` smallest or all eigenvalues, in ascending order.
)r5   )r   r-   r4   Ú_s       r   r4   ÚLaplacianNd.eigenvalues%  s   € ð ×2Ñ2°1Ó5‰ˆØÐr   c                 ó  • U R                   S:X  aj  [        R                  [        R                  " U5      S-   -  US-   -  n[        R                  " SUS-   -  5      [        R
                  " X1S-   -  5      -  nGOÈU R                   S:X  ai  [        R                  [        R                  " U5      S-   -  U-  n[        R                  " US:X  a  SOSU-  5      [        R                  " X1-  5      -  nGOOUS:X  a2  [        R                  " SU-  5      [        R                  " U5      -  nGOUS-   U:X  a@  US-  S:X  a7  [        R                  " SU-  5      [        R                  " SS	/US-  5      -  nOÎUS-   S-  S:X  ac  [        R                  [        R                  " U5      S-   -  U-  n[        R                  " SU-  5      [        R
                  " X1S-   -  5      -  nO_[        R                  [        R                  " U5      S-   -  U-  n[        R                  " SU-  5      [        R                  " X1-  5      -  nS
U[        R                  " U5      [        R                  " [        R                  5      R                  :  '   U$ )zYReturn 1 eigenvector in 1d with index `j`
and number of grid points `n` where ``j < n``.
r   r    g       @ç      ð?r
   ç      à?r   r!   éÿÿÿÿg        )r   r   r)   ÚarangeÚsqrtr(   ÚcosÚonesÚtileÚabsÚfinfoÚfloat64Úeps)r   r0   r1   ÚiÚevs        r   Ú_ev1dÚLaplacianNd._ev1d6  sá  € ð ×#Ñ# {Ó2Ü—‘œŸš 1›¨Ñ)Ñ*¨a°!©eÑ4ˆAÜ—’˜˜q 2™v™Ó'¬"¯&ª&°¸!±e±Ó*=Ñ=ŠBØ×%Ñ%¨Ó2Ü—‘œŸš 1›¨Ñ+Ñ,¨qÑ0ˆAÜ—’  Q£™"¨B°!Ñ3Ó4´r·v²v¸a¹e³}ÑDŠBà�A‹vÜ—W’W˜R !™V“_¤r§w¢w¨q£zÑ1’Ø�Q‘˜!“  A¡¨£
Ü—W’W˜R !™V“_¤r§w¢w°°2¨w¸¸1¹Ó'=Ñ=‘Ø�a‘%˜1‘ Ó!Ü—E‘EœRŸYšY q›\¨CÑ/Ñ0°1Ñ4�Ü—W’W˜R !™V“_¤r§v¢v¨a°q±5©kÓ':Ñ:‘ä—E‘EœRŸYšY q›\¨CÑ/Ñ0°1Ñ4�Ü—W’W˜R !™V“_¤r§v¢v¨a©e£}Ñ4�ð 57ˆŒ2�6Š6�"‹:œŸš¤§¡Ó,×0Ñ0Ñ0Ñ1Øˆ	r   c                 ó  • [        XR                  5       VVs/ s H  u  p#U R                  X#5      PM     nnnUS   nUSS  H  n[        R                  " XTSS9nM     [        R
                  " U5      R                  5       $ s  snnf )zjReturn 1 eigenvector in Nd with multi-index `j`
as a tensor product of the corresponding 1d eigenvectors.
r   r    N)Úaxes)r'   r   rI   r   Ú	tensordotÚasarrayr+   )r   Úkr0   r1   ÚphiÚresults         r   Ú_one_eveÚLaplacianNd._one_eveP  su   € ô -0°·?±?Ô,CÔDÒ,C¡D Aˆt�z‰z˜!ÖÑ,CˆÑDØ�Q‘ˆØ�q�r“7ˆCÜ—\’\ &°AÑ6ŠFñ ä�zŠz˜&Ó!×'Ñ'Ó)Ð)ùó	 Es   ™Bc                 ó¶  • U R                  U5      u  p#Uc  U R                  nO@[        U R                  [        [        R
                  " U R                  5      U-  5      5      n[        R                  " X45      n[        U6  Vs/ s H  n[        U5      PM     nnU Vs/ s H  opR                  U5      PM     nn[        R                  " U5      $ s  snf s  snf )a™  Return the requested number of eigenvectors for ordered eigenvalues.

Parameters
----------
m : int, optional
    The positive number of eigenvectors to return. If not provided,
    then all eigenvectors will be returned.

Returns
-------
eigenvectors : float array
    An array with columns made of the requested `m` or all eigenvectors.
    The columns are ordered according to the `m` ordered eigenvalues.
)
r5   r   r$   r%   r   r&   Úunravel_indexr'   rR   Úcolumn_stack)	r   r-   r8   r3   r/   Ú	N_indicesÚxrO   Úeigenvectors_lists	            r   ÚeigenvectorsÚLaplacianNd.eigenvectorsZ  s±   € ð ×*Ñ*¨1Ó-‰ˆØ‰9Ø!Ÿ_™_‰Nä  §¡Ü %¤b§l¢l°4·?±?Ó&CÀaÑ&GÓ HóJˆNô ×$Ò$ SÓ9ˆ	Ü'*¨I¡Ó7¢ !”U˜1–X¡ˆ	Ð7Ù7@ÓA²y°!Ÿ]™]¨1Ö-±yÐÐAÜ�ŠÐ0Ó1Ð1ùò 8ùÚAs   ÂCÂCc           
      óÔ  • U R                   n[        R                  " U5      n[        R                  " X"/[        R                  S9n[        R
                  " U5      n[        R
                  " U5      n[        U5       GHÇ  u  pgSUSS& S[        R                  " SUSU2SU24   5      SS& S[        R                  " SUSUS-
  2SU24   5      SS& S[        R                  " SUSU2SUS-
  24   5      SS& U R                  S:X  a  SUS	'   SXGS-
  US-
  4'   OGU R                  S
:X  a7  US:”  a$  USUS-
  4==   S-  ss'   XGS-
  S4==   S-  ss'   OUS	==   S-  ss'   UnUS:”  aT  [        R                  " USU 5      n	[        SU	5       H+  n
USU2SU24   XJU-  U
S-   U-  2X§-  U
S-   U-  24'   X‡-  nM-     USU2SU24   USU2SU24'   [        [        R                  " XS-   S 5      5      n	SUSU2SU24'   [        U	5       Vs/ s H  o»PM     nnUSU2SU24   UR                  X‰X‰45      SS2USS2U4'   X4-  nGMÊ     UR                  U R                  5      $ s  snf )zŒ
Converts the Laplacian data to a dense array.

Returns
-------
L : ndarray
    The shape is ``(N, N)`` where ``N = np.prod(grid_shape)``.

©r   r   Néþÿÿÿzii->ir    r
   r=   ©r   r   r   )r   r   r   r#   Úint8Ú
empty_likeÚ	enumerateÚeinsumr   ÚrangeÚintÚreshapeÚastyper   )r   r   r1   ÚLÚL_iÚLtempr3   ÚdimÚnew_dimÚtilesr0   rX   Úidxs                r   ÚtoarrayÚLaplacianNd.toarrayu  s®  € ð —_‘_ˆ
Ü�GŠG�JÓˆÜ�HŠH�a�V¤2§7¡7Ñ+ˆä�mŠm˜AÓˆÜ—’˜aÓ ˆä! *×-‰HˆCàˆC‘ˆFð 68ŒB�IŠI�g˜s 4 C 4¨¨#¨ :™Ó/±Ð2Ø;<ŒB�IŠI�g˜s 9 S¨1¡W 9¨a°¨eÐ#3Ñ4Ó5±aÐ8Ø;<ŒB�IŠI�g˜s 1 S 5¨)¨C°!©G¨)Ð#3Ñ4Ó5±aÐ8à×'Ñ'¨9Ó4Ø��D‘	Ø(*�˜!‘G˜S 1™WÐ$Ò%Ø×)Ñ)¨ZÓ7Ø˜“7Ø˜˜3 ™7˜
“O qÑ(“OØ˜a™ ˜
“O qÑ(”Oà˜“I ‘N“Ið ˆGà�Q‹wÜŸš 
¨4¨CÐ 0Ó1�Ü˜q %ž�AØ<?ÀÀÀÀdÀsÀdÀ
¹O�C˜#™˜q ™s C™i˜¨©°°!±°S©y¨Ð8Ñ9Ø‘N’Gñ )ð
 ),¨H¨W¨H°h°w°hÐ,>Ñ(?ˆE�(�7�(˜H˜W˜HÐ$Ñ%ÜœŸš 
¨q©5¨6Ð 2Ó3Ó4ˆEà&'ˆC���˜(˜7˜(Ð"Ñ#Ü# EœlÓ+šl˜’1™lˆCÐ+ð %*¨(¨7¨(°H°W°HÐ*<Ñ$=ð �K‰KØØð!óò �Sš!˜S�.ñ"ð
 ‰H‹AñW .ðZ �x‰x˜Ÿ
™
Ó#Ð#ùò ,s   ÈI%c           
      ó¶  • [        U R                  5      n[        R                  " U R                  5      n[	        X"4[        R
                  S9n[        U5       GHa  nU R                  U   n[        R                  " SU/[        R
                  S9nUSSS24==   S-  ss'   U R                  S:X  a
  SUS'   SUS	'   [	        U/ S
Q4XU4[        R
                  S9nU R                  S:X  aF  [	        XU4[        R
                  S9nUR                  S/U* S-   S9  UR                  S/US-
  S9  Xx-  n[        U5       H2  n	[        [        U R                  U	   [        R
                  S9U5      nM4     [        US-   U5       H2  n	[        U[        U R                  U	   [        R
                  S95      nM4     X7-  nGMd     UR                  U R                  5      $ )zñ
Constructs a sparse array from the Laplacian data. The returned sparse
array format is dependent on the selected boundary conditions.

Returns
-------
L : scipy.sparse.sparray
    The shape is ``(N, N)`` where ``N = np.prod(grid_shape)``.

r]   é   r    Nr^   r
   r=   ©r    r   )r    r=   ©r=   r   r    )r   r   r   )rO   )Úlenr   r   r   r   r`   rd   rA   r   Úsetdiagr   r   rg   r   )
r   r   Úprh   rG   rk   Údatari   Útr0   s
             r   ÚtosparseÚLaplacianNd.tosparseµ  s�  € ô �—‘Ó ˆÜ�GŠG�D—O‘OÓ$ˆÜ�q�f¤B§G¡GÑ,ˆä�q—ˆAØ—/‘/ !Ñ$ˆCÜ—7’7˜A˜s˜8¬2¯7©7Ñ3ˆDØ�’A�‹J˜"Ñ‹Jà×'Ñ'¨9Ó4Ø��T‘
Ø ��U‘ä˜T¢:Ð.°s°jÜ"$§'¡'ñˆCð ×'Ñ'¨:Ó5Ü˜s˜j´·±Ñ8�Ø—	‘	˜1˜# #  a¡�	Ñ(Ø—	‘	˜1˜#  Q¡�	Ñ'Ø‘�ä˜1–X�Üœ9 T§_¡_°QÑ%7¼r¿w¹wÑGÈÓM’ñ ä˜1˜q™5 !–_�Ü˜3¤	¨$¯/©/¸!Ñ*<ÄBÇGÁGÑ LÓM’ñ %à‰H‹Añ/ ð0 �x‰x˜Ÿ
™
Ó#Ð#r   c           
      óì  • U R                   n[        U5      nUR                  US-   5      nSU-  U-  n[        U5       GH  nU[        R
                  " USUS9-  nU[        R
                  " USUS9-  nU R                  S;   d  MH  U[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -   ==   [        R
                  " USUS9[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -      -  ss'   U[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -   ==   [        R
                  " USUS9[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -      -  ss'   U R                  S:X  d  GM7  U[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -   ==   [        R
                  " US	US9[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -      -  ss'   U[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -   ==   [        R
                  " US	US9[        S 5      4U-  S-   [        S 5      4X6-
  S-
  -  -      -  ss'   GM     UR                  SUR                  S   5      $ )
N)r=   r^   r    )Úaxisr=   )r
   r   )r   r
   r   )	r   ru   rf   rd   r   Úrollr   Úslicer   )r   rX   r   r   ÚXÚYrG   s          r   Ú_matvecÚLaplacianNd._matvecÞ  s‘  € Ø—_‘_ˆ
Ü�
‹OˆØ�I‰I�j 5Ñ(Ó)ˆØ�‰F�Q‰JˆÜ�q—ˆAØ”—’˜˜A AÑ&Ñ&ˆAØ”—’˜˜B QÑ'Ñ'ˆAØ×'Ñ'Ð+CÕCØ”5˜“;�. Ñ" TÑ)¬U°4«[¨N¸A¹CÀ¹EÑ,BÑBó Ü—w’w˜q !¨!Ñ,Ü˜4“[�N QÑ&¨Ñ-´°t³°À!Á#ÀaÁ%Ñ0HÑHññó ð Ü˜4“[�N QÑ&¨Ñ.´%¸³+°À1Á3ÀqÁ5Ñ1IÑIóä—W’W˜Q ¨Ñ+Ü˜4“[�N QÑ&¨Ñ.´%¸³+°À1Á3ÀqÁ5Ñ1IÑIññó ð ×+Ñ+¨yÖ8ØÜ˜t›˜¨Ñ*¨TÑ1´U¸4³[°NÀaÁcÈ!ÁeÑ4LÑLóäŸš  A¨AÑ.Ü˜t›˜¨Ñ*¨TÑ1´U¸4³[°NÀaÁcÈ!ÁeÑ4LÑLññó ð
 Ü˜t›˜¨Ñ*¨UÑ2´e¸D³k°^ÀqÁsÈ1ÁuÑ5MÑMóäŸš  A¨AÑ.Ü˜t›˜¨Ñ*¨UÑ2´e¸D³k°^ÀqÁsÈ1ÁuÑ5MÑMññö ñ) ð4 �y‰y˜˜QŸW™W R™[Ó)Ð)r   c                 ó$   • U R                  U5      $ ©N©r‚   ©r   rX   s     r   Ú_matmatÚLaplacianNd._matmatÿ  s   € Ø�|‰|˜A‹Ðr   c                 ó   • U $ r…   © ©r   s    r   Ú_adjointÚLaplacianNd._adjoint  ó   € Øˆr   c                 ó   • U $ r…   r‹   rŒ   s    r   Ú
_transposeÚLaplacianNd._transpose  r�   r   )r   r   r…   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r`   r   r5   r4   rI   rR   rZ   ro   rz   r‚   rˆ   r�   r‘   Ú__static_attributes__Ú__classcell__©r   s   @r   r   r   
   s_   ø† ñhðV &/Ø—w‘w÷4ð 4ò" ô>ò"ò4*ô2ò6>$ò@'$òR*òBò÷ð r   c                   óz   ^ • \ rS rSrSr\R                  4U 4S jjrSS jrS r	S r
S rS rS	 rS
 rS rSrU =r$ )ÚSakuraii	  aT  
Construct a Sakurai matrix in various formats and its eigenvalues.

Constructs the "Sakurai" matrix motivated by reference [1]_:
square real symmetric positive definite and 5-diagonal
with the main diagonal ``[5, 6, 6, ..., 6, 6, 5], the ``+1`` and ``-1``
diagonals filled with ``-4``, and the ``+2`` and ``-2`` diagonals
made of ``1``. Its eigenvalues are analytically known to be
``16. * np.power(np.cos(0.5 * k * np.pi / (n + 1)), 4)``.
The matrix gets ill-conditioned with its size growing.
It is useful for testing and benchmarking sparse eigenvalue solvers
especially those taking advantage of its banded 5-diagonal structure.
See the notes below for details.

Parameters
----------
n : int
    The size of the matrix.
dtype : dtype
    Numerical type of the array. Default is ``np.int8``.

Methods
-------
toarray()
    Construct a dense array from Laplacian data
tosparse()
    Construct a sparse array from Laplacian data
tobanded()
    The Sakurai matrix in the format for banded symmetric matrices,
    i.e., (3, n) ndarray with 3 upper diagonals
    placing the main diagonal at the bottom.
eigenvalues
    All eigenvalues of the Sakurai matrix ordered ascending.

Notes
-----
Reference [1]_ introduces a generalized eigenproblem for the matrix pair
`A` and `B` where `A` is the identity so we turn it into an eigenproblem
just for the matrix `B` that this function outputs in various formats
together with its eigenvalues.

.. versionadded:: 1.12.0

References
----------
.. [1] T. Sakurai, H. Tadano, Y. Inadomi, and U. Nagashima,
   "A moment-based method for large-scale generalized
   eigenvalue problems",
   Appl. Num. Anal. Comp. Math. Vol. 1 No. 2 (2004).

Examples
--------
>>> import numpy as np
>>> from scipy.sparse.linalg._special_sparse_arrays import Sakurai
>>> from scipy.linalg import eig_banded
>>> n = 6
>>> sak = Sakurai(n)

Since all matrix entries are small integers, ``'int8'`` is
the default dtype for storing matrix representations.

>>> sak.toarray()
array([[ 5, -4,  1,  0,  0,  0],
       [-4,  6, -4,  1,  0,  0],
       [ 1, -4,  6, -4,  1,  0],
       [ 0,  1, -4,  6, -4,  1],
       [ 0,  0,  1, -4,  6, -4],
       [ 0,  0,  0,  1, -4,  5]], dtype=int8)
>>> sak.tobanded()
array([[ 1,  1,  1,  1,  1,  1],
       [-4, -4, -4, -4, -4, -4],
       [ 5,  6,  6,  6,  6,  5]], dtype=int8)
>>> sak.tosparse()
<DIAgonal sparse array of dtype 'int8'
    with 24 stored elements (5 diagonals) and shape (6, 6)>
>>> np.array_equal(sak.dot(np.eye(n)), sak.tosparse().toarray())
True
>>> sak.eigenvalues()
array([0.03922866, 0.56703972, 2.41789479, 5.97822974,
       10.54287655, 14.45473055])
>>> sak.eigenvalues(2)
array([0.03922866, 0.56703972])

The banded form can be used in scipy functions for banded matrices, e.g.,

>>> e = eig_banded(sak.tobanded(), eigvals_only=True)
>>> np.allclose(sak.eigenvalues(), e, atol= n * n * n * np.finfo(float).eps)
True

c                 óB   >• Xl         X l        X4n[        TU ]  X#5        g r…   )r1   r   r   r   )r   r1   r   r   r   s       €r   r   ÚSakurai.__init__d  s!   ø€ ØŒØŒ
Ø�ˆÜ‰Ñ˜Õ&r   c           
      óT  • Uc  U R                   n[        R                  " U R                   S-   U-
  U R                   S-   5      n[        R                  " S[        R                  " [        R
                  " SU-  [        R                  -  U R                   S-   -  5      S5      -  5      $ )aE  Return the requested number of eigenvalues.

Parameters
----------
m : int, optional
    The positive number of smallest eigenvalues to return.
    If not provided, then all eigenvalues will be returned.

Returns
-------
eigenvalues : `np.float64` array
    The requested `m` smallest or all eigenvalues, in ascending order.
r    g      0@r<   é   )r1   r   r>   ÚflipÚpowerr@   r)   )r   r-   rO   s      r   r4   ÚSakurai.eigenvaluesj  sw   € ð ‰9Ø—‘ˆAÜ�IŠI�d—f‘f˜q‘j !‘m T§V¡V¨a¡ZÓ0ˆÜ�wŠw�sœRŸXšX¤b§f¢f¨S°1©W´r·u±u©_ÀÇÁÈÁ
Ñ-KÓ&LÈaÓPÑPÓQÐQr   c                 ó”  • [         R                  SS[         R                  " U R                  S-
  U R                  S9-  S4   nS[         R                  " U R                  U R                  S9-  n[         R                  " U R                  U R                  S9n[         R
                  " X2U/5      R                  U R                  5      $ )z1
Construct the Sakurai matrix as a banded array.
é   é   r!   r]   r   )r   Úr_rA   r1   r   Úarrayrg   )r   Úd0Úd1Úd2s       r   ÚtobandedÚSakurai.tobanded}  sŒ   € ô �U‰U�1�aœ"Ÿ'š' $§&¡&¨1¡*°D·J±JÑ?Ñ?ÀÐBÑCˆØ”"—'’'˜$Ÿ&™&¨¯
©
Ñ3Ñ3ˆÜ�WŠW�T—V‘V 4§:¡:Ñ.ˆÜ�xŠx˜ ˜Ó%×,Ñ,¨T¯Z©ZÓ8Ð8r   c                 ó¬   • SSK Jn  U R                  5       nU" US   US   US   US   US   // SQU R                  U R                  4UR                  S9$ )z2
Construct the Sakurai matrix in a sparse format.
r   ©Údiags_arrayr    r!   )r^   r=   r   r    r!   ©Úoffsetsr   r   )Úscipy.sparser°   r¬   r1   r   )r   r°   Úds      r   rz   ÚSakurai.tosparse†  s]   € õ 	-Ø�M‰M‹Oˆñ ˜A˜a™D ! A¡$¨¨!©¨a°©d°A°a±DÐ9ÒCTØ"&§&¡&¨$¯&©&Ð!1¸¿¹ñBð 	Br   c                 ó>   • U R                  5       R                  5       $ r…   ©rz   ro   rŒ   s    r   ro   ÚSakurai.toarray‘  ó   € Ø�}‰}‹×&Ñ&Ó(Ð(r   c                 óL  • UR                  U R                  S5      n[        R                  " UR                  U R                  5      n[        R
                  " XS9nSUSSS24   -  SUSSS24   -  -
  USSS24   -   USSS24'   SUSSS24   -  SUS	SS24   -  -
  US
SS24   -   USSS24'   SUSS2SS24   -  SUSS	2SS24   USS2SS24   -   -  -
  [        R                  " USS
2SS24   S5      -   [        R                  " USS2SS24   S5      -   USS2SS24'   U$ )zÊ
Construct matrix-free callable banded-matrix-vector multiplication by
the Sakurai matrix without constructing or storing the matrix itself
using the knowledge of its entries and the 5-diagonal format.
r=   r]   r¥   r   Nr    r    r!   r^   éýÿÿÿr¦   )rs   r_   rr   ))r   r    r_   )rf   r1   r   Úpromote_typesr   Ú
zeros_likeÚpad)r   rX   Úresult_dtypeÚsxs       r   r‚   ÚSakurai._matvec”  s9  € ð �I‰I�d—f‘f˜bÓ!ˆÜ×'Ò'¨¯©°·±Ó<ˆÜ�]Š]˜1Ñ1ˆØ�q˜šA˜‘w‘;  Q qª! t¡W¡Ñ,¨q°²A°©wÑ6ˆˆ1Šaˆ4‰Ø˜˜"ša˜%™‘L 1 q¨ªQ¨¡x¡<Ñ/°!°Bº°E±(Ñ:ˆˆ2Šqˆ5‰	Ø˜A˜a ˜e¢Q˜h™K™¨!¨q°°"°²a°©y¸1¸Q¹RÂ¸U¹8Ñ/CÑ*DÑDÜŸš˜q  " ¢a ™yÐ*:Ó;ñ<äŸš˜q ¡¢Q ™xÐ)9Ó:ñ;ˆˆ1ˆbˆ5’!ˆ8‰ð ˆ	r   c                 ó$   • U R                  U5      $ )zÎ
Construct matrix-free callable matrix-matrix multiplication by
the Sakurai matrix without constructing or storing the matrix itself
by reusing the ``_matvec(x)`` that supports both 1D and 2D arrays ``x``.
r†   r‡   s     r   rˆ   ÚSakurai._matmat¤  ó   € ð �|‰|˜A‹Ðr   c                 ó   • U $ r…   r‹   rŒ   s    r   r�   ÚSakurai._adjoint¬  r�   r   c                 ó   • U $ r…   r‹   rŒ   s    r   r‘   ÚSakurai._transpose¯  r�   r   )r   r1   r…   )r“   r”   r•   r–   r—   r   r`   r   r4   r¬   rz   ro   r‚   rˆ   r�   r‘   r˜   r™   rš   s   @r   rœ   rœ   	  sG   ø† ñYðt !#§¡÷ 'ôRò&9ò	Bò)òò ò÷ð r   rœ   c                   óv   ^ • \ rS rSrSr\R                  4U 4S jjrS rS r	S r
S rS rS	 rS
 rS rSrU =r$ )ÚMikotaMi³  a'  
Construct a mass matrix in various formats of Mikota pair.

The mass matrix `M` is square real diagonal
positive definite with entries that are reciprocal to integers.

Parameters
----------
shape : tuple of int
    The shape of the matrix.
dtype : dtype
    Numerical type of the array. Default is ``np.float64``.

Methods
-------
toarray()
    Construct a dense array from Mikota data
tosparse()
    Construct a sparse array from Mikota data
tobanded()
    The format for banded symmetric matrices,
    i.e., (1, n) ndarray with the main diagonal.
c                 ó<   >• Xl         X l        [        TU ]  X!5        g r…   )r   r   r   r   )r   r   r   r   s      €r   r   ÚMikotaM.__init__Ë  s   ø€ ØŒ
ØŒ
Ü‰Ñ˜Õ&r   c                 óˆ   • S[         R                  " SU R                  S   S-   5      -  R                  U R                  5      $ )Nr;   r    r   )r   r>   r   rg   r   rŒ   s    r   Ú_diagÚMikotaM._diagÐ  s6   € ð ”R—Y’Y˜q $§*¡*¨Q¡-°!Ñ"3Ó4Ñ4×<Ñ<¸T¿Z¹ZÓHÐHr   c                 ó"   • U R                  5       $ r…   )rÎ   rŒ   s    r   r¬   ÚMikotaM.tobandedÕ  s   € Ø�z‰z‹|Ðr   c                 óh   • SSK Jn  U" U R                  5       /S/U R                  U R                  S9$ )Nr   r¯   r±   )r³   r°   rÎ   r   r   ©r   r°   s     r   rz   ÚMikotaM.tosparseØ  s-   € Ý,Ù˜DŸJ™J›L˜>°A°3Ø!%§¡°4·:±:ñ?ð 	?r   c                 ó|   • [         R                  " U R                  5       5      R                  U R                  5      $ r…   )r   ÚdiagrÎ   rg   r   rŒ   s    r   ro   ÚMikotaM.toarrayÝ  s&   € Ü�wŠw�t—z‘z“|Ó$×+Ñ+¨D¯J©JÓ7Ð7r   c                 ó�   • UR                  U R                  S   S5      nU R                  5       SS2[        R                  4   U-  $ )zÌ
Construct matrix-free callable banded-matrix-vector multiplication by
the Mikota mass matrix without constructing or storing the matrix itself
using the knowledge of its entries and the diagonal format.
r   r=   N)rf   r   rÎ   r   Únewaxisr‡   s     r   r‚   ÚMikotaM._matvecà  s:   € ð �I‰I�d—j‘j ‘m RÓ(ˆØ�z‰z‹|šAœrŸz™z˜MÑ*¨QÑ.Ð.r   c                 ó$   • U R                  U5      $ )zÒ
Construct matrix-free callable matrix-matrix multiplication by
the Mikota mass matrix without constructing or storing the matrix itself
by reusing the ``_matvec(x)`` that supports both 1D and 2D arrays ``x``.
r†   r‡   s     r   rˆ   ÚMikotaM._matmaté  rÄ   r   c                 ó   • U $ r…   r‹   rŒ   s    r   r�   ÚMikotaM._adjointñ  r�   r   c                 ó   • U $ r…   r‹   rŒ   s    r   r‘   ÚMikotaM._transposeô  r�   r   r   )r“   r”   r•   r–   r—   r   rE   r   rÎ   r¬   rz   ro   r‚   rˆ   r�   r‘   r˜   r™   rš   s   @r   rÊ   rÊ   ³  sD   ø† ñð. %'§J¡J÷ 'ò
Iò
ò?ò
8ò/òò÷ð r   rÊ   c                   óp   ^ • \ rS rSrSr\R                  4U 4S jjrS rS r	S r
S rS rS	 rS
 rSrU =r$ )ÚMikotaKiø  aQ  
Construct a stiffness matrix in various formats of Mikota pair.

The stiffness matrix `K` is square real tri-diagonal symmetric
positive definite with integer entries.

Parameters
----------
shape : tuple of int
    The shape of the matrix.
dtype : dtype
    Numerical type of the array. Default is ``np.int32``.

Methods
-------
toarray()
    Construct a dense array from Mikota data
tosparse()
    Construct a sparse array from Mikota data
tobanded()
    The format for banded symmetric matrices,
    i.e., (2, n) ndarray with 2 upper diagonals
    placing the main diagonal at the bottom.
c                 óò   >• Xl         X l        [        TU ]  X!5        US   n[        R
                  " SU-  S-
  SSU R                  S9U l        [        R
                  " US-
  SSU R                  S9* U l        g )Nr   r!   r    r^   r]   r=   )r   r   r   r   r   r>   Ú_diag0Ú_diag1)r   r   r   r1   r   s       €r   r   ÚMikotaK.__init__  sh   ø€ ØŒ
ØŒ
Ü‰Ñ˜Ô&ð �!‰HˆÜ—i’i  A¡¨¡	¨1¨b¸¿
¹
ÑCˆŒÜŸ	š	 ! a¡%¨¨B°d·j±jÑAÐAˆ�r   c                 ó†   • [         R                  " [         R                  " U R                  SS5      U R                  /5      $ )Nrs   Úconstant)r   r¨   r¾   rå   rä   rŒ   s    r   r¬   ÚMikotaK.tobanded  s+   € Ü�xŠxœŸš §¡¨V°ZÓ@À$Ç+Á+ÐNÓOÐOr   c                 óŽ   • SSK Jn  U" U R                  U R                  U R                  // SQU R                  U R
                  S9$ )Nr   r¯   rt   r±   )r³   r°   rå   rä   r   r   rÓ   s     r   rz   ÚMikotaK.tosparse  s6   € Ý,Ù˜DŸK™K¨¯©°d·k±kÐBÊJØ!%§¡°4·:±:ñ?ð 	?r   c                 ó>   • U R                  5       R                  5       $ r…   r·   rŒ   s    r   ro   ÚMikotaK.toarray#  r¹   r   c                 ó  • UR                  U R                  S   S5      n[        R                  " UR                  U R                  5      n[        R
                  " XS9nU R                  nU R                  nUS   USSS24   -  US   USSS24   -  -   USSS24'   US   USSS24   -  US   USSS24   -  -   USSS24'   USS2S4   USS2SS24   -  USS2S4   USS2SS24   -  -   USS2S4   USS2SS24   -  -   USS2SS24'   U$ )zÓ
Construct matrix-free callable banded-matrix-vector multiplication by
the Mikota stiffness matrix without constructing or storing the matrix
itself using the knowledge of its entries and the 3-diagonal format.
r   r=   r]   Nr    r^   r!   )rf   r   r   r¼   r   r½   rå   rä   )r   rX   r¿   Úkxrª   r©   s         r   r‚   ÚMikotaK._matvec&  s7  € ð �I‰I�d—j‘j ‘m RÓ(ˆÜ×'Ò'¨¯©°·±Ó<ˆÜ�]Š]˜1Ñ1ˆØ�[‰[ˆØ�[‰[ˆØ�a‘5˜1˜Q¢˜T™7‘? R¨¡U¨Q¨q²!¨t©W¡_Ñ4ˆˆ1Šaˆ4‰Ø�r‘F˜Q˜r¢1˜u™XÑ%¨¨2©°°2²q°5±Ñ(9Ñ9ˆˆ2Šqˆ5‰	Ø˜3˜B˜3 ˜9™¨¨$¨B¨$²¨'©
Ñ2Ø˜Q ˜U D˜[™/¨A¨a°¨e²Q¨h©KÑ7ñ8à˜Q™R ˜X™,¨¨1©2ªq¨5©Ñ1ñ2ˆˆ1ˆbˆ5’!ˆ8‰ð ˆ	r   c                 ó$   • U R                  U5      $ )zÕ
Construct matrix-free callable matrix-matrix multiplication by
the Stiffness mass matrix without constructing or storing the matrix itself
by reusing the ``_matvec(x)`` that supports both 1D and 2D arrays ``x``.
r†   r‡   s     r   rˆ   ÚMikotaK._matmat8  rÄ   r   c                 ó   • U $ r…   r‹   rŒ   s    r   r�   ÚMikotaK._adjoint@  r�   r   c                 ó   • U $ r…   r‹   rŒ   s    r   r‘   ÚMikotaK._transposeC  r�   r   )rä   rå   r   r   )r“   r”   r•   r–   r—   r   Úint32r   r¬   rz   ro   r‚   rˆ   r�   r‘   r˜   r™   rš   s   @r   râ   râ   ø  s@   ø† ñð0 %'§H¡H÷ BòPò?ò
)òò$ò÷ð r   râ   c                   óB   • \ rS rSrSr\R                  4S jrSS jrSr	g)Ú
MikotaPairiG  at  
Construct the Mikota pair of matrices in various formats and
eigenvalues of the generalized eigenproblem with them.

The Mikota pair of matrices [1, 2]_ models a vibration problem
of a linear mass-spring system with the ends attached where
the stiffness of the springs and the masses increase along
the system length such that vibration frequencies are subsequent
integers 1, 2, ..., `n` where `n` is the number of the masses. Thus,
eigenvalues of the generalized eigenvalue problem for
the matrix pair `K` and `M` where `K` is the system stiffness matrix
and `M` is the system mass matrix are the squares of the integers,
i.e., 1, 4, 9, ..., ``n * n``.

The stiffness matrix `K` is square real tri-diagonal symmetric
positive definite. The mass matrix `M` is diagonal with diagonal
entries 1, 1/2, 1/3, ...., ``1/n``. Both matrices get
ill-conditioned with `n` growing.

Parameters
----------
n : int
    The size of the matrices of the Mikota pair.
dtype : dtype
    Numerical type of the array. Default is ``np.float64``.

Attributes
----------
eigenvalues : 1D ndarray, ``np.uint64``
    All eigenvalues of the Mikota pair ordered ascending.

Methods
-------
MikotaK()
    A `LinearOperator` custom object for the stiffness matrix.
MikotaM()
    A `LinearOperator` custom object for the mass matrix.

.. versionadded:: 1.12.0

References
----------
.. [1] J. Mikota, "Frequency tuning of chain structure multibody oscillators
   to place the natural frequencies at omega1 and N-1 integer multiples
   omega2,..., omegaN", Z. Angew. Math. Mech. 81 (2001), S2, S201-S202.
   Appl. Num. Anal. Comp. Math. Vol. 1 No. 2 (2004).
.. [2] Peter C. Muller and Metin Gurgoze,
   "Natural frequencies of a multi-degree-of-freedom vibration system",
   Proc. Appl. Math. Mech. 6, 319-320 (2006).
   http://dx.doi.org/10.1002/pamm.200610141.

Examples
--------
>>> import numpy as np
>>> from scipy.sparse.linalg._special_sparse_arrays import MikotaPair
>>> n = 6
>>> mik = MikotaPair(n)
>>> mik_k = mik.k
>>> mik_m = mik.m
>>> mik_k.toarray()
array([[11., -5.,  0.,  0.,  0.,  0.],
       [-5.,  9., -4.,  0.,  0.,  0.],
       [ 0., -4.,  7., -3.,  0.,  0.],
       [ 0.,  0., -3.,  5., -2.,  0.],
       [ 0.,  0.,  0., -2.,  3., -1.],
       [ 0.,  0.,  0.,  0., -1.,  1.]])
>>> mik_k.tobanded()
array([[ 0., -5., -4., -3., -2., -1.],
       [11.,  9.,  7.,  5.,  3.,  1.]])
>>> mik_m.tobanded()
array([1.        , 0.5       , 0.33333333, 0.25      , 0.2       ,
    0.16666667])
>>> mik_k.tosparse()
<DIAgonal sparse array of dtype 'float64'
    with 16 stored elements (3 diagonals) and shape (6, 6)>
>>> mik_m.tosparse()
<DIAgonal sparse array of dtype 'float64'
    with 6 stored elements (1 diagonals) and shape (6, 6)>
>>> np.array_equal(mik_k(np.eye(n)), mik_k.toarray())
True
>>> np.array_equal(mik_m(np.eye(n)), mik_m.toarray())
True
>>> mik.eigenvalues()
array([ 1,  4,  9, 16, 25, 36])
>>> mik.eigenvalues(2)
array([ 1,  4])

c                 óÀ   • Xl         X l        X4U l        [        U R                  U R                  5      U l        [        U R                  U R                  5      U l        g r…   )r1   r   r   rÊ   r-   râ   rO   )r   r1   r   s      r   r   ÚMikotaPair.__init__   sA   € ØŒØŒ
Ø�VˆŒ
Ü˜Ÿ™ T§Z¡ZÓ0ˆŒÜ˜Ÿ™ T§Z¡ZÓ0ˆ�r   Nc                 óv   • Uc  U R                   n[        R                  " SUS-   [        R                  S9nX"-  $ )aD  Return the requested number of eigenvalues.

Parameters
----------
m : int, optional
    The positive number of smallest eigenvalues to return.
    If not provided, then all eigenvalues will be returned.

Returns
-------
eigenvalues : `np.uint64` array
    The requested `m` smallest or all eigenvalues, in ascending order.
r    r]   )r1   r   r>   Úuint64)r   r-   Úarange_plus1s      r   r4   ÚMikotaPair.eigenvalues§  s5   € ð ‰9Ø—‘ˆAÜ—y’y  A¨¡E´·±Ñ;ˆØÑ*Ð*r   )r   rO   r-   r1   r   r…   )
r“   r”   r•   r–   r—   r   rE   r   r4   r˜   r‹   r   r   rù   rù   G  s   † ñWðp !#§
¡
ô 1÷+r   rù   )Únumpyr   Úscipy.sparse.linalgr   r³   r   r   r   Ú__all__r   rœ   rÊ   râ   rù   r‹   r   r   Ú<module>r     s`   ðÛ Ý .ß 3Ñ 3àˆ/€ô
|�.ô |ô~gˆnô gôTBˆnô BôJLˆnô L÷^q+ò q+r   