
    biYR                     6   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z	d dlZd dlmZ d dlmZmZmZ dZddddZej,                  j/                  d	      Zd
 Zd Zd Zd ZddZd Z edd      Z edd      Z  G d de!      Z" G d d      Z#y)    N)SimpleNamespace)IntEnum)EnvironmentPackageLoaderselect_autoescape)cudamklbuiltin	osqp_cudaosqp_mklzosqp.ext_builtinOSQP_ALGEBRA_BACKENDc                     | t         v s
J d|         t        |    }	 t        j                  |       y# t        $ r Y yw xY w)NzUnknown algebra TF)	_ALGEBRAS_ALGEBRA_MODULES	importlibimport_moduleImportError)algebramodules     I/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/osqp/interface.pyalgebra_availabler      sS    i=#3G9!==g&F'   s   3 	??c                  L    t         D  cg c]  } t        |       s|  c} S c c} w N)r   r   r   s    r   algebras_availabler   (   s    #,K0A'0JGKKKs   !!c                  d    t         t         S t        D ]  } t        |       s| c S  t        d      )NzNo algebra backend available!)r   r   r   RuntimeErrorr   s    r   default_algebrar   ,   s8    '## W%N 6
77    c                  J    t        j                  t        t                        S )z
    Get the default algebra module.
    Note: importlib.import_module is cached so we pay almost no penalty
      for repeated calls to this function.
    )r   r   r   r    r   r   default_algebra_moduler"   5   s     ""#3O4E#FGGr   c                 T   t        j                  t        |         }t        || d      }| |j                  j
                  v rt        j                  dt               t        |t        t        t        f      r|S ||j                  S | dk(  rt        j                  S t!        d|        )z
    Get a named constant from the extension module.
    Since constants are typically consistent across osqp algebras,
    we use the `builtin` algebra (always guaranteed to be available)
    by default.
    NzaDirect access to osqp status values will be deprecated. Please use the SolverStatus enum instead.OSQP_NANzUnknown constant )r   r   r   getattrosqp_status_type__members__warningswarnPendingDeprecationWarning
isinstanceintfloatstrvaluenpnanr   )whichr   m	_constants       r   constantr5   >   s     	 0 9:A5$'I""...o%	
 )c5#./		 J66M.ug677r   c                     t               }t        ||      }t        | |j                  j	                         D cg c]  }|j
                  |j                  f c}      S c c}w )z
    Dynamically construct an IntEnum from available enum members.
    For all values, see https://osqp.org/docs/interfaces/status_values.html
    )r"   r%   r   r'   valuesnamer/   )r8   binding_enum_namer3   binding_enumvs        r   construct_enumr<   \   sP    
 	 A1/0L4\5M5M5T5T5VW166177+WXXWs   A
SolverStatusr&   SolverErrorosqp_error_typec                       e Zd ZdZddZd Zy)OSQPExceptionz}
    OSQPException is raised by the wrapper interface when it encounters an
    exception by the underlying OSQP solver.
    Nc                     |r	|f| _         y y r   )argsself
error_codes     r   __init__zOSQPException.__init__p   s    #DI r   c                 Z    t        | j                        dkD  xr | j                  d   |k(  S Nr   )lenrC   rD   s     r   __eq__zOSQPException.__eq__t   s'    499~!@diilj&@@r   r   )__name__
__module____qualname____doc__rG   rK   r!   r   r   rA   rA   j   s    
&Ar   rA   c                       e Zd ZdZed        Zd Zd ZddZe	d        Z
defd	Ze	d
        Ze	d        Zd Zd Zd Zd Zd Zd ZddZddZd Z	 	 	 	 	 	 	 	 	 	 ddZddZddZd Zy)OSQPz
    For OSQP bindings (see bindings.cpp.in) that throw `ValueError`s
    (through `throw py::value_error(...)`), we catch and re-raise them
    as `OSQPException`s, with the correct int value as args[0].
    c                     	  ||i |}|S # t         $ r[}|j                  r?d }	 t        |j                  d         }t        |      # t         $ r Y t        |      w xY wt              d }~ww xY wrI   )
