
    bi,S                     $   d dl Z d dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlZd dlZ ej                  d       dZdZdZdZdZdZdZd	Zej0                  j3                   e j4                  d
       d       G d dej6                               Zy)    N)sparse)approx_fprime   gh㈵>g{Gzt?g{Gz?g&.>i  builtinzBuiltin Algebra not availablereasonc                   B   e Zd Zd ZddZddZd Zej                  j                  d      dd       Z
ej                  j                  d      dd	       Zej                  j                  d      dd
       ZddZddZddZddZddZddZddZddZddZy)derivative_testsc                 .    t        j                  d       y )Nr   )nprseed)selfs    U/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/osqp/tests/derivative_test.pysetUpzderivative_tests.setUp   s        c                 \   t         j                  j                  ||dz
        }t        j                  |j                  |j                        dt        j                  |      z  z         }t        j                  |      }t        j                  |      }t        j                  t        j                  ||            }	|	j                  |      |z   }
|	j                  |      |z
  }t        j                  |      }t        j                  |      }t        j                  |      }|||	||
||gS )Nr   g?)
nprandomrandnr   
csc_matrixdotTeyer   rand)r   nmP_scaleA_scaleLPx_0s_0Aulqtrue_xtrue_ys                  r   get_probzderivative_tests.get_prob   s    IIOOAq1u%aeeACCj3A+>>?iilhhqkcii1o.EE#JEE#JIIaL111aAvv..r   Nc                    t        j                  d      }|j                  |||||t        t        t
        d	       |j                         }	|	j                  j                  t         j                  j                  k7  rt        d      |	j                  }
|	j                  }||j                  |
|z
         n|j                  |
|z
  ||z
         |j                         \  }}|j!                         \  }}}|||||f}|S )Nr   algebraTeps_abseps_relmax_iterverboseProblem not solved!)dx)r3   dy)osqpOSQPsetupr.   r/   r0   solveinfo
status_valSolverStatusOSQP_SOLVED
ValueErrorxyadjoint_derivative_computeadjoint_derivative_get_matadjoint_derivative_get_vec)r   r    r&   r#   r%   r$   r'   r(   r   resultsr>   r?   dPdAdqdldugradss                     r   	get_gradszderivative_tests.get_grads0   s    IIi(	 	 
	
 '')<<""d&7&7&C&CC233IIII>((AJ(7((AJ1v:(F--/B113
BBB"r   c                 V   t        j                  dt        t              }|j	                  |||||t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  ||||	|
      }|S )Nr   )r,   r/   r.   Fr-   r2   )rD   rF   rE   rG   rH   )r5   r6   r/   r.   r7   r0   r8   r9   r:   r;   r<   r=   forward_derivative)r   r    r&   r#   r%   r$   rD   rF   rE   rG   rH   r   rC   rI   s                 r   get_forward_gradsz"derivative_tests.get_forward_gradsN   s    IIi'J	 	 
	
 '')<<""d&7&7&C&CC233$$rbRB$Gr   z'forward derivatives not implemented yetr   c                 ,    d\  }} j                  ||dd      }|\  }} fd}t        j                  j                  |      } ||      \  }	}
}t	        j
                  d      }|j                  t        t        t        d		       |j                         }|j                  j                  t        j                  j                  k7  rt        d
      |j                   }|j"                  }t$        }|j                  ||z  z   t        t        t        d		       |j                         }|j                  j                  t        j                  j                  k7  rt        d
      |j                   }|j"                  }||z
  |z  }||z
  |z  }t        j&                  |      }||dk      ||dk  <   t        j&                  |      }||dk\     ||dk\  <   |rBt)        dt        j*                  |d             t)        dt        j*                  |	d             t-        j.                  ||	t0        t2               t-        j.                  ||
t0        t2               t-        j.                  ||t0        t2               y )N   rP         Y@r   r   r   r   c                 J    j                  	d | d d d 
      \  }}}|||fS NrM   
