Ë
    0Ò^jÈ7  ã                   óº   — d Z ddlZddlmZmZmZmZ ddlmZ dZ	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Zy)zù
This module provides some basic linear algebra procedures.

Translated from Zaikun Zhang's modern-Fortran reference implementation in PRIMA.

Dedicated to late Professor M. J. D. Powell FRS (1936--2015).

Python translation by Nickolai Belakovski.
é    Né   )Ú	DEBUGGINGÚEPSÚREALMAXÚREALMIN)ÚpresentFc                 ó�   — t         st        j                  | |«      S d}t        t	        | «      «      D ]  }|| |   ||   z  z  }Œ |S )Nr   )ÚUSE_NAIVE_MATHÚnpÚdotÚrangeÚlen©ÚxÚyÚresultÚis       úp/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/scipy/_external/pyprima/common/linalg.pyÚinprodr      sL   € ÝÜ�v‰v�a˜‹|ÐØ€FÜ”3�q“6‹]ò ˆØ�!�A‘$˜˜1™‘+Ñ‰ðà€Mó    c                 ó°   — t        j                  |j                  d   «      }t        |j                  d   «      D ]  }t	        | |d d …|f   «      ||<   Œ |S )Nr   )r   ÚzerosÚshaper   r   r   s       r   Ú	matprod12r   %   sQ   € Ü�X‰X�a—g‘g˜a‘jÓ!€FÜ�1—7‘7˜1‘:Óò 'ˆÜ˜1˜a¢ 1 ™gÓ&ˆˆqŠ	ð'à€Mr   c                 ó¨   — t        j                  | j                  d   «      }t        | j                  d   «      D ]  }|| d d …|f   ||   z  z  }Œ |S ©Nr   r   ©r   r   r   r   r   s       r   Ú	matprod21r   ,   sS   € Ü�X‰X�a—g‘g˜a‘jÓ!€FÜ�1—7‘7˜1‘:Óò !ˆØ�!’A�q�D‘'˜A˜a™D‘.Ñ ‰ð!à€Mr   c           	      ó  — t        j                  | j                  d   |j                  d   f«      }t        |j                  d   «      D ]?  }t        | j                  d   «      D ]"  }|d d …|fxx   | d d …|f   |||f   z  z  cc<   Œ$ ŒA |S r   r   )r   r   r   r   Újs        r   Ú	matprod22r!   3   s‹   € Ü�X‰X�q—w‘w˜q‘z 1§7¡7¨1¡:Ð.Ó/€FÜ�1—7‘7˜1‘:Óò .ˆÜ�q—w‘w˜q‘zÓ"ò 	.ˆAØ’1�a�4‹L˜Aša ˜d™G a¨¨1¨¡gÑ-Ñ-ŒLñ	.ð.ð €Mr   c                 óB  — t         s| |z  S t        | j                  «      dk(  r$t        |j                  «      dk(  rt        | |«      S t        | j                  «      dk(  r$t        |j                  «      dk(  rt	        | |«      S t        | j                  «      dk(  r$t        |j                  «      dk(  rt        | |«      S t        | j                  «      dk(  r$t        |j                  «      dk(  rt        | |«      S t        d| j                  › d|j                  › �«      ‚)Nr   é   zInvalid shapes for x and y: z and )r
   r   r   r   r   r   r!   Ú
