o
    ei                     @   s  d Z ddlmZ ddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZmZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& e$'e(Z)G dd dej*Z+	d2dej,dej-dej-dej-dej-dB de.de.fddZ/G dd  d ej,Z0G d!d" d"eZ1e"G d#d$ d$eZ2G d%d& d&e2Z3e"G d'd( d(e2Z4G d)d* d*e2eZ5e"d+d,G d-d. d.e2Z6e"G d/d0 d0e2Z7g d1Z8dS )3zPyTorch OPT model.    )CallableN)nn)BCEWithLogitsLossCrossEntropyLossMSELoss   )ACT2FN)CacheDynamicCache)GenerationMixin)create_causal_mask)FlashAttentionKwargs)GradientCheckpointingLayer)BaseModelOutputWithPastCausalLMOutputWithPastQuestionAnsweringModelOutput SequenceClassifierOutputWithPast)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tuplelogging   )	OPTConfigc                       sR   e Zd ZdZdedef fddZ		ddejd	ed
ejdB f fddZ  Z	S )OPTLearnedPositionalEmbeddingzN
    This module learns positional embeddings up to a fixed maximum size.
    num_embeddingsembedding_dimc                    s   d| _ t || j  | d S N   )offsetsuper__init__)selfr   r   	__class__ b/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/transformers/models/opt/modeling_opt.pyr#   0   s   z&OPTLearnedPositionalEmbedding.__init__r   Nattention_maskpast_key_values_lengthposition_idsc                    sL   |du rt j|dd}|| d  }|dd|df }t || j S )z3`input_ids_shape` is expected to be [bsz x seqlen].Nr   dim)torchcumsumlongr"   forwardr!   )r$   r)   r*   r+   r%   r'   r(   r1   6   s
   z%OPTLearnedPositionalEmbedding.forward)r   N)
__name__
__module____qualname____doc__intr#   r.   
LongTensorr1   __classcell__r'   r'   r%   r(   r   +   s    	r           modulequerykeyvaluer)   scalingdropoutc           
      K   s|   t ||dd| }|d ur|| }tjj|dt jd|j}tjj	||| j
d}t ||}	|	dd }	|	|fS )N)r-   dtypeptrainingr   r    )r.   matmul	transposer   
functionalsoftmaxfloat32torB   r?   rE   
contiguous)
r:   r;   r<   r=   r)   r>   r?   kwargsattn_weightsattn_outputr'   r'   r(   eager_attention_forwardH   s   
rP   c                       s   e Zd ZdZ	ddededB f fddZ				ddejd	e	dB d
ejdB de
dejdB deejejdB e	dB f fddZ  ZS )OPTAttentionz=Multi-headed attention from 'Attention Is All You Need' paperNconfig	layer_idxc                    s  t    || _|j| _|j| _|j| _|j	| _	|| _
|d u r*td| jj d | j| j | _d| _| j| j | jkrJtd| j d| j d| jd | _tj| j| j| j	d| _tj| j| j| j	d| _tj| j| j| j	d| _tj| j| j| j	d| _d S )	NzInstantiating z without passing a `layer_idx` is not recommended and will lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` when creating this class.Tz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: z).g      ࿩bias)r"   r#   rR   hidden_size	embed_dimnum_attention_heads	num_headsattention_dropoutr?   enable_biasrS   loggerwarning_oncer&   r2   head_dim	is_causal
ValueErrorr>   r   Lineark_projv_projq_projout_proj)r$   rR   rS   rM   r%   r'   r(   r#   b   s0   

zOPTAttention.__init__Fhidden_statespast_key_valuesr)   output_attentionscache_positionreturnc                 K   s  |  \}}}	| || j }
|
|d| j| jdd}
| |}| |}||d| j| jdd}||d| j| jdd}|durT|	||| j
d|i\}}t| jjt}|| |
|||f| jshdn| jdd|\}}|||d }| |}|sd}||fS )	z#Input shape: Batch x Time x Channelr@   r   r    Nri   r9   g      ?)r?   r>   )sizerd   r>   viewrY   r^   rG   rb   rc   updaterS   r   get_interfacerR   _attn_implementationrP   rE   r?   reshaperL   re   )r$   rf   rg   r)   rh   ri   rM   bsztgt_len_query_states
key_statesvalue_statesattention_interfacerO   rN   r'   r'   r(   r1      s>   




zOPTAttention.forwardN)NNFN)r2   r3   r4   r5   r   r6   r#   r.   Tensorr	   booltupler1   r8   r'   r'   r%   r(   rQ   _   s2    &rQ   c                       s   e Zd ZddededB f fddZ						ddejdejdB d	edB d
e	dB de	dB dej
dB dejdB dee deejeejejf dB f fddZ  ZS )OPTDecoderLayerNrR   rS   c                    s   t    |j| _t||d| _|j| _|j| _t|j	 | _
tj| j|jd| _tj| j|j|jd| _tj|j| j|jd| _tj| j|jd| _d S )N)rR   rS   elementwise_affinerT   )r"   r#   rV   rW   rQ   	self_attndo_layer_norm_beforer?   r   activation_functionactivation_fnr   	LayerNormlayer_norm_elementwise_affineself_attn_layer_normra   ffn_dimr[   fc1fc2final_layer_norm)r$   rR   rS   r%   r'   r(   r#      s   
zOPTDecoderLayer.__init__Frf   r)   rg   rh   	use_cacher+   ri   rM   rj   c              	   K   s   |}	| j r
| |}| jd||||||d|\}}
tjj|| j| jd}|	| }| j s2| |}|j}|d|	d}|}	| j rH| 
|}| |}| |}| |}tjj|| j| jd}|	| |}| j sq| 
|}|f}|r{||
f7 }|S )a  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`, *optional*): attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
            use_cache (`bool`, *optional*):
                If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding
                (see `past_key_values`).
            past_key_values (`Cache`, *optional*): cached past key and value projection states
            cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):
                Indices depicting the position of the input sequence tokens in the sequence..
        )rf   rg   r+   r)   rh   ri   rC   r@   Nr'   )r   r   r   r   rH   r?   rE   shaperp   rk   r   r   r   r   rl   )r$   rf   r)   rg   rh   r   r+   ri   rM   residualself_attn_weightshidden_states_shapeoutputsr'   r'   r(   r1      sB   

	






