B
    /`3                 @   s   d dl Z d dlmZmZmZmZmZmZmZ d dlZd dl	Z	d dl
Zd dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ ejrd dlm Z  G dd dZ!dS )	    N)AnyOptionalTupleTextDictSetList)RasaException)TEXTINTENTRESPONSEINTENT_RESPONSE_KEYMETADATAMETADATA_INTENTMETADATA_EXAMPLEENTITIESRESPONSE_IDENTIFIER_DELIMITERFEATURE_TYPE_SENTENCEFEATURE_TYPE_SEQUENCEACTION_TEXTACTION_NAME)DIAGNOSTIC_DATA)Featuresc            
   @   sz  e Zd Zd;eeeef  ee ee eed  eddddZ	ed ddddZ
eeeef dd	d
dZd<eeeddddZd=edddZedddZd>edddZedddZedddZedddZed?eee eeeeef   ee ee ed dddZedd d!Zedd"d#Zeeeeee f d$d%d&Zd@eeee  eed ed f d'd(d)ZdAeeee  eed ed f d'd*d+ZdBeeee  ed d'd,d-ZdCeeee  ed'd.d/Z eee eed ed f d'd0d1Z!eee eed ed f d'd2d3Z"edDed eee  ed d4d5d6Z#edd7d8Z$edd9d:Z%dS )EMessageNr   )dataoutput_propertiestimefeatureskwargsreturnc             K   sX   || _ |r| ni | _|r |ng | _| jjf | |r@|| _nt | _| jt d S )N)	r   copyr   r   updater   setaddr
   )selfr   r   r   r   r    r%   T/home/dcms/DCMS/lib/python3.7/site-packages/rasa/shared/nlu/training_data/message.py__init__   s    zMessage.__init__)r   r   c             C   s   |d k	r| j | d S )N)r   append)r$   r   r%   r%   r&   add_features3   s    zMessage.add_features)originr   r   c             C   sH   ||  ti kr(tjjjd| d | jti  || jt |< dS )zAdds diagnostic data from the `origin` component.

        Args:
            origin: Name of the component that created the data.
            data: The diagnostic data.
        zIPlease make sure every pipeline component has a distinct name. The name 'zA' appears at least twice and diagnostic data will be overwritten.N)	getr   rasasharedutilsioraise_warningr   
setdefault)r$   r*   r   r%   r%   r&   add_diagnostic_data7   s
    
zMessage.add_diagnostic_dataF)propinfoadd_to_outputr   c             C   s   || j |< |r| j| dS )a  Sets the message's property to the given value.

        Args:
            prop: Name of the property to be set.
            info: Value to be assigned to that property.
            add_to_output: Decides whether to add `prop` to the `output_properties`.
        N)r   r   r#   )r$   r3   r4   r5   r%   r%   r&   r"   G   s    
zMessage.set)r   c             C   s   | j ||S )N)r   r+   )r$   r3   defaultr%   r%   r&   r+   S   s    zMessage.getc             C   s<   |   }|tdr |  |t< |td |td |S )zFGet dict representation of message as it would appear in training dataN)as_dictr+   r   get_full_intentpopr   r   )r$   dr%   r%   r&   as_dict_nluV   s    zMessage.as_dict_nluc                s6   |r fdd j  D }n j }dd | D S )Nc                s    i | ]\}}| j kr||qS r%   )r   ).0keyvalue)r$   r%   r&   
<dictcomp>b   s   z#Message.as_dict.<locals>.<dictcomp>c             S   s   i | ]\}}|d k	r||qS )Nr%   )r<   r=   r>   r%   r%   r&   r?   l   s    )r   items)r$   Zonly_output_propertiesr:   r%   )r$   r&   r7   `   s
    
zMessage.as_dictc             C   s"   t |tsdS | |  kS d S )NF)
isinstancer   fingerprint)r$   otherr%   r%   r&   __eq__n   s    
zMessage.__eq__c             C   s   t |  dS )z]Calculate a hash for the message.

        Returns:
            Hash of the message.
           )intrB   )r$   r%   r%   r&   __hash__t   s    zMessage.__hash__c             C   s   t jjj| jS )zrCalculate a string fingerprint for the message.

        Returns:
            Fingerprint of the message.
        )r,   r-   r.   r/   Zdeep_container_fingerprintr   )r$   r%   r%   r&   rB   |   s    zMessage.fingerprint)textintententitiesintent_metadataexample_metadatar   r   c       
      K   sv   t |i}|r2| |\}}	|r&||t< |	r2||t< |r>||t< |dk	rRt|i|t< |dk	rj||ti t< | |f|S )a  Builds a Message from `UserUttered` data.

        Args:
            text: text of a user's utterance
            intent: an intent of the user utterance
            entities: entities in the user's utterance
            intent_metadata: optional metadata for the intent
            example_metadata: optional metadata for the intent example

        Returns:
            Message
        N)	r
   separate_intent_response_keyr   r   r   r   r   r1   r   )
