o
    }oi#                     @   sV   d Z ddlZddlmZmZmZ ddlmZ dgZG dd de	Z
G dd de	ZdS )	z
Wrappers for schemas of different services.
This file contains code artifacts adapted from the original implementation:
https://github.com/google-research/google-research/blob/master/schema_guided_dst/schema.py
    N)ListOptionalUnion)loggingSchemac                   @   s  e Zd ZdZd2dedee fddZedefdd	Z	ede
fd
dZedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 ZdS )3ServiceSchemaz#A wrapper for schema for a service.Nschema_json
service_idc                    sl  |d  _ |d  _| _| _dgtdd |d D   _dd |d D  _d	 jd< td
d |d D  _dd |d D  _t fdd|d D  _	t fdd|d D  _
dd |d D }i }i }i }i }t j	D ]#\}}	||	 }
t|
d }|||	< dd t|D }|||	< |||	< qvt j
D ]\}}	|||	< q| _| _| _| _dS )z
        Constructor for ServiceSchema.
        Args:
            schema_json: schema json dict
            service_id: service ID
        service_namedescriptionNONEc                 s       | ]}|d  V  qdS nameN .0ir   r   a/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/nlp/data/dialogue/sgd/schema.py	<genexpr>/       z)ServiceSchema.__init__.<locals>.<genexpr>intentsc                 S      i | ]	}|d  |d qS r   r   r   r   r   r   r   
<dictcomp>0       z*ServiceSchema.__init__.<locals>.<dictcomp>nonec                 s   r   r   r   r   sr   r   r   r   2   r   slotsc                 S   r   r   r   r   r   r   r   r   3   r   c                 3   s.    | ]}|d  r|d  j v r|d V  qdS is_categoricalr   Nstate_slotsr   selfr   r   r   4       c                 3   s.    | ]}|d  s|d  j v r|d V  qdS r    r"   r   r$   r   r   r   7   r&   c                 S   s   i | ]}|d  |qS )r   r   r   r   r   r   r   :       possible_valuesc                 S      i | ]\}}||qS r   r   )r   idxvaluer   r   r   r   C   r'   N)_service_name_description_schema_json_service_idsorted_intents_intent_descriptions_slots_slots_descriptions_categorical_slots_non_categorical_slots	enumerate_categorical_slot_values_categorical_slot_value_ids_categorical_slot_ids_non_categorical_slot_ids)r%   r   r	   slot_schemascategorical_slot_valuescategorical_slot_value_idscategorical_slot_idsnon_categorical_slot_idsslot_idslotslot_schemavalues	value_idsr   r$   r   __init__!   sB   







zServiceSchema.__init__returnc                 C      | j S )zReturns schema json dictionary)r.   r$   r   r   r   r   P   s   zServiceSchema.schema_jsonc                 C   s6   t  }| jd D ]}||d  ||d  q|S )z=Set of slots which are permitted to be in the dialogue state.r   required_slotsoptional_slots)setr.   update)r%   r#   intentr   r   r   r#   U   s
   zServiceSchema.state_slotsc                 C   rH   N)r,   r$   r   r   r   r
   ^      zServiceSchema.service_namec                 C   rH   rN   )r/   r$   r   r   r   r	   b   rO   zServiceSchema.service_idc                 C   rH   rN   )r-   r$   r   r   r   r   f   rO   zServiceSchema.descriptionc                 C   rH   rN   r3   r$   r   r   r   r   j   rO   zServiceSchema.slotsc                 C   rH   rN   r1   r$   r   r   r   r   n   rO   zServiceSchema.intentsc                 C   rH   rN   )r2   r$   r   r   r   intent_descriptionsr   rO   z!ServiceSchema.intent_descriptionsc                 C   rH   rN   )r4   r$   r   r   r   slot_descriptionsv   rO   zServiceSchema.slot_descriptionsc                 C   rH   rN   r5   r$   r   r   r   categorical_slotsz   rO   zServiceSchema.categorical_slotsc                 C   rH   rN   r6   r$   r   r   r   non_categorical_slots~   rO   z#ServiceSchema.non_categorical_slotsc                 C   rH   rN   r8   r$   r   r   r   r=      rO   z%ServiceSchema.categorical_slot_valuesc                 C   
   | j | S rN   rX   r%   rB   r   r   r   get_categorical_slot_values      
