o
    €o™iþ†  ã                   @   s,  d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
mZ dedefdd„Zdedefd	d
„Ze dd¡adtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dtd< dejdejdejfd d!„Ze d"d#¡adtd< dtd$< dtd%< dtd&< dtd'< dtd(< dtd)< dtd*< dtd+< dtd,< dtd-< dtd.< dtd/< dtd0< dtd1< dtd2< dtd3< dtd4< dtd5< dtd6< dtd7< dtd8< dtd9< dtd:< dtd;< dtd<< dtd=< dtd>< dtd?< dtd@< dtdA< dtdB< dtdC< dtdD< dtdE< dtdF< dtdG< dtdH< dtdI< dtdJ< dejdejdejfdKdL„Zejg g dM¢‘g dN¢‘g dO¢‘g dP¢‘g dQ¢‘g dR¢‘g dS¢‘g dT¢‘g dU¢‘g dV¢‘g dW¢‘g dX¢‘g dY¢‘g dZ¢‘g d[¢‘g d\¢‘g d]¢‘g d^¢‘g d_¢‘g d`¢‘g da¢‘g db¢‘g dc¢‘g dd¢‘g de¢‘g df¢‘g dg¢‘g dh¢‘g di¢‘g dj¢‘g dk¢‘g dl¢‘g dm¢‘g dn¢‘g do¢‘g dp¢‘g dq¢‘g dr¢‘g ds¢‘g dt¢‘g du¢‘g dv¢‘g dw¢‘g dx¢‘g dy¢‘g dz¢‘g d{¢‘g d|¢‘g d}¢‘g d~¢‘g d¢‘g d€¢‘g d¢‘g d‚¢‘g dƒ¢‘g d„¢‘g d…¢‘g d†¢‘g d‡¢‘g dˆ¢‘g d‰¢‘g dŠ¢‘g d‹¢‘g dŒ¢‘g d¢‘g dŽ¢‘g d¢‘g d¢‘g d‘¢‘g d’¢‘g d“¢‘g d”¢‘g d•¢‘g d–¢‘g d—¢‘g d˜¢‘g d™¢‘g dš¢‘g d›¢‘g dœ¢‘g d¢‘g dž¢‘g dŸ¢‘g d ¢‘g d¡¢‘g d¢¢‘g d£¢‘g d¤¢‘g d¥¢‘g d¦¢‘g d§¢‘g d¨¢‘g d©¢‘g dª¢‘g d«¢‘g d¬¢‘g d­¢‘g d®¢‘g d¯¢‘g d°¢‘g d±¢‘g d²¢‘g d³¢‘g d´¢‘g dµ¢‘g d¶¢‘g d·¢‘g d¸¢‘g d¹¢‘g dº¢‘g d»¢‘g d¼¢‘g d½¢‘g d¾¢‘g d¿¢‘g dÀ¢‘g dÁ¢‘g dÂ¢‘g dÃ¢‘g dÄ¢‘g dÅ¢‘g dÆ¢‘g dÇ¢‘g dÈ¢‘g dÉ¢‘g dÊ¢‘g dË¢‘g dÌ¢‘g dÍ¢‘g dÎ¢‘g dÏ¢‘g dÐ¢‘g dÑ¢‘g dÒ¢‘g dÓ¢‘g dÔ¢‘g dÕ¢‘g dÖ¢‘g d×¢‘g dØ¢‘g dÙ¢‘g dÚ¢‘g dÛ¢‘g dÜ¢‘g dÝ¢‘g dÞ¢‘g dß¢‘g dà¢‘g dá¢‘g dâ¢‘g dã¢‘g dä¢‘g då¢‘g dæ¢‘g dç¢‘g dè¢‘g dé¢‘g dê¢‘g dë¢‘g dì¢‘g dí¢‘g dî¢‘g dï¢‘g dð¢‘g dñ¢‘g dò¢‘g dó¢‘g dô¢‘g dõ¢‘g dö¢‘g d÷¢‘g dø¢‘g dù¢‘g dú¢‘g dû¢‘g dü¢‘g dý¢‘g dþ¢‘g dÿ¢‘g d ¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d	¢‘g d
¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d ¢‘g d!¢‘g d"¢‘g d#¢‘g d$¢‘g d%¢‘g d&¢‘g d'¢‘g d(¢‘g d)¢‘g d*¢‘g d+¢‘g d,¢‘g d-¢‘g d.¢‘g d/¢‘g d0¢‘g d1¢‘g d2¢‘g d3¢‘g d4¢‘g d5¢‘g d6¢‘g d7¢‘g d8¢‘g d9¢‘g d:¢‘g d;¢‘g d<¢‘g d=¢‘g d>¢‘g d?¢‘g d@¢‘g dA¢‘g dB¢‘g dC¢‘g dD¢‘g dE¢‘g dF¢‘g dG¢‘g dH¢‘g dI¢‘g dJ¢‘g dK¢‘g dL¢‘g dM¢‘g dN¢‘g dO¢‘g dP¢‘g dQ¢‘g dR¢‘g dS¢‘g dT¢‘g dU¢‘g dV¢‘g dW¢‘g dX¢‘g dY¢‘g dZ¢‘g d[¢‘g d\¢‘g d]¢‘g d^¢‘g d_¢‘g d`¢‘g da¢‘g db¢‘g dc¢‘g dd¢‘g de¢‘g df¢‘g dg¢‘g dh¢‘g di¢‘g dj¢‘g dk¢‘g dl¢‘g dm¢‘g dn¢‘g do¢‘g dp¢‘g dq¢‘g dr¢‘g ds¢‘g dt¢‘g du¢‘g dv¢‘g dw¢‘g dx¢‘g dy¢‘g dz¢‘g d{¢‘g d|¢‘g d}¢‘g d~¢‘g d¢‘g d€¢‘g d¢‘g d‚¢‘g dƒ¢‘g d„¢‘g d…¢‘g d†¢‘g d‡¢‘g dˆ¢‘g d‰¢‘g dŠ¢‘g d‹¢‘g dŒ¢‘g d¢‘g dŽ¢‘g d¢‘g d¢‘g d‘¢‘g d’¢‘g d“¢‘g d”¢‘g d•¢‘g d–¢‘g d—¢‘g d˜¢‘g d™¢‘g dš¢‘g d›¢‘g dœ¢‘g d¢‘g dž¢‘g dŸ¢‘g d ¢‘g d¡¢‘g d¢¢‘g d£¢‘g d¤¢‘g d¥¢‘g d¦¢‘g d§¢‘g d¨¢‘g d©¢‘g dª¢‘g d«¢‘g d¬¢‘g d­¢‘g d®¢‘g d¯¢‘g d°¢‘g d±¢‘g d²¢‘g d³¢‘g d´¢‘g dµ¢‘g d¶¢‘g d·¢‘g d¸¢‘g d¹¢‘g dº¢‘g d»¢‘g d¼¢‘g d½¢‘g d¾¢‘g d¿¢‘g dÀ¢‘g dÁ¢‘g dÂ¢‘g dÃ¢‘g dÄ¢‘g dÅ¢‘g dÆ¢‘g dÇ¢‘g dÈ¢‘g dÉ¢‘g dÊ¢‘g dË¢‘g dÌ¢‘g dÍ¢‘g dÎ¢‘g dÏ¢‘g dÐ¢‘g dÑ¢‘g dÒ¢‘g dÓ¢‘g dÔ¢‘g dÕ¢‘g dÖ¢‘g d×¢‘g dØ¢‘g dÙ¢‘g dÚ¢‘g dÛ¢‘g dÜ¢‘g dÝ¢‘g dÞ¢‘g dß¢‘g dà¢‘g dá¢‘g dâ¢‘g dã¢‘g dä¢‘g då¢‘g dæ¢‘g dç¢‘g dè¢‘g dé¢‘g dê¢‘g dë¢‘g dì¢‘g dí¢‘g dî¢‘g dï¢‘g dð¢‘g dñ¢‘g dò¢‘g dó¢‘g dô¢‘g dõ¢‘g dö¢‘g d÷¢‘g dø¢‘g dù¢‘g dú¢‘g dû¢‘g dü¢‘g dý¢‘g dþ¢‘g dÿ¢‘g d ¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d	¢‘g d
¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d¢‘g d ¢‘g d!¢‘g d"¢‘g d#¢‘g d$¢‘g d%¢‘g d&¢‘g d'¢‘g d(¢‘g d)¢‘g d*¢‘g d+¢‘g d,¢‘ejd-aejg d.¢ejd-aejg d/¢ejd-ad0edefd1d2„ZdS (3  zZModule containing the functionalities for computing the real roots of polynomial equation.é    N)ÚTensorÚcosÚ	ones_likeÚstackÚzerosÚ
zeros_like)ÚKORNIA_CHECK_SHAPEÚcoeffsÚreturnc                 C   s*  t | ddgƒ | dd…df }| dd…df }| dd…df }|| d| |  }|dk }|dk}d| }t| jd df| j| jd	}t |¡r_||  ||  ||df< ||df ||df< t |¡}	t | | ¡}
t |
¡r“||
  |	|
  ||
  ||