rF   r3   dyldyur#   r    r%   r&   r   r$   s
       r   gradz+derivative_tests.test_dsol_dq.<locals>.gradi   9    !33Aq!Q4TSWY]^NRcsC<r   sizer   r+   Fr-   r2   r   dx_fd:    decimalsdx: rtolatol)r)   r   r   normalr5   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r?   grad_precisionzerosprintroundnptassert_allcloserel_tolabs_tolr   r1   r   r   probr'   r(   rY   rF   dx_computeddyl_computeddyu_computedosqp_solverresx1y1epsx2y2dx_fddy_fddyl_fddyu_fdr#   r    r%   r&   r$   s   `                      @@@@@r   test_dsol_dqzderivative_tests.test_dsol_dqb   sA   1}}qAue}D(,%1aAvv	  	  YYA'26r(/\<ii	2 	 
	
 !88$"3"3"?"??233UUUUbL 	 
	
 !88$"3"3"?"??233UUUUbCbC!Q-rAv!a.rQw)RXXea89&"((;;<E;W7KFLwWMFLwWMr   c                 r    d\  }} j                  ||dd      }|\  }}d d d d t        j                  dd       dd   fd}t        j                  j                  |	      } ||      \  }	}
}t        j                  d      }|j                  t        t        t        d
	       |j                         }|j                  j                  t        j                  j                  k7  rt!        d      |j"                  }|j$                  }t&        }|j                  ||z  z   t        t        t        d
	       |j                         }|j                  j                  t        j                  j                  k7  rt!        d      |j"                  }|j$                  }||z
  |z  }||z
  |z  }t        j(                  |      }||dk      ||dk  <   t        j(                  |      }||dk\     ||dk\  <   |rBt+        dt        j,                  |d             t+        dt        j,                  |	d             t/        j0                  ||	t2        t4               t/        j0                  ||
t2        t4               t/        j0                  ||t2        t4               y )N)
   r   rQ   rR   rP   
OSQP_INFTYr   r+   c                 J    j                  	d | d d d 
      \  }}}|||fS rT   rU   rV   s
       r   rY   z2derivative_tests.test_eq_inf_forward.<locals>.grad   rZ   r   r[   Fr-   r2   r   r]   r^   r_   ra   rb   )r)   r5   constantr   r   re   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r?   rf   rg   rh   ri   rj   rk   rl   rm   rn   s   `                      @@@@@r   test_eq_inf_forwardz$derivative_tests.test_eq_inf_forward   sk   1}}qAue}D(,%1aAvv"1"1|Y??!"	  	  YYA'26r(/\<ii	2 	 
	
 !88$"3"3"?"??233UUUUbL 	 
	
 !88$"3"3"?"??233UUUUbCbC!Q-rAv!a.rQw)RXXea89&"((;;<E;W7KFLwWMFLwWMr   c                      d\  }} j                  ||dd      }|\   }}  fd}t        j                  j                  |      }t	        j
                  t        j                  j                  ||f            }	t        j                  j                  |      }
t        j                  j                  |      }t        j                  j                  ||f      }||j                  z   } ||||	|
|      \  }}}t        j                  d      }|j                   t        t        t        d		       |j                         }|j                  j                  t        j                   j"                  k7  rt%        d
      |j&                  }|j(                  }t*        }|j                  ||z  z   ||z  z   ||	z  z   ||
z  z    ||z  z   t        t        t        d		       |j                         }|j                  j                  t        j                   j"                  k7  rt%        d
      |j&                  }|j(                  }||z
  |z  }||z
  |z  }t        j,                  |      }||dk      ||dk  <   t        j,                  |      }||dk\     ||dk\  <   |rBt/        dt        j0                  |d             t/        dt        j0                  |d             t3        j4                  ||t6        t8               t3        j4                  ||t6        t8               t3        j4                  ||t6        t8               y )NrO   rQ   rR   c                 J    j                  	
| ||||
      \  }}}|||fS rT   rU   )rD   rF   rE   rG   rH   r3   rW   rX   r#   r    r%   r&   r   r$   s           r   rY   z?derivative_tests.test_multiple_forward_derivative.<locals>.grad   s8    !33Aq!Q2r2rSUVNRcsC<r   r[   r   r+   Fr-   r2   r   r]   r^   r_   ra   rb   )r)   r   r   re   r   r   r   r5   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r?   rf   rg   rh   ri   rj   rk   rl   rm   )!r   r1   r   r   ro   r'   r(   rY   rF   rE   rG   rH   dLrD   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r#   r    r%   r&   r$   s!   `                           @@@@@r    test_multiple_forward_derivativez1derivative_tests.test_multiple_forward_derivative   s   1}}qAue}D(,%1aAvv	  	  YYA'ryy//aV/<=YYA'YYA'YYAq6*"$$Y26r2r2r2J/\<ii	2 	 
	
 !88$"3"3"?"??233UUUUbLbLbLbLbL 	 
	
 !88$"3"3"?"??233UUUUbCbC!Q-rAv!a.rQw)RXXea89&"((;;<E;W7KFLwWMFLwWMr   c                 z    d\  }} j                  ||dd      }|\  }} fd}fd} ||      }	t        ||t              }
|rBt        dt	        j
                  |
