
    +j                       d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
Z
e	rd dlmZ g dZ G d d	e          Z ed
           G d de                      Z ed
           G d de                      Z ed
           G d de                      Z ed
           G d d                      Z ed
           G d d                      Ze G d d                      Zd'd Z	 d(d)d&ZdS )*    )annotations)ABCabstractmethod)	dataclassfield)TYPE_CHECKINGN)Mapping)	DivisibleBy	ExactDimsFunctionConstraintsMinDimsParamConstraint	ShapeRuleValidationResultvalidate_function_callvalidate_paramc                  B    e Zd ZdZed
d            Zedd            Zd	S )r   z&Base class for shape validation rules.tensortorch.Tensorreturnboolc                    dS )z*Check if tensor satisfies this shape rule.N selfr   s     \/home/wildlama/comfy/ComfyUI/.venv/lib/python3.11/site-packages/comfy_kitchen/constraints.pycheckzShapeRule.check!   	     	    strc                    dS )z'Human-readable description of the rule.Nr   r   s    r   describezShapeRule.describe&   r   r   Nr   r   r   r   r   r    )__name__
__module____qualname____doc__r   r   r#   r   r   r   r   r      sX        00   ^    ^  r   r   T)frozenc                  8    e Zd ZU dZded<   ded<   dd	ZddZdS )r
   z7Check that a tensor dimension is divisible by a factor.intdimfactorr   r   r   r   c                |    |                                 | j         k    rdS |j        | j                  | j        z  dk    S )NFr   )r-   shaper.   r   s     r   r   zDivisibleBy.check3   s7    ::<<48##5|DH%3q88r   r    c                &    d| j          d| j         S )Nzdim[z] divisible by )r-   r.   r"   s    r   r#   zDivisibleBy.describe8   s    <dh<<t{<<<r   Nr$   r%   r&   r'   r(   r)   __annotations__r   r#   r   r   r   r
   r
   ,   sV         AAHHHKKK9 9 9 9
= = = = = =r   r
   c                  .    e Zd ZU dZded<   ddZdd
ZdS )r   z,Check that tensor has at least N dimensions.r,   ndimr   r   r   r   c                <    |                                 | j        k    S Nr-   r5   r   s     r   r   zMinDims.checkB       zz||ty((r   r    c                    d| j          dS )Nz	at least Dr5   r"   s    r   r#   zMinDims.describeE   s    '49''''r   Nr$   r%   r2   r   r   r   r   r   <   sM         66III) ) ) )( ( ( ( ( (r   r   c                  .    e Zd ZU dZded<   ddZdd
ZdS )r   z+Check that tensor has exactly N dimensions.r,   r5   r   r   r   r   c                <    |                                 | j        k    S r7   r8   r   s     r   r   zExactDims.checkO   r9   r   r    c                    d| j          dS )Nzexactly r;   r<   r"   s    r   r#   zExactDims.describeR   s    &$)&&&&r   Nr$   r%   r2   r   r   r   r   r   I   sM         55III) ) ) )' ' ' ' ' 'r   r   c                  V    e Zd ZU dZdZded<   dZded<   dZded	<   ddZddZ	ddZ
dS )r   a  Constraints for a single parameter.

    Attributes:
        dtypes: Allowed dtypes for this parameter. None means any dtype.
        devices: Allowed device types. None means inherit from function default.
        shape_rules: Tuple of shape rules that must all pass.
    Nzfrozenset[torch.dtype] | Nonedtypeszfrozenset[str] | Nonedevicesr   ztuple[ShapeRule, ...]shape_rulesvaluetorch.Tensor | torch.dtyper   r   c                v    | j         dS t          |t          j                  r|j        | j         v S || j         v S )z"Check if value's dtype is allowed.NT)rA   