df< ||
  |	|
  ||
  ||
df< |S )
aã  Solve given quadratic equation.

    The function takes the coefficients of quadratic equation and returns the real roots.

    .. math:: coeffs[0]x^2 + coeffs[1]x + coeffs[2] = 0

    Args:
        coeffs : The coefficients of quadratic equation :`(B, 3)`

    Returns:
        A tensor of shape `(B, 2)` containing the real roots to the quadratic equation.

    Example:
        >>> coeffs = torch.tensor([[1., 4., 4.]])
        >>> roots = solve_quadratic(coeffs)

    .. note::
       In cases where a quadratic polynomial has only one real root, the output will be in the format
       [real_root, 0]. And for the complex roots should be represented as 0. This is done to maintain
       a consistent output shape for all cases.

    ÚBÚ3Nr   é   é   é   g      à?©ÚdeviceÚdtype)	r   r   Úshaper   r   ÚtorchÚanyÚsqrtÚbitwise_and)r	   ÚaÚbÚcÚdeltaÚmask_negativeÚ	mask_zeroÚinv_2aÚ	solutionsÚ
sqrt_deltaÚmask© r"   ú]/home/ubuntu/.local/lib/python3.10/site-packages/kornia/geometry/solvers/polynomial_solver.pyÚsolve_quadratic   s$   