ValueError)r   r   s     r   Úmatprodr%   ;   sÛ   € ÝØ�‰sˆ
Ü
ˆ1�7‰7ƒ|�qÒœS §¡›\¨QÒ.Ü�a˜‹|ÐÜ	ˆQ�W‰W‹˜Ò	œs 1§7¡7›|¨qÒ0Ü˜˜A‹ÐÜ	ˆQ�W‰W‹˜Ò	œs 1§7¡7›|¨qÒ0Ü˜˜A‹ÐÜ	ˆQ�W‰W‹˜Ò	œs 1§7¡7›|¨qÒ0Ü˜˜A‹ÐäÐ7¸¿¹°yÀÀaÇgÁgÀYÐOÓPÐPr   c                 óà   — t         st        j                  | |«      S t        j                  t	        | «      t	        |«      f«      }t        t	        | «      «      D ]  }| ||   z  |d d …|f<   Œ |S ©N)r
   r   Úouterr   r   r   r   s       r   Úoutprodr)   J   sa   € ÝÜ�x‰x˜˜1‹~ÐÜ�X‰X”s˜1“vœs 1›vÐ&Ó'€FÜ”3�q“6‹]ò $ˆØ˜q ™t™8ˆF’1�a�4ŠLð$à€Mr   c           	      ó  — t         s%t        j                  j                  | |d ¬«      d   S | j                  d   }| j                  d   }t        ||«      }t        j                  |«      }|j                  «       }t        |dz
  dd«      D ]}  }	t        ||d d …|	f   «      }
t        t        j                  |«      t        j                  |d d …|	f   «      «      }t        |
|«      rd||	<   Œa|
||	   z  ||	<   |||	   | d d …|	f   z  z
  }Œ |S )N)Úrcondr   r   éÿÿÿÿ)r
   r   ÚlinalgÚlstsqr   Úminr   Úcopyr   r   ÚabsÚisminor)ÚAÚbÚQÚRdiagÚmÚnÚrankr   r   r   ÚyqÚyqas               r   Úlsqrr<   S   sù   € ÝÜ�y‰y�‰˜q !¨4ˆÓ0°Ñ3Ð3à	�‰�‰
€AØ	�‰�‰
€Aäˆq�!‹9€Dä
�‰�‹€AØ	�‰‹€Aä�4˜!‘8˜R Ó$ò #ˆÜ�A�qš˜A˜‘wÓˆÜ”R—V‘V˜A“Y¤§¡ qª¨A¨¡w£Ó0ˆÜ�2�sÔØˆAˆaŠDà˜˜a™‘=ˆAˆa‰DØ�A�a‘D˜1šQ ˜T™7‘NÑ"‰Að#ð €Hr   c                 óž  — t         st        j                  | |«      S t        j                  | «      st	        | «      }|S t        j                  |«      st	        |«      }|S t	        t        j
                  | |g«      «      }t        j
                  t        |«      t        |«      g«      }|d   t        j                  t        «      kD  rE|d   t        j                  t        dz  «      k  r#t        j                  t        ||z  «      «      }|S |d   dkD  r5|d   t        j                  |d   |d   z  |d   |d   z  z  dz   «      z  }|S d}|S )Nr   r   çÍÌÌÌÌÌ @)r
   r   ÚhypotÚisfiniter1   Úarrayr/   ÚmaxÚsqrtr   r   Úsum)Úx1Úx2Úrr   s       r   r?   r?   j   s%  € ÝÜ�x‰x˜˜BÓÐÜ�;‰;�rŒ?Ü�‹Gˆð €Hô �[‰[˜Œ_Ü�‹Gˆð €Hô ”—‘˜"˜b˜Ó"Ó#ˆÜ�H‰H”c˜!“fœc !›fÐ%Ó&ˆØˆQ‰4”"—'‘'œ'Ó"Ò" q¨¡t¬b¯g©g´g¸c±kÓ.BÒ'BÜ—‘œ˜A˜a™C›Ó!ˆAð
 €Hð	 ˆq‰T�AŠXØ�!‘”r—w‘w  !¡ Q q¡T¡	¨A¨a©D°°1±©IÑ6¸Ñ:Ó;Ñ;ˆAð €Hð ˆAØ€Hr   c           	      ó¸   — t         st        j                  j                  | «      S t        j                  t        | D �cg c]  }||z  ‘Œ	 c}«      «      }|S c c}w r'   )r
   r   r-   ÚnormrC   rD   )r   Úxir   s      r   rI   rI   }   sF   € ÝÜ�y‰y�~‰~˜aÓ Ð ô �W‰W”S¨!Ö, B˜"˜R›%Ò,Ó-Ó.€FØ€Mùò -s   ¾Ac                 ón   — t        t        | «      t        j                  t        | «      «      z
  «      |k  S r'   )Úprimasumr1   r   Útril©r3   Útols     r   ÚistrilrP   ‡   ó'   € Ü”C˜“FœRŸW™W¤S¨£V›_Ñ,Ó-°Ñ4Ð4r   c                 ón   — t        t        | «      t        j                  t        | «      «      z
  «      |k  S r'   )rL   r1   r   ÚtriurN   s     r   ÚistriurT   Š   rQ   r   c                 ó  — t         st        j                  j                  | «      S | j	                  «       } | j
                  d   }t        | «      rz| j                  }t        j                  ||f«      }t        |«      D ]=  }d|||f   z  |||f<   t        |d |…d |…f   |d |…|f   «       |||f   z  |d |…|f<   Œ? |j                  S t        | «      rdt        j                  ||f«      }t        |«      D ]=  }d| ||f   z  |||f<   t        |d |…d |…f   | d |…|f   «       | ||f   z  |d |…|f<   Œ? |S t        | «      \  }}}|j                  }t        j                  ||f«      }t        |dz
  dd«      D ]=  }|d d …|f   t        |d d …|dz   |…f   ||dz   |…|f   «      z
  |||f   z  |d d …|f<   Œ? t        j                  |t        ¬«      }t        j                  d|dz
  |«      ||<   |d d …|f   j                  }|S )Nr   r   r,   ©Údtype)r
   r   r-   Úinvr0   r   rP   ÚTr   r   r%   rT   ÚqrÚintÚlinspace)r3   r8   ÚRÚBr   r5   ÚPÚInvPs           r   rX   rX   Ž   s5  € ÝÜ�y‰y�}‰}˜QÓÐØ	�‰‹€AØ	�‰�‰