ValueErrorrC   r,   rA   )clsfnrC   kwargsreturn_valueerF   s          r   raises_errorzOSQP.raises_error   s    	 t.v.L    	,vv!
!$QVVAYJ  
++ " 
++
++	,s6    	A0A+AA+	AA+AA++A0c                 .   d | _         d | _        d|v r|j                  d      n	t               | _        t        | j                        st        d| j                   d      t        j                  t        | j                           | _
        | j                  j                  dk(  rt        j                  nt        j                  | _        | j                  j                   dk(  rt        j"                  nt        j$                  | _        d | _        i | _        y )Nr   zAlgebra z not available   )r3   npopr   r   r   r   r   r   r   extOSQP_USE_FLOATr0   float32float64_dtypeOSQP_USE_LONGint64int32_itype_solver_derivative_cache)rE   rC   rV   s      r   rG   zOSQP.__init__   s    09V0Cvzz),IZ .$,,~FGG**+;DLL+IJ$(HH$;$;q$@bjjbjj"&(("8"8A"=bhh288 !#r   c                 r    | j                   d| j                   S d| j                   d| j                   dS )Nz Uninitialized OSQP with algebra=zOSQP with algebra=z ())rg   r   solver_typerE   s    r   __str__zOSQP.__str__   s=    <<5dll^DD'~R8H8H7IKKr   Nc                    |+|t        |      }n,||j                  d   }nt        d      |j                  d   }|dn|j                  d   }|||}J d       |	|J d       |4t        j                   t        j
                  |j                  d         z  }|3t        j                  t        j
                  |j                  d         z  }|}t        j                  t        j                  d| j                        t        j                  d| j                        t        j                  |dz   f| j                        f||f      }|t        j                  |      }|t        j                  t        j                  d| j                        t        j                  d| j                        t        j                  |dz   f| j                        f||f      }t        j                  |j                  d         }t        j                  |j                  d         }t        |      |k(  sJ d	       t        |      |k(  sJ d
       t        |      |k(  sJ d       t        j                  |      s4t        |t        j                        r|j                  dk(  rt        d      t        j                  |      s4t        |t        j                        r|j                  dk(  rt        d      t        j                   |d      j"                  j$                  dkD  rt        j&                  |d      }t        j(                  |      s%t+        j,                  d       |j/                         }t        j(                  |      s%t+        j,                  d       |j/                         }|j0                  s|j3                          |j0                  s|j3                          t        j4                  || j7                  d            }t        j8                  || j7                  d             }|||||||fS )Nr[   z'The problem does not have any variablesr   z/If A is unspecified, leave l/u unspecified too.z/If A is specified, specify at least one of l/u.)r   )dtype)shapezIncorrect dimension of qzIncorrect dimension of lzIncorrect dimension of u   z#P is required to be a sparse matrixz#A is required to be a sparse matrixcsc)formatz=Converting sparse P to a CSC matrix. This may take a while...z=Converting sparse A to a CSC matrix. This may take a while...
OSQP_INFTY)rJ   rp   rS   r0   infonesspa
csc_matrixzerosrb   rf   issparser+   ndarrayndim	TypeErrortrildatasizetriuisspmatrix_cscr(   r)   tocschas_sorted_indicessort_indicesminimumr5   maximum)rE   PqAlur\   r3   s           r   _infer_mnpqaluzOSQP._infer_mnpqalu   sR   9}FGGAJ !JKK
AA
9IAIa0aa.Mq}h7hh5yVVGbggaggaj11yFFRWWQWWQZ009HHT5HHT5HHa!eXT[[9
 !fA 9A9HHT5HHT5HHa!eXT[[9
 !fA $A$A1v{666{1v{666{1v{666{||A:a#<1ABB||A:a#<1ABB88Ar?$$q(5)A !!!$MMYZ	A!!!$MMYZ	A##NN##NNJJq$--56JJq4==667!Q1a""r   c                 H    t        | j                  j                               S r   )r,   r^   osqp_capabilitiesrl   s    r   capabilitieszOSQP.capabilities   s    488--/00r   
capabilityc                     	 t        | j                  j                  j                  |         }| j                  |z  dk7  S # t        $ r t        d|       w xY w)NzUnrecognized capability r   )r,   r^   osqp_capabilities_typer'   KeyErrorr   r   )rE   r   caps      r   has_capabilityzOSQP.has_capability   se    	Hdhh55AA*MNC !!C'A--  	H!9*FGG	Hs   ,A   Ac                 x    | j                   j                  | j                  j                  j                  k(  rdS dS )Ndirectindirect)settingslinsys_solverr^   osqp_linsys_solver_typeOSQP_DIRECT_SOLVERrl   s    r   rk   zOSQP.solver_type   s:     }}**dhh.N.N.a.aa 	
 	
r   c                 d    | j                   j                  | j                  j                  k(  rdS d S Ndiagonal)r   
cg_precondr^   OSQP_DIAGONAL_PRECONDITIONERrl   s    r   cg_preconditionerzOSQP.cg_preconditioner  s)    !]]559^9^^zhdhhr   c                     t        || j                  j                        sJ t        j                  |j
                  |j                  |j                  f      }t        j                  |j                               S r   )r+   r^   CSCrx   ry   xipr0   arraytodense)rE   r3   _m_cscs      r   	_as_densezOSQP._as_dense
  sP    !TXX\\***acc1330xx())r   c                     | j                  |      }t        j                  |j                  d      |z   }t	        j
                  |      }| j                  j                  |      S )Nrr   )r   r0   r   Trx   ry   r^   r   )rE   r3   _m_triu_dense_m_full_dense_m_full_cscs        r   _csc_triu_as_csc_fullzOSQP._csc_triu_as_csc_full  sJ    q)4}Dnn]3xx||K((r   c                 0    t        || j                        S )Nr   )r5   r   )rE   r2   s     r   r5   zOSQP.constant  s    t||44r   c                 f   | j                   J ddd}|j                         D ]6  \  }}||v st        j                  d| d| dt               ||   ||<   ||= 8 d}d|v r6| j
                  *| j
                  j                  |j                  d             d	|v rm|j                  d	      }|d