""r$   c           .      C   s8  t | ddgƒ tjtj| j| jd}| dd…df }| dd…df }| dd…df }| dd…df }tt| ƒdf|j|jd}|dk}|dk}|dk}	||@ |	 @ }
|| @ |	 @ }t 	|¡rot
| |dd…f ƒ||dd…f< t 	|
¡r‚tjd	|j|jd||
df< d	||   }|||   }|| }|||   }|||   }d| | d
 }d
| | d|  d| |  d }|| | }|||  }d| }t|ƒ}t|ƒ}t|ƒ}||| < ||| < ||| < |dk|dk@ }|dk|dk@ }t 	|¡rt d||  d¡||  }|||df< |dk|dk@ }|dk|dk@ }t 	|¡r;t||  ||  ||  gdd||< |dk|dk@ }|dk|dk@ }t 	|¡r¥t || t ||  ¡ ¡} t ||  ¡}!d|! t| d ƒ ||  }"d|! t| d|  d ƒ ||  }#d|! t| d|  d ƒ ||  }$t|"|#|$gdd||< t|ƒ}%||%| < |%dk|dk@ }&|dk|dk@ }'t 	|'¡rt|ƒ}(t|ƒ})t |¡}*|*dk}+t 	|+¡rt |*|+ t ||+ ¡ d¡|(|+< |dk },t 	|,¡rý|(|,  |(|,< ||+  |(|+  |)|+< |(|' |)|'  ||'  }-|-||&df< |S )a  Solve given cubic equation.

    The function takes the coefficients of cubic equation and returns
    the real roots.

    .. math:: coeffs[0]x^3 + coeffs[1]x^2 + coeffs[2]x + coeffs[3] = 0

    Args:
        coeffs : The coefficients cubic equation : `(B, 4)`

    Returns:
        A tensor of shape `(B, 3)` containing the real roots to the cubic equation.

    Example:
        >>> coeffs = torch.tensor([[32., 3., -11., -6.]])
        >>> roots = solve_cubic(coeffs)

    .. note::
       In cases where a cubic polynomial has only one or two real roots, the output for the non-real
       roots should be represented as 0. Thus, the output for a single real root should be in the
       format [real_root, 0, 0], and for two real roots, it should be [real_root_1, real_root_2, 0].

    r   Ú4r   Nr   r   r   é   ç      ð?é	   é   é6   gUUUUUUÕ?©Údimg      @r   g¼‰Ø—²Òœ<)r   r   ÚtensorÚmathÚpir   r   r   Úlenr   r$   r   Úpowr   Úacosr   r   r   Úabs).r	   Ú_PIr   r   r   Údr   Úmask_a_zeroÚmask_b_zeroÚmask_c_zeroÚmask_first_orderÚmask_second_orderÚinv_aÚb_aÚb_a2Úc_aÚd_aÚQÚRÚQ3ÚDÚb_a_3Úa_Q_zeroÚa_R_zeroÚa_D_zeroÚmask_Q_zeroÚmask_Q_zero_solutionsÚ	x0_Q_zeroÚmask_QR_zeroÚmask_QR_zero_solutionsÚmask_D_zeroÚmask_D_zero_solutionsÚtheta_D_zeroÚsqrt_Q_D_zeroÚ	x0_D_zeroÚ	x1_D_zeroÚ	x2_D_zeroÚa_D_positiveÚmask_D_positive_solutionÚmask_D_positiveÚADÚBDÚR_absÚmask_R_positiveÚmask_R_positive_Úx0_D_positiver"   r"   r#   Úsolve_cubicZ   sŒ   
 