€AÜˆa„yà�C‰CˆÜ�H‰H�a˜�VÓˆÜ�q“ò 	?ˆAØ˜!˜A˜q˜D™'‘kˆAˆa�ˆd‰GÜ  " 1 " b q b &¡	¨1¨R¨a¨R°¨U©8Ó4Ð4°q¸¸A¸±wÑ>ˆAˆbˆqˆb�!ˆeŠHð	?ð �s‰sˆ
Ü	�ŒÜ�H‰H�a˜�VÓˆÜ�q“ò 	?ˆAØ˜!˜A˜q˜D™'‘kˆAˆa�ˆd‰GÜ  " 1 " b q b &¡	¨1¨R¨a¨R°¨U©8Ó4Ð4°q¸¸A¸±wÑ>ˆAˆbˆqˆb�!ˆeŠHð	?ð €Hô �Q“%‰ˆˆ1ˆaØ�C‰CˆÜ�H‰H�a˜�VÓˆÜ�q˜1‘u˜b "Ó%ò 	RˆAØš˜A˜‘w¤¨ª1¨a°!©e°A¨g¨:©¸¸!¸a¹%À¸'À1¸*¹Ó!FÑFÈ!ÈAÈqÈDÉ'ÑQˆAŠa�ˆdŠGð	Rä�x‰x˜¤Ô%ˆÜ—+‘+˜a  1¡ aÓ(ˆˆQ‰ØŠa�ˆg‰J�L‰LˆØ€Hr   c                 óB  — | j                   d   }| j                   d   }t        j                  |«      }| j                  }t        j                  d|dz
  |t
        ¬«      }t        |«      D �]!  }t        j                  t        t        |||dz   …||dz   …f   «      d¬«      d¬«      }|dkD  r5|||z
  dz
  k  r*||z  }||   ||   c||<   ||<   |||gd d …f   |||gd d …f<   t        |dz
  |d«      D ]—  }t        ||||gf   «      j                  }	t        j                  t        |||f   |||f   «      d«      ||||gf<   t        ||dz   |dz   …||gf   |	«      ||dz   |dz   …||gf<   t        |d d …||gf   |	«      |d d …||gf<   Œ™ �Œ$ |j                  }