d             t        d	t	        j
                  |	d             t        j                  |
|	t        t        
       y )NrO   rQ   rR   c                 @    j                  | 	      \  }}}}}|S rT   rJ   )
r&   rD   rF   _r#   r    r%   r   r'   r$   s
       r   rY   z)derivative_tests.test_dl_dq.<locals>.grad0  s*    "nnQ1aFCOBAq!Ir   c                    t        j                  d      }|j                  | t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }dt        j                  t        j                  |z
              z  S Nr   r+   Fr-   r2         ?r5   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r   sumsquare	r&   r   rt   x_hatr#   r    r%   r'   r$   s	       r   fz&derivative_tests.test_dl_dq.<locals>.f4      		),AGG!  
 '')Cxx""d&7&7&C&CC !677EEE		%&. 9:::r   dq_fd: r^   r_   zdq: rb   
r)   r   rf   rh   r   ri   rj   rk   rl   rm   )r   r1   r   r   ro   r&   r(   rY   r   rF   dq_fdr#   r    r%   r'   r$   s   `          @@@@@r   
test_dl_dqzderivative_tests.test_dl_dq*  s    1}}qAue}D(,%1aAvv	 		; 	;( !WaN3)RXXea89&"((223E2G'Br   c                     d\  }} j                  ||dd      }|\  }j                          fd}fd} |j                        }t        j                  |t              }	t        j                  |	fj                        }
|
|
j                  z   dz  }
|rVt        dt        j                  |
j                  d	
             t        dt        j                  |j                  d	
             t        j                  t        j                  |      t        j                  |
j                               t         t"               y )N   r   rQ   rR   c                     t        j                  | fj                        }	j                  |
      \  }}}}}|S Nshaper   r   r   rJ   )P_valP_qprD   r   r#   r    P_idxr%   r&   r   r'   r$   s       r   rY   z)derivative_tests.test_dl_dP.<locals>.gradX  sD    $$eU^177CD!^^D!Q1fENB1aIr   c                    t        j                  | fj                        }t        j                  d      }|j                  |	t        t        t        d	       |j                         }|j                  j                  t        j                  j                  k7  rt        d      |j                  }dt!        j"                  t!        j$                  |
z
              z  S Nr   r   r+   Fr-   r2   r   r   r   r   r5   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r   r   r   )r   r   r   rt   r   r#   r    r   r%   r&   r'   r$   s        r   r   z&derivative_tests.test_dl_dP.<locals>.f]  s    $$eU^177CD		),AGG!  
 '')Cxx""d&7&7&C&CC !677EEE		%&. 9:::r   r      zdP_fd: r^   r_   dA: rb   )r)   nonzerodatar   rf   r   r   r   r   rh   r   ri   rj   rk   triutodenserl   rm   )r   r1   r   r   ro   r(   rY   r   rD   	dP_fd_valdP_fdr#   r    r   r%   r&   r'   r$   s   `          @@@@@@@r   
test_dl_dPzderivative_tests.test_dl_dPQ  s   1}}qAue}D(,%1aAvv			 	
	; 	;* !&&\!!&&!^<	!!9e"4AGGDA%)RXXejj1=>&"((277Q78BGGBK)AV]^r   c                 X    d\  }} j                  ||dd      }|\  }j                          fd}fd} |j                        }t        j                  |t              }	t        j                  |	fj                        }
|rVt        dt        j                  |
j                  d	             t        d
t        j                  |j                  d	             t        j                  ||
j                         t        t               y )Nr   rQ   rR   c                     t        j                  | fj                        }	j                  |
      \  }}}}}|S r   r   A_valA_qpr   rE   r#   A_idxr    r%   r&   r   r'   r$   s       r   rY   z)derivative_tests.test_dl_dA.<locals>.grad  D    $$eU^177CD!^^Aq$1fENAq"aIr   c                    t        j                  | fj                        }t        j                  d      }|j                  	|t        t        t        d	       |j                         }|j                  j                  t        j                  j                  k7  rt        d      |j                  }dt!        j"                  t!        j$                  |
z
              z  S r   r   r   r   r   rt   r   r#   r   r    r%   r&   r'   r$   s        r   r   z&derivative_tests.test_dl_dA.<locals>.f      $$eU^177CD		),AGG!  
 '')Cxx""d&7&7&C&CC !677EEE		%&. 9:::r   r   dA_fd: r^   r_   r   rb   r)   r   r   r   rf   r   r   r   rh   r   ri   rj   rk   r   rl   rm   )r   r1   r   r   ro   r(   rY   r   rE   	dA_fd_valdA_fdr#   r   r    r%   r&   r'   r$   s   `          @@@@@@@r   
test_dl_dAzderivative_tests.test_dl_dA}  s    1}}qAue}D(,%1aAvv			 	
	; 	;* !&&\!!&&!^<	!!9e"4AGGD)RXXejj1=>&"((277Q78BgGLr   c                     d\  }} j                  ||dd      }|\  }} fd}fd} ||      }	t        ||t              }