isinstancetorchTensordtype)r   rD   s     r   check_dtypezParamConstraint.check_dtypei   s?    ;4eU\** 	.;$+--##r   r   r   default_devicesfrozenset[str]c                J    | j         | j         n|}d|v rdS |j        j        |v S )z$Check if tensor's device is allowed.N*T)rB   devicetype)r   r   rL   rB   s       r   check_devicezParamConstraint.check_devicer   s2    "&,":$,,'>>4}!W,,r   c                D    t          fd| j        D                       S )z*Check if tensor satisfies all shape rules.c              3  B   K   | ]}|                               V  d S r7   )r   ).0ruler   s     r   	<genexpr>z.ParamConstraint.check_shape.<locals>.<genexpr>{   s/      CC$4::f%%CCCCCCr   )allrC   r   s    `r   check_shapezParamConstraint.check_shapey   s)    CCCC$2BCCCCCCr   )rD   rE   r   r   )r   r   rL   rM   r   r   r$   )r&   r'   r(   r)   rA   r3   rB   rC   rK   rR   rY   r   r   r   r   r   [   s           -1F0000%)G)))))+K++++$ $ $ $- - - -D D D D D Dr   r   c                  p    e Zd ZU dZ ee          Zded<    ed           Zded<   dZ	d	ed
<   ddZ
dS )r   a  Constraints for an entire function.

    Attributes:
        params: Per-parameter constraints keyed by parameter name.
        default_devices: Default allowed devices when param doesn't specify.
        min_compute_capability: Minimum CUDA compute capability (major, minor).
    )default_factoryzdict[str, ParamConstraint]paramsc                 $    t          ddh          S )Ncudacpu)	frozensetr   r   r   <lambda>zFunctionConstraints.<lambda>   s    IvW\oD^D^ r   rM   rL   Ntuple[int, int] | Nonemin_compute_capabilityr   r,   c                    t          t          t          | j                                        d                     | j        | j        f          S )Nc                    | d         S )Nr   r   )xs    r   ra   z.FunctionConstraints.__hash__.<locals>.<lambda>   s
    AaD r   )key)hashtuplesortedr\   itemsrL   rc   r"   s    r   __hash__zFunctionConstraints.__hash__   sM    &**,,..AAABB '
   	r   )r   r,   )r&   r'   r(   r)   r   dictr\   r3   rL   rc   rl   r   r   r   r   r   ~   s           */t)D)D)DFDDDD&+e<^<^&_&_&_O____599999     r   r   c                  j    e Zd ZU dZded<   dZded<   dZded<   edd	            Zedd            Z	dS )r   z Result of constraint validation.r   successNz
str | Nonefailed_paramfailure_reasonr   c                 "    t          d          S )NT)ro   r   r   r   r   okzValidationResult.ok   s    ----r   paramr    reasonc                &    t          d| |          S )NF)ro   rp   rq   rs   )ru   rv   s     r   failzValidationResult.fail   s    ERXYYYYr   )r   r   )ru   r    rv   r    r   r   )
r&   r'   r(   r)   r3   rp   rq   staticmethodrt   rx   r   r   r   r   r      s         **MMM#L####!%N%%%%. . . \. Z Z Z \Z Z Zr   r   namer    rD   !torch.Tensor | torch.dtype | None
constraintrL   rM   r   c           	        |t                                           S |                    |          st          |t          j                  r8t                               | d|j         dt          |j	                             S t                               | d| dt          |j	                             S t          |t          j                  st                                           S |
                    ||          sH|j        |j        n|}t                               | d|j        j         dt          |                     S |j        D ]^}|                    |          sGt                               | dt!          |j                   d|                                           c S _t                                           S )a_  Validate a single parameter against its constraint.

    Args:
        name: Parameter name (for error messages)
        value: The parameter value
        constraint: Constraint to validate against
        default_devices: Default devices from FunctionConstraints

    Returns:
        ValidationResult indicating success or failure with details
    Nzdtype z not in zdevice zshape z fails: )r   rt   rK   rG   rH   rI   rx   rJ   setrA   rR   rB   rP   rQ   rC   r   listr0   r#   )rz   rD   r|   rL   allowedrV   s         r   r   r      s   " }""$$$!!%(( eU\** 	#((Lu{LLC
8I4J4JLL   $((FuFFc*2C.D.DFF   eU\** %""$$$""5/:: 
(2(:(F*$$O$$EEL-EEs7||EE
 
 	
 & f fzz%   	f#((/dU[8I8I/d/dSWS`S`SbSb/d/deeeee	f    r   constraintskwargs/Mapping[str, torch.Tensor | torch.dtype | None]compute_capabilityrb   c                   | j         ]|t                              dd          S | j         \  }}|\  }}||f||fk     r't                              dd| d| d| d|           S | j                                        D ]<\  }}|                    |          }	t          ||	|| j                  }
|
j        s|
c S =t          	                                S )aM  Validate all parameters for a function call.

    Args:
        constraints: Function constraints to validate against
        kwargs: Keyword arguments passed to the function
        compute_capability: Current device's compute capability (major, minor)

    Returns:
        ValidationResult indicating success or first failure
    N__hardware__z2CUDA compute capability required but not availablezcompute capability .z < required )
rc   r   rx   r\   rk   getr   rL   ro   rt   )r   r   r   	min_major	min_minor
curr_major
curr_minor
param_nameparam_constraintrD   results              r   r   r      s    )5%#(( T    +A	9!3
J
#y)&<<<#((bjbb:bb9bbW`bb  
 )4(:(@(@(B(B  $
$

:&&
E3C[E`aa~ 	MMM	    r   )
rz   r    rD   r{   r|   r   rL   rM   r   r   r7   )r   r   r   r   r   rb   r   r   )
__future__r   abcr   r   dataclassesr   r   typingr   rH   collections.abcr	   __all__r   r
   r   r   r   r   r   r   r   r   r   r   <module>r      s   " " " " " " # # # # # # # # ( ( ( ( ( ( ( (              (''''''
 
 
$        $= = = = =) = = = $	( 	( 	( 	( 	(i 	( 	( 	( $	' 	' 	' 	' 	'	 	' 	' 	'" $D D D D D D D DD $       4 Z Z Z Z Z Z Z Z +! +! +! +!b 26"! "! "! "! "! "! "!r   