||
|fS )Nr   r   rV   ©Úaxisr,   )r   r   ÚeyerY   r\   r[   r   ÚargmaxrL   Ú	primapow2ÚplanerotÚappendr?   r%   )r3   r7   r8   r5   rY   r_   r    Úkr   ÚGr]   s              r   rZ   rZ   ­   sÌ  € Ø	�‰�‰
€AØ	�‰�‰
€Aä
�‰ˆq‹	€AØ	�‰€AÜ
�‰�A�q˜‘s˜A¤SÔ)€Aä�1‹Xó 
4ˆÜ�I‰I”hœy¨¨1¨Q¨q©S¨5°!°A°a±C°%¨<©Ó9ÀÔBÈÔKˆØˆqŠ5�Q˜!˜a™% !™)’^Ø�‰FˆAØ˜1™˜q ™tˆJˆAˆa‰D�!�A‘$Ø˜a ˜V¢Q˜Y™<ˆAˆq�!ˆf’aˆi‰LÜ�q˜‘s˜A˜rÓ"ò 	4ˆAÜ˜˜1˜q !˜f˜9™Ó&×(Ñ(ˆAÜŸ9™9¤U¨1¨Q°¨T©7°A°a¸°d±GÓ%<¸aÓ@ˆAˆa�!�Q�ˆi‰LÜ%,¨Q¨q°1©u°Q¸±U¨{¸QÀ¸FÐ/BÑ-CÀQÓ%GˆAˆa�!‰e�A˜‘Eˆk˜A˜q˜6Ð!Ñ"Ü" 1¢Q¨¨A¨ Y¡<°Ó3ˆAŠa�!�Q�ˆiŠLò		4ð
4ð 	
�‰€Aàˆa�ˆ7€Nr   c                 ó  — t         st        j                  | |¬«      S |€0| j                  dk(  rt        t	        | d¬«      «      S t        | «      S |dk(  rVt        j
                  | j                  d   «      }t        | j                  d   «      D ]  }t        | dd…|f   «      ||<   Œ |S |dk(  rVt        j
                  | j                  d   «      }t        | j                  d   «      D ]  }t        | |dd…f   «      ||<   Œ |S y)zâ
    According to its documentation, np.sum will sometimes do partial pairwise summation.
    For our purposes, when comparing, we want don't want to do anything fancy, and we
    just want to add things up one at a time.
    rb   Nr#   r   r   )r
   r   rD   ÚndimrL   r   r   r   )r   rc   r   r   s       r   rL   rL   Æ   sî   € õ Ü�v‰v�a˜dÔ#Ð#Ø€|Ø�6‰6�QŠ;ä”x ¨Ô*Ó+Ð+ä�q“6ˆMØ	�ŠÜ—‘˜!Ÿ'™' !™*Ó%ˆÜ�q—w‘w˜q‘zÓ"ò 	%ˆAÜ˜Aša ˜d™G›ˆF�1ŠIð	%àˆØ	�ŠÜ—‘˜!Ÿ'™' !™*Ó%ˆÜ�q—w‘w˜q‘zÓ"ò 	%ˆAÜ˜A˜a¢˜d™G›ˆF�1ŠIð	%àˆð	 