v sJ |dk(  r | j                  j                  j                  n| j                  j                  j                  | j                   _        d}d|v rY|j                  d      }|dv sJ |dk(  r| j                  j                  n| j                  j                  | j                   _        d}| j                  j                   j"                  D ]A  }|j%                  d      r||v st'        | j                   ||j                  |             d}C |r%t)        dt+        |j-                                      |r>| j
                  1| j/                  | j
                  j0                  | j                          y y y )N	polishingwarm_starting)polish
warm_start"z" is deprecated. Please use "z
" instead.Frhork   )r   r   r   Tr   r   r   __zUnrecognized settings )r   itemsr(   r)   DeprecationWarningrg   
update_rhor]   r^   r   r   OSQP_INDIRECT_SOLVERr   r   OSQP_NO_PRECONDITIONERr   OSQPSettings__dict__
startswithsetattrrS   listkeysrY   update_settings)rE   rV   renamed_settingskr;   settings_changedr/   s          r   r   zOSQP.update_settings  s    }}((( ")
 %**, 	DAqF{s7s*E& #1Iq	1I	 !F?t||7LL##FJJu$56F"JJ}-E2222 H$ 00CCXX55JJ MM'
  $&(JJ23E....9>*9L55RVRZRZRqRq MM$  $&&// 	,A<<%;DMM1fjjm<'+$		, 5d6;;=6I5JKLL 8dll::DMMJ !9r   c                    |j                  d      |j                  d      |j                  d      }}}|&t        j                  || j                  d             }|%t        j                  || j                  d            }|||| j
                  j                  |||       d|v sd|v sd|v sd	|v r[| j
                  j                  |j                  d      |j                  d      |j                  d      |j                  d	      
       ||| j                  d<   ||| j                  d<   ||| j                  d<   dD ]j  }| d}|j                  |      |j                  | d      ||   | j                  |   _	        F||   | j                  |   j                  || d   <   l | j                  j                  dd        | j                  j                  dd        | j                  j                  dd        y )Nr   r   r   ru   )r   r   r   PxPx_idxAxAx_idx)P_xP_iA_xA_i)r   r   r   _idxresultssolverM)getr0   r   r5   r   rg   update_data_vecupdate_data_matrh   r   r]   )rE   rV   r   r   r   _var_varxs          r   updatezOSQP.updateJ  s    **S/6::c?FJJsOa1=

1t}}\::;A=