zOPTDecoderLayer.forwardrx   )NNFFNN)r2   r3   r4   r   r6   r#   r.   ry   r	   rz   r7   r   r   r{   FloatTensorr1   r8   r'   r'   r%   r(   r|      s6    	
r|   c                   @   s8   e Zd ZU eed< dZdZdgZdZdZ	dZ
dZdZdS )OPTPreTrainedModelrR   modelTr|   N)r2   r3   r4   r   __annotations__base_model_prefixsupports_gradient_checkpointing_no_split_modules_supports_attention_backend_supports_flash_attn_supports_sdpa_supports_flex_attn_can_compile_fullgraphr'   r'   r'   r(   r     s   
 r   c                       s   e Zd ZdZdef fddZe										ddejdB dej	dB de
dB d	ejdB d
edB dedB dedB dedB dejdB dej	dB dee deeB fddZ  ZS )
OPTDecoderz
    Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`OPTDecoderLayer`]

    Args:
        config: OPTConfig
    rR   c                    s  t     j| _ j| _ j| _ j| _ j| _t	
 j j| j| _t j j| _ j jkr?t	j j jdd| _nd | _ j jkrTt	j j jdd| _nd | _ jrh jsht	j j jd| _nd | _t	 fddt jD | _d| _|   d S )NFrT   r}   c                    s   g | ]}t  |d qS ))rS   )r|   ).0irR   r'   r(   
<listcomp>Q  s    z'OPTDecoder.__init__.<locals>.<listcomp>)r"   r#   r?   	layerdroppad_token_idpadding_idxmax_position_embeddingsmax_target_positions
vocab_sizer   	Embeddingword_embed_proj_dimembed_tokensr   rV   embed_positionsra   project_out
project_inr   _remove_final_layer_normr   r   r   
ModuleListrangenum_hidden_layerslayersgradient_checkpointing	post_initr$   rR   r%   r   r(   r#   2  s,   
 zOPTDecoder.__init__N	input_idsr)   rg   inputs_embedsr   rh   output_hidden_statesreturn_dictr+   ri   rM   rj   c              
   K   s  |dur|n| j j}|dur|n| j j}|dur|n| j j}|dur$|n| j j}|du |duA r4td| jrC| jrC|rCt	d d}|durP|