z)ServiceSchema.get_categorical_slot_valuesc                 C   rY   rN   rP   r%   rA   r   r   r   get_slot_from_id   r\   zServiceSchema.get_slot_from_idc                 C   rY   rN   rQ   )r%   	intent_idr   r   r   get_intent_from_id   r\   z ServiceSchema.get_intent_from_idc                 C   rY   rN   rT   r]   r   r   r   get_categorical_slot_from_id   r\   z*ServiceSchema.get_categorical_slot_from_idc                 C   rY   rN   rV   r]   r   r   r    get_non_categorical_slot_from_id   r\   z.ServiceSchema.get_non_categorical_slot_from_idc                 C   s   | j | }| j| | S rN   )r5   r8   )r%   rA   value_idrB   r   r   r   "get_categorical_slot_value_from_id   s   
z0ServiceSchema.get_categorical_slot_value_from_idc                 C   s   | j | | S rN   )r9   )r%   rB   r+   r   r   r   get_categorical_slot_value_id   s   z+ServiceSchema.get_categorical_slot_value_idc                 C   rY   rN   )r:   rZ   r   r   r   get_categorical_slot_id   r\   z%ServiceSchema.get_categorical_slot_idc                 C   rY   rN   )r;   rZ   r   r   r   get_non_categorical_slot_id   r\   z)ServiceSchema.get_non_categorical_slot_idrN   )__name__
__module____qualname____doc__dictr   intrF   propertyr   rK   r#   r
   r	   r   r   r   rR   rS   rU   rW   r=   r[   r^   r`   ra   rb   rd   re   rf   rg   r   r   r   r   r      sH    /









r   c                   @   sh   e Zd ZdZdeeee f fddZdefddZde	fd	d
Z
defddZedd Zdd ZdS )r   z2Wrapper for schemas for all services in a dataset.schema_json_pathsc           
   	   C   sX  t |tr$t|d}t|}|  W d   n1 sw   Y  nGg }g }|D ]@}t|d}t|}|  td|t| W d   n1 sNw   Y  |D ]}|d |vri|	|d  |	| qUq*t
dd |D | _dd t| jD | _d	d | j D | _i }|D ]}	|	d }t|	| |d
||< q|| _|| _i | _dS )zs
        schema_json_paths: list of .json path to schema files of a single str with path to the json file.
        rNzNum of services in %s: %sr
   c                 s   r   )r
   Nr   )r   schemar   r   r   r      r   z"Schema.__init__.<locals>.<genexpr>c                 S   r)   r   r   r   kvr   r   r   r      r'   z#Schema.__init__.<locals>.<dictcomp>c                 S   r)   r   r   rr   r   r   r   r      r'   )r	   )
isinstancestropenjsonloadcloser   debuglenappendr0   	_servicesr7   _services_vocabitems_services_id_to_vocabr   get_service_id_service_schemas_schemas_slots_relation_list)
r%   ro   fall_schemascompleted_servicesschema_json_pathschemasserviceservice_schemasrq   r   r   r   rF      s<   





zSchema.__init__r   c                 C   rY   rN   )r   r%   r   r   r   r   r      r\   zSchema.get_service_idr	   c                 C   rY   rN   r~   )r%   r	   r   r   r   get_service_from_id   r\   zSchema.get_service_from_idc                 C   rY   rN   )r   r   r   r   r   get_service_schema   r\   zSchema.get_service_schemac                 C   rH   rN   r   r$   r   r   r   services   rO   zSchema.servicesc                 C   sB   t |d}tj| j|dd W d   dS 1 sw   Y  dS )zq
        Saves schema object to file
        Args:
            file_path: path to store schema object at
        w   )indentN)rw   rx   dumpr   )r%   	file_pathr   r   r   r   save_to_file   s   "zSchema.save_to_fileN)rh   ri   rj   rk   r   rv   r   rF   r   rm   r   r   rn   r   r   r   r   r   r   r      s    $
)rk   rx   typingr   r   r   
nemo.utilsr   __all__objectr   r   r   r   r   r   <module>   s    