ó
    Û“,j_K  ã            
       óè   • S SK r S SKrS SKrS SKJr  SSKJrJ	r	  SSKJ
r
  SSK	Jr  S rS rS rS q " S	 S
\R                   5      rS rSS jr " S S\5      rSS\R,                  SSSSSSS4
S jrg)é    Né   )ÚchÚutils)Úpif)Útimerc                 ó–   • U R                   S   R                  5         [        U S5      (       a  U R                  R                  5         g g )NÚdrsÚ	dr_cached)Ú_cacheÚclearÚhasattrr
   )Únodes    ÚªC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\chumpy/optimization_internal.pyÚclear_cache_singler   
   s9   € Ø‡K�K�Ñ×ÑÔÜˆt�[×!Ñ!Ø�‰×ÑÕð "ó    c           	      óÄ  • U  Vs/ s Hj  n[        U[        R                  R                  R                  5      (       d  UO1UR                  [        R                  " UR                  S   5      5      PMl     n n[        U  Vs/ s H  n[        R                  " U5      PM     sn5      (       a  [        R                  " U SS9$ [        R                  " U 5      $ s  snf s  snf ©Nr   Úcsc)Úformat)Ú
isinstanceÚspÚlinalgÚ	interfaceÚLinearOperatorÚdotÚnpÚeyeÚshapeÚanyÚissparseÚvstack©ÚxÚas     r   r!   r!      ó¢   € ÙlmÓnÒlmÐgh”*˜Q¤§	¡	× 3Ñ 3× BÑ B×CÑC‰ÈÏÉÌrÏvÊvÐVW×V]ÑV]Ð^_ÑV`ÓOaÓIbÒ	bÑlm€AÐnÜ),ÁaÓ-HÂaÀ¬b¯kªk¸!®nÁaÑ-H×)IÑ)IŒ2�9Š9�Q˜uÑ%Ð[ÌrÏyÊyÐYZË|Ð[ùò 	oùÚ-Hó   …A1CÂ Cc           	      óÄ  • U  Vs/ s Hj  n[        U[        R                  R                  R                  5      (       d  UO1UR                  [        R                  " UR                  S   5      5      PMl     n n[        U  Vs/ s H  n[        R                  " U5      PM     sn5      (       a  [        R                  " U SS9$ [        R                  " U 5      $ s  snf s  snf r   )r   r   r   r   r   r   r   r   r   r   r    Úhstackr"   s     r   r(   r(      r%   r&   c                   óB   • \ rS rSrSrSrS rS
S jrS r\	S 5       r
S	rg)ÚChInputsStackedé   )r#   ÚobjÚfree_variablesc                 ó¤   • [        U S5      (       d  SU l        U =R                  S-  sl        U R                  R                  R	                  5       $ )NÚfevalsr   r   )r   r/   r,   ÚrÚravel©Úselfs    r   Ú	compute_rÚChInputsStacked.compute_r   s;   € Ü�t˜X×&Ñ&ØˆDŒKØ�Š�qÑ�Ø�x‰x�z‰z×ÑÓ!Ð!r   Nc           
      óŒ  • XR                   L Ga  / n[        U R                  5       GHl  u  pE[        5       n[	        U[
        R                  5      (       a9  U R                  R                  UR                  US9n USS2UR                  4   nOU R                  R                  XRS9n[        SR                  UR                  U" 5       [        R                   " U5      5      5        U R"                  (       a+  [        R                   " U5      (       a  UR%                  5       nU R&                  (       a1  [        R                   " U5      (       d  [        R(                  " U5      nUc  [+        SR                  U5      5      eUR-                  U5        GMo     [        5       n[.        R0                  " U R                  [2        5        [        SR                  U" 5       5      5        [        5       n[5        U5      n[        SR                  U" 5       5      5        U$ g!   UR                  5       SS2UR                  4   n GN›= f)zV
Loop over free variables and delete cache for the whole tree after finished each one
©ÚprofilerNzdx wrt {} in {}sec, sparse: {}zNObjective has no derivative wrt free variable {}. You should likely remove it.zdfs_do_func_on_graph in {}seczhstack in {}sec)r#   Ú	enumerater-   r   r   r   ÚSelectr,   Údr_wrtr$   ÚidxsÚtocscr   r   Ú
short_namer   r    Ú_make_denseÚtodenseÚ_make_sparseÚ
csc_matrixÚ	ExceptionÚappendr   Údfs_do_func_on_graphr   r(   )	r3   Úwrtr8   ÚjacsÚfviÚfreevarÚtmÚnew_jacÚJs	            r   r;   ÚChInputsStacked.dr_wrt"   sµ  € ð —&‘&‹=ØˆDÜ )¨$×*=Ñ*=× >‘�Ü“W�Ü˜g¤r§y¡y×1Ñ1Ø"Ÿh™hŸo™o¨g¯i©iÀ(˜oÐK�GðCØ")ª!¨W¯\©\¨/Ñ":™ð
 #Ÿh™hŸo™o¨g˜oÐI�GäÐ4×;Ñ;¸G×<NÑ<NÑPRÓPTÔVX×VaÒVaÐbiÓVjÓkÔlà×#×#¬¯ª°G×(<Ñ(<Ø%Ÿo™oÓ/�GØ×$×$¬R¯[ª[¸×-AÑ-AÜ Ÿmšm¨GÓ4�Gà‘?Ü#ð7ß7=±v¸c³{óDð Dð —‘˜G×$ñ1 !?ô2 “ˆBÜ×&Ò& t§x¡xÔ1CÔDÜÐ/×6Ñ6±r³tÓ<Ô=Ü“ˆBÜ�t“ˆAÜÐ!×(Ñ(©«Ó.Ô/ØˆHðC øðCà")§-¡-£/²!°W·\±\°/Ñ"B›ús   Á;HÈ#Ic                 óH  • [         S-  q SU;   Ga’  Sn[        U R                  5       GHu  u  p4UR                  R                  n[
        R                  " X"U-   5      n[        U R                  U   [        R                  5      (       Ga$  / nU R                  U   n[        U[        R                  5      (       aH  UR                  UR                  5        UR                  n[        U[        R                  5      (       a  MH  UR                  R                  5       n	UR                  5       n
[!        U5      S:”  a#  X§R                  5          n
[!        U5      S:”  a  M#  U R                  R                  R#                  5       U   U	R#                  5       U
'   UR%                  SU	[         5        Oë[        U R                  U   R                  [
        R&                  5      (       az  U R                  U   R%                  SU R                  R                  U   R                  5       R)                  U R                  U   R                  R*                  5      [         5        O;U R                  U   R%                  SU R                  R                  U   [         5        X%-  nGMx     g g )Nr   r#   r   )Ú_giterr9   r-   r0   Úsizer   Úaranger   r   r:   rD   r<   r$   r#   ÚcopyÚpopÚlenr1   Ú__setattr__ÚndarrayÚreshaper   )r3   ÚwhichÚposÚidxrI   ÚszÚrngÚselectsr$   Únewvr<   s              r   Ú
on_changedÚChInputsStacked.on_changedI   sè  € ä�!‰ˆØ�%Œ<ØˆCÜ )¨$×*=Ñ*=× >‘�Ø—Y‘Y—^‘^�Ü—i’i ¨¡VÓ,�Ü˜d×1Ñ1°#Ñ6¼¿	¹	×BÒBà �GØ×+Ñ+¨CÑ0�AÜ$ Q¬¯	©	×2Ñ2ØŸ™ q§v¡vÔ.ØŸC™C˜ô % Q¬¯	©	×2Ó2ð Ÿ3™3Ÿ8™8›:�DØ"Ÿ;™;›=�DÜ˜g›,¨Ó*Ø#§K¡K£MÑ2˜ô ˜g›,¨Õ*à)-¯©¯©¯©Ó)9¸#Ñ)>�D—J‘J“L Ñ&Ø—M‘M # t¬VÕ4Ü × 3Ñ 3°CÑ 8× :Ñ :¼B¿J¹J×GÑGØ×'Ñ'¨Ñ,×8Ñ8¸¸d¿f¹f¿h¹hÀs¹m×>PÑ>PÓ>R×>ZÑ>ZÐ[_×[nÑ[nÐorÑ[s×[uÑ[u×[{Ñ[{Ó>|ô  Eõ  Fà×'Ñ'¨Ñ,×8Ñ8¸¸d¿f¹f¿h¹hÀs¹mÌVÔTØ‘	“ò) !?ð r   c                 ó"  • U R                  U R                  U R                  S9R                  5       nU R                  (       a  U R                  R	                  5         [
        R                  " U5      (       d  [        R                  " U5      $ U$ )zI
Compute Jacobian. Analyze dr graph first to disable unnecessary caching
r7   )	r;   r#   r8   rR   Úharvestr   r    r   Ú
atleast_2d)r3   Úresults     r   rL   ÚChInputsStacked.Jd   s`   € ð
 —‘˜TŸV™V¨d¯m©m�Ð<×AÑAÓCˆØ�=�=Ø�M‰M×!Ñ!Ô#Ü,.¯KªK¸×,?Ñ,?Œr�}Š}˜VÓ$ÐKÀVÐKr   )r/   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚdtermsÚtermsr4   r;   r_   ÚpropertyrL   Ú__static_attributes__© r   r   r*   r*      s2   † Ø€FØ€Eò"ô%òNð6 ñLó óLr   r*   c           	      ó  • SS jS S.n[        U 5      (       a  U $ [        U [        5      (       a!  U [        UR	                  5       5      ;   a  X   $ [        SSR                  [        UR	                  5       5      5      -  5      e)Nc                 óF   • [         R                  R                  XUSS9S   $ )Ng»½×Ùß|Û=)ÚMÚtolr   )r   r   Úcg)ÚAr#   rr   s      r   Ú<lambda>Ú%setup_sparse_solver.<locals>.<lambda>q   s   € ¤B§I¡I§L¡L°¸À LÐ$FÀqÒ$Ir   c                 ó@   • [         R                  R                  X5      $ rf   )r   r   Úspsolve)ru   r#   s     r   rv   rw   r   s   € ¤§¡×!2Ñ!2°1Ô!8r   )rt   ry   znsparse_solver argument must be either a string in the set (%s) or have the api of scipy.sparse.linalg.spsolve.z, rf   )Úcallabler   ÚstrÚlistÚkeysrC   Újoin)Úsparse_solverÚ_solver_fnss     r   Úsetup_sparse_solverr�   o   s®   € ãIÙ8ñ€Kô �×ÑØÐÜ	�M¤3×	'Ñ	'¨M¼TÀ+×BRÑBRÓBTÓ=UÓ,UØÑ)Ð)äð  Ið  LP÷  LUñ  LUô  VZð  [f÷  [kñ  [kó  [mó  Vnó  Loñ  oó  pð  	pr   TFc                 ó2  ^ ^^^
• [        [        R                  " [        R                  " U Vs/ s H  n[	        U5      PM     sn5      5      5      nU[        U5      :w  a  [        S5      e0 m
[        T [        5      (       d  [        T [        5      (       a5  [        R                  " T  Vs/ s H  owR                  5       PM     sn5      m Ob[        T [        5      (       aM  T m
[        R                  " [        T R                  5       5       Vs/ s H  owR                  5       PM     sn5      m [        R                  " U Vs/ s H  oUR                  R                  5       PM     sn5      n[        T XUS9m UU
U U4S jn	T U	4$ s  snf s  snf s  snf s  snf )a9  
obj here can be a list of ch objects or a dict of label: ch objects. Either way, the ch
objects will be merged into one objective using a ChInputsStacked. The labels are just used
for printing out values per objective with each iteration. If make_dense is True, the
resulting object with return a desne Jacobian
z8The "free_variables" param contains duplicate variables.)r,   r-   r#   Ú
make_densec            	      ó¦  >• Tb  T" T5        T(       a¾  S[         R                  " TR                  S-  5      4-  /n [        [	        TR                  5       5      S S9 H<  u  pU R                  SU[         R                  " UR                  S-  5      4-  5        M>     SR                  U 5      S-   n [        R                  R                  U 5        g g )Nz%.2eé   c                 ó   • U S   $ ©Nr   ro   )r#   s    r   rv   Ú3setup_objective.<locals>.callback.<locals>.<lambda>—   s	   € ÈqÐQRÊtr   )Úkeyz%s: %.2ez | Ú
)r   Úsumr0   Úsortedr|   ÚitemsrD   r~   ÚsysÚstderrÚwrite)Úreport_lineÚlabelÚ	objectiveÚdispÚlabelsr,   Úon_steps      €€€€r   ÚcallbackÚ!setup_objective.<locals>.callback’   s§   ø€ ØÑÙ�CŒLÞØ!¤R§V¢V¨C¯E©E°1©HÓ%5Ð$7Ñ7Ð8ˆKÜ$*¬4°·±³Ó+?Á^Ô$TÑ �Ø×"Ñ" :°¼¿º¸y¿{¹{ÈA¹~Ó8NÐ0OÑ#OÖPñ %UàŸ*™* [Ó1°DÑ8ˆKÜ�J‰J×Ñ˜[Õ)ð r   )rT   r   ÚuniqueÚarrayÚidrC   r   r|   Útupler   Úconcatenater1   ÚdictÚvaluesr0   r*   )r,   r-   r–   r”   rƒ   rI   Únum_unique_idsÚfr#   r—   r•   s   ` ``      @r   Úsetup_objectiver¢   |   s+  û€ ô œŸš¤2§8¢8ÉÓ,WÊ¸W¬R°®[ÉÑ,WÓ#XÓYÓZ€NØœ˜^Ó,Ó,ÜÐRÓSÐSà€FÜ�#”t×Ñ¤
¨3´× 6Ñ 6Ü�nŠn±Ó5²¨AŸg™gži±Ñ5Ó6‰Ü	�Cœ×	Ñ	ØˆÜ�nŠn´°c·j±j³lÔ1CÓDÒ1C¨AŸg™gžiÑ1CÑDÓEˆä
�Š¹ÓHº¨gŸ	™	Ÿ™Ö)¹ÑHÓI€AÜ
˜c°.ÐR\Ñ
]€C÷*ð *ð �ˆ=Ðùò/ -Xùò 6ùò EùâHs   ®FÂ,F
ÄFÅ#Fc                   ó–  • \ rS rSrSrS r\S 5       r\R                  S 5       r\S 5       r	\	R                  S 5       r	\S 5       r
\
R                  S	 5       r
\S
 5       r\R                  S 5       r\S 5       r\S 5       rS r\S 5       r\R                  S 5       rS rS r\S 5       rS rS r " S S\5      rS rSS jrSrg)ÚDoglegStateéž   añ  
Dogleg preserves a great deal of state from iteration to iteration. Many of the things
that we need to calculate are dependent only on this state (e.g. the various trust region
steps, the current jacobian and the A & g that depends on it, etc.). Holding the state and
the various methods based on that state here allows us to seperate a lot of the jacobian
based calculation from the flow control of the optmization.

There will be once instance of DoglegState per invocation of minimize_dogleg.
c                 ó¶   • SU l         S U l        S U l        S U l        S U l        S U l        S U l        S U l        Xl        X l	        S U l
        S U l        SU l        g )Nr   F)Ú	iterationÚ_d_gnÚ_d_sdÚ_d_dlrL   ru   ÚgÚ_pÚdeltaÚsolveÚ_rÚrhoÚdone)r3   r­   r®   s      r   Ú__init__ÚDoglegState.__init__¨   sY   € ØˆŒØˆŒ
ØˆŒ
ØˆŒ
ØˆŒØˆŒØˆŒØˆŒØŒ
ØŒ
ØˆŒØˆŒØˆ�	r   c                 ó   • U R                   $ )z&p is the current proposed input vector)r¬   r2   s    r   ÚpÚDoglegState.p·   ó   € ð �w‰wˆr   c                 ó0   • UR                  S5      U l        g ©N©éÿÿÿÿr   )rW   r¬   ©r3   Úvals     r   rµ   r¶   »   s   € à—+‘+˜gÓ&ˆ�r   c                 ó   • U R                   $ rf   )r¨   r2   s    r   Úd_gnÚDoglegState.d_gnÀ   ó   € à�z‰zÐr   c                 ó8   • Ub  UR                  S5      nXl        g r¹   )rW   r¨   r¼   s     r   r¿   rÀ   Ã   ó   € à‰?Ø—+‘+˜gÓ&ˆCØ�
r   c                 ó   • U R                   $ rf   )r©   r2   s    r   Úd_sdÚDoglegState.d_sdÉ   rÁ   r   c                 ó8   • Ub  UR                  S5      nXl        g r¹   )rW   r©   r¼   s     r   rÅ   rÆ   Ì   rÃ   r   c                 ó   • U R                   $ rf   )rª   r2   s    r   Úd_dlÚDoglegState.d_dlÒ   rÁ   r   c                 ó8   • Ub  UR                  S5      nXl        g r¹   )rW   rª   r¼   s     r   rÉ   rÊ   Õ   rÃ   r   c                 ó8   • U R                   R                  S5      $ r¹   )rÉ   rW   r2   s    r   ÚstepÚDoglegState.stepÛ   s   € à�y‰y× Ñ  Ó)Ð)r   c                 óT   • [         R                  R                  U R                  5      $ rf   )r   r   ÚnormrÉ   r2   s    r   Ú	step_sizeÚDoglegState.step_sizeÞ   s   € ä�y‰y�~‰~˜dŸi™iÓ(Ð(r   c                 ó’  • U =R                   S-  sl         [        SU R                   4-  5        [        R                  R	                  U R
                  5      S-  [        R                  R	                  U R                  R                  U R
                  5      5      S-  -  U R
                  -  R                  5       U l	        S U l
        g )Nr   zbeginning iteration %dr…   )r§   r   r   r   rÐ   r«   rL   r   r1   rÅ   r¿   r2   s    r   Ústart_iterationÚDoglegState.start_iterationâ   s‡   € Ø�Š˜!Ñ�ÜÐ$¨¯©Ð'8Ñ8Ô9Ü—Y‘Y—^‘^ D§F¡FÓ+¨QÑ.´·±·±ÀÇÁÇ
Á
È4Ï6É6Ó@RÓ1SÐUVÑ1VÑVÐY]×Y_ÑY_Ñ_×fÑfÓhˆŒ	Øˆ�	r   c                 ó   • U R                   $ )z"r is the residual at the current p)r¯   r2   s    r   r0   ÚDoglegState.rè   r·   r   c                 ól   • UR                  5       R                  S5      U l        U R                  5         g r¹   )rR   rW   r¯   ÚupdateAgr¼   s     r   r0   r×   ì   s#   € à—(‘(“*×$Ñ$ WÓ-ˆŒØ�‰�r   c                 ó   • [        5       n[        S5        U R                  R                  nUR	                  U R                  5      U l        UR	                  U R                  * 5      R                  S5      U l        [        SU" 5       -  5        g )Nzupdating A and g...rº   zA and g updated in %.2fs)	r   r   rL   ÚTr   ru   r0   rW   r«   )r3   rJ   ÚJTs      r   rÙ   ÚDoglegState.updateAgñ   sb   € Ü‹WˆÜÐ!Ô"Ø�V‰V�X‰XˆØ—‘˜Ÿ™“ˆŒØ—‘˜Ÿ™˜“×(Ñ(¨Ó1ˆŒÜÐ&©«Ñ-Õ.r   c                 ó¶  • U R                   b­  [        R                  R                  U R                  5      U R                   :¼  av  [        S5        [        R                  " U R                   [        R                  R                  U R                  5      -  U R                  -  5      R                  5       U l        g U R                  c  U R                  5         U R                   b7  [        R                  R                  U R                  5      U R                   ::  a{  [        S5        [        R                  " U R                  5      R                  5       U l        U R                   c/  [        R                  R                  U R                  5      U l         g g [        S5        U R                  U R                  U R                  U R                  -
  -  -   U l        g )NzPROGRESS: Using stunted cauchyz%PROGRESS: Using gauss-newton solutionz)PROGRESS: between cauchy and gauss-newton)r­   r   r   rÐ   rÅ   r   rš   r1   rÉ   r¿   ÚupdateGNÚbeta_multiplierr2   s    r   Úupdate_stepÚDoglegState.update_stepù   s(  € ð �:‰:Ñ!¤b§i¡i§n¡n°T·Y±YÓ&?À4Ç:Á:Ó&MÜÐ0Ô1ÜŸš §¡¬B¯I©I¯N©N¸4¿9¹9Ó,EÑ!EÈÏ	É	Ñ!QÓR×XÑXÓZˆD�Ià�y‰yÑ à—‘”à�z‰zÑ!¤R§Y¡Y§^¡^°D·I±IÓ%>À$Ç*Á*Ó%LÜÐ;Ô<ÜŸHšH T§Y¡YÓ/×5Ñ5Ó7�”	Ø—:‘:Ñ%Ü!#§¡§¡°·	±	Ó!:�D•Jð &ô Ð?Ô@à ŸI™I¨×(<Ñ(<ÀÇ	Á	ÈDÏIÉIÑ@UÑ(VÑV�•	r   c                 óR  • U R                   S-  nU R                  U R                  -
  n[        R                  R                  U R                  5      S-  nUR                  R                  U5      U-  U R                  R                  R                  U R                  5      S-  -   [        R                  R                  U R                  5      S-  U-  -
  n[        X-
  5      [        UR                  R                  U R                  5      [        R                  " U5      -   5      -  $ ©Nr…   )
r­   r¿   rÅ   r   r   rÐ   rÛ   r   ÚfloatÚsqrt)r3   Údelta_sqÚdiffÚ	sqnorm_sdÚpnows        r   rà   ÚDoglegState.beta_multiplier  sÎ   € à—:‘:˜q‘=ˆØ�y‰y˜4Ÿ9™9Ñ$ˆÜ—I‘I—N‘N 4§9¡9Ó-¨qÑ0ˆ	Ø�v‰v�z‰z˜$Ó Ñ(¨4¯9©9¯;©;¯?©?¸4¿9¹9Ó+EÀqÑ+HÑHÌ2Ï9É9Ï>É>ÐZ^×ZcÑZcÓKdÐfgÑKgÐjsÑKsÑsˆÜ�XÑ)Ó*¬U°D·8±8·<±<ÀÇ	Á	Ó3JÌRÏWÊWÐUYË]Ñ3ZÓ-[Ñ[Ð[r   c                 ó6  • [        5       n[        R                  " U R                  5      (       Ga  U R                  R	                  5         [        SSU R                  R                  -  U R                  R                  S   U R                  R                  S   -  -  U R                  R                  S   U R                  R                  S   4-  5        U R                  R                  S:”  aû  U R                  U R                  U R                  5      R                  5       U l        [        R                  " [        R                  " U R                  5      5      (       d9  [        R                  " [        R                   " U R                  5      5      (       aO  SSKJn  [&        R(                  " S5        U" U R                  U R                  5      S   R                  5       U l        OF[        R*                  " U R                  R                  5       S   U R                  S   -  5      U l        [        SU" 5       -  5        g [        S	5         [        R,                  R                  U R                  U R                  5      R                  5       U l        [        SU" 5       -  5        g ! [.         ac    [&        R(                  " S
5        [        R,                  R1                  U R                  U R                  5      S   R                  5       U l         N€f = f)Nz8sparse solve...sparsity infill is %.3f%% (hessian %dx%d)g      Y@r   r   )Úlsqrz)sparse solve failed, falling back to lsqr)r   r   zsparse solve...done in %.2fszdense solve...z(dense solve failed, falling back to lsqrzdense solve...done in %.2fs)r   r   r    ru   Úeliminate_zerosr   Únnzr   r«   rP   r®   r1   r¿   r   r   ÚisnanÚisinfÚscipy.sparse.linalgrí   ÚwarningsÚwarnÚ
atleast_1dr   rC   Úlstsq)r3   rJ   rí   s      r   rß   ÚDoglegState.updateGN  sq  € Ü‹WˆÜ�;Š;�t—v‘v×ÒØ�F‰F×"Ñ"Ô$ÜÐJÈdÐUY×U[ÑU[×U_ÑU_ÑN_Ðcg×ciÑci×coÑcoÐpqÑcrÐuy×u{Ñu{÷  vBñ  vBð  CDñ  vEñ  dEñ  OFð  HL÷  HNñ  HN÷  HTñ  HTð  UVñ  HWð  Y]÷  Y_ñ  Y_÷  Yeñ  Yeð  fgñ  Yhð  Niñ  iô  jØ�v‰v�{‰{˜Q‹Ø ŸJ™J t§v¡v¨t¯v©vÓ6×<Ñ<Ó>�”	Ü—6’6œ"Ÿ(š( 4§9¡9Ó-×.Ñ.´"·&²&¼¿ºÀ$Ç)Á)Ó9L×2MÑ2MÝ8Ü—M’MÐ"MÔNÙ $ T§V¡V¨T¯V©VÓ 4°QÑ 7× =Ñ =Ó ?�D”IøäŸMšM¨$¯&©&¯,©,«.¸Ñ*;¸D¿F¹FÀ3¹KÑ*GÓH�”	ÜÐ.±³Ñ5Õ6äÐ Ô!ðGÜŸI™IŸO™O¨D¯F©F°D·F±FÓ;×AÑAÓC�”	ô Ð-±³Ñ4Õ5øô ó GÜ—’ÐHÔIÜŸI™IŸO™O¨D¯F©F°D·F±FÓ;¸AÑ>×DÑDÓF�–	ðGús   ÉAJ+ Ê+A*LÌLc                 ó\  • [        5       n[        S5        UR                  U l        U R                  c  [        S5      e[        R
                  " U R                  5      (       ae  [        5       nU R                  R                  5       U l        [        SR                  U" 5       5      5        U R                  R                  S:”  d   eOY[        R                  (       aD  [        R                  " U R                  5      n[        SX@R                  R                  -  -  5        [        SU R                  R                  S   U R                  R                  S   U" 5       4-  5        U R                  R                  S   U R                  R                  :w  a  [        S5      eU R                  $ )	Nzcomputing Jacobian...zComputing Jacobian failed!zconverted to csr in {}secsr   z!Jacobian dense with sparsity %.3fz"Jacobian (%dx%d) computed in %.2fsr   z+Jacobian size mismatch with objective input)r   r   rL   rC   r   r    Útocsrr   rï   r   ÚVERBOSEr   Úcount_nonzerorP   r   rµ   )r3   r,   rJ   Útm2Únonzeros        r   ÚupdateJÚDoglegState.updateJ-  s  € Ü‹WˆÜÐ#Ô$Ø—‘ˆŒØ�6‰6‰>ÜÐ8Ó9Ð9Ü�;Š;�t—v‘v×ÑÜ“'ˆCØ—V‘V—\‘\“^ˆDŒFÜÐ,×3Ñ3±C³EÓ:Ô;Ø—6‘6—:‘: “>Ð"‘>Ü�Z�ZÜ×&Ò& t§v¡vÓ.ˆGÜÐ3°w¿v¹v¿{¹{Ñ7JÑKÔLÜÐ0°D·F±F·L±LÀ±OÀTÇVÁVÇ\Á\ÐRSÁ_ÑVXÓVZÐ3[Ñ[Ô\Ø�6‰6�<‰<˜‰?˜dŸf™fŸk™kÓ)ÜÐIÓJÐJØ�v‰vˆr   c                   ó>   • \ rS rSrSrS r\S 5       r\S 5       rSr	g)ÚDoglegState.Triali@  a  
Inside each iteration of dogleg we propose a step and check to see if it's actually
an improvement before we accept it. This class encapsulates that trial and the
testing to see if it is actually an improvement.

There will be one instance of Trial per iteration in dogleg.
c                 ó–  • Xl         X l        [        R                  R	                  UR                   5      S-  [        R                  R	                  U5      S-  -
  U l        U R
                  S:”  aÈ  [        R                  " 5          [        R                  " S[        S9  SUR                  R                  R                  UR                  5      -  UR                  R                  R                  UR                  R                  UR                  5      5      -
  nU =R
                  U-  sl        S S S 5        g g ! , (       d  f       g = f)Nr…   r   Úignore)Úcategoryg       @)r0   Ústater   r   rÐ   r°   ró   Úcatch_warningsÚfilterwarningsÚRuntimeWarningr«   rÛ   r   rÉ   ru   )r3   Ú
proposed_rr  Úpredicted_improvements       r   r²   ÚDoglegState.Trial.__init__H  sÞ   € ØŒFØŒJô —y‘y—~‘~ e§g¡gÓ.°Ñ1´B·I±I·N±NÀ:Ó4NÐPQÑ4QÑQˆDŒHØ�x‰x˜!‹|Ü×,Ò,Õ.Ü×+Ò+¨H¼nÒMØ,.°·±·±·±¸u¿z¹zÓ1JÑ,JÈUÏZÉZÏ\É\×M]ÑM]Ð^c×^eÑ^e×^iÑ^iÐjo×jtÑjtÓ^uÓMvÑ,vÐ)Ø—H’HÐ 5Ñ5•H÷ /Ð.ð ß.Õ.ús   ÂB*D:Ä:
Ec                 ó    • U R                   S:„  $ r‡   )r°   r2   s    r   Úis_improvementÚ DoglegState.Trial.is_improvementT  s   € à—8‘8˜a‘<Ðr   c                 ó6  • [         R                  R                  U R                  R                  5      S-  [         R                  R                  U R                  5      S-  -
  [         R                  R                  U R                  R                  5      S-  -  $ rä   )r   r   rÐ   r  r0   r2   s    r   ÚimprovementÚDoglegState.Trial.improvementX  sg   € ä—I‘I—N‘N 4§:¡:§<¡<Ó0°!Ñ3´b·i±i·n±nÀTÇVÁVÓ6LÈaÑ6OÑOÔSU×S\ÑS\×SaÑSaÐbf×blÑbl×bnÑbnÓSoÐqrÑSrÑrÐrr   )r0   r°   r  N)
rg   rh   ri   rj   Ú__doc__r²   rm   r  r  rn   ro   r   r   ÚTrialr  @  s6   † ñ	ò
	6ð 
ñ	 ó 
ð	 ð 
ñ	só 
ó	sr   r  c                 ó$   • U R                  X5      $ rf   )r  )r3   r	  s     r   Útrial_rÚDoglegState.trial_r\  s   € Ø�z‰z˜*Ó+Ð+r   c                 óÐ   • X:”  aF  [        U R                  S[        R                  R	                  U R
                  5      -  5      U l        g X:  a  U =R                  S-  sl        g g )Ng      @g      Ð?)Úmaxr­   r   r   rÐ   rÉ   )r3   r°   ÚlbÚubs       r   ÚupdateRadiusÚDoglegState.updateRadius_  sG   € Ø‹8Ü˜TŸZ™Z¨¬R¯Y©Y¯^©^¸D¿I¹IÓ-FÑ)FÓGˆD�JØ‹XØ�JŠJ˜#ÑŽJð r   )ru   rL   rª   r¨   r©   r¬   r¯   rÉ   r¿   rÅ   r­   r±   r«   r§   r°   r®   N)gš™™™™™©?gÍÌÌÌÌÌì?)rg   rh   ri   rj   r  r²   rm   rµ   Úsetterr¿   rÅ   rÉ   rÍ   rÑ   rÔ   r0   rÙ   rá   rà   rß   rþ   Úobjectr  r  r  rn   ro   r   r   r¤   r¤   ž   sP  † ñòð ñó ðð ‡X�Xñ'ó ð'ð ñó ðà	‡[�[ñó ðð
 ñó ðà	‡[�[ñó ðð
 ñó ðà	‡[�[ñó ðð
 ñ*ó ð*àñ)ó ð)òð ñó ðð ‡X�Xñó ðò/òWð* ñ\ó ð\ò6ò.ô&s�ô sò8,÷r   r¤   éÈ   ry   gVçž¯Ò<ç        c                 óv  ^• [        U5      n[        XX&US9u  p[        X¬S9mU R                  R                  Tl        [        R                  (       a  SSKJ	n  U" U 5      U l
        U" 5         TR                  U 5        U R                  Tl        U4S jn[        R                  R                  TR                  [        R                   5      U:  a  U" SU-  5        TR"                  (       GdÁ  TR%                  5          TR'                  5         TR(                  U[        R                  R                  TR
                  5      -  ::  a7  U" SU[        R                  R                  TR
                  5      -  -  5        GO®[+        5       nTR
                  TR,                  -   U l        TR/                  U R                  5      n[1        SU" 5       -  5        UR2                  (       a´  TR
                  TR,                  -   Tl        U" 5         U	S	:”  a  UR4                  U	:  a  U" S
SU	-  -  5        O TR                  U 5        UR                  Tl        [        R                  R                  TR                  [        R                   5      U:  a  U" SU-  5        O6[        R6                  " TR
                  5      U l        U R9                  S5        TR;                  UR<                  5        TR>                  U[        R                  R                  TR
                  5      -  ::  a  U" S5        TR"                  (       d!  WR2                  (       d  U R@                  U:¼  a  OGMe  TRB                  U:¼  a  U" SU-  5        OU R@                  U:¼  a  U" SU-  5        TR"                  (       d  GMÁ  U RD                  $ )aÛ  "Nonlinear optimization using Powell's dogleg method.
See Lourakis et al, 2005, ICCV '05, "Is Levenberg-Marquardt the
Most Efficient Optimization for Implementing Bundle Adjustment?":
http://www.ics.forth.gr/cvrl/publications/conferences/0201-P0401-lourakis-levenberg.pdf

e_N are stopping conditions:
e_1 is gradient magnatude threshold
e_2 is step size magnatude threshold
e_3 is improvement threshold (as a ratio; 0.1 means it must improve by 10%% at each step)

maxiter and max_fevals are also stopping conditions. Note that they're not quite the same,
as an iteration may evaluate the function more than once.

sparse_solver is the solver to use to calculate the Gauss-Newton step in the common case
that the Jacobian is sparse. It can be 'spsolve' (in which case scipy.sparse.linalg.spsolve
will be used), 'cg' (in which case scipy.sparse.linalg.cg will be used), or any callable
that matches the api of scipy.sparse.linalg.spsolve to solve `A x = b` for x where A is sparse.

cg, uses a Conjugate Gradient method, and will be faster if A is sparse but x is dense.
spsolve will be faster if x is also sparse.

delta_0 defines the initial trust region. Generally speaking, if this is set too low then
the optimization will never really go anywhere (to small a trust region to make any real
progress before running out of iterations) and if it's set too high then the optimization
will diverge immidiately and go wild (such a large trust region that the initial step so
far overshoots that it can't recover). If it's left as None, it will be automatically
estimated on the first iteration; it's always updated at each iteration, so this is treated
only as an initialization.

handle_as_dense explicitly converts all Jacobians of obj to dense matrices
)r–   r”   rƒ   )r­   r®   r   )ÚDrWrtProfilerc                 óL   >• TR                   (       d  [        U 5        STl         g )NT)r±   r   )Úmsgr  s    €r   ÚstopÚminimize_dogleg.<locals>.stop›  s   ø€ Ø�z�zÜ�ŒHØˆ�
r   z'stopping because norm(g, np.inf) < %.2ez4stopping because of small step size (norm_dl < %.2e)zResiduals computed in %.2fsr   z%stopping because improvement < %.1e%%éd   r#   z*stopping because trust region is too smallzJstopping because max number of user-specified iterations (%d) has been metzJstopping because max number of user-specified func evals (%d) has been met)#r�   r¢   r¤   r#   r0   rµ   r   ÚDEBUGÚmonitorr"  r8   rþ   r   r   rÐ   r«   Úinfr±   rÔ   rá   rÑ   r   rÍ   r  r   r  r  ÚChr_   r  r°   r­   r/   r§   r-   )r,   r-   r–   ÚmaxiterÚ
max_fevalsr   r”   Úe_1Úe_2Úe_3Údelta_0Útreat_as_denser®   r—   r"  r%  rJ   Útrialr  s                     @r   Úminimize_doglegr4  f  sµ  ø€ ôJ   Ó.€EÜ# CÀØ/=ñ?�M€Cô ˜gÑ3€EØ�e‰e�g‰g€E„Gô 
‡x‡xÝ*Ù$ SÓ)ˆŒá„JØ	‡M�M�#ÔØ�e‰e€E„Gõô
 
‡y�y‡~�~�e—g‘gœrŸv™vÓ&¨Ó,ÙÐ6¸Ñ<Ô=Ø�j�jˆjØ×ÑÔØØ×ÑÔØ�‰ #¬¯	©	¯©°u·w±wÓ(?Ñ"?Ó?ÙÐKÈsÔUW×U^ÑU^×UcÑUcÐdi×dkÑdkÓUlÑOlÑmÖnä“W�ØŸ™ %§*¡*Ñ,�”ØŸ™ c§e¡eÓ,�ÜÐ1±B³DÑ8Ô9ð ×'×'Ø#Ÿg™g¨¯
©
Ñ2�E”GÙ”JØ˜R“x E×$5Ñ$5¸Ó$;ÙÐDÈÈCÉÑPÕQàŸ™ cÔ*Ø"'§'¡'˜œÜŸ9™9Ÿ>™>¨%¯'©'´2·6±6Ó:¸SÓ@Ù Ð!JÈSÑ!PÔQøäŸEšE %§'¡'›N�C”EØ—N‘N 3Ô'à×"Ñ" 5§9¡9Ô-Ø—;‘; #¤b§i¡i§n¡n°U·W±WÓ&=Ñ"=Ó=ÙÐEÔFØ�z�z˜U×1×1°c·j±jÀJÓ6NØò= ð> �?‰?˜gÓ%ÙÐ]Ð`gÑgÕhØ�Z‰Z˜:Ó%ÙÐ]Ð`jÑjÔkðI �j�jŠjðJ ×ÑÐr   )NTF)rŽ   ró   Únumpyr   Úscipy.sparseÚsparser   Ú r   r   r   r   r   r!   r(   rO   r+  r*   r�   r¢   r  r¤   r*  r4  ro   r   r   Ú<module>r9     s†   ðÛ 
Û Û Ý ß Ý Ý òò
\ò\ð
 
€ôTL�b—e‘eô TLòn
pôôDE�&ô EðP 26Ø ¨R¯V©VÀ9Ø E¨u¸"ÀdØ$)õar   