d|jd }|du rY| |}|re|du ret| j d}|durm| nd}|
du rtj|||jd  |jd	}
|du r||jd  }tj|jd ||jd	}|	du rtj|dd
}	|	| d  }	|	dd|df }	t| j |||
|d}| j|||	d}| jdur| |}|||j }|rdnd}|rdnd}t| jD ]8\}}|r||f7 }| jrtg }|| jk rq||f||	||||
d|}|d }|r"||d f7 }q| jdur.| |}| jdur9| |}|rA||f7 }t||||dS )aU  
        Args:
            input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
                Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you
                provide it.

                Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
                [`PreTrainedTokenizer.__call__`] for details.

                [What are input IDs?](../glossary#input-ids)
            attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
                Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.

                [What are attention masks?](../glossary#attention-mask)
            past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):
                It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache).

                Contains pre-computed hidden-states (key and values in the self-attention blocks and in the
                cross-attention blocks) that can be used (see `past_key_values` input) to speed up sequential decoding.

                If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those
                that don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of
                all `decoder_input_ids` of shape `(batch_size, sequence_length)`.

            inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
                Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation.
                This is useful if you want more control over how to convert `input_ids` indices into associated vectors
                than the model's internal embedding lookup matrix.
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
            output_hidden_states (`bool`, *optional*):
                Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors
                for more detail.
            return_dict (`bool`, *optional*):
                Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
            position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
                Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
                config.n_positions - 1]`. for padding use -1.

                [What are position IDs?](../glossary#position-ids)
            cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):
                Indices depicting the position of the input sequence tokens in the sequence. Contrarily to `position_ids`,
                this tensor is not affected by padding. It is used to update the cache in the correct position and to infer
                the complete sequence length.
        Nz:You must specify exactly one of input_ids or inputs_embedszX`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`.Fr@   r   r   r   devicer,   )rR   r   r)   ri   rg   )r+   r'   )r)   r+   rg   rh   r   ri   last_hidden_staterg   rf   
attentions) rR   rh   r   r   use_return_dictr`   r   rE   r\   r]   rl   r   r   r
   get_seq_lengthr.   aranger   onesr/   r0   r   r   r   rK   	enumerater   randr   r   r   r   )r$   r   r)   rg   r   r   rh   r   r   r+   ri   rM   past_seen_tokens
seq_lengthcausal_mask
pos_embedsrf   all_hidden_statesall_self_attnsidxdecoder_layerdropout_probabilitylayer_outputsr'   r'   r(   r1   W  s   @







zOPTDecoder.forward
NNNNNNNNNN)r2   r3   r4   r5   r   r#   r   r.   r7   ry   r	   r   rz   r   r   r{   r   r1   r8   r'   r'   r%   r(   r   *  sN    %	
r   c                       s   e Zd Zdef fddZdd Zdd Zee										dd	e	j
dB d
e	jdB dedB de	jdB dedB dedB dedB dedB de	j
dB de	jdB dee deeB fddZ  ZS )OPTModelrR   c                    s"   t  | t|| _|   d S rx   )r"   r#   r   decoderr   r   r%   r'   r(   r#     s   
zOPTModel.__init__c                 C   s   | j jS rx   r   r   r$   r'   r'   r(   get_input_embeddings	  s   zOPTModel.get_input_embeddingsc                 C   s   || j _d S rx   r   r$   r=   r'   r'   r(   set_input_embeddings  s   zOPTModel.set_input_embeddingsNr   r)   rg   r   r   rh   r   r   r+   ri   rM   rj   c                 K   s   |d ur|n| j j}|d ur|n| j j}|d ur|n| j j}|d ur$|n| j j}| jd|||	|||||d|
d
|}t|j|j|j	|j
dS )NT
r   r)   r+   rg   r   r   rh   r   r   ri   r   r'   )rR   rh   r   r   r   r   r   r   rg   rf   r   )r$   r   r)   rg   r   r   rh   r   r   r+   ri   rM   decoder_outputsr'   r'   r(   r1     s2   zOPTModel.forwardr   )r2   r3   r4   r   r#   r   r   r   r   r.   r7   ry   r	   r   rz   r   r   r{   r   r1   r8   r'   r'   r%   r(   r     sR    	
r   c                        s   e Zd ZddiZ fddZdd Zdd Zee																							
dde	j
d	B de	jd	B ded	B de	jd	B de	j
d	B ded	B ded	B ded	B ded	B de	j
d	B de	jd	B dee	jB dee deeB fddZ  ZS )OPTForCausalLMzlm_head.weightz!model.decoder.embed_tokens.weightc                    s8   t  | t|| _tj|j|jdd| _| 	  d S NFrT   )
r"   r#   r   r   r   ra   r   r   lm_headr   r   r%   r'   r(   r#   @  s   
zOPTForCausalLM.__init__c                 C   
   | j jjS rx   r   r   r   r   r'   r'   r(   r   J     
z#OPTForCausalLM.get_input_embeddingsc                 C      || j j_d S rx   r   r   r'   r'   r(   r   M     z#OPTForCausalLM.set_input_embeddingsNr   r   r)   rg   r   labelsr   rh   r   r   r+   ri   logits_to_keeprM   rj   c                 K   s   |dur|n| j j}|dur|n| j j}|	dur|	n| j j}	| jjd|||
|||||d|d
|}|j}t|tr@t	| dn|}| 
|dd|ddf  }d}|durf| jd||| j jd|}t|||j|j|jdS )an  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
            (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.

        Example:

        ```python
        >>> from transformers import AutoTokenizer, OPTForCausalLM

        >>> model = OPTForCausalLM.from_pretrained("facebook/opt-350m")
        >>> tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")

        >>> prompt = "Hey, are you conscious? Can you talk to me?"
        >>> inputs = tokenizer(prompt, return_tensors="pt")

        >>> # Generate
        >>> generate_ids = model.generate(inputs.input_ids, max_length=30)
        >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
        "Hey, are you conscious? Can you talk to me?\nI'm not conscious. I'm just a little bit of a weirdo."
        ```NTr   )logitsr   r   lossr   rg   rf   r   r'   )rR   rh   r   r   r   r   r   
