o
    ziAO                     @   s~   d dl mZmZmZmZmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlZd dlZd dlZG dd dejZdS )    )	DDPMResnetBlockGaussianFourierProjectionSelfAttentionBlockUpsampleLayerDownsampleLayerCombineResnetBlockBigGANppconv3x3PositionalEncoding)get_activation)default_initNc                       sb   e Zd ZdZdddddddddd	dd
dddddddgdddfdedef fddZdd Z  ZS )NCSNppa  
    NCSN++ model

    Args:
        channels (int): Number of input channels. Default is 1.
        dimensions (int): Number of dimensions of the input data. Default is 2.
        nf (int): Number of filters in the first layer. Default is 128.
        ch_mult (tuple): Channel multiplier for each layer. Default is (2, 2, 2, 2).
        num_res_blocks (int): Number of residual blocks in each layer. Default is 2.
        activation_type (str): Type of activation function. Default is "swish".
        dropout (float): Dropout probability. Default is 0.
        resample_with_conv (bool): Whether to use convolutional resampling. Default is True.
        fir (bool): Whether to use finite impulse response filtering. Default is True.
        fir_kernel (tuple): FIR filter kernel. Default is (1, 3, 3, 1).
        skip_rescale (bool): Whether to rescale skip connections. Default is True.
        progressive (str): Type of progressive training. Default is "output_skip".
        progressive_input (str): Type of progressive
        init_scale (float): The initial scale for the function. Default is 1e-2.
        fourier_scale (float): The Fourier scale for the function. Default is 16.
        resblock_type (str): The type of residual block to use. Default is "biggan".
        combine_method (str): The method to use for combining the results. Default is "sum".
        attention (bool): Whether or not to use attention. Default is True.

             )r   r   r   r   swishg        T)r      r   r   output_skip
input_skipg{Gz?g      0@biggansumNoneNcondition_input_channelscondition_vector_channelsc           .         s,  t    |dvrtdd| _d}|d ur!t|ttfs!td|D ]i}| dvr2td| | dkr<d	| _n| dkrL| jrLtd
| | dkrmt|ttfs]tdt|| tshtd|d7 }q#| dkr}t|ts|tdq#| dkrt|tstdq#|| _	|| _
|d u rdn|| _|| _|| _|| _i d|d|d|d|d|d|d|d|	d|
d|d|d|d|d|d |d!|d"||||||d#| _t| | _}|| _|| _|| _t| | _}|| _| | _| | _|| _|d$v sJ |d%v sJ tjt| | jd&}|}d}| jrg }| j	D ]M}| dkrP||7 }|tj | j
| |d' |d7 }q0| d(krf||7 }|t!||d) q0| dkr|||7 }|t"| j||d* q0t#|| _$t!||d)t%||d+ t%|d+ |d+ g} t&' 0 t( | d j)j*| d j)_+| d j,-  t( | d, j)j*| d, j)_+| d, j,-  W d    n	1 sw   Y  tjt.||d-}!tjt/||	|
| jd.}"|d/kr|"|	|
dd0| _0n|d1kr	tjt/|	|
d	| jd2}#tjt1||	|
| jd.}$|d3kr"|$|	|
dd0| _2n|d1kr0tj|$|	|
d	d0}%|d4krEtjt3|||||d+ | jd5}&n|d6kr\tjt4|||	|
|||d+ | jd7	}&ntd8| d9|| j }'| t5|| j ||d: |g}(|})t6|D ]l}*t6|D ]}+|||*  },| |&|)|,d; |,})|(|) q|*|d kr|d4kr| |$|)d< n	| |&d	|)d= |d3kr| ||'|)d; |d>kr|)d,9 })n|d1kr| |%|'|)d; |)}'|(|) q|(d? })| |&|)d< | jr| |!|)d@ | |&|)d< d}-t7t6|D ]}*t6|d D ]}+|||*  },| |&|)|(8  |,d; |,})q|dkr|*|d kr|d/krd| tj9t:|)d+ dA|)dBdC | t5|)|||d- |}-nf|d1kr| tj9t:|)d+ dA|)dBdC | t5|)|)d	|dD |)}-nCt| dE|d/kr| tj9t:|)d+ dA|)dBdC | t5|)|d	||dF |}-n|d1kr| |#|-|)d; |)}-nt| dG|*dkr|d4kr| |"|)d< q| |&|)d	dH q|(rJ |d/kr| tj9t:|)d+ dA|)dBdC | t5|)|dI|d- t#| | _;d S )JN)r   r   r   zFInput must have 1, 2, or 3 spatial dimensions to use this architectureFr   z0Condition should be a list or a tuple of strings)nonediscrete_timelikecontinuous_timelikevectorinputz]Condition must be in ['none', 'discrete_timelike', 'continuous_timelike', 'input'], received r   TzMCannot have a mix of 'None' and other type of conditions, received the tuple r   zocondition_num_embedding must be provided and be a tuple or list of integer for discrete_timelike condition typer   r   zTcondition_input_channels must be provided and be an integer for input condition typer   zVcondition_vector_channels must be provided and be an integer for vector condition typechannelsnfactivation_typech_multnum_res_blocksresample_with_convdropoutfir
fir_kernelskip_rescaleprogressiveprogressive_input
init_scalefourier_scaleresblock_typecombine_method	attention)
dimensions	conditioncondition_num_embeddingr   r   )r   r   residual)r   r   r3   )methodr0   )num_embeddingsembedding_dimr   )	embed_dimscale)r   r7   r8      r   )r+   r0   )	with_convr&   r'   r0   r   )r&   r'   r:   r3   )r&   r'   r:   r0   r   ddpm)actr%   r+   r(   temb_dimr0   r   )r<   r%   r&   r'   r+   r(   r=   r0   zresblock type z unrecognized.)r0   )in_chout_ch)r>   )downr>   cat)r       gư>)
num_groupsnum_channelseps)biasr0    is not a valid name.)rG   r+   r0    is not a valid name)r>   upg      ?)<super__init__
ValueErrorconditioned
isinstancetuplelistlowerintcondition_typer2   r   r   r0   r   hyperparametersr   r<   r/   r    r#   lennum_resolutionsr(   r)   r*   r-   	functoolspartialr   appendnn	Embeddingr   r
   
