o
    ॵi+                     @   s   d dl Z d dlZd dlZd dlZddlmZmZ G dd deZe	dkrvddd	d
ddddZ
ee
Z	 i ZedZed\ZZedD ]Zed\ZZeee< qEejeeddZg ZdddddZee ee edeede q3dS )    N   )all_domains
db_domainsc                   @   s`   e Zd Zdd Zdd Zdd Zddd	Zdd
dZdddZdd Z			dddZ
dd ZdS )
MultiWozDBc              	   C   sn   i | _ i | _tD ],}ttj||| ddd}t|	 
 | j |< W d    n1 s/w   Y  qd S )Nrzutf-8)encoding)dbssql_dbsr   openospathjoinjsonloadsreadlower)selfdb_dirdb_pathsdomainf r   U/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/nlp/space/db_ops.py__init__   s   zMultiWozDB.__init__c                 C   s   g d}|dkr
|S |dkr2|dkrg d}|S |dkr"g d}|S |dkr,g d	}|S g d
}|S |dkr<g d}|S |dkrFg d}|S |dkrPg d	}|S g d
}|S )z:Return number of available entities for particular domain.r   r   r   r    trainr   )r   r   r   r   r   )r   r   r   r      )r   r   r   r   )r   r   r   r      
   r   )r   r   numvectorr   r   r   oneHotVector   s4   
zMultiWozDB.oneHotVectorc                 C   s:   ddg}| drddg}| ds| drddg}|S )z9Add information about availability of the booking option.r   zbooking-nobookr   zbooking-bookztrain-offerbooked)get)r   turn_dar!   r   r   r   addBookingPointer0   s   
zMultiWozDB.addBookingPointerFc                 C   s$   |t v r| ||}|S g d}|S )0Create database pointer for all related domains.r   )r   r"   )r   r   	match_num
return_numr!   r   r   r   addDBPointer;   s
   zMultiWozDB.addDBPointerc                 C   sD   |t v r| ||}ng d}|g dkrd}|S d|d }|S )z2Create database indicator for all related domains.r   z
[db_nores]z[db_%s]r   )r   r"   index)r   r   r'   r(   r!   	indicatorr   r   r   addDBIndicatorE   s   zMultiWozDB.addDBIndicatorc                 C   sd   ddi}i }t D ]#}d||< |tv r+||r+| ||| }t|||< |r+|||< q|r0|S |S )r&   generalr   )r   r   r#   
queryJsonslen)r   constraintsreturn_entrymatchentryr   matched_entsr   r   r   get_match_numU   s   zMultiWozDB.get_match_numc                 C   s   | dr|dd }|dkrddddd	}ndd
ddd	}|d d g dkr+d}n|d}|d ||  d }|d dkrJ|d dkrJ|d7 }|d dkrZ|d dkrZ|d7 }|S )N]r   r   01z2-3z>3)r   r      r   z1-5z6-10z>10   r   r   z: z; r   zbooking: okzbooking: unable)endswithr*   )r   r!   r   nummapreportr    r   r   r   pointerBackf   s   

zMultiWozDB.pointerBackTc              
   C   s  |dkr"t | j| d t | j| d dd tdD dgS |dkr+| jd S |d	krN|d
rL| jd	 D ]}|d
|d
krJ|g  S q9ng S d}| D ]}|dvr\d}qT|sag S g }d|v r| j| D ]#}	d|	v r|d }
|	d }|
|kr|s|	n|	d }	||	 |  S ql| j| D ]}	d}| D ]\}}|dkrq|dv s|dkr|dks|dkr|dv rqddddddd}||rq||	vrd} nx|dkrdn|}|dv r0z|d\}}t	|d t	| }W n t
y   d}Y  nLw t	|	| dd d t	|	| dd  }|dkr#||kr#d}|dkr/||k r/d}q|r>||	| kr>d} n||	| vrId} nq|rR||	 q|sX|S |dkrfdd |D }|S d d |D }|S )!zReturns the list of entities for a given domain
        based on the annotation of the belief state
        constraints: dict e.g. {'pricerange': 'cheap', 'area': 'west'}
        taxitaxi_colors
taxi_typesc                 S   s   g | ]}t d dqS )r   	   )randomrandint).0_r   r   r   
<listcomp>   s    z)MultiWozDB.queryJsons.<locals>.<listcomp>r   )rB   rC   
taxi_phonepolicehospital
departmentF)not mentionedr   Tname)peoplestayhotelday
restaurant)rS   timer   )
don't caredo n't care	dont carerN   dontcarer   freeyes)arriveleave:<   r   r\   r]   r   c                 S      g | ]}|d  qS )idr   rG   er   r   r   rI          c                 S   r`   )rO   r   rb   r   r   r   rI      rd   )rE   choicer   ranger#   valuesappenditemssplitint	Exception)r   r   r0   exactly_matchreturn_namer3   
valid_consvmatch_resultdb_entconsdbnr2   s	skip_casehmrU   r   r   r   r.   |   s   








zMultiWozDB.queryJsonsc                 C   s  | j stD ]}d|}t|}| }|| j |< qd|}d}| D ]\}	}
|
dksB|
dksB|
dksB|
dksB|
dksB|
d	krCq&|r|d
7 }|
dd}|	dkrb|d|	 d d | d 7 }n!|	dkru|d|	 d d | d 7 }n|d|	 d d | d 7 }d}q&|
dd}|	dkr|d|	 d d | d 7 }q&|	dkr|d|	 d d | d 7 }q&|d|	 d d | d 7 }q&zt| | j | 	|
 W S  ty   g  Y S w )Nzdb/{}-dbase.dbzselect * from {}Tr   rY   rN   rV   rX   rW   z where 'z''leaveAt z > arriveByz < =Fz and )r	   r   formatsqlite3connectcursorri   replaceprintexecutefetchallrl   )r   r   r0   domdbconnc	sql_queryflagkeyvalval2r   r   r   querySQL   sJ   


zMultiWozDB.querySQLN)F)TF)__name__
__module____qualname__r   r"   r%   r)   r,   r5   r@   r.   r   r   r   r   r   r      s    	




rr   __main__zdb/attraction_db_processed.jsonzdb/hospital_db_processed.jsonzdb/hotel_db_processed.jsonzdb/police_db_processed.jsonzdb/restaurant_db_processed.jsonzdb/taxi_db_processed.jsonzdb/train_db_processed.json)
attractionrL   rR   rK   rT   rA   r   TzAinput belief state in fomat: domain-slot1=value1;slot2=value2...
-;r}   )rn         r   )rR   rT   r   r   zcount:z
names:)r   rE   r   r   ontologyr   r   objectr   r   dbPATHsr   r0   inputinprj   r   rs   svru   rp   r.   resr?   reidxr   r/   r   r   r   r   <module>   sN     	