$



ÿ$$

"r]   é   é
   r   )r   r   )r   r   )r   r   )r   r   )é   r   )r&   r&   )é   r&   )é   r   )é   rb   )r(   rb   )é   rc   )é   rc   )r_   rd   )é   r`   )é   r`   )é   r(   r   r   c                 C   sJ   t j| jkst j| jkrt j| j| jda |  d¡| d¡ jddt  S )aE  Multiply two polynomials of the first order [@nister2004efficient].

    Args:
        a: a first order polynomial for variables :math:`(x,y,z,1)`.
        b: a first order polynomial for variables :math:`(x,y,z,1)`.

    Returns:
        degree 2 poly with the order :math:`(x^2, x*y, x*z, x, y^2, y*z, y, z^2, z, 1)`.

    r   r   r   éþÿÿÿ©Ú	start_dim)ÚT_deg1r   r   ÚtoÚ	unsqueezeÚflatten)r   r   r"   r"   r#   Úmultiply_deg_one_polyö   s    rp   é(   é   )é   r   )r   r   )r   r   )rb   r&   )r^   r&   )r   r   )r`   r   )r&   rb   )ra   rb   )é   rc   )é   rc   )é   rd   )é   rd   )rc   r`   )r(   r`   )rr   r`   )rd   r(   )re   r(   )é   r(   )r_   r_   )é   r_   )rf   rf   )rg   rf   )é    rf   )rh   ra   )é$   ra   )é   re   )é   re   )é   rg   )é   rg   )é!   rg   )r)   rh   )é%   rh   )é   r^   )é   rs   )é"   rs   )é#   rt   )é&   rt   )é'   rv   c                 C   sR   t j| jkst j| jkrt j| j| jda |  d¡| d¡ }|jdd}|t  S )a¿  Multiply two polynomials a and b of degrees two and one [@nister2004efficient].

    Args:
        a: a second degree poly for variables :math:`(x^2, x*y, x*z, x, y^2, y*z, y, z^2, z, 1)`.
        b: a first degree poly for variables :math:`(x y z 1)`.

    Returns:
        a third degree poly for variables,
        :math:`(x^3, y^3, x^2*y, x*y^2, x^2*z, x^2, y^2*z, y^2,
        x*y*z, x*y, x*z^2, x*z, x, y*z^2, y*z, y, z^3, z^2, z, 1)`.

    r   r   r   ri   rj   )ÚT_deg2r   r   rm   rn   ro   )r   r   Úproduct_basisÚproduct_vectorr"   r"   r#   Úmultiply_deg_two_one_poly6  s
   r‹   )ra   r^   r€   )ra   rr   r}   )r&   r€   rw   )rd   r}   rw   )r&   rr   r†   )rd   r^   r†   )rf   r^   r€   )rf   rr   r}   )ra   rh   r€   )ra   r^   rz   )ra   rv   r}   )ra   rr   ry   )r   r€   rw   )r&   rz   rw   )r&   r€   rx   )rc   r}   rw   )rd   ry   rw   )rd   r}   rx   )r   rr   r†   )r&   rv   r†   )r&   rr   r   )rc   r^   r†   )rd   rh   r†   )rd   r^   r   )r_   r^   r€   )r_   rr   r}   )rf   rh   r€   )rf   r^   rz   )rf   rv   r}   )rf   rr   ry   )rg   ra   r€   )ra   rh   rz   )ra   r^   rƒ   )ra   rt   r}   )ra   rv   ry   )ra   rr   r)   )r   r€   rw   )r   rz   rw   )r   r€   rx   )r&   rƒ   rw   )r&   rz   rx   )r&   r€   r~   )rb   r}   rw   )rc   ry   rw   )rc   r}   rx   )rd   r)   rw   )rd   ry   rx   )rd   r}   r~   )r   rr   r†   )r   rv   r†   )r   rr   r   )r&   rt   r†   )r&   rv   r   )r&   rr   r{   )rb   r^   r†   )rc   rh   r†   )rc   r^   r   )rd   rg   r†   )rd   rh   r   )rd   r^   r{   )r&   rr   r…   )r&   r|   r€   )rd   r^   r…   )rd   r|   r}   )r(   r^   r€   )r(   rr   r}   )r_   rh   r€   )r_   r^   rz   )r_   rv   r}   )r_   rr   ry   )re   ra   r€   )rf   rg   r€   )rf   rh   rz   )rf   r^   rƒ   )rf   rt   r}   )rf   rv   ry   )rf   rr   r)   )rg   ra   rz   )ra   rh   rƒ   )ra   r^   r‚   )ra   rs   r}   )ra   rt   ry   )ra   rv   r)   )ra   rr   r   )r   r€   rw   )r   rz   rw   )r   r€   rx   )r   rƒ   rw   )r   rz   rx   )r   r€   r~   )r&   r‚   rw   )r&   rƒ   rx   )r&   rz   r~   )r   r}   rw   )rb   ry   rw   )rb   r}   rx   )rc   r)   rw   )rc   ry   rx   )rc   r}   r~   )rd   r   rw   )rd   r)   rx   )rd   ry   r~   )r   rr   r†   )r   rv   r†   )r   rr   r   )r   rt   r†   )r   rv   r   )r   rr   r{   )r&   rs   r†   )r&   rt   r   )r&   rv   r{   )r   r^   r†   )rb   rh   r†   )rb   r^   r   )rc   rg   r†   )rc   rh   r   )rc   r^   r{   )rd   re   r†   )rd   rg   r   )rd   rh   r{   )r   rr   r…   )r   r|   r€   )r&   rv   r…   )r&   rr   r„   )r&   ru   r€   )r&   r|   rz   )rc   r^   r…   )rc   r|   r}   )rd   rh   r…   )rd   r^   r„   )rd   ru   r}   )rd   r|   ry   )r`   r^   r€   )r`   rr   r}   )r(   rh   r€   )r(   r^   rz   )r(   rv   r}   )r(   rr   ry   )r_   rg   r€   )r_   rh   rz   )r_   r^   rƒ   )r_   rt   r}   )r_   rv   ry   )r_   rr   r)   )re   rf   r€   )re   ra   rz   )rf   rg   rz   )rf   rh   rƒ   )rf   r^   r‚   )rf   rs   r}   )rf   rt   ry   )rf   rv   r)   )rf   rr   r   )rg   ra   rƒ   )ra   rh   r‚   )ra   rs   ry   )ra   rt   r)   )ra   rv   r   )r   rz   rw   )r   r€   rx   )r   rƒ   rw   )r   rz   rx   )r   r€   r~   )r   r‚   rw   )r   rƒ   rx   )r   rz   r~   )r&   r‚   rx   )r&   rƒ   r~   )r   ry   rw   )r   r}   rx   )rb   r)   rw   )rb   ry   rx   )rb   r}   r~   )rc   r   rw   )rc   r)   rx   )rc   ry   r~   )rd   r   rx   )rd   r)   r~   )r   rv   r†   )r   rr   r   )r   rt   r†   )r   rv   r   )r   rr   r{   )r   rs   r†   )r   rt   r   )r   rv   r{   )r&   rs   r   )r&   rt   r{   )r   rh   r†   )r   r^   r   )rb   rg   r†   )rb   rh   r   )rb   r^   r{   )rc   re   r†   )rc   rg   r   )rc   rh   r{   )rd   re   r   )rd   rg   r{   )r   rr   r…   )r   r|   r€   )r   rv   r…   )r   rr   r„   )r   ru   r€   )r   r|   rz   )r&   rt   r…   )r&   rv   r„   )r&   ru   rz   )r&   r|   rƒ   )rb   r^   r…   )rb   r|   r}   )rc   rh   r…   )rc   r^   r„   )rc   ru   r}   )rc   r|   ry   )rd   rg   r…   )rd   rh   r„   )rd   ru   ry   )rd   r|   r)   )r`   rh   r€   )r`   r^   rz   )r`   rv   r}   )r`   rr   ry   )r(   rg   r€   )r(   rh   rz   )r(   r^   rƒ   )r(   rt   r}   )r(   rv   ry   )r(   rr   r)   )r_   re   r€   )r_   rg   rz   )r_   rh   rƒ   )r_   r^   r‚   )r_   rs   r}   )r_   rt   ry   )r_   rv   r)   )r_   rr   r   )re   rf   rz   )re   ra   rƒ   )rf   rg   rƒ   )rf   rh   r‚   )rf   rs   ry   )rf   rt   r)   )rf   rv   r   )rg   ra   r‚   )ra   rs   r)   )ra   rt   r   )r   rƒ   rw   )r   rz   rx   )r   r€   r~   )r   r‚   rw   )r   rƒ   rx   )r   rz   r~   )r   r‚   rx   )r   rƒ   r~   )r&   r‚   r~   )r   r)   rw   )r   ry   rx   )r   r}   r~   )rb   r   rw   )rb   r)   rx   )rb   ry   r~   )rc   r   rx   )rc   r)   r~   )rd   r   r~   )r   rt   r†   )r   rv   r   )r   rr   r{   )r   rs   r†   )r   rt   r   )r   rv   r{   )r   rs   r   )r   rt   r{   )r&   rs   r{   )r   rg   r†   )r   rh   r   )r   r^   r{   )rb   re   r†   )rb   rg   r   )rb   rh   r{   )rc   re   r   )rc   rg   r{   )rd   re   r{   )r   rr   r…   )r   r|   r€   )r   rv   r…   )r   rr   r„   )r   ru   r€   )r   r|   rz   )r   rt   r…   )r   rv   r„   )r   ru   rz   )r   r|   rƒ   )r&   rs   r…   )r&   rt   r„   )r&   ru   rƒ   )r&   r|   r‚   )r   r^   r…   )r   r|   r}   )rb   rh   r…   )rb   r^   r„   )rb   ru   r}   )rb   r|   ry   )rc   rg   r…   )rc   rh   r„   )rc   ru   ry   )rc   r|   r)   )rd   re   r…   )rd   rg   r„   )rd   ru   r)   )rd   r|   r   )r`   rg   r€   )r`   rh   rz   )r`   r^   rƒ   )r`   rt   r}   )r`   rv   ry   )r`   rr   r)   )r(   re   r€   )r(   rg   rz   )r(   rh   rƒ   )r(   r^   r‚   )r(   rs   r}   )r(   rt   ry   )r(   rv   r)   )r(   rr   r   )r_   re   rz   )r_   rg   rƒ   )r_   rh   r‚   )r_   rs   ry   )r_   rt   r)   )r_   rv   r   )re   rf   rƒ   )re   ra   r‚   )rf   rg   r‚   )rf   rs   r)   )rf   rt   r   )ra   rs   r   )r   r‚   rw   )r   rƒ   rx   )r   rz   r~   )r   r‚   rx   )r   rƒ   r~   )r   r‚   r~   )r   r   rw   )r   r)   rx   )r   ry   r~   )rb   r   rx   )rb   r)   r~   )rc   r   r~   )r   rs   r†   )r   rt   r   )r   rv   r{   )r   rs   r   )r   rt   r{   )r   rs   r{   )r   re   r†   )r   rg   r   )r   rh   r{   )rb   re   r   )rb   rg   r{   )rc   re   r{   )r   rv   r…   )r   rr   r„   )r   ru   r€   )r   r|   rz   )r   rt   r…   )r   rv   r„   )r   ru   rz   )r   r|   rƒ   )r   rs   r…   )r   rt   r„   )r   ru   rƒ   )r   r|   r‚   )r&   rs   r„   )r&   ru   r‚   )r   rh   r…   )r   r^   r„   )r   ru   r}   )r   r|   ry   )rb   rg   r…   )rb   rh   r„   )rb   ru   ry   )rb   r|   r)   )rc   re   r…   )rc   rg   r„   )rc   ru   r)   )rc   r|   r   )rd   re   r„   )rd   ru   r   )r`   re   r€   )r`   rg   rz   )r`   rh   rƒ   )r`   r^   r‚   )r`   rs   r}   )r`   rt   ry   )r`   rv   r)   )r`   rr   r   )r(   re   rz   )r(   rg   rƒ   )r(   rh   r‚   )r(   rs   ry   )r(   rt   r)   )r(   rv   r   )r_   re   rƒ   )r_   rg   r‚   )r_   rs   r)   )r_   rt   r   )re   rf   r‚   )rf   rs   r   )r   r‚   rx   )r   rƒ   r~   )r   r‚   r~   )r   r   rx   )r   r)   r~   )rb   r   r~   )r   rs   r   )r   rt   r{   )r   rs   r{   )r   re   r   )r   rg   r{   )rb   re   r{   )r   rt   r…   )r   rv   r„   )r   ru   rz   )r   r|   rƒ   )r   rs   r…   )r   rt   r„   )r   ru   rƒ   )r   r|   r‚   )r   rs   r„   )r   ru   r‚   )r   rg   r…   )r   rh   r„   )r   ru   ry   )r   r|   r)   )rb   re   r…   )rb   rg   r„   )rb   ru   r)   )rb   r|   r   )rc   re   r„   )rc   ru   r   )r`   re   rz   )r`   rg   rƒ   )r`   rh   r‚   )r`   rs   ry   )r`   rt   r)   )r`   rv   r   )r(   re   rƒ   )r(   rg   r‚   )r(   rs   r)   )r(   rt   r   )r_   re   r‚   )r_   rs   r   )r   r‚   r~   )r   r   r~   )r   rs   r{   )r   re   r{   )r   rs   r…   )r   rt   r„   )r   ru   rƒ   )r   r|   r‚   )r   rs   r„   )r   ru   r‚   )r   re   r…   )r   rg   r„   )r   ru   r)   )r   r|   r   )rb   re   r„   )rb   ru   r   )r`   re   rƒ   )r`   rg   r‚   )r`   rs   r)   )r`   rt   r   )r(   re   r‚   )r(   rs   r   )r   rs   r„   )r   ru   r‚   )r   re   r„   )r   ru   r   )r`   re   r‚   )r`   rs   r   )r   (à  r'   ç      ð¿rŒ   r'   r'   rŒ   r'   rŒ   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   rŒ   r'   r'   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   rŒ   rŒ   r'   r'   rŒ   r'   r'   rŒ   rŒ   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   rŒ   r'   r'   rŒ   rŒ   rŒ   r'   rŒ   rŒ   r'   r'   r'   rŒ   r'   r'   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   rŒ   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   r'   r'   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   rŒ   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   rŒ   rŒ   rŒ   rŒ   r'   r'   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   r'   rŒ   r'   r'   r'   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   rŒ   r'   rŒ   rŒ   r'   r'   rŒ   r'   r'   rŒ   rŒ   r'   rŒ   rŒ   rŒ   r'   r'   rŒ   r'   r'   r'   rŒ   rŒ   r'   rŒ   r'   rŒ   rŒ   r'   r'   rŒ   (à  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rb   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rc   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   rd   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r`   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r(   r_   r_   r_   r_   r_   r_   ÚAc           
      C   sž   | j d | j| j}}}t |¡at ||¡at |¡a|  |d¡}|dd…tf }tj	|dd}|t }tj