1dmmL9:A=AMQ]LL((1Q(76>X/46>XQWEWLL((JJt$JJx(JJt$JJx(	 )  =*+D""3'=*+D""3'=*+D""3' 	^DfAJEzz% ,::tn-58>uD**405PVW\P]D**4055fwd^6LM	^ 	""9d3""8T2""3-r   c                    | j                  |||||      \  }}}}}}}| j                  j                  |||||d       || _        || _        | j
                  j                  |j                  | j                              }|j                  | j                        }| j
                  j                  |j                  | j                              }|j                  | j                        }|j                  | j                        }| j
                  j                         | _
        | j
                  j                  | j                          | j                  di | | j                  | j
                  j                  |||||| j                  | j                  | j                  	      | _        d|v r| j                  j!                  |d          y y )N)r   r   r   r   r   r   r!   )r   rh   r   r3   r\   r^   r   astyperb   r   r   osqp_set_default_settingsr   rY   
OSQPSolverrg   r   )	rE   r   r   r   r   r   r   r3   r\   s	            r   setupz
OSQP.setupr  sr   "11Aa11J1aAq!%%AAAAA&NOHHLL$++./HHT[[!HHLL$++./HHT[[!HHT[[!--/**4==9(x(((HHFFFFMM

 HLL##HUO4 r   c                 :    | j                   j                  ||      S r   )rg   r   )rE   r   ys      r   r   zOSQP.warm_start  s    ||&&q!,,r   c                 :   |t        j                  dt               d}| j                  j	                          | j                  j
                  }|j                  t        j                  k(  rt        j                  |_        |j                  t        j                  k7  r|rt        |j                        t        di |j                  j                   D ci c]!  }|j#                  d      r|t%        ||      # c}}t        | j                  j&                  j(                  | j                  j&                  j*                  | j                  j&                  j,                  | j                  j&                  j.                  |      }|| j0                  d<   |S c c}w )NzCThe default value of raise_error will change to True in the future.Fr   )r   r   prim_inf_certdual_inf_certinfor   r!   )r(   r)   r*   rg   solver   
status_valr=   OSQP_NON_CVXr0   r1   obj_valOSQP_SOLVEDrA   r   	__class__r   r   r%   solutionr   r   r   r   rh   )rE   raise_errorr   r   _infor   s         r   r   z
OSQP.solve  s7   MMU)  K||  ??l77766DL??l666;00  s@W@W"r1_`_k_klp_q1gdA&6#6"rs "ll##%%ll##%%,,//==,,//==
 -4y) #ss   F+Fc           	         t        t        dd      t                     }|j                  d      D ]  }|j	                  |      }t
        j                  j                  |      d   }t        t
        j                  j                  ||      d      5 }|j                   |j                  d	i |       d d d         y # 1 sw Y   xY w)
Nzosqp.codegen.pywrapper )package_path)loader
autoescapez.jinja)
extensionsr   wr!   )r   r   r   list_templatesget_templateospathsplitextopenjoinwriterender)rE   output_folderrV   envtemplate_nametemplatetemplate_base_namefs           r   _render_pywrapper_fileszOSQP._render_pywrapper_files  s     !9K(*

 !//8/D 	3M''6H!#!1!1-!@!Cbggll=2DEsK 3q1&123 3		33 3s   "C  C		c                    | j                  d      sJ d       |dv sJ d       | j                  j                         }| j                  j                  |       |dk(  rdnd|_        |rdnd|_        |rdnd|_        |rdnd|_        |rdnd|_        d|_	        t        j                  j                  |      }|	rG	 t        j                  j                  d	      j!                  d
      }t#        j$                  |||       t        j(                  |d       |j+                  t        j                  j,                        s|t        j                  j,                  z  }| j.                  j1                  ||
|      }|dk(  s
J d|        |_|	sJ d       t3        |
||j                        } | j4                  |fi | |r)t7        j8                  t:        j<                  dddg|       |S # t&        $ rT t        j                  j                  d	d
      }|5 }t#        j$                  |||       d d d        n# 1 sw Y   nxY wY Hw xY w)NOSQP_CAPABILITY_CODEGENz)This OSQP object does not support codegen)vectorsmatricesz Unknown parameters specificationr  r[   rq   r   zosqp.codegencodegen_src)dirs_exist_okT)exist_okzCodegen failed with error code z?If generating python wrappers, include_codegen_src must be True)prefixextension_nameembedded_modezsetup.py	build_extz	--inplace)cwd)r   r^   OSQPCodegenDefines osqp_set_default_codegen_definesr  
