o >g @sVddlZddlmZddlmZd dedededefd d ZGd d d Zd eiZdS)N) rearrange)randint max_optionsvalue min_valuereturncs~t|}fddt|dD}fdd|d|D}t|ddkr9tdt|ddd}||Sd}||S)Ncsg|] }|dkr|qS)r.0irr F/home/comdoleger1/zen-flux-style-shape/comfy_extras/nodes_hypertile.py sz"random_divisor..rcsg|]}|qSr r r r r rrsrr)lowhighsize)minrangelenritem)rrrdivisorsnsidxr r rrandom_divisors rc@s,eZdZeddZdZdZdZddZdS) HyperTilec Cs@dddddddfdddd dfdd d d dfd d difdiS)NrequiredMODELINTri)defaultrmaxr BOOLEANr"F)model tile_size swap_size max_depth scale_depthr )sr r r INPUT_TYPESs  zHyperTile.INPUT_TYPESrpatchzmodel_patches/unetc sd|jjjd}td|dd_fdd}fdd}|} | || || fS)Nmodel_channels cs|jd}|d}g}tdD]}||dd||dd|q||vr|d}|d|d} |d} tt| | tt| | } } rXd||nd} t| | }t| | }||dkrt |d| || |||d}||| | f_ |||fS|||fS)Noriginal_shaperr$z$b (nh h nw w) c -> (b nh nw) (h w) c)hwnhnw) shaperappendrroundmathsqrtindexrrtemp)qkv extra_optionsZ model_chans orig_shapeZapply_tor r: aspect_ratiohwr6r7factorr8r9Zlatent_tile_sizer+r,selfr*r r hypertile_in+s$ ( &   z%HyperTile.patch..hypertile_incsJjdur#j\}}}}d_t|d||d}t|d||||d}|S)Nz(b nh nw) hw c -> b nh nw hw c)r8r9z"b nh nw (h w) c -> b (nh h nw w) c)r6r7)r@r)outrDr8r9r6r7)rJr r hypertile_outCs z&HyperTile.patch..hypertile_out)r( model_config unet_configr#r@cloneset_model_attn1_patchset_model_attn1_output_patch) rJr(r)r*r+r,r0rKrMmr rIrr/%s   zHyperTile.patchN) __name__ __module__ __qualname__ classmethodr. RETURN_TYPESFUNCTIONCATEGORYr/r r r rrs  rr) r=einopsrtorchrintrrNODE_CLASS_MAPPINGSr r r rs  ;