
    Z jB                        S SK r S SK Jr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SS	KJrJrJr  S
SKJr  S r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r\ " S S\
5      5       r\" SS9 " S S \5      5       rS S/rg)!    N)nn   )initialization)load_backbone)DepthEstimatorOutput)PreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tuple   )CHMv2Configc                     U R                   b1  [        U R                   S5      (       a  U R                   R                  $ U R                  $ )Nhidden_size)backbone_confighasattrr   )configs    y/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/models/chmv2/modeling_chmv2.py_get_backbone_hidden_sizer   "   s>    )gf6L6Lm.\.\%%111!!!    c                   >   ^  \ rS rSrS\S\S\4U 4S jjrS rSrU =r	$ )CHMv2ReassembleLayer)   r   channelsfactorc           	      P  > [         TU ]  5         [        U5      n[        R                  " XBSS9U l        US:  a  [        R                  " X"X3SS9U l        g US:X  a  [        R                  " 5       U l        g US:  a)  [        R                  " X"S[        SU-  5      SS9U l        g g )Nr   )in_channelsout_channelskernel_sizer   r   stridepaddingr   )
super__init__r   r   Conv2d
projectionConvTranspose2dresizeIdentityint)selfr   r   r   r   	__class__s        r   r$   CHMv2ReassembleLayer.__init__*   s    /7))`ab A:,,XVlmnDKq[++-DKaZ))HAcRSV\R\oghiDK r   c                 J    U R                  U5      nU R                  U5      nU$ Nr&   r(   )r+   hidden_states     r   forwardCHMv2ReassembleLayer.forward9   s$    |4{{<0r   r0   )
__name__
__module____qualname____firstlineno__r   r*   r$   r2   __static_attributes____classcell__r,   s   @r   r   r   )   s+    j{ jc j3 j r   r   c                   ~   ^  \ rS rSrSrS\4U 4S jjrS	S\\R                     S\\R                     4S jjr
SrU =r$ )
CHMv2ReassembleStage?   z
Reassemble stage that processes hidden states from the backbone into image-like feature
representations at various resolutions.
r   c           	        > [         TU ]  5         Xl        UR                  U l        [        R
                  " 5       U l        [        UR                  UR                  5       H)  u  p#U R                  R                  [        UUUS95        M+     [        U5      nU R                  S:X  a  [        R
                  " 5       U l        [        [        U R                  5      5       H^  nU R                  R                  [        R                   " [        R"                  " SU-  U5      [        R$                  " 5       5      5        M`     g g )N)r   r   r   project   )r#   r$   r   readout_typer   
ModuleListlayerszippost_process_channelsreassemble_factorsappendr   r   readout_projectsrangelen
SequentialLinearGELU)r+   r   r   r   r   _r,   s         r   r$   CHMv2ReassembleStage.__init__E   s    "//mmo$'(D(DfF_F_$` LKK$!)! %a 07	)$&MMOD!3t{{+,%%,,R]]299Q_Va;bdfdkdkdm-no - *r   hidden_statesreturnc                    / n[        U5       GH  u  pV[        U[        [        45      (       Ga  [	        U5      S:X  a  US   US   pvUR
                  nU R                  S:X  a  UR                  S5      R                  SS5      nUR                  S5      R                  U5      n	U R                  U   " [        R                  " Xi4S5      5      nUR                  SSS5      R                  U5      nOU R                  S:X  a4  UR                  S5      UR                  S5      -   nUR                  U5      nObUR!                  5       S:X  aN  US S 2SS 24   nUR
                  u  pnUR                  XX<5      nUR                  SSSS5      R#                  5       nU R$                  U   " U5      nUR'                  U5        GM     U$ )Nr@   r   r   r?   addr   )	enumerate
isinstancetuplelistrJ   shaperA   flatten	transpose	unsqueeze	expand_asrH   torchcatpermutereshapedim
contiguousrC   rG   )r+   rP   patch_heightpatch_widthout	layer_idxr1   	cls_tokenfeature_shapereadout
batch_sizerN   num_channelss                r   r2   CHMv2ReassembleStage.forwardZ   s   '0'?#I,663|;LPQ;Q*6q/<?i , 2 2$$	1#/#7#7#:#D#DQ#JL'11!4>>|LG#'#8#8#CEII|NegiDj#kL#/#7#71a#@#H#H#WL&&%/#/#7#7#:Y=P=PQS=T#TL#/#7#7#FL##%*#/12#6L2>2D2D/J<#/#7#7
R]#lL#/#7#71a#C#N#N#PL;;y1,?LJJ|$+ (@. 
r   )r   rC   rH   rA   NN)r4   r5   r6   r7   __doc__r   r$   rX   r^   Tensorr2   r8   r9   r:   s   @r   r<   r<   ?   sD    
p{ p*T%,,%7 aefkfrfras  r   r<   c                   f   ^  \ rS rSrSrU 4S jrS\R                  S\R                  4S jrSr	U =r
$ )CHMv2PreActResidualLayerw   z
ResidualConvUnit, pre-activate residual unit.