isinstancer6   slicer   rL   loss_functionr   r   rg   rf   r   )r$   r   r)   rg   r   r   r   rh   r   r   r+   ri   r   rM   r   rf   slice_indicesr   r   r'   r'   r(   r1   P  s>   ) zOPTForCausalLM.forward)NNNNNNNNNNNr   )r2   r3   r4   _tied_weights_keysr#   r   r   r   r   r.   r7   ry   r	   r   rz   r6   r   r   r{   r   r1   r8   r'   r'   r%   r(   r   =  s`    
	
r   a  
    The OPT Model transformer with a sequence classification head on top (linear layer).

    [`OPTForSequenceClassification`] uses the last token in order to do the classification, as other causal models
    (e.g. GPT-2) do.

    Since it does classification on the last token, it requires to know the position of the last token. If a
    `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If
    no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the
    padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in
    each row of the batch).
    )custom_introc                       s   e Zd Zdef fddZe										ddejdB dejdB de	dB dejdB d	ejdB d
e
dB de
dB de
dB de
dB dejdB deeB fddZdd Zdd Z  ZS )OPTForSequenceClassificationrR   c                    s@   t  | |j| _t|| _tj|j| jdd| _| 	  d S r   )
r"   r#   
num_labelsr   r   r   ra   r   scorer   r   r%   r'   r(   r#     s
   
z%OPTForSequenceClassification.__init__Nr   r)   rg   r   r   r   rh   r   r   r+   rj   c                 K   sF  |	dur|	n| j j}	| j||||
|||||	d	}|d }| |}|dur/|jdd \}}n	|jdd \}}| j jdu rF|dkrFtd| j jdu rOd}n1|durt|| j jk|jt	j
}t	j|jd |jt	j
d}|| d}nd}t| jj d	 |t	j||jd
|f }d}|dur| j jdu r| jdkrd| j _n| jdkr|jt	jks|jt	jkrd| j _nd| j _| j jdkrt }| jdkr|| | }n+|||}n%| j jdkrt }||d| j|d}n| j jdkrt }|||}|	s|f|dd  }|dur|f| S |S t|||j|j|jdS )a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
        Nrg   r)   r+   r   r   rh   r   r   r   r    r   z=Cannot handle batch sizes > 1 if no padding token is defined.r@   )r   rB   z will not detect padding tokens in `inputs_embeds`. Results may be unexpected if using padding tokens in conjunction with `inputs_embeds.`r   
regressionsingle_label_classificationmulti_label_classificationr   )rR   r   r   r   r   r   r`   rK   r   r.   int32r   argmaxr\   r]   r&   r2   problem_typer   rB   r0   r6   r   squeezer   rl   r   r   rg   rf   r   )r$   r   r)   rg   r   r   r   rh   r   r   r+   rM   transformer_outputsrf   r   
batch_sizesequence_lengthlast_non_pad_tokennon_pad_masktoken_indicespooled_logitsr   loss_fctoutputr'   r'   r(   r1     sv   


"


z$OPTForSequenceClassification.forwardc                 C   r   rx   r   r   r'   r'   r(   r     r   z1OPTForSequenceClassification.get_input_embeddingsc                 C   r   rx   r   r   r'   r'   r(   r     r   z1OPTForSequenceClassification.set_input_embeddingsr   )r2   r3   r4   r   r#   r   r.   r7   r   r	   rz   r{   r   r1   r   r   r8   r'   r'   r%   r(   r     sL    		
]r   c                       s   e Zd Zdef fddZe											ddejdB dejdB de	dB dejdB d	ejdB d
ejdB de
dB de
dB de
dB de
dB dejdB deeB fddZdd Zdd Z  ZS )OPTForQuestionAnsweringrR   c                    s2   t  | t|| _t|jd| _|   d S r   )	r"   r#   r   r   r   ra   r   
qa_outputsr   r   r%   r'   r(   r#     s   
z OPTForQuestionAnswering.__init__Nr   r)   rg   r   start_positionsend_positionsr   rh   r   r   r+   rj   c                 K   sX  |
dur|
n| j j}
| j||||||||	|
d	}|d }| |}|jddd\}}|d }|d }d}|dur|durt| dkrO|d}t| dkr\|d}|d}|	d|
|j}|	d|
|j}t|d}|||}|||}|| d }|
s||f|dd  }|dur|f| S |S t||||j|jd	S )
a  
        Example:

        ```python
        >>> from transformers import AutoTokenizer, OPTForQuestionAnswering
        >>> import torch

        >>> torch.manual_seed(4)  # doctest: +IGNORE_RESULT
        >>> tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")

        >>> # note: we are loading a OPTForQuestionAnswering from the hub here,
        >>> # so the head will be randomly initialized, hence the predictions will be random
        >>> model = OPTForQuestionAnswering.from_pretrained("facebook/opt-350m")

        >>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"

        >>> inputs = tokenizer(question, text, return_tensors="pt")
        >>> with torch.no_grad():
        ...     outputs = model(**inputs)

        >>> answer_start_index = outputs.start_logits.argmax()
        >>> answer_end_index = outputs.end_logits.argmax()

        >>> answer_offset = len(tokenizer(question)[0])

        >>> predict_answer_tokens = inputs.input_ids[
        ...     0, answer_offset + answer_start_index : answer_offset + answer_end_index + 1
        ... ]
        >>> predicted = tokenizer.decode(predict_answer_tokens)
        >>> predicted
        ' a nice puppet'
        ```Nr   r   r   r@   r,   )ignore_indexr    )r   start_logits