clsrH   rI   rJ   rK   rL   r   r   Zsplit_intentZresponse_keyr%   r%   r&   build   s    zMessage.buildc             C   s   |  tr|  tS |  tS )z)Get intent as it appears in training data)r+   r   r   )r$   r%   r%   r&   r8      s    zMessage.get_full_intentc             C   s   t jjjjdtd |  S )z)Get intent as it appears in training dataz~`get_combined_intent_response_key` is deprecated and will be removed in future versions. Please use `get_full_intent` instead.)category)r,   r-   r.   r/   r0   DeprecationWarningr8   )r$   r%   r%   r&    get_combined_intent_response_key   s    
z(Message.get_combined_intent_response_key)original_intentr   c             C   sX   |  t}t|dkr&|d |d fS t|dkr>|d d fS td|  dt dd S )N   r      zIntent name 'z/' is invalid, it cannot contain more than one 'z'.)splitr   lenr	   )rS   Zsplit_titler%   r%   r&   rM      s    
z$Message.separate_intent_response_key)	attributefeaturizersr   c             C   s<   |dkrg }|  ||\}}| ||}| ||}||fS )aG  Gets all sparse features for the attribute given the list of featurizers.

        If no featurizers are provided, all available features will be considered.

        Args:
            attribute: message attribute
            featurizers: names of featurizers to consider

        Returns:
            Sparse features.
        N)_filter_sparse_features_combine_features)r$   rX   rY   sequence_featuressentence_featuresr%   r%   r&   get_sparse_features   s    zMessage.get_sparse_featuresc             C   s<   |dkrg }|  ||\}}| ||}| ||}||fS )aE  Gets all dense features for the attribute given the list of featurizers.

        If no featurizers are provided, all available features will be considered.

        Args:
            attribute: message attribute
            featurizers: names of featurizers to consider

        Returns:
            Dense features.
        N)_filter_dense_featuresr[   )r$   rX   rY   r\   r]   r%   r%   r&   get_dense_features   s    zMessage.get_dense_featuresc             C   s*   |  ||}| ||}dd || D S )a9  Gets all features for the attribute given the list of featurizers.

        If no featurizers are provided, all available features will be considered.

        Args:
            attribute: message attribute
            featurizers: names of featurizers to consider

        Returns:
            Features.
        c             S   s   g | ]}|d k	r|qS )Nr%   )r<   fr%   r%   r&   
<listcomp>  s    z,Message.get_all_features.<locals>.<listcomp>)r^   r`   )r$   rX   rY   Zsparse_featuresZdense_featuresr%   r%   r&   get_all_features  s    zMessage.get_all_featuresc             C   s\   |dkrg }|  ||\}}| ||\}}t|dkpZt|dkpZt|dkpZt|dkS )ar  Checks if there are any features present for the attribute and featurizers.

        If no featurizers are provided, all available features will be considered.

        Args:
            attribute: Message attribute.
            featurizers: Names of featurizers to consider.

        Returns:
            ``True``, if features are present, ``False`` otherwise.
        Nr   )rZ   r_   rW   )r$   rX   rY   Zsequence_sparse_featuresZsentence_sparse_featuresZsequence_dense_featuresZsentence_dense_featuresr%   r%   r&   features_present  s    zMessage.features_presentc                s4    fdd| j D } fdd| j D }||fS )Nc                s:   g | ]2}|j  kr| r|jtkr|jks2s|qS r%   )rX   is_densetyper   r*   )r<   ra   )rX   rY   r%   r&   rb   ;  s
   

z2Message._filter_dense_features.<locals>.<listcomp>c                s:   g | ]2}|j  kr| r|jtkr|jks2s|qS r%   )rX   re   rf   r   r*   )r<   ra   )rX   rY   r%   r&   rb   C  s
   

)r   )r$   rX   rY   r]   r\   r%   )rX   rY   r&   r_   7  s
    

zMessage._filter_dense_featuresc                s4    fdd| j D } fdd| j D }||fS )Nc                s:   g | ]2}|j  kr| r|jtkr|jks2s|qS r%   )rX   	is_sparserf   r   r*   )r<   ra   )rX   rY   r%   r&   rb   P  s
   

z3Message._filter_sparse_features.<locals>.<listcomp>c                s:   g | ]2}|j  kr| r|jtkr|jks2s|qS r%   )rX   rg   rf   r   r*   )r<   ra   )rX   rY   r%   r&   rb   X  s
   

)r   )r$   rX   rY   r]   r\   r%   )rX   rY   r&   rZ   L  s
    

zMessage._filter_sparse_features)r   rY   r   c             C   s:   d }x0| D ](}|d kr(t |}||_q
|| q
W |S )N)r    deepcopyr*   Zcombine_with_features)r   rY   Zcombined_featuresra   r%   r%   r&   r[   b  s    

zMessage._combine_featuresc             C   sh   t | jtpd| jtpd| jts2| jtr@| jt pd| jtod| jtpb| jt S )a  Checks whether the message is a core message or from the domain.

        E.g. a core message is created from a story or a domain action,
        not from the NLU data.

        Returns:
            True, if message is a core or domain message, false otherwise.
        )boolr   r+   r   r   r   r   r
   )r$   r%   r%   r&   is_core_or_domain_messageq  s    	z!Message.is_core_or_domain_messagec             C   s0   t | tr| t p,| to,| t S )zChecks whether the message came from an e2e story.

        Returns:
            `True`, if message is a from an e2e story, `False` otherwise.
        )ri   r+   r   r   r
   r   )r$   r%   r%   r&   is_e2e_message  s    zMessage.is_e2e_message)NNNN)F)N)F)NNNN)N)N)N)N)N)&__name__
__module____qualname__r   r   r   r   r   r   r'   r)   r2   ri   r"   r+   dictr;   r7   rD   rF   rG   rB   classmethodrO   r8   rR   staticmethodr   rM   r^   r`   rc   rd   r_   rZ   r[   rj   rk   r%   r%   r%   r&   r      sX      &
   (	r   )"jsontypingr   r   r   r   r   r   r   r    Zrasa.shared.utils.ior,   Zrasa.shared.exceptionsr	   Zrasa.shared.nlu.constantsr
   r   r   r   r   r   r   r   r   r   r   r   r   Zrasa.shared.constantsr   TYPE_CHECKINGZ&rasa.shared.nlu.training_data.featuresr   r   r%   r%   r%   r&   <module>   s   $<