Args:
    config (`[CHMv2Config]`):
        Model configuration class defining the model architecture.
c           	      R  > [         TU ]  5         [        R                  " 5       U l        [        R
                  " UR                  UR                  SSSSS9U l        [        R                  " 5       U l        [        R
                  " UR                  UR                  SSSSS9U l	        g )Nr   r   T)r   r!   r"   bias)
r#   r$   r   ReLUactivation1r%   fusion_hidden_sizeconvolution1activation2convolution2r+   r   r,   s     r   r$   !CHMv2PreActResidualLayer.__init__   s    779II%%%%
 779II%%%%
r   r1   rQ   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nX-   $ r/   )rw   ry   rz   r{   )r+   r1   residuals      r   r2    CHMv2PreActResidualLayer.forward   sP    ''5((6''5((6&&r   )rw   rz   ry   r{   )r4   r5   r6   r7   ro   r$   r^   rp   r2   r8   r9   r:   s   @r   rr   rr   w   s-    
.'ELL 'U\\ ' 'r   rr   c                   B   ^  \ rS rSrSS\S\4U 4S jjjrSS jrSrU =r	$ )	CHMv2FeatureFusionLayer   r   is_first_layerc                    > [         TU ]  5         X l        [        R                  " UR
                  UR
                  SSS9U l        U(       d  [        U5      U l        [        U5      U l	        g )Nr   T)r   ru   )
r#   r$   r   r   r%   rx   r&   rr   residual_layer1residual_layer2)r+   r   r   r,   s      r   r$    CHMv2FeatureFusionLayer.__init__   sU    ,))F$=$=v?X?Xfgnrs#;F#CD 7?r   c                    Ubo  U R                   (       d^  UR                  UR                  :w  a1  UR                  u    pEn[        R                  R	                  X%U4SSS9nXR                  U5      -   nU R                  U5      nUc  SS0OSU0n[        R                  R                  " U40 UDSSS.D6nU R                  U5      nU$ )	NbilinearF)sizemodealign_cornersscale_factorr@   r   T)r   r   )r   rY   r   
functionalinterpolater   r   r&   )r+   r1   r   r   rN   heightwidthmodifiers           r   r2   CHMv2FeatureFusionLayer.forward   s    (;(;!!X^^3&2&8&8#1e==44E?SX 5  (*>*>x*HHL++L9*.,NA&VTN}}00

 	
 |4r   )r   r&   r   r   )Frn   )
r4   r5   r6   r7   r   boolr$   r2   r8   r9   r:   s   @r   r   r      s)    	@{ 	@D 	@ 	@ r   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )CHMv2UpsampleConvHead   z
Convolutional head with intermediate upsampling.

Architecture: Conv3x3 -> 2x bilinear upsample -> Conv3x3 -> ReLU -> Conv1x1.
c                 <  > [         TU ]  5         [        R                  " [        R                  " XS-  SSSS9[        R
                  " SSSS9[        R                  " US-  USSSS9[        R                  " 5       [        R                  " X2SSSS9/5      U l        g )	Nr@   r   r   r    r   T)r   r   r   r   )r#   r$   r   rB   r%   Upsamplerv   head)r+   featuresnumber_output_channelsn_hidden_channelsr,   s       r   r$   CHMv2UpsampleConvHead.__init__   s    MM		(MqTUV4P		(a-):RS]^_			+QR[\fgh
	r   c                 <    U R                    H  nU" U5      nM     U$ r/   r   )r+   rP   layers      r   r2   CHMv2UpsampleConvHead.forward   s     YYE!-0M r   r   )   )	r4   r5   r6   r7   ro   r$   r2   r8   r9   r:   s   @r   r   r      s    

 r   r   c                      ^  \ rS rSrSrS\4U 4S jjrS\\R                     S\
S\
S\R                  4S	 jrS\\R                     S\
S\
S\R                  4S
 jrSrU =r$ )	CHMv2Head   z
CHMv2 dense-prediction head adapted from DPT.

Integrates reassemble, projection convs, feature fusion, and UpConv depth head.
r   c                 @  > [         TU ]  5         Xl        [        U5      U l        [
        R                  " 5       U l        UR                   H=  nU R                  R                  [
        R                  " X!R                  SSSS95        M?     [
        R                  " 5       U l        [        [        UR                  5      5       H(  nU R                  R                  [        XS:H  S95        M*     [!        UR                  UR"                  UR$                  S9U l        g )Nr   r   F)r   r"   ru   r   )r   )r   r   r   )r#   r$   r   r<   reassemble_stager   rB   convsrE   rG   r%   rx   fusion_layersrI   rJ   r   r   r   head_hidden_size