r   c                 ó   — | | z  S )a@  
    Believe it or now, x**2 is not always the same as x*x in Python. In Fortran they
    appear to be identical. Here's a quick one-line to find an example on your system
    (well, two liner after importing numpy):
    list(filter(lambda x: x[1], [(x:=np.random.random(), x**2 - x*x != 0) for _ in range(10000)]))
    © )r   s    r   rf   rf   à   s   € ð ˆQ‰3€Jr   c           
      óÀ  — t         rt        | «      dk(  sJ d«       ‚t        t        j                  | «      «      rd}d}�nŸt        t        j                  | «      «      rddt        j                  d«      z  t        j                  | d   «      z  }dt        j                  d«      z  t        j                  | d   «      z  }�nt        | d   «      dk  rt        | d   «      dk  rd}d}�nõt        | d   «      t        t        | d   «      z  k  rt        j                  | d   «      }d}�nµt        | d   «      t        t        | d   «      z  k  rd}t        j                  | d   «      }�nut        t        j                  t        j                  t        «      t        j                  | «      k  t        j                  | «      t        j                  t        dz  «      k  «      «      rt        | «      }| d   |z  }| d   |z  }nÝt        | d   «      t        | d   «      kD  r`| d   | d   z  }t        dt        |«      t        j                  d||z  z   «      «      }|t        j                  | d   «      z  }d|z  }||z  }n`| d   | d   z  }t        dt        |«      t        j                  d||z  z   «      g«      }|t        j                  | d   «      z  }||z  }d|z  }t        j                   ||g| |gg«      }t         �r\|j"                  dk(  sJ ‚t        j
                  t        j$                  |«      «      sJ ‚t        |d   |d   z
  «      t        |d	   |d
   z   «      z   dk  sJ ‚t        j&                  dt        j(                  ddt        z  «      «      }t+        ||«      sJ ‚t        t        j                  t        j$                  | «      t        j                  | «      t        j                  t        dz  «      k  «      «      rRt        j,                  j                  | «      }t        t        || z  |dgz
  «      «      t        |||z  «      k  sJ d«       ‚|S )aP  
    As in MATLAB, planerot(x) returns a 2x2 Givens matrix G for x in R2 so that Y=G@x has Y[1] = 0.
    Roughly speaking, G = np.array([[x[0]/R, x[1]/R], [-x[1]/R, x[0]/R]]), where R = np.linalg.norm(x).
    0. We need to take care of the possibilities of R=0, Inf, NaN, and over/underflow.
    1. The G defined above is continuous with respect to X except at 0. Following this definition,
    G = np.array([[np.sign(x[0]), 0], [0, np.sign(x[0])]]) if x[1] == 0,
    G = np.array([[0, np.sign(x[1])], [np.sign(x[1]), 0]]) if x[0] == 0
    Yet some implementations ignore the signs, leading to discontinuity and numerical instability.
    2. Difference from MATLAB: if x contains NaN of consists of only Inf, MATLAB returns a NaN matrix,
    but we return an identity matrix or a matrix of +/-np.sqrt(2). We intend to keep G always orthogonal.
    r#   zx must be a 2-vectorr   r   r>   )r#   r#   )r   r   )r   r   )r   r   )r   r   g»½×Ùß|Û=çš™™™™™¹?g    €„.AzG @ X = [||X||, 0])r   r   Úanyr   ÚisnanÚallÚisinfrC   Úsignr1   r   Úlogical_andr   r   rI   rB   rA   r   r@   ÚmaximumÚminimumÚisorthr-   )r   ÚcÚsrG   ÚtÚurj   rO   s           r   rg   rg   ê   s�  € õ Ü�1‹v˜Š{Ð2Ð2Ó2ˆ{ô 	ŒB�H‰H�Q‹KÔàˆØŠÜ