|r^t        dt	        j
                  |
d      j                                t        d	t	        j
                  |	d      j                                t        j                  |
|	t        t        
       y )N)   r   rQ   rR   c                 @    j                  |       \  }}}}}|S rT   r   )	r%   r   rG   r#   r    r&   r   r'   r$   s	      r   rY   z)derivative_tests.test_dl_dl.<locals>.grad  s*    !^^Aq!Q6BNAq!RIr   c                    t        j                  d      }|j                  | t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }dt        j                  t        j                  |z
              z  S r   r   )	r%   r   rt   r   r#   r    r&   r'   r$   s	       r   r   z&derivative_tests.test_dl_dl.<locals>.f  r   r   zdl_fd: r^   r_   zdl_computed: rb   )r)   r   rf   rh   r   ri   tolistrj   rk   rl   rm   )r   r1   r   r   ro   r%   r(   rY   r   dl_computeddl_fdr#   r    r&   r'   r$   s   `          @@@@@r   
test_dl_dlzderivative_tests.test_dl_dl  s    1}}qAue}D(,%1aAvv	 		; 	;( 1gaN3)RXXea8??AB/288K!#D#K#K#MNE;W7Kr   c                 z    d\  }} j                  ||dd      }|\  }} fd}fd} ||      }	t        ||t              }
|rBt        dt	        j
                  |
d             t        d	t	        j
                  |	d             t        j                  |
|	t        t        
       y )N)r      rQ   rR   c                 @    j                  |       \  }}}}}|S rT   r   )	r$   r   rH   r#   r    r%   r&   r   r'   s	      r   rY   z)derivative_tests.test_dl_du.<locals>.grad  s*    !^^Aq!Q6BNAq!QIr   c                    t        j                  d      }|j                  | t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }dt        j                  t        j                  |z
              z  S r   r   )	r$   r   rt   r   r#   r    r%   r&   r'   s	       r   r   z&derivative_tests.test_dl_du.<locals>.f  r   r   zdu_fd: r^   r_   zdu: rb   r   )r   r1   r   r   ro   r$   r(   rY   r   du_computeddu_fdr#   r    r%   r&   r'   s   `          @@@@@r   
test_dl_duzderivative_tests.test_dl_du  s    1}}qAue}D(,%1aAvv	 		; 	;( 1gaN3)RXXea89&"((;;<E;W7Kr   c                 h    d\  }} j                  ||dd      }|\  }d d d d j                          fd}fd} |j                        }t        j                  |t              }	t        j                  |	fj                        }
|rVt        dt        j                  |
j                  d	
             t        dt        j                  |j                  d	
             t        j                  ||
j                         t        t               y )N)r   r   rQ   rR   r   c                     t        j                  | fj                        }	j                  |
      \  }}}}}|S r   r   r   s       r   rY   z,derivative_tests.test_dl_dA_eq.<locals>.grad  r   r   c                    t        j                  | fj                        }t        j                  d      }|j                  	|t        t        t        d	       |j                         }|j                  j                  t        j                  j                  k7  rt        d      |j                  }dt!        j"                  t!        j$                  |