|d||d}t |d¡}	|jd|	|d |S )	zíRepresent the determinant by the 10th polynomial, used for 5PC solver [@nister2004efficient].

    Args:
        A: Tensor :math:`(*, 3, 13)`.

    Returns:
        a degree 10 poly, representing determinant (Eqn. 14 in the paper).

    r   éÿÿÿÿNr+   rf   r   r   )r,   ÚindexÚsrc)r   r   r   Úmultiplication_indicesrm   ÚsignsÚcoefficient_mapÚviewr   Úprodr   ÚrepeatÚscatter_add_)
r   r   r   r   ÚA_flatÚgathered_valuesÚproductsÚsigned_productsÚcsÚbatch_coefficient_mapr"   r"   r#   Údeterminant_to_polynomial  s   

rž   )Ú__doc__r.   r   Úkornia.corer   r   r   r   r   r   Úkornia.core.checkr   r$   r]   rl   rp   rˆ   r‹   r-   Úint64r‘   Úfloat32r’   r“   rž   r"   r"   r"   r#   Ú<module>   sø   = 
ÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼E»FºG¹H¸I·J¶KµL´M³N²O±P°Q¯R®S­T¬U«VªW©X¨Y§Z¦[¥\¤]£^¢_¡` aŸbžcdœe›fšg™h˜i—j–k•l”m“n’o‘pqrŽstŒu‹vŠw‰xˆy‡z†{…|„}ƒ~‚  ÿ  þ  ý  ü  û  ú  ù  ø 	 ÷ 
 ö  õ  ô  ó  ò  ñ  ð  ï  î  í  ì  ë  ê  é  è  ç  æ  å  ä  ã  â  á   à ! ß " Þ # Ý $ Ü % Û & Ú ' Ù ( Ø ) × * Ö + Õ , Ô - Ó . Ò / Ñ 0 Ð 1 Ï 2 Î 3 Í 4 Ì 5 Ë 6 Ê 7 É 8 È 9 Ç : Æ ; Å < Ä = Ã > Â ? Á @ À A ¿ B ¾ C ½ D ¼ E » F º G ¹ H ¸ I · J ¶ K µ L ´ M ³ N ² O ± P ° Q ¯ R ® S ­ T ¬ U « V ª W © X ¨ Y § Z ¦ [ ¥ \ ¤ ] £ ^ ¢ _ ¡ `   a Ÿ b ž c  d œ e › f š g ™ h ˜ i — j – k • l ” m “ n ’ o ‘ p  q  r Ž s  t Œ u ‹ v Š w ‰ x ˆ y ‡ z † { … | „ } ƒ ~ ‚      ÿ    þ    ý    ü    û    ú    ù    ø  	  ÷  
  ö    õ    ô    ó    ò    ñ    ð    ï    î    í    ì    ë    ê    é    è    ç    æ    å    ä    ã    â    á     à  !  ß  "  Þ  #  Ý  $  Ü  %  Û  &  Ú  '  Ù  (  Ø  )  ×  *  Ö  +  Õ  ,  Ô  -  Ó  .  Ò  /  Ñ  0  Ð  1  Ï  2  Î  3  Í  4  Ì  5  Ë  6  Ê  7  É  8  È  9  Ç  :  Æ  ;  Å  <  Ä  =  Ã  >  Â  ?  Á  @  À  A  ¿  B  ¾  C  ½  D  ¼  E  »  F  º  G  ¹  H  ¸  I  ·  J  ¶  K  µ  L  ´  M  ³  N  ²  O  ±  P  °  Q  ¯  R  ®  S  ­  T  ¬  U  «  V  ª  W  ©  X  ¨  Y  §  Z  ¦  [  ¥  \  ¤  ]  £  ^  ¢  _  ¡  `     a  Ÿ  b  ž  c    d  œ  e  ›  f  š  g  ™  h  ˜  i  —  j  –  k  •  l  ”  m  “  n  ’  o  ‘  p    q    r  Ž  s    t  Œ  u  ‹  v  Š  w  ‰  x  ˆ  y  ‡  z  †  {  …  |  „  }  ƒ  ~  ‚          ÿ      þ      ý      ü      û      ú      ù      ø   	   ÷   
   ö      õ      ô      ó      ò      ñ      ð      ï      î      í      ì      ë      ê      é      è      ç      æ      å      ä      ã      â      á       à   !   ß   "   Þ   #   Ý   $   Ü   %   Û   &   Ú   '   Ù   (   Ø   )   ×   *   Ö   +   Õ   ,   Ô   -   Ó   .   Ò   /   Ñ   0   Ð   1   Ï   2   Î   3   Í   4   Ì   5   Ë   6   Ê   7   É   8   È   9   Ç   :   Æ   ;   Å   <   Ä   =   Ã   >   Â   ?   Á   @   À   A   ¿   B   ¾   C   ½   D   ¼   E   »   F   º   G   ¹   H   ¸   I   ·   J   ¶   K   µ   L   ´   M   ³   N   ²   O   ±   P   °   Q   ¯   R   ®   S   ­   T   ¬   U   «   V   ª   W   ©   X   ¨   Y   §   Z   ¦   [   ¥   \   ¤   ]   £   ^   ¢   _   ¡   `       a   Ÿ   b   ž   c      e   š   j   e   š   j   e   š   jÿþ