o
    2h                     @   s   d dl mZ d dl mZ d dlmZ edG dd dZeddgG d	d
 d
eZeddgG dd deZeddgG dd deZeddgG dd deZ	dS )    )backend)ops)keras_exportzkeras.constraints.Constraintc                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	
ConstraintaG  Base class for weight constraints.

    A `Constraint` instance works like a stateless function.
    Users who subclass this
    class should override the `__call__()` method, which takes a single
    weight parameter and return a projected version of that parameter
    (e.g. normalized or clipped). Constraints can be used with various Keras
    layers via the `kernel_constraint` or `bias_constraint` arguments.

    Here's a simple example of a non-negative weight constraint:

    >>> class NonNegative(keras.constraints.Constraint):
    ...
    ...  def __call__(self, w):
    ...    return w * ops.cast(ops.greater_equal(w, 0.), dtype=w.dtype)

    >>> weight = ops.convert_to_tensor((-1.0, 1.0))
    >>> NonNegative()(weight)
    [0.,  1.]

    Usage in a layer:

    >>> keras.layers.Dense(4, kernel_constraint=NonNegative())
    c                 C   s   |S )ak  Applies the constraint to the input weight variable.

        By default, the inputs weight variable is not modified.
        Users should override this method to implement their own projection
        function.

        Args:
            w: Input weight variable.

        Returns:
            Projected variable (by default, returns unmodified inputs).
         selfwr   r   \/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/constraints/constraints.py__call__!   s   zConstraint.__call__c                 C   s   i S )a  Returns a Python dict of the object config.

        A constraint config is a Python dictionary (JSON-serializable) that can
        be used to reinstantiate the same object.

        Returns:
            Python dict containing the configuration of the constraint object.
        r   r   r   r   r
   
get_config0   s   	zConstraint.get_configc                 C   s   | di |S )a  Instantiates a weight constraint from a configuration dictionary.

        Example:

        ```python
        constraint = UnitNorm()
        config = constraint.get_config()
        constraint = UnitNorm.from_config(config)
        ```

        Args:
            config: A Python dictionary, the output of `get_config()`.

        Returns:
            A `keras.constraints.Constraint` instance.
        Nr   r   )clsconfigr   r   r
   from_config;   s   zConstraint.from_configN)__name__
__module____qualname____doc__r   r   classmethodr   r   r   r   r
   r      s    r   zkeras.constraints.MaxNormzkeras.constraints.max_normc                   @   s*   e Zd ZdZdddZdd Zdd	 Zd
S )MaxNormaz  MaxNorm weight constraint.

    Constrains the weights incident to each hidden unit
    to have a norm less than or equal to a desired value.

    Also available via the shortcut function `keras.constraints.max_norm`.

    Args:
        max_value: the maximum norm value for the incoming weights.
        axis: integer, axis along which to calculate weight norms.
            For instance, in a `Dense` layer the weight matrix
            has shape `(input_dim, output_dim)`,
            set `axis` to `0` to constrain each weight vector
            of length `(input_dim,)`.
            In a `Conv2D` layer with `data_format="channels_last"`,
            the weight tensor has shape
            `(rows, cols, input_depth, output_depth)`,
            set `axis` to `[0, 1, 2]`
            to constrain the weights of each filter tensor of size
            `(rows, cols, input_depth)`.

       r   c                 C   s   || _ || _d S N	max_valueaxis)r   r   r   r   r   r
   __init__i   s   
zMaxNorm.__init__c                 C   sL   t |}ttjt|| jdd}t|d| j}||t 	 |   S )NTr   keepdimsr   )
r   convert_to_tensorr   sqrtsumsquarer   clipr   epsilonr   r	   normsdesiredr   r   r
   r   m   s   
zMaxNorm.__call__c                 C   s   | j | jdS )Nr   r   r   r   r   r
   r   s   s   zMaxNorm.get_configN)r   r   r   r   r   r   r   r   r   r   r   r   r
   r   P   s
    
r   zkeras.constraints.NonNegzkeras.constraints.non_negc                   @   s   e Zd ZdZdd ZdS )NonNegz*Constrains the weights to be non-negative.c                 C   s&   t |}|tjt|d|jd S )N        )dtype)r   r   r   castgreater_equalr+   r   r   r   r
   r   {   s   
zNonNeg.__call__N)r   r   r   r   r   r   r   r   r
   r)   w   s    r)   zkeras.constraints.UnitNormzkeras.constraints.unit_normc                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )UnitNorma  Constrains the weights incident to each hidden unit to have unit norm.

    Args:
        axis: integer, axis along which to calculate weight norms.
            For instance, in a `Dense` layer the weight matrix
            has shape `(input_dim, output_dim)`,
            set `axis` to `0` to constrain each weight vector
            of length `(input_dim,)`.
            In a `Conv2D` layer with `data_format="channels_last"`,
            the weight tensor has shape
            `(rows, cols, input_depth, output_depth)`,
            set `axis` to `[0, 1, 2]`
            to constrain the weights of each filter tensor of size
            `(rows, cols, input_depth)`.
    r   c                 C   s
   || _ d S r   r   )r   r   r   r   r
   r         
zUnitNorm.__init__c              	   C   s4   t |}|t  ttjt|| jdd  S )NTr   )r   r   r$   r   r    r!   r"   r   r   r   r   r
   r      s   
zUnitNorm.__call__c                 C   s
   d| j iS )Nr   r/   r   r   r   r
   r      r0   zUnitNorm.get_configN)r   r(   r   r   r   r
   r.      s
    
r.   zkeras.constraints.MinMaxNormzkeras.constraints.min_max_normc                   @   s*   e Zd ZdZdddZdd Zd	d
 ZdS )
MinMaxNorma  MinMaxNorm weight constraint.

    Constrains the weights incident to each hidden unit
    to have the norm between a lower bound and an upper bound.

    Args:
        min_value: the minimum norm for the incoming weights.
        max_value: the maximum norm for the incoming weights.
        rate: rate for enforcing the constraint: weights will be
            rescaled to yield
            `(1 - rate) * norm + rate * norm.clip(min_value, max_value)`.
            Effectively, this means that rate=1.0 stands for strict
            enforcement of the constraint, while rate<1.0 means that
            weights will be rescaled at each step to slowly move
            towards a value inside the desired interval.
        axis: integer, axis along which to calculate weight norms.
            For instance, in a `Dense` layer the weight matrix
            has shape `(input_dim, output_dim)`,
            set `axis` to `0` to constrain each weight vector
            of length `(input_dim,)`.
            In a `Conv2D` layer with `data_format="channels_last"`,
            the weight tensor has shape
            `(rows, cols, input_depth, output_depth)`,
            set `axis` to `[0, 1, 2]`
            to constrain the weights of each filter tensor of size
            `(rows, cols, input_depth)`.
    r*         ?r   c                 C   s   || _ || _|| _|| _d S r   	min_valuer   rater   )r   r4   r   r5   r   r   r   r
   r      s   
zMinMaxNorm.__init__c                 C   sb   t |}ttjt|| jdd}| jt|| j	| j
 d| j |  }||t  |   S )NTr      )r   r   r   r    r!   r"   r   r5   r#   r4   r   r$   r%   r   r   r
   r      s   
zMinMaxNorm.__call__c                 C   s   | j | j| j| jdS )Nr3   r3   r   r   r   r
   r      s
   zMinMaxNorm.get_configN)r*   r2   r2   r   r(   r   r   r   r
   r1      s
    
	r1   N)
	keras.srcr   r   keras.src.api_exportr   r   r   r)   r.   r1   r   r   r   r
   <module>   s    
I
&