end_logitsrf   r   )rR   r   r   r   splitr   rL   lenrk   clamprK   r   r   r   rf   r   )r$   r   r)   rg   r   r  r  r   rh   r   r   r+   rM   r   rf   r   r  r  
total_lossignored_indexr   
start_lossend_lossr   r'   r'   r(   r1   &  sP   0






zOPTForQuestionAnswering.forwardc                 C   r   rx   r   r   r'   r'   r(   r     r   z,OPTForQuestionAnswering.get_input_embeddingsc                 C   r   rx   r   r   r'   r'   r(   r     r   z,OPTForQuestionAnswering.set_input_embeddings)NNNNNNNNNNN)r2   r3   r4   r   r#   r   r.   r7   r   r	   rz   r{   r   r1   r   r   r8   r'   r'   r%   r(   r     sR    	
`r   )r   r   r   r   r   )r9   )9r5   collections.abcr   r.   r   torch.nnr   r   r   activationsr   cache_utilsr	   r
   
generationr   masking_utilsr   modeling_flash_attention_utilsr   modeling_layersr   modeling_outputsr   r   r   r   modeling_utilsr   r   processing_utilsr   utilsr   r   r   r   configuration_optr   
get_loggerr2   r\   r   r   Modulery   floatrP   rQ   r|   r   r   r   r   r   r   __all__r'   r'   r'   r(   <module>   sd   
$
]a X;boq