
    bi                     d    d dl mZ d dlZd dlmZ d dlmc m	Z
 d dlmZ d dlmZ  G d de      Zy)    )TupleN)Atom)Variablec                   J   e Zd Zd!dZd!dZd Zd Zd Zdee	df   fd	Z
deeef   fd
ZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZdefdZd Zd Z d Z!d  Z"y)"SuppFuncAtomreturnNc                     t        j                         | _        t        j                  |      g| _        || _        d| _        t               | _	        | j                          y)a!  
        Parameters
        ----------
        y : cvxpy.expressions.expression.Expression
            Must satisfy ``y.is_affine() == True``.

        parent : cvxpy.transforms.suppfunc.SuppFunc
            The object containing data for the convex set associated with this atom.
        N)luget_ididr   cast_to_constargs_parent_etatuple_shapevalidate_arguments)selfyparents      O/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/atoms/suppfunc.py__init__zSuppFuncAtom.__init__   sI     ))+''*+		',w!    c                     | j                   d   j                         rt        d      | j                   d   j                         st        d      y )Nr   z,Arguments to SuppFuncAtom cannot be complex.z)Arguments to SuppFuncAtom must be affine.)r   
is_complex
ValueError	is_affiner   s    r   r   zSuppFuncAtom.validate_arguments   sG    99Q<""$KLLyy|%%'HII (r   c                 @    | j                   d   j                         }|S )Nr   )r   	variables)r   varlists     r   r    zSuppFuncAtom.variables$   s    ))A,((*r   c                     g S N r   s    r   
parameterszSuppFuncAtom.parameters(       	r   c                     g S r#   r$   r   s    r   	constantszSuppFuncAtom.constants+   r&   r   .c                     | j                   S r#   )r   r   s    r   shape_from_argszSuppFuncAtom.shape_from_args.   s    {{r   c                      y)N)FFr$   r   s    r   sign_from_argszSuppFuncAtom.sign_from_args1   s    r   c                      yNFr$   r   s    r   	is_nonnegzSuppFuncAtom.is_nonneg4       r   c                      yr.   r$   r   s    r   	is_nonposzSuppFuncAtom.is_nonpos7   r0   r   c                      yr.   r$   r   s    r   is_imagzSuppFuncAtom.is_imag:   r0   r   c                      yr.   r$   r   s    r   r   zSuppFuncAtom.is_complex=   r0   r   c                      yNTr$   r   s    r   is_atom_convexzSuppFuncAtom.is_atom_convex@       r   c                      yr.   r$   r   s    r   is_atom_concavezSuppFuncAtom.is_atom_concaveC   r0   r   c                      yr.   r$   r   s    r   is_atom_log_log_convexz#SuppFuncAtom.is_atom_log_log_convexF   r0   r   c                      yr.   r$   r   s    r   is_atom_log_log_concavez$SuppFuncAtom.is_atom_log_log_concaveI   r0   r   c                      yr7   r$   r   s    r   is_atom_quasiconvexz SuppFuncAtom.is_atom_quasiconvexL   r9   r   c                      yr.   r$   r   s    r   is_atom_quasiconcavez!SuppFuncAtom.is_atom_quasiconcaveO   r0   r   c                      yr.   r$   r   idxs     r   is_incrzSuppFuncAtom.is_incrR   r0   r   c                      yr.   r$   rE   s     r   is_decrzSuppFuncAtom.is_decrU   r0   r   c                      yr7   r$   r   s    r   	is_convexzSuppFuncAtom.is_convexX       r   c                      yr.   r$   r   s    r   
is_concavezSuppFuncAtom.is_concave\   r0   r   c                      yr.   r$   r   s    r   is_log_log_convexzSuppFuncAtom.is_log_log_convex_   r0   r   c                      yr.   r$   r   s    r   is_log_log_concavezSuppFuncAtom.is_log_log_concaveb   r0   r   c                      yr7   r$   r   s    r   is_quasiconvexzSuppFuncAtom.is_quasiconvexe   rL   r   c                      yr.   r$   r   s    r   is_quasiconcavezSuppFuncAtom.is_quasiconcavei   r0   r   c                    ddl m} ddlm} | j                  d   j
                  j                  d      j                  d      }| j                  j                  j                  d      }| j                  j                  }t        |      dk(  rt               }|dk(  g} | |||z        |      }|j                  d	d
      }|S )Nr   )Maximize)Problem	   )decimalsForder   SCSgư>)solvereps)cvxpy.problems.objectiverX   cvxpy.problems.problemrY   r   valueroundravelr   xflattenconstraintslenr   solve)	r   rX   rY   y_valx_flatconsdummyprobvals	            r   _value_implzSuppFuncAtom._value_impll   s    52		!""((!(4:::E''c'2||''t9>JEQJ<Dx/6jj4j0
r   c                    | j                   d   j                  }|d   }|| j                   d   _        | j                          || j                   d   _        | j                  j                  j                  }t        j                  t        j                  |            rd gS t        j                  |j                  d      g      j                  }|gS )Nr   r\   r]   )r   re   rs   r   rh   npanyisnansp	csc_arrayrg   T)r   valuesy0r   gradvalgradmats         r   _gradzSuppFuncAtom._grady   s     YYq\1I		!		!,,..&&66"((7#$ 6MllGMMM$<#=>@@G9r   c                     t        d      Nz$Strict inequalities are not allowed.NotImplementedErrorr   others     r   __lt__zSuppFuncAtom.__lt__       !"HIIr   c                     t        d      r   r   r   s     r   __gt__zSuppFuncAtom.__gt__   r   r   )r   N)#__name__
__module____qualname__r   r   r    r%   r(   r   intr*   boolr,   r/   r2   r4   r   r8   r;   r=   r?   rA   rC   rG   rI   rK   rN   rP   rR   rT   rV   rs   r   r   r   r$   r   r   r   r      s3   ""JsCx dDj 1 4 4  D     T d d d 4 D 4 D   "JJr   r   )typingr   numpyru   scipy.sparsesparserx   cvxpy.lin_ops.lin_utilslin_ops	lin_utilsr
   cvxpy.atoms.atomr   cvxpy.expressions.variabler   r   r$   r   r   <module>r      s*       $ $ ! /CJ4 CJr   