
    3j                       S SK Jr  S SKJrJr  S SKJrJr  S SKJ	r	  S SK
r
\	(       a  S SKJr  / SQr " S S	\5      r\" S
S9 " S S\5      5       r\" S
S9 " S S\5      5       r\" S
S9 " S S\5      5       r\" S
S9 " S S5      5       r\" S
S9 " S S5      5       r\ " S S5      5       r          SS jr S       SS jjrg)    )annotations)ABCabstractmethod)	dataclassfield)TYPE_CHECKINGN)Mapping)	DivisibleBy	ExactDimsFunctionConstraintsMinDimsParamConstraint	ShapeRuleValidationResultvalidate_function_callvalidate_paramc                  @    \ rS rSrSr\SS j5       r\SS j5       rSrg)	r      z&Base class for shape validation rules.c                    g)z*Check if tensor satisfies this shape rule.N selftensors     S/home/wildlama/miniconda3/lib/python3.13/site-packages/comfy_kitchen/constraints.pycheckShapeRule.check!        	    c                    g)z'Human-readable description of the rule.Nr   r   s    r   describeShapeRule.describe&   r   r   r   Nr   torch.Tensorreturnboolr%   str)	__name__
__module____qualname____firstlineno____doc__r   r   r!   __static_attributes__r   r   r   r   r      s+    0   r   r   T)frozenc                  B    \ rS rSr% SrS\S'   S\S'   S
S jrSS jrSrg	)r
   ,   z7Check that a tensor dimension is divisible by a factor.intdimfactorc                    UR                  5       U R                   ::  a  gUR                  U R                      U R                  -  S:H  $ )NFr   )r3   shaper4   r   s     r   r   DivisibleBy.check3   s8    ::<488#||DHH%3q88r   c                :    SU R                    SU R                   3$ )Nzdim[z] divisible by )r3   r4   r    s    r   r!   DivisibleBy.describe8   s    dhhZt{{m<<r   r   Nr#   r'   	r)   r*   r+   r,   r-   __annotations__r   r!   r.   r   r   r   r
   r
   ,   s    A	HK9
=r   r
   c                  8    \ rS rSr% SrS\S'   S	S jrS
S jrSrg)r   <   z,Check that tensor has at least N dimensions.r2   ndimc                <    UR                  5       U R                  :  $ Nr3   r>   r   s     r   r   MinDims.checkB       zz|tyy((r   c                "    SU R                    S3$ )Nz	at least Dr>   r    s    r   r!   MinDims.describeE   s    499+Q''r   r   Nr#   r'   r:   r   r   r   r   r   <   s    6
I)(r   r   c                  8    \ rS rSr% SrS\S'   S	S jrS
S jrSrg)r   I   z+Check that tensor has exactly N dimensions.r2   r>   c                <    UR                  5       U R                  :H  $ r@   rA   r   s     r   r   ExactDims.checkO   rC   r   c                "    SU R                    S3$ )Nzexactly rE   rF   r    s    r   r!   ExactDims.describeR   s    $))A&&r   r   Nr#   r'   r:   r   r   r   r   r   I   s    5
I)'r   r   c                  b    \ rS rSr% SrSrS\S'   SrS\S'   SrS	\S
'   SS jr	SS jr
SS jrSrg)r   [   zConstraints 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_rulesc                    U R                   c  g[        U[        R                  5      (       a  UR                  U R                   ;   $ XR                   ;   $ )z"Check if value's dtype is allowed.T)rP   
isinstancetorchTensordtype)r   values     r   check_dtypeParamConstraint.check_dtypei   s@    ;;eU\\**;;$++--##r   c                x    U R                   b  U R                   OUnSU;   a  gUR                  R                  U;   $ )z$Check if tensor's device is allowed.*T)rQ   devicetype)r   r   default_devicesrQ   s       r   check_deviceParamConstraint.check_devicer   s5    "&,,":$,,'>}}!!W,,r   c                B   ^ [        U4S jU R                   5       5      $ )z*Check if tensor satisfies all shape rules.c              3  D   >#    U  H  oR                  T5      v   M     g 7fr@   )r   ).0ruler   s     r   	<genexpr>.ParamConstraint.check_shape.<locals>.<genexpr>{   s     C2B$::f%%2Bs    )allrR   r   s    `r   check_shapeParamConstraint.check_shapey   s    C$2B2BCCCr   )rX   ztorch.Tensor | torch.dtyper%   r&   )r   r$   r_   frozenset[str]r%   r&   r#   )r)   r*   r+   r,   r-   rP   r;   rQ   rR   rY   r`   ri   r.   r   r   r   r   r   [   s:     -1F)0%)G"))+K&+$-Dr   r   c                  `    \ rS rSr% Sr\" \S9rS\S'   \" S S9r	S\S'   S	r
S
\S'   SS jrSrg	)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                     [        SS15      $ )Ncudacpu)	frozensetr   r   r   <lambda>FunctionConstraints.<lambda>   s    IvW\oD^r   rk   r_   Ntuple[int, int] | Nonemin_compute_capabilityc           	         [        [        [        U R                  R	                  5       S S95      U R
                  U R                  45      $ )Nc                    U S   $ )Nr   r   )xs    r   rt   .FunctionConstraints.__hash__.<locals>.<lambda>   s    AaDr   )key)hashtuplesortedro   itemsr_   rw   r    s    r   __hash__FunctionConstraints.__hash__   sB    &**,.AB  ''
  	r   r   )r%   r2   )r)   r*   r+   r,   r-   r   dictro   r;   r_   rw   r   r.   r   r   r   r   r   ~   s:     */t)DF&D&+<^&_O^_5929r   r   c                  h    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   \SS	 j5       r	\SS
 j5       r