Œb�h‰h�q‹kÔ
à”—‘˜“
‰NœRŸW™W Q q¡T›]Ñ*ˆØ”—‘˜“
‰NœRŸW™W Q q¡T›]Ñ*ŠÜ
ˆa�‰d‹)�qŠ.œS  1¡›Y¨!š^ØˆØŠÜ
ˆa�‰d‹)”sœS  1¡›Y‘Ò
&ô �G‰G�A�a‘D‹MˆØŠÜ
ˆa�‰d‹)”sœS  1¡›Y‘Ò
&ð ˆÜ�G‰G�A�a‘D‹MŠô ”—‘œrŸw™w¤wÓ/´"·&±&¸³)Ñ;¼R¿V¹VÀA»YÌÏÉÔQXÐ[^ÑQ^ÓI_Ñ=_Ó`Ôaä�Q“ˆAØ�!‘�q‘ˆAØ�!‘�q‘‰AÜ�!�A‘$‹iœ#˜a ™d›)Ò#Ø�!‘�q˜‘t‘ˆAÜ�A”s˜1“vœrŸw™w q¨1¨Q©3¡wÓ/Ó0ˆAØ”—‘˜˜1™“ÑˆAØ�A‘ˆAØ�A‘‰Aà�!‘�q˜‘t‘ˆAÜ�Qœ˜A›¤§¡¨¨A¨a©C©Ó 0Ð1Ó2ˆAØ”—‘˜˜1™“ÑˆAØ�A‘ˆAØ�A‘ˆAä
�‰�1�a�&˜A˜2˜q˜'Ð"Ó#€Aö Ø�w‰w˜%ÒÐÐÜ�v‰v”b—k‘k !“nÔ%Ð%Ð%Ü�1�T‘7˜Q˜t™WÑ$Ó%¬¨A¨d©G°a¸±gÑ,=Ó(>Ñ>À!ÒCÐCÐCÜ�j‰j˜¤"§*¡*¨V°U¼S±[Ó"AÓBˆÜ�a˜Œ~Ðˆ~ÜŒr�~‰~œbŸk™k¨!›n¬b¯f©f°Q«i¼"¿'¹'Ä'ÈCÁ-Ó:PÑ.PÓQÔRÜ—	‘	—‘˜qÓ!ˆAÜ”s˜1˜Q™3 ! Q ™<Ó(Ó)¬S°°c¸A±gÓ->Ò>ÐTÐ@TÓTÐ>à€Hr   c                 ó¾   — d}t        |«      |t        | «      z  z   }t        |«      d|z  t        | «      z  z   }t        j                  t        |«      |k\  ||k\  «      S )a#  
    This function tests whether x is minor compared to ref. It is used by Powell, e.g., in COBYLA.
    In precise arithmetic, isminor(x, ref) is true if and only if x == 0; in floating point
    arithmetic, isminor(x, ref) is true if x is 0 or its nonzero value can be attributed to
    computer rounding errors according to ref.
    Larger sensitivity means the function is more strict/precise, the value 0.1 being due to Powell.

    For example:
    isminor(1e-20, 1e300) -> True, because in floating point arithmetic 1e-20 cannot be added to
    1e300 without being rounded to 1e300.
    isminor(1e300, 1e-20) -> False, because in floating point arithmetic adding 1e300 to 1e-20
    dominates the latter number.
    isminor(3, 4) -> False, because 3 can be added to 4 without being rounded off
    rp   r#   )r1   r   Ú
logical_or)r   ÚrefÚsensitivityÚrefaÚrefbs        r   r2   r2   E  sY   € ð  €KÜˆs‹8�k¤C¨£FÑ*Ñ*€DÜˆs‹8�a˜+‘o¬¨A«Ñ.Ñ.€DÜ�=‰=œ˜S› TÑ)¨4°4©<Ó8Ð8r   c                 óî  — t        j                  | d«      }t        rŸt        j                  | d«      t        j                  | d«      k(  sJ ‚t        j                  |d«      t        j                  |d«      k(  sJ ‚t        j                  | d«      t        j                  |d«      k(  sJ ‚t        |«      r|dk\  sJ ‚t        |«      r|n[t        j                  ddt
        z  t        j                  t        j                  | d«      t        j                  | d«      «      z  «      }t        j                  ||t        j                  t        | «      «      z  |t        j                  t        |«      «      z  g«      }t        t        | |«      «      t        j                  |«      z
  |k  j                  «       xs< t        t        || «      t        j                  |«      z
  «      |k  j                  «       }|S )zJ
    This procedure tests whether A = B^{-1} up to the tolerance TOL.
    r   r   gü©ñÒMbP?g      Y@)r   Úsizer   r   rx   r   rw   rB   r1   r%   rd   rs   )r3   r^   rO   r8   Úis_invs        r   Úisinvr‡   [  su  € ô 	�‰��1‹€Aõ Ü�w‰w�q˜!‹}¤§¡¨¨1£Ò-Ð-Ð-Ü�w‰w�q˜!‹}¤§¡¨¨1£Ò-Ð-Ð-Ü�w‰w�q˜!‹}¤§¡¨¨1£Ò-Ð-Ð-Ü�3Œ<Ø˜!’8ˆO�8ô ˜”‰#¤2§:¡:¨d°C¼#±IÄÇ