z
              z  S r   r   r   s        r   r   z)derivative_tests.test_dl_dA_eq.<locals>.f  r   r   r   r      r_   zdA_computed: rb   r   )r   r1   r   r   ro   r(   rY   r   dA_computedr   r   r#   r   r    r%   r&   r'   r$   s   `          @@@@@@@r   test_dl_dA_eqzderivative_tests.test_dl_dA_eq  s    1}}qAue}D(,%1aAvv 3B#2			 	
	; 	;* 166l!!&&!^<	!!9e"4AGGD)RXXejj1=>/288K,<,<q#IJKwWUr   c                     d\  }} j                  ||dd      }|\  }}d d d d  fd}fd} ||      }	t        ||t              }
|rBt        dt	        j
                  |
d	             t        d
t	        j
                  |	d	             t        j                  |
|	t        t               y )N)r            ?rR   r   c                 @    j                  |       \  }}}}}|S rT   r   	r&   r   rF   r#   r    r%   r   r'   r$   s	      r   rY   z,derivative_tests.test_dl_dq_eq.<locals>.grad.  *    !^^Aq!Q6BNAr1aIr   c                    t        j                  d      }|j                  | t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }dt        j                  t        j                  |z
              z  S r   r   r   s	       r   r   z)derivative_tests.test_dl_dq_eq.<locals>.f2  r   r   r   r^   r_   dq_computed: rb   r   r   r1   r   r   ro   r&   r(   rY   r   dq_computedr   r#   r    r%   r'   r$   s   `          @@@@@r   test_dl_dq_eqzderivative_tests.test_dl_dq_eq%  s    1}}qAsC}@(,%1aAvv 3B#2	 		; 	;( 1gaN3)RXXea89/288K!#DEE;W7Kr   c                     d\  }} j                  ||dd      }|\  }}t        j                  dd       dd d d d d  fd	}fd
} ||      }	t        ||t              }
|rBt        dt        j                  |
d             t        dt        j                  |	d             t        j                  |
|	t        t               y )N)d   x   r   rR   r   r   r+   r   (   c                 @    j                  |       \  }}}}}|S rT   r   r   s	      r   rY   z2derivative_tests.test_dl_dq_eq_large.<locals>.gradX  r   r   c                    t        j                  d      }|j                  | t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }dt        j                  t        j                  |z
              z  S r   r   r   s	       r   r   z/derivative_tests.test_dl_dq_eq_large.<locals>.f\  r   r   r   r^   r_   r   rb   )r)   r5   r   r   rf   rh   r   ri   rj   rk   rel_tol_relaxedabs_tol_relaxedr   s   `          @@@@@r   test_dl_dq_eq_largez$derivative_tests.test_dl_dq_eq_largeO  s    1}}qAsC}@(,%1aAvvMM,	BB"R3B#2	 		; 	;( 1gaN3)RXXea89/288K!#DEE;_?[r   c                     d\  }} j                  ||dd      }|\  }d}d | d |  fd}fd} ||      }	t        ||t              }
|rBt        dt	        j
                  |
d	             t        d
t	        j
                  |	d	             t        j                  |
|	t        t               y )N)r   r   r   rR   r   c           	      B    j                  | 	      \  }}}}}|S rT   r   )
r&   r   rF   r#   r    r%   r   r'   r(   r$   s
      r   rY   z5derivative_tests._test_dl_dq_nonzero_dy.<locals>.grad  s,    !^^Aq!Q66JNAr1aIr   c                    t        j                  d      }|j                  
| 	t        t        t
        d	       |j                         }|j                  j                  t         j                  j                  k7  rt        d      |j                  }|j                  }t        j                  |d      }t        j                   |d       }t        j                  d      }t        j                   d       }dt        j"                  t        j$                  |z
              t        j"                  t        j$                  ||z
              z   t        j"                  t        j$                  ||z
              z   z  S )Nr   r+   Fr-   r2   r   r   )r5   r6   r7   r.   r/   r0   r8   r9   r:   r;   r<   r=   r>   r?   r   maximumminimumr   r   )r&   r   rt   r   y_hatyu_hatyl_hattrue_yutrue_ylr#   r    r%   r'   r(   r$   s            r   r   z2derivative_tests._test_dl_dq_nonzero_dy.<locals>.f  s0   		),AGG!  
 '')Cxx""d&7&7&C&CC !677EEEEEEZZq)Fjj**Fjj+Gzz&!,,Gryy01&&6G#3456&&6G#3456 r   r   r^   r_   r   rb   r   )r   r1   r   r   ro   r&   num_eqrY   r   r   r   r#   r    r%   r'   r(   r$   s   `          @@@@@@r   _test_dl_dq_nonzero_dyz'derivative_tests._test_dl_dq_nonzero_dyy  s    1}}qAsC}@(,%1aAvv wZ'6
	 		 	< 1gaN3)RXXea89/288K!#DEE;W7Kr   )r   r   r   r   rT   )F)__name__
__module____qualname__r   r)   rJ   rM   pytestmarkskipr~   r   r   r   r   r   r   r   r   r   r   r    r   r   r
   r
      s    /"<( [[FG>N H>N@ [[FG?N H?NB [[FGBN HBNH%CN*_X)MV%LN%LN-V^(LT(\T3Lr   r
   )r5   numpyr   numpy.randomr   r   scipyr   scipy.optimizer   numpy.testingtestingrj   unittestr   r   rf   rl   rm   r   r   r.   r/   r0   r   skipifalgebra_availableTestCaser
   r   r   r   <module>r     s        (    	 

 
 ...y99BabQ
Lx(( Q
L cQ
Lr   