conv_depth)r+   r   channelidxr,   s       r   r$   CHMv2Head.__init__   s     4V <]]_
33GJJbii1J1JXYcdkpqr 4  ]]_V99:;C%%&=f]^V^&`a < 0..#)#@#@$55
r   rP   rd   re   rQ   c                 f   U R                  XU5      n[        U5       VVs/ s H  u  pEU R                  U   " U5      PM     nnnUR                  5         U R                  S   " US   5      n[        S[        U R                  5      5       H  nU R                  U   " XvU   5      nM     U$ s  snnf )Nr   r   )r   rU   r   reverser   rI   rJ   )r+   rP   rd   re   ifeaturer   fused_hidden_states           r   forward_featuresCHMv2Head.forward_features   s    --m;W=F}=UV=UzqDJJqM'*=UV!//28A;?q#d0012A!%!3!3A!67ITU;!W 3 "! Ws   !B-c                 L    U R                  XU5      nU R                  U5      nU$ r/   )r   r   )r+   rP   rd   re   rf   s        r   r2   CHMv2Head.forward  s'    ##MMooc"
r   )r   r   r   r   r   )r4   r5   r6   r7   ro   r   r$   rX   r^   rp   r*   r   r2   r8   r9   r:   s   @r   r   r      s~    
{ 
(
"d5<<.@ 
"PS 
"be 
"jojvjv 
"T%,,%7 s Y\ afamam  r   r   c                      ^  \ rS rSrSrS\4U 4S jjrS\S\R                  S\R                  4S jrS	\R                  S
\R                  S\R                  4S jrS\R                  S\R                  4S jrSrU =r$ )CHMv2FeaturesToDepthi  zJConverts raw logits from the CHMv2 head into a depth map using depth bins.r   c                    > [         TU ]  5         UR                  U l        UR                  U l        UR                  U l        UR
                  U l        SU l        SU l        SU l        g )Ng-C6?g:0yE>g-q=)	r#   r$   	min_depth	max_depthbins_strategynorm_strategy_mixlog_max_clamp_value_mixlog_eps_shift_mixlog_epsr|   s     r   r$   CHMv2FeaturesToDepth.__init__  s\    ))))#11#11'+$!% r   n_binsdevicerQ   c                    U R                   S-  n[        R                  " U R                  X1US9n[        R                  " [        R                  " [        R
                  " [        R                  " U R                  US95      [        R
                  " [        R                  " X2S95      UUS95      n[        R                  " SSXS9nXe-  SU-
  U-  -   nU$ )z
Creates mixed log bins interpolated between linear and log distributions.

The max_depth is divided by 8.0 internally; this scaling is reversed in
`_create_outputs_with_mixlog_norm` by multiplying by 8.0.
       @r         ?        )r   r^   linspacer   explogtensor)r+   r   r   scaled_max_depthlinearr   interp_weightbinss           r   _create_mixlog_bins(CHMv2FeaturesToDepth._create_mixlog_bins  s      >>C/0@QWXiiNN		%,,t~~fEF		%,,'7GH	
 sCG"cM&9V%CCr   inputr   c                    [         R                  " U5      nUR                  SSS9nU* R                  S5      R	                  U R
                  5      U R                  -   nX5-   nUR                  SSS9n[         R                  " USSSS9R                  U R                  5      nXg-  nUR                  SSSS5      R                  U R                  5      n	X-  R                  SSS9R                  U R                  5      n
U
S-  n
U
$ )	zEConverts depth bin logits to depth values using mixlog normalization.r   Trb   keepdimr   r   )nanposinfneginfrS   r   )r^   reluamin	clamp_min	clamp_maxr   r   sum
nan_to_numr   view)r+   r   r   logitsmin_per_sampleshift
logits_posdenomweightsbins_broadcastoutputs              r    _create_outputs_with_mixlog_norm5CHMv2FeaturesToDepth._create_outputs_with_mixlog_norm.  s    E"D9 ++C0::4;W;WX[_[q[qq^
1d3  CCHRRSWScScd$1b!Q/99$:J:JK*//At/DNNtO_O_`#r   xc                 @   UR                   S   nUS:  Ga  U R                  S:X  a5  [        R                  " U R                  U R
                  X!R                  S9nOU R                  S:X  a  [        R                  " [        R                  " [        R                  " U R                  5      5      [        R                  " [        R                  " U R
                  5      5      UUR                  S9n[        R                  " U5      nOU R                  X!R                  5      nU R                  S;   a  U R                  S:X  a/  [        R                  " U5      nSnXE-   nXDR                  SSS9-  nONU R                  S	:X  a  [        R                  " USS
9nO([        R                  " U5      nXDR                  SSS9-  n[        R                   " SXC/5      R#                  SS
9nU$ U R%                  X5      n U$ [        R                  " U5      U R                  -   nU$ )Nr   r   r   r   )r   softmaxsigmoidg?Tr   r   rb   zikmn,k->imn)rY   r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   einsumr\   r   )r+   r   r   r   logitepsr   s          r   r2   CHMv2FeaturesToDepth.forwardA  s   A:!!X-~~dnndnnfU]U]^##u,~~IIell4>>:;IIell4>>:;88	 yy//A!!%EE%%1!JJqMEC!KE!II!TI$BBE''94!MM!3E!MM!,E!II!TI$BBEme]CMMRSMT 	 >>qG  ZZ]T^^3Fr   )r   r   r   r   r   r   r   )r4   r5   r6   r7   ro   r   r$   r*   r^   r   rp   r   r   r2   r8   r9   r:   s   @r   r   r     s}    T!{ !# u||  *ell %,, [`[g[g &" "%,, " "r   r   c                   X   ^  \ rS rSr% \\S'   SrSrSrSr	Sr
SrSrSrS	U 4S jjrSrU =r$ )
CHMv2PreTrainedModelif  r   chmv2pixel_values)imageTc                 f  > [         TU ]  U5        [        U[        R                  [        R
                  [        R                  45      (       ac  [        R                  " UR                  SU R                  R                  S9  UR                  b!  [        R                  " UR                  5        g g g )Nr   )meanstd)r#   _init_weightsrV   r   rL   r%   r'   inittrunc_normal_weightr   initializer_rangeru   zeros_)r+   moduler,   s     r   r   "CHMv2PreTrainedModel._init_weightsr  sw    f%fryy"))R5G5GHIIv}}3DKK<Y<YZ{{&FKK( ' Jr    )rQ   N)r4   r5   r6   r7   r   __annotations__base_model_prefixmain_input_nameinput_modalitiessupports_gradient_checkpointing_supports_sdpa_supports_flash_attn_supports_flex_attn_supports_attention_backendr   r8   r9   r:   s   @r   r   r   f  sA    $O!&*#N"&) )r   r   z
    CHMv2 Model with a depth estimation head on top (consisting of convolutional layers) e.g. for canopy height
    estimation.
    )custom_introc                      ^  \ rS rSrS\4U 4S jjrS r\\ SS\	R                  S\	R                  S-  S\\   S	\4S
 jj5       5       rSrU =r$ )CHMv2ForDepthEstimationiz  r   c                    > [         TU ]  U5        [        U5      U l        [	        U5      U l        [        U5      U l        U R                  5         g r/   )	r#   r$   r   backboner   r   r   features_to_depth	post_initr|   s     r   r$    CHMv2ForDepthEstimation.__init__  s?     %f-f%	!5f!=r   c                 6    U R                   R                  5       $ r/   )r  get_input_embeddings)r+   s    r   r  ,CHMv2ForDepthEstimation.get_input_embeddings  s    }}1133r   Nr   labelskwargsrQ   c                    SnUb  [        S5      eUR                  u    pVnU R                  R                  nXh-  n	Xx-  n
U R                  " U40 UD6n[        [        UR                  UR                  5      5      nU R                  XU
5      nU R                  U5      nUR                  SS9n[        UUUR                  UR                  S9$ )z
labels (`torch.LongTensor` of shape `(batch_size, height, width)`, *optional*):
    Ground truth depth estimation maps for computing the loss.
NzTraining is not implemented yetr   r   )losspredicted_depthrP   
attentions)NotImplementedErrorrY   r   
patch_sizer  rX   rD   feature_maps
cls_tokensr   r  squeezer   rP   r!  )r+   r   r  r  r  rN   r   r   r#  rd   re   backbone_outputintermediate_featureshead_outputr   s                  r   r2   CHMv2ForDepthEstimation.forward  s     %&GHH*001e[[++
+)--?? $S)E)EGaGa%b cii 5[Q00=)11a18#+)77&11	
 	
r   )r  r  r   r/   )r4   r5   r6   r7   r   r$   r  r   r   r^   FloatTensor
LongTensorr	   r
   r   r2   r8   r9   r:   s   @r   r  r  z  sr    { 4  +/ 
'' 
   4' 
 +,	 

 
 
   
r   r  )r^   r    r   r   backbone_utilsr   modeling_outputsr   modeling_utilsr   processing_utilsr	   utilsr
   r   r   configuration_chmv2r   r   Moduler   r<   rr   r   r   r   r   r   r  __all__r  r   r   <module>r6     s   ,   & + 4 - & I I ,"299 ,5299 5p''ryy ''T"bii "JBII 2*		 *ZW299 Wt )? ) )& /
2 /
/
d %&<
=r   