float_typeprinting_enableprofiling_enableinterrupt_enablederivatives_enabler   r   abspathr   	resourcesfilesjoinpathshutilcopytreeAttributeErrormakedirsendswithseprg   codegendictr	  
subprocess
check_callsys
executable)rE   folder
parametersr  force_rewrite	use_floatr  r  r  include_codegen_srcr  compiledefinescodegen_src_pathhandlestatustemplate_varss                    r   r'  zOSQP.codegen  s8    ""#<=j?jj= 
 
 	. .	. 

 ((--/11':%/9%<!"+Q'6!A(81a (81a %&"([#,#6#6#<#<^#L#U#UVc#d  0&V 	FT*rww{{+bggkk!F%%ffg>{F=fXFF{%&i(ii& -%33M
 )D((A=A%%"##	  A " [",,11.-P [/OO$4fMZ[ [ [[s+   <AG. .+IH;2	I;I	 I
Ic                 b   | j                  d      sJ d       	 | j                  d   }|j                  j
                  t        j                  k7  rt        d      |t        j                  | j                        }| j                  j                  ||       y# t        $ r t        d      w xY w)z9
        Compute adjoint derivative after solve.
        OSQP_CAPABILITY_DERIVATIVES-This OSQP object does not support derivativesr   YProblem has not been solved. You cannot take derivatives. Please call the solve function.FProblem has not been solved to optimality. You cannot take derivativesN)r   rh   r   rS   r   r   r=   r   r0   rz   r3   rg   adjoint_derivative_compute)rE   dxdyr   s       r   r=  zOSQP.adjoint_derivative_compute  s    
 ""#@ArCrrA	,,Y7G <<""l&>&>>hii:$&&!B//B7  	q 	s   B B.c                    | j                  d      sJ d       	 | j                  d   }|j                  j
                  t        j                  k7  rt        d      | j                  d   | j                  d   }}| j                  d   }| j                  j                  |j                               }| j                  j                  |j                               }| j                  j                  ||       |s| j                  |      }|r"| j                  |      }| j                  |      }||fS # t        $ r t        d      w xY w)	zV
        Get dP/dA matrices after an invocation of adjoint_derivative_compute
        r9  r:  r   r;  r<  r   r   r   )r   rh   r   rS   r   r   r=   r   r^   r   copyrg   adjoint_derivative_get_matr   r   )	rE   as_dense
dP_as_triur   r   _r   dPdAs	            r   rB  zOSQP.adjoint_derivative_get_mat  s)   
 ""#@ArCrrA	,,Y7G <<""l&>&>>hii%%c*D,B,B3,G1""3'XX\\!&&(#XX\\!&&(#//B7++B/B#B#B2v/  	q 	s   D1 1Ec                 z   | j                  d      sJ d       	 | j                  d   }|j                  j
                  t        j                  k7  rt        d      t        j                  | j                        j                  | j                        }t        j                  | j                        j                  | j                        }t        j                  | j                        j                  | j                        }| j                  j!                  |||       |||fS # t        $ r t        d      w xY w)zX
        Get dq/dl/du vectors after an invocation of adjoint_derivative_compute
        r9  r:  r   r;  r<  )r   rh   r   rS   r   r   r=   r   r0   emptyr\   r   rb   rz   r3   rg   adjoint_derivative_get_vec)rE   r   dqdldus        r   rJ  zOSQP.adjoint_derivative_get_vec?  s    
 ""#@ArCrrA	,,Y7G <<""l&>&>>hiiXXdff$$T[[1XXdff$$T[[1XXdff$$T[[1//B;2rz  	q 	s   D% %D:)NNNNN)NNr   )
r  emosqpFFFFFTr   F)TT)rL   rM   rN   rO   classmethodrY   rG   rm   r   propertyr   r.   r   rk   r   r   r   r5   r   r   r   r   r   r	  r'  r=  rB  rJ  r!   r   r   rQ   rQ   x   s        $ LK#Z 1 1. . 
 
 i i*
)50Kd&.P5:-B3   DL8, Dr   rQ   )r
   )$r+  r   typesr   enumr   r!  r)  r(   r   importlib.resourcesnumpyr0   scipy.sparsesparserx   jinja2r   r   r   r   r   environr   r   r   r   r   r"   r5   r<   r=   r>   	ExceptionrA   rQ   r!   r   r   <module>rZ     s    
 	 !         @ @	 ! 
 zz~~&<= 	L8H8<Y n.@A],=>AI A^ ^r   