Srg)r      z Result of constraint validation.r&   successNz
str | Nonefailed_paramfailure_reasonc                     [        SS9$ )NT)r   r   r   r   r   okValidationResult.ok   s    --r   c                    [        SXS9$ )NF)r   r   r   r   )paramreasons     r   failValidationResult.fail   s    EYYr   r   )r%   r   )r   r(   r   r(   r%   r   )r)   r*   r+   r,   r-   r;   r   r   staticmethodr   r   r.   r   r   r   r   r      sF    *M#L*#!%NJ%. . Z Zr   r   c           	        Uc  [         R                  5       $ UR                  U5      (       d  [        U[        R
                  5      (       a9  [         R                  U SUR                   S[        UR                  5       35      $ [         R                  U SU S[        UR                  5       35      $ [        U[        R
                  5      (       d  [         R                  5       $ UR                  X5      (       dT  UR                  b  UR                  OUn[         R                  U SUR                  R                   S[        U5       35      $ UR                   HX  nUR                  U5      (       a  M  [         R                  U S[!        UR"                  5       SUR%                  5        35      s  $    [         R                  5       $ )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
zdtype z not in zdevice zshape z fails: )r   r   rY   rT   rU   rV   r   rW   setrP   r`   rQ   r]   r^   rR   r   listr6   r!   )namerX   
constraintr_   allowedre   s         r   r   r      s   " }""$$!!%((eU\\**#((u{{m8C
8I8I4J3KL  $((ugXc*2C2C.D-EF  eU\\**""$$""5::(2(:(:(F*$$O$$GELL--.hs7|nE
 	
 &&zz%  #((U[[8I7J(SWS`S`SbRc/dee '   r   c                   U R                   bU  Uc  [        R                  SS5      $ U R                   u  p4Uu  pVXV4X44:  a"  [        R                  SSU SU SU SU 35      $ U R                  R	                  5        HA  u  pxUR                  U5      n	[        XyXR                  5      n
U
R                  (       a  M?  U
s  $    [        R                  5       $ )a1  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
__hardware__z2CUDA compute capability required but not availablezcompute capability .z < required )
rw   r   r   ro   r   getr   r_   r   r   )constraintskwargscompute_capability	min_major	min_minor
curr_major
curr_minor
param_nameparam_constraintrX   results              r   r   r      s     ))5%#(( T   +AA	!3
#y&<<#((%j\:,l9+UVW`Vab 
 )4(:(:(@(@(B$


:&
3CE`E`a~~~M	 )C   r   )
r   r(   rX   z!torch.Tensor | torch.dtype | Noner   r   r_   rk   r%   r   r@   )r   r   r   z/Mapping[str, torch.Tensor | torch.dtype | None]r   rv   r%   r   )
__future__r   abcr   r   dataclassesr   r   typingr   rU   collections.abcr	   __all__r   r
   r   r   r   r   r   r   r   r   r   r   <module>r      sK   " # (   '
$  $=) = = $	(i 	( 	( $	'	 	' 	'" $D D DD $  4 Z Z Z +!
+!,+!  +! $	+!
 +!b 26"!$"!;"! /"! 	"!r   