ModuleListcondition_embedding_layersLineartorchno_gradr   weightshapedatarG   zero_r   r   pyramid_upsampler   pyramid_downsampler   r   r	   rangereversedpop	GroupNormminall_modules).selfr   r0   r    r"   r#   r!   r%   r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r1   r2   r   r   kwargsdiscrete_indexcr<   rW   combinertime_input_nfr^   c_typemodules	AttnBlockUpsamplerf   
Downsamplerg   ResnetBlockinput_pyramid_chhs_cr>   i_leveli_blockr?   
pyramid_ch	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/score_models/architectures/ncsnpp.pyrL   $   s  



	




.






	














zNCSNpp.__init__c                 G   s  |j ^}}| j}d}|| ||d}|d7 }d}	| jrit|t| jkr6tdt| j dt| dt|D ].\}
}d| j|
  v sPd| j|
  v rh| j	|	 ||d}t
j||gdd	}|	d7 }	q:|| |}|d7 }|| | |}|d7 }| jrt|D ]\}
}| j|
  d
krt
j||gdd	}qd }| jdkr|}|| |g}|d7 }t| jD ]}t| jD ]}|| |d |}t
| |d7 }|| q|| jd kr?| jdkr|| |d }|d7 }n|| |d |}|d7 }| jdkr| |}|| ||}|d7 }n$| jdkr:|| |}|d7 }| jr4|| td }n|| }|}|| q|d }|| ||}|d7 }| jr]|| |}|d7 }|| ||}|d7 }d }tt| jD ]}t| jd D ]}|| t
j|| gdd	|}|d7 }qz| jdkr8|| jd kr| jdkr| || |}|d7 }|| |}|d7 }nz| jdkr| || |}|d7 }|| |}|d7 }n\t| j d| jdkr| |}| || |}|d7 }|| |}|d7 }|| }n-| jdkr0|| |}|d7 }| jr)|| td }n|| }|}nt| j d|dkrZ| jdkrO|| |}|d7 }qq|| ||}|d7 }qq|raJ | jdkrj|}n| || |}|d7 }|| |}|d7 }|t|ksJ |S )Nr   rB   r   zThe network requires z additional arguments, but z were provided.timeliker   )dimr   r   r;   r   r3   g       @r   rH   rI   )rc   rm   viewrN   rV   rT   rM   	enumeraterR   r^   r`   rA   r<   r*   rh   rW   r#   varrZ   r-   rg   r(   npsqrtr/   ri   rj   r)   rf   )rn   txargsBDru   m_idxtembc_idxjr1   c_embinput_pyramidhsr|   r}   hpyramid	pyramid_hr   r   r   forward#  s   
 $






 





zNCSNpp.forward)__name__
__module____qualname____doc__rS   rL   r   __classcell__r   r   r   r   r      s@      r   )score_models.layersr   r   r   r   r   r   r   r	   r
   score_models.utilsr   score_models.definitionsr   torch.nnr[   rX   r`   numpyr   Moduler   r   r   r   r   <module>   s   , 