Á
Ì2Ï7É7ÐSTÐVWË=ÔZ\×ZaÑZaÐbcÐefÓZgÓ@hÑ4hÓ#i€CÜ
�&‰&�#�sœRŸV™V¤C¨£F›^Ñ+¨S´2·6±6¼#¸a»&³>Ñ-AÐBÓ
C€CÜ”7˜1˜a“=Ó!¤B§F¡F¨1£IÑ-°#Ñ5×:Ñ:Ó<ÒoÄ#ÄgÈaÐQRÃmÔVX×V\ÑV\Ð]^ÓV_ÑF_ÓB`ÐehÑAh×@mÑ@mÓ@o€Fð
 €Mr   c           
      óŠ  — t         rt        |«      r|dk\  sJ ‚t        j                  | d«      }|t        j                  | d«      kD  rd}|S t        j                  t        t        | «      «      «      rd}|S t        |«      r{t        t        | j                  | «      t        j                  |«      z
  «      t        j                  ||t        j                  t        | «      «      z  «      k  j                  «       }|S t        t        | j                  | «      t        j                  |«      z
  «      dk  j                  «       }|S )zc
    This function tests whether the matrix A has orthonormal columns up to the tolerance TOL.
    r   r   F)r   r   r   r…   rr   rL   r1   r%   rY   rd   rw   rB   rs   )r3   rO   Únum_varsÚis_orths       r   ry   ry   y  s  € õ Ü�3Œ<Ø˜!’8ˆO�8ô �w‰w�q˜!‹}€Hà”"—'‘'˜!˜Q“-ÒØˆð €Nô �(‰(”8œC ›FÓ#Ô
$Øˆð €Nô �3Œ<Üœ7 1§3¡3¨›?¬R¯V©V°HÓ-=Ñ=Ó>Ä"Ç*Á*ÈSÐRUÔXZ×X^ÑX^Ô_bÐcdÓ_eÓXfÑRfÓBgÑg×lÑlÓnˆGð €Nô œ7 1§3¡3¨›?¬R¯V©V°HÓ-=Ñ=Ó>À!ÑC×HÑHÓJˆGð
 €Nr   c                  ó®   — t        | «      dk(  rt        d«      ‚t        d„ | D «       «      }t        d„ | D «       «      }dt        z  t        |d«      z  |z  S )aS  
    Get a relative tolerance for a set of arrays. Borrowed from COBYQA

    Parameters
    ----------
    *arrays: tuple
        Set of `numpy.ndarray` to get the tolerance for.

    Returns
    -------
    float
        Relative tolerance for the set of arrays.

    Raises
    ------
    ValueError
        If no array is provided.
    r   z$At least one array must be provided.c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr'   )r…   ©Ú.0rA   s     r   ú	<genexpr>z!get_arrays_tol.<locals>.<genexpr>®  s   è ø€ Ò.˜eˆu�z�zÑ.ùs   ‚c           	   3   óœ   K  — | ]D  }t        j                  t        j                  |t        j                  |«         «      d ¬«      –— ŒF y­w)ç      ð?)ÚinitialN)r   rB   r1   r@   r�   s     r   r�   z!get_arrays_tol.<locals>.<genexpr>¯  s=   è ø€ ò àô 	�‰Œr�v‰v�eœBŸK™K¨Ó.Ñ/Ó0¸#×>Ð>ñùs   ‚A
Ag      $@r‘   )r   r$   rB   r   )Úarraysr…   Úweights      r   Úget_arrays_tolr•   ™  s_   € ô& ˆ6ƒ{�aÒÜÐ?Ó@Ð@ÜÑ. vÔ.Ó.€DÜñ àôó €Fð ”#‰:œ˜D #›Ñ&¨Ñ/Ð/r   )r   r'   )Ú__doc__Únumpyr   Úconstsr   r   r   r   r   r
   r   r   r   r!   r%   r)   r<   r?   rI   rP   rT   rX   rZ   rL   rf   rg   r2   r‡   ry   r•   rn   r   r   ú<module>r™      s‡   ðñó ß 4Ó 4Ý ð €òòòòòQòòò.ò&ó5ó5òò>ó2ò4òXòv9ó,ó<ó@0r   