
    `is                     \	   d dl mZ d dl mZ d dlmZ d Z G d dej                  ZdefdZ	d	ed
dfdZ
d	eded
dfdZd	eded
dfdZd	eded
dfdZ ed e                      Z ed e                      Z ed e                      Z edg          d]d            Z edg          d             Z edg          d             Z edg          d             Z edg          d]d            Z edg          d]d            Z edg          	 d^d             Z edg          	 d_d!            Z ed"g          d#             Z ed$g          d%             Z ed&g          d'             Z edg          	 d]d(            Z edg          	 d^d)            Z ed*g          	 d^d+            Z ed,g          d]d-            Z ed,g          d]d.            Z  edg          d/             Z! G d0 d1ej"                  Z# ed2g          d]d3            Z$ G d4 d5ej"                  Z% ed6g          d]d7            Z& ed8g          d]d9            Z' ed:g          d^d;            Z( ed:g          	 d^d<            Z) ed=g          d>             Z* ed=g          d?             Z+ ed@g          dA             Z, ed@g          dB             Z- edCg          dD             Z. edCg          dE             Z/ edFg          dG             Z0 edHg          d^dI            Z1 edJg          	 d]dK            Z2 edJg          	 d]dL            Z3 edJg          	 d]dM            Z4 edJg          	 d]dN            Z5 edJg          	 d]dO            Z6 edJg          	 d]dP            Z7 edJg          	 d]dQ            Z8 edJg          	 d]dR            Z9 ed,g          d]dS            Z: ed,g          	 d]dT            Z; ed,g          d]dU            Z< ed,g          	 d]dV            Z= edWg          dX             Z> edYg          d]dZ            Z? edYg          	 d]d[            Z@ edg          d\             ZAdS )`    )_internal_types)_cuda_types)Datac                       fd}|S )Nc                 P      G  fddt           j                  } |            S )Nc                       e Zd Z fdZdS )7_wrap_thrust_func.<locals>.wrapper.<locals>.FuncWrapperc                     D ] }j                             d| d           !j                             d           j                             d           dj         _        fd|D             }fdD             } g|R i |S )Nz
#include <>z$#include <thrust/execution_policy.h>z#include <thrust/functional.h>nvccc                 :    g | ]}t          j        |          S  _Datainit).0aenvs     d/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupyx/jit/thrust.py
<listcomp>zP_wrap_thrust_func.<locals>.wrapper.<locals>.FuncWrapper.call.<locals>.<listcomp>   s%    >>>AUZ3//>>>    c                 H    i | ]}|t          j        |                   S r   r   )r   kr   kwargss     r   
<dictcomp>zP_wrap_thrust_func.<locals>.wrapper.<locals>.FuncWrapper.call.<locals>.<dictcomp>   s+    MMMq%*VAY"<"<MMMr   )	generatedadd_codebackend)	selfr   argsr   header	data_argsdata_kwargsfuncheaderss	    ` `   r   callz<_wrap_thrust_func.<locals>.wrapper.<locals>.FuncWrapper.call	   s    % C CFM**+A+A+A+ABBBB&&'MNNN&&'GHHH(.%>>>>>>>	MMMMMfMMMtC;);;;{;;;r   N)__name__
__module____qualname__r&   )r$   r%   s   r   FuncWrapperr	      s3        < < < < < < < <r   r*   )r   BuiltinFunc)r$   r*   r%   s   ` r   wrapperz"_wrap_thrust_func.<locals>.wrapper   sN    		< 		< 		< 		< 		< 		< 		< 		</5 		< 		< 		< {}}r   r   )r%   r,   s   ` r   _wrap_thrust_funcr-      s#         Nr   c                       e Zd ZdS )_ExecPolicyTypeN)r'   r(   r)   r   r   r   r/   r/      s        Dr   r/   exec_policyc                 h    t          | j        t                    st          | j         d          d S )Nz must be execution policy type)
isinstancectyper/   	TypeErrorcode)r0   s    r   _assert_exec_policy_typer6      s>    k'99 M;+KKKLLLM Mr   r   returnNc                     t          | j        t          j                  s t	          d| j         d| j         d          d S )N`z` must be of pointer type: `)r2   r3   r   PointerBaser4   r5   )r   s    r   _assert_pointer_typer;      sL    ag{677 LJAFJJJJJKKKL Lr   bc                     | j         |j         k    r0t          d| j         d|j         d| j          d|j          d	          d S )Nr9   ` and `` must be of the same type: `` != `)r3   r4   r5   r   r<   s     r   _assert_same_typerB   %   so    w!'* * *qv * ** * w* * *+ + 	+ r   c                     t          |            t          |           | j        j        |j        j        k    r:t          d| j         d|j         d| j        j         d|j        j         d	          d S )Nr9   r>   z%` must be of the same pointer type: `r@   )r;   r3   
child_typer4   r5   typerA   s     r   _assert_same_pointer_typerF   ,   s    wQW///? ? ?qv ? ?"? ?*+&*;? ? ?@ @ 	@ 0/r   c                     t          |            | j        j        |j        k    r5t          d| j         d|j         d| j        j         d|j         d	          d S )Nz`*r>   r?   r@   r9   )r;   r3   rD   r4   r5   rA   s     r   _assert_pointer_ofrH   6   s    wQW$$5 5 5 5 5"5 5*+'5 5 56 6 	6 %$r   zthrust::hostzthrust::devicezthrust::seqzthrust/adjacent_difference.hc                     t          |           t          ||           t          ||           |t          d          ||||g}d                    d |D                       }t          d| d|j                  S )z3Computes the differences of adjacent elements.
    N!binary_op option is not supported, c                     g | ]	}|j         
S r   r5   r   r   s     r   r   z'adjacent_difference.<locals>.<listcomp>M       ---1---r   zthrust::adjacent_difference()r6   rB   rF   NotImplementedErrorjoinr   r3   r   r0   firstlastresult	binary_opr    paramss           r   adjacent_differencerZ   C   s     [)))eT"""eV,,,!"EFFFf-DYY-----..F99996<HHHr   zthrust/binary_search.hc                    t          |           t          |           t          ||           dt          |          cxk    rdk    rEn nB|d         }t          |          dk    r|d         nd}t	          ||           t
          j        }ndt          |          cxk    rdk    r`n n]|d         }|d         }	|d         }
t          |          dk    r|d         nd}t          ||           t          ||	           |
j        }nt          d          |t          d          |||g|}d	                    d
 |D                       }t          d| d|          S );Attempts to find the element value with binary search.
          r   N      z0Invalid number of inputs of thrust.binary_searchcomp option is not supportedrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z!binary_search.<locals>.<listcomp>p   rO   r   zthrust::binary_search(rP   )r6   r;   rB   lenrH   r   bool_rF   r3   r4   rR   rS   r   r   r0   rU   rV   r    valuecompresult_ctypevalue_first
value_lastrW   rY   s               r   binary_searchrk   U   s    [)))eT"""CIIQd))q..tAwwd5%((("(	
c$ii				1					1g!W
ad))q..tAwwd!%555+z222|JKKK!"@AAA,t,DYY-----..F3&333\BBBr   zthrust/copy.hc                     t          |           t          ||           t          ||           ||||g}d                    d |D                       }t	          d| d|j                  S )zCopies the elements.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zcopy.<locals>.<listcomp>}   rO   r   zthrust::copy(rP   )r6   rB   rF   rS   r   r3   r   r0   rU   rV   rW   r    rY   s          r   copyro   t   s~     [)))eT"""eV,,,f-DYY-----..F****FL999r   zthrust/count.hc                 @   t          |           t          |j        t          j                  st          d          |j        |j        k    rt          d          ||||g}d                    d |D                       }t          d| dt          j                  S )zMCounts the number of elements in [first, last) that equals to ``value``.
    z`first` must be of pointer typez+`first` and `last` must be of the same typerK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zcount.<locals>.<listcomp>   rO   r   zthrust::count(rP   )	r6   r2   r3   r   r:   r4   rS   r   int32r   r0   rU   rV   rf   r    rY   s          r   countrt      s     [)))ek;#:;; ;9:::{dj  EFFFe,DYY-----..F+&+++[->???r   zthrust/equal.hc                    t          |           t          ||           t          ||           |t          d          ||||g}d                    d |D                       }t          d| dt          j                  S )z2Returns true if the two ranges are identical.
    N#binary_pred option is not supportedrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zequal.<locals>.<listcomp>   rO   r   zthrust::equal(rP   )r6   rB   rF   rR   rS   r   r   rd   )r   r0   first1last1first2binary_predr    rY   s           r   equalr|      s     [)))fe$$$ff---!"GHHH/DYY-----..F+&+++[->???r   c                 .   t          |           t          |           t          ||           |t          d          ||||g}d                    d |D                       }t          d| dt          j        |j        |j        g                    S )z<Attempts to find the element value in an ordered range.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zequal_range.<locals>.<listcomp>   rO   r   zthrust::equal_range(rP   	r6   r;   rB   rR   rS   r   r   Tupler3   )r   r0   rU   rV   rf   rg   r    rY   s           r   equal_ranger      s     [)))eT"""!"@AAAe,DYY-----..F(v(((5;4557 7 7r   zthrust/scan.hc                 ,   t          |           t          ||           t          ||           |t          d          ||||g}||                    |           d                    d |D                       }t          d| d|j                  S )z0Computes an exclusive prefix sum operation.
    NrJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z"exclusive_scan.<locals>.<listcomp>   rO   r   zthrust::exclusive_scan(rP   )r6   rB   rF   rR   appendrS   r   r3   )	r   r0   rU   rV   rW   r   rX   r    rY   s	            r   exclusive_scanr      s    
 [)))eT"""eV,,,!"EFFFf-DDYY-----..F46444flCCCr   c	                 P   t          |           t          ||           t          ||           |t          d          |t          d          |||||g}	||	                    |           d                    d |	D                       }
t          d|
 d|j                  S )zaComputes an exclusive prefix sum operation by key.
    _assert_exec_policy_type(exec_policy)
    Nrv   rJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z)exclusive_scan_by_key.<locals>.<listcomp>   rO   r   zthrust::exclusive_scan_by_key(rP   )r;   rB   rF   rR   r   rS   r   r3   )r   r0   rx   ry   rz   rW   r   r{   rX   r    rY   s              r   exclusive_scan_by_keyr      s        fe$$$ff---!"GHHH!"EFFF7DDYY-----..F;&;;;V\JJJr   zthrust/fill.hc                     t          |           t          ||           ||||g}d                    d |D                       }t          d| dt          j                  S )z5Assigns the value to every element in the range.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zfill.<locals>.<listcomp>   rO   r   zthrust::fill(rP   )r6   rB   rS   r   r   voidrs   s          r   fillr      so     [)))eT"""e,DYY-----..F****K,<===r   zthrust/find.hc                     t          |           t          |           t          ||           ||||g}d                    d |D                       }t	          d| d|j                  S )z>Finds the first iterator whose value equals to ``value``.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zfind.<locals>.<listcomp>   rO   r   zthrust::find(rP   r6   r;   rB   rS   r   r3   rs   s          r   findr      s|     [)))eT"""e,DYY-----..F****EK888r   zthrust/gather.hc                     t          |           t          |           t          ||           t          ||           |||||g}d                    d |D                       }t          d| d|j                  S )zFCopies elements from source into destination  according to a map.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zgather.<locals>.<listcomp>  rO   r   zthrust::gather(rP   )r6   r;   rB   rF   rS   r   r3   )r   r0   	map_firstmap_lastinput_firstrW   r    rY   s           r   gatherr      s     [)))###i***k6222Hk6BDYY-----..F,6,,,fl;;;r   c                     t          |           t          ||           t          ||           |t          d          ||||g}d                    d |D                       }t          d| d|j                  S )z0Computes an inclusive prefix sum operation.
    NrJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z"inclusive_scan.<locals>.<listcomp>  rO   r   zthrust::inclusive_scan(rP   rQ   rT   s           r   inclusive_scanr     s    
 [)))eT"""eV,,,!"EFFFf-DYY-----..F46444flCCCr   c                 @   t          |           t          |           t          ||           t          ||           |t	          d          |t	          d          |||||g}d                    d |D                       }	t          d|	 d|j                  S )z7Computes an inclusive prefix sum operation by key.
    Nrv   rJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z)inclusive_scan_by_key.<locals>.<listcomp>,  rO   r   zthrust::inclusive_scan_by_key(rP   )r6   r;   rB   rF   rR   rS   r   r3   )
r   r0   rx   ry   rz   rW   r{   rX   r    rY   s
             r   inclusive_scan_by_keyr     s     [)))   fe$$$ff---!"GHHH!"EFFF7DYY-----..F;&;;;V\JJJr   zthrust/inner_product.hc                 "   t          |           t          ||           t          ||           |t          d          |t          d          |||||g}d                    d |D                       }	t          d|	 d|j                  S )z/Calculates an inner product of the ranges.
    Nz"binary_op1 option is not supportedz"binary_op2 option is not supportedrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z!inner_product.<locals>.<listcomp>>  rO   r   zthrust::inner_product(rP   rQ   )
r   r0   rx   ry   rz   r   
binary_op1
binary_op2r    rY   s
             r   inner_productr   0  s     [)))fe$$$ff---!"FGGG!"FGGG5DYY-----..F3&333TZ@@@r   zthrust/sort.hc                    t          |           t          |           t          ||           |t          d          |||g}d                    d |D                       }t          d| dt          j                  S )z<Returns true if the range is sorted in ascending order.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zis_sorted.<locals>.<listcomp>O  rO   r   zthrust::is_sorted(rP   )r6   r;   rB   rR   rS   r   r   rd   r   r0   rU   rV   rg   r    rY   s          r   	is_sortedr   E  s     [)))eT"""!"@AAA%DYY-----..F/f///1BCCCr   c                     t          |           t          |           t          ||           |t          d          |||g}d                    d |D                       }t          d| d|j                  S )z=Returns the last iterator for which the range is sorted.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z#is_sorted_until.<locals>.<listcomp>]  rO   r   zthrust::is_sorted_until(rP   r6   r;   rB   rR   rS   r   r3   r   s          r   is_sorted_untilr   S  s     [)))eT"""!"@AAA%DYY-----..F5F555u{CCCr   c                    t          |           t          |           t          ||           dt          |          cxk    rdk    r@n n=|d         }t          |          dk    r|d         nd}t	          ||           |j        }ndt          |          cxk    rdk    r`n n]|d         }|d         }	|d         }
t          |          dk    r|d         nd}t          ||           t          ||	           |
j        }nt          d          |t          d          |||g|}d		                    d
 |D                       }t          d| d|          S )r\   r]   r^   r   Nr_   r`   z.Invalid number of inputs of thrust.lower_boundra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zlower_bound.<locals>.<listcomp>|  rO   r   zthrust::lower_bound(rP   r6   r;   rB   rc   rH   r3   rF   r4   rR   rS   r   re   s               r   lower_boundr   a      [)))eT"""CIIQd))q..tAwwd5%((({	
c$ii				1					1g!W
ad))q..tAwwd!%555+z222|HIII!"@AAA,t,DYY-----..F1111<@@@r   c                       e Zd ZdefdZdS )_ConstantIteratorr7   c                     | j         }d| dS )Nzthrust::constant_iterator<r   rD   r   
value_types     r   __str__z_ConstantIterator.__str__      _
9J9999r   Nr'   r(   r)   strr   r   r   r   r   r     /        : : : : : : :r   r   z#thrust/iterator/constant_iterator.hc                     |t          d          |g}d                    d |D                       }t          d| dt          |j                            S )3Finds the first positions whose values differ.
    Nindex_type is not supportedrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z*make_constant_iterator.<locals>.<listcomp>  rO   r   zthrust::make_constant_iterator(rP   )rR   rS   r   r   r3   r   xir    rY   s        r   make_constant_iteratorr     l     	}!"?@@@3DYY-----..F3&333!'""  r   c                       e Zd ZdefdZdS )_CountingIteratorr7   c                     | j         }d| dS )Nzthrust::counting_iterator<r   r   r   s     r   r   z_CountingIterator.__str__  r   r   Nr   r   r   r   r   r     r   r   r   z#thrust/iterator/counting_iterator.hc                     |t          d          |g}d                    d |D                       }t          d| dt          |j                            S )r   Nr   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z*make_counting_iterator.<locals>.<listcomp>  rO   r   zthrust::make_counting_iterator(rP   )rR   rS   r   r   r3   r   s        r   make_counting_iteratorr     r   r   zthrust/mismatch.hc                 0   t          |           t          ||           t          ||           |t          d          ||||g}d                    d |D                       }t          d| dt          j        |j        |j        g                    S )r   Nzpred option is not supportedrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zmismatch.<locals>.<listcomp>  rO   r   zthrust::mismatch(rP   )	r6   rB   rF   rR   rS   r   r   r   r3   )r   r0   rx   ry   rz   predr    rY   s           r   mismatchr     s     [)))fe$$$ff---!"@AAA/DYY-----..F%F%%%6<677  r   zthrust/reduce.hc                 F   t          |           t          |           t          ||           |||g}||                    |           |j        }n|j        j        }|t          d          d                    d |D                       }t          d| d|          S )z!Generalization of summation.
    NrJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zreduce.<locals>.<listcomp>  rO   r   zthrust::reduce(rP   )	r6   r;   rB   r   r3   rD   rR   rS   r   )	r   r0   rU   rV   r   rX   r    return_typerY   s	            r   reducer     s     [)))eT"""%DDjk,!"EFFFYY-----..F,6,,,k:::r   c	                    t          |           t          |           t          ||           t          |           t          |           t          |           ||||||g}	|t          d          |t          d          d                    d |	D                       }
t          d|
 dt          j        |j        |j        g                    S )z1Generalization of reduce to key-value pairs.
    Nrv   rJ   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z!reduce_by_key.<locals>.<listcomp>  rO   r   zthrust::reduce_by_key(rP   r   )r   r0   
keys_first	keys_lastvalues_firstkeys_outputvalues_outputr{   rX   r    rY   s              r   reduce_by_keyr     s     [)))$$$j),,,&&&%%%'''ZL]D !"GHHH!"EFFFYY-----..F****;,m.ABCC  r   zthrust/remove.hc                     t          |           t          |           t          ||           ||||g}d                    d |D                       }t	          d| d|j                  S )ARemoves from the range all elements that are equal to value.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zremove.<locals>.<listcomp>  rO   r   zthrust::remove(rP   r   rs   s          r   remover     s|     [)))eT"""e,DYY-----..F,6,,,ek:::r   c                     t          |           t          |           t          ||           t          |           |||||g}d                    d |D                       }t	          d| d|j                  S )r   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zremove_copy.<locals>.<listcomp>
  rO   r   zthrust::remove_copy(rP   r   )r   r0   rU   rV   rW   rf   r    rY   s           r   remove_copyr     s     [)))eT"""   fe4DYY-----..F11116<@@@r   zthrust/replace.hc                    t          |           t          |           t          ||           t          ||           |||||g}d                    d |D                       }t	          d| dt
          j                  S )KReplaces every element in the range equal to old_value with new_value.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zreplace.<locals>.<listcomp>  rO   r   zthrust::replace(rP   r6   r;   rB   rS   r   r   r   )r   r0   rU   rV   	old_value	new_valuer    rY   s           r   replacer     s     [)))eT"""i+++i;DYY-----..F-F---{/?@@@r   c                    t          |           t          |           t          ||           t          |           t          ||           ||||||g}d                    d |D                       }t	          d| d|j                  S )r   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z replace_copy.<locals>.<listcomp>)  rO   r   zthrust::replace_copy(rP   r   )	r   r0   rU   rV   rW   r   r   r    rY   s	            r   replace_copyr     s     [)))eT"""   i+++fiCDYY-----..F2222FLAAAr   zthrust/reverse.hc                     t          |           t          |           t          ||           |||g}d                    d |D                       }t	          d| dt
          j                  S )Reverses a range.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zreverse.<locals>.<listcomp>9  rO   r   zthrust::reverse(rP   r   )r   r0   rU   rV   r    rY   s         r   reverser   1  s{     [)))eT"""%DYY-----..F-F---{/?@@@r   c                     t          |           t          |           t          ||           t          |           ||||g}d                    d |D                       }t	          d| d|j                  S )r   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z reverse_copy.<locals>.<listcomp>F  rO   r   zthrust::reverse_copy(rP   r   rn   s          r   reverse_copyr   =  s     [)))eT"""   f-DYY-----..F2222FLAAAr   zthrust/scatter.hc                 "   t          |           t          |           t          ||           t          |           t          |           |||||g}d                    d |D                       }t	          d| dt
          j                  S )zMCopies elements from source range into an output range according to map.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zscatter.<locals>.<listcomp>T  rO   r   zthrust::scatter(rP   r   )r   r0   rU   rV   maprW   r    rY   s           r   scatterr   J  s     [)))eT"""   c62DYY-----..F-F---{/?@@@r   zthrust/sequence.hc                 ^   t          |           t          |           t          ||           |||g}||                    |           |%t          ||           |                    |           d                    d |D                       }t          d| dt          j                  S )z0Fills the range with a sequence of numbers.
    NrK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zsequence.<locals>.<listcomp>h  rO   r   zthrust::sequence(rP   )r6   r;   rB   r   rS   r   r   r   )r   r0   rU   rV   r   stepr    rY   s           r   sequencer   [  s     [)))eT"""%DD$%%%DYY-----..F.V...0@AAAr   zthrust/set_operations.hc                     t          |           t          ||           t          ||           t          |           ||||||g}|t          d          d                    d |D                       }	t          d|	 d|j                  S )zKConstructs a sorted range that is the set difference of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z"set_difference.<locals>.<listcomp>y  rO   r   zthrust::set_difference(rP   r6   rB   r;   rR   rS   r   r3   
r   r0   rx   ry   rz   last2rW   rg   r    rY   s
             r   set_differencer   l  s     [)))fe$$$fe$$$   v>D!"@AAAYY-----..F46444flCCCr   c           	         t          |           t          ||           t          ||           t          |           t          |           t          |           t          |	           |||||||||	g	}|
t          d          d                    d |D                       }t          d| dt          j        |j        |	j        g                    S )z>Constructs the key-value set difference of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z)set_difference_by_key.<locals>.<listcomp>  rO   r   zthrust::set_difference_by_key(rP   	r6   rB   r;   rR   rS   r   r   r   r3   r   r0   keys_first1
keys_last1keys_first2
keys_last2values_first1values_first2keys_resultvalues_resultrg   r    rY   s                r   set_difference_by_keyr  }  s     [)))k:...k:...''''''%%%'''j+z=+}FD!"@AAAYY-----..F2222;,m.ABCC  r   c                     t          |           t          ||           t          ||           t          |           ||||||g}|t          d          d                    d |D                       }	t          d|	 d|j                  S )zMConstructs a sorted range that is the set intersection of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z$set_intersection.<locals>.<listcomp>  rO   r   zthrust::set_intersection(rP   r   r   s
             r   set_intersectionr    s     [)))fe$$$fe$$$   v>D!"@AAAYY-----..F6V666EEEr   c
                    t          |           t          ||           t          ||           t          |           t          |           t          |           ||||||||g}
|	t          d          d                    d |
D                       }t          d| dt          j        |j        |j        g                    S )z@Constructs the key-value set intersection of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z+set_intersection_by_key.<locals>.<listcomp>  rO   r   z thrust::set_intersection_by_key(rP   r  )r   r0   r  r  r  r  r  r	  r
  rg   r    rY   s               r   set_intersection_by_keyr    s     [)))k:...k:...'''%%%'''j+z;7D!"@AAAYY-----..F46444;,m.ABCC  r   c                     t          |           t          ||           t          ||           t          |           ||||||g}|t          d          d                    d |D                       }	t          d|	 d|j                  S )z@Constructs a sorted range that is the symmetric difference.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z,set_symmetric_difference.<locals>.<listcomp>  rO   r   z!thrust::set_symmetric_difference(rP   r   r   s
             r   set_symmetric_differencer    s     [)))fe$$$fe$$$   v>D!"@AAAYY-----..F>V>>>MMMr   c           	         t          |           t          ||           t          ||           t          |           t          |           t          |           t          |	           |||||||||	g	}|
t          d          d                    d |D                       }t          d| dt          j        |j        |	j        g                    S )zDConstructs the key-value symmetric difference of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z3set_symmetric_difference_by_key.<locals>.<listcomp>  rO   r   z(thrust::set_symmetric_difference_by_key(rP   r  r  s                r   set_symmetric_difference_by_keyr    s     [)))k:...k:...''''''%%%'''j+z=+}FD!"@AAAYY-----..F<6<<<;,m.ABCC  r   c                     t          |           t          ||           t          ||           t          |           ||||||g}|t          d          d                    d |D                       }	t          d|	 d|j                  S )zFConstructs a sorted range that is the set union of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zset_union.<locals>.<listcomp>  rO   r   zthrust::set_union(rP   r   r   s
             r   	set_unionr    s     [)))fe$$$fe$$$   v>D!"@AAAYY-----..F/f///>>>r   c           	         t          |           t          ||           t          ||           t          |           t          |           t          |           t          |	           |||||||||	g	}|
t          d          d                    d |D                       }t          d| dt          j        |j        |	j        g                    S )z5Constructs the key-value union of sorted inputs.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z$set_union_by_key.<locals>.<listcomp>  rO   r   zthrust::set_union_by_key(rP   r  r  s                r   set_union_by_keyr    s     [)))k:...k:...''''''%%%'''j+z=+}FD!"@AAAYY-----..F-F---;,m.ABCC  r   c                    t          |           t          |           t          ||           |t          d          |||g}d                    d |D                       }t          d| dt          j                  S )>Sorts the elements in [first, last) into ascending order.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zsort.<locals>.<listcomp>"  rO   r   zthrust::sort(rP   r6   r;   rB   rR   rS   r   r   r   r   s          r   sortr"    s     [)))eT"""!"@AAA%DYY-----..F****K,<===r   c                 $   t          |           t          |           t          ||           t          |           |t          d          ||||g}d                    d |D                       }t          d| dt          j                  S )Performs key-value sort.
    Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zsort_by_key.<locals>.<listcomp>3  rO   r   zthrust::sort_by_key(rP   r!  r   r0   r   r   r   rg   r    rY   s           r   sort_by_keyr'  &  s    
 [)))$$$j),,,&&&!"@AAAY=DYY-----..F1111;3CDDDr   c                    t          |           t          |           t          ||           |t          d          |||g}d                    d |D                       }t          d| dt          j                  S )r  Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zstable_sort.<locals>.<listcomp>F  rO   r   zthrust::stable_sort(rP   r!  r   s          r   stable_sortr*  ;  s     [)))eT"""!"@AAA%DYY-----..F1111;3CDDDr   c                 $   t          |           t          |           t          ||           t          |           |t          d          ||||g}d                    d |D                       }t          d| dt          j                  S )r$  Nra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z&stable_sort_by_key.<locals>.<listcomp>W  rO   r   zthrust::stable_sort_by_key(rP   r!  r&  s           r   stable_sort_by_keyr-  J  s    
 [)))$$$j),,,&&&!"@AAAY=DYY-----..F8v888+:JKKKr   zthrust/swap.hc                     t          |           t          |           t          ||           t          |           ||||g}d                    d |D                       }t	          d| d|j                  S )z-Swaps each of the elements in the range.
    rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zswap_ranges.<locals>.<listcomp>e  rO   r   zthrust::swap_ranges(rP   r   )r   r0   rx   ry   rz   r    rY   s          r   swap_rangesr0  [  s     [)))   fe$$$   /DYY-----..F11116<@@@r   zthrust/unique.hc                     t          |           t          |           t          ||           |t          d          |||g}d                    d |D                       }t          d| d|j                  S )z4Removes all but the first element of the group.
    Nrv   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zunique.<locals>.<listcomp>  rO   r   zthrust::unique(rP   r   )r   r0   rU   rV   r{   r    rY   s          r   uniquer3  u  s     [)))eT"""!"GHHH%DYY-----..F,6,,,ek:::r   c                 L   t          |           t          |           t          ||           t          |           ||||g}|t          d          d                    d |D                       }t          d| dt          j        |j        |j        g                    S )zUniques key-value pairs.
    Nrv   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   z!unique_by_key.<locals>.<listcomp>  rO   r   zthrust::unique_by_key(rP   r   )r   r0   r   r   r   r{   r    rY   s           r   unique_by_keyr6    s     [)))$$$j),,,&&&Y=D!"GHHHYY-----..F****:+\-?@AA  r   c                    t          |           t          |           t          ||           dt          |          cxk    rdk    r@n n=|d         }t          |          dk    r|d         nd}t	          ||           |j        }ndt          |          cxk    rdk    r`n n]|d         }|d         }	|d         }
t          |          dk    r|d         nd}t          ||           t          ||	           |
j        }nt          d          |t          d          |||g|}d		                    d
 |D                       }t          d| d|          S )r\   r]   r^   r   Nr_   r`   z.Invalid number of inputs of thrust.upper_boundra   rK   c                     g | ]	}|j         
S r   rM   rN   s     r   r   zupper_bound.<locals>.<listcomp>  rO   r   zthrust::upper_bound(rP   r   re   s               r   upper_boundr9    r   r   )N)NN)NNN)B	cupyx.jitr   r   cupyx.jit._internal_typesr   r   r-   TypeBaser/   r6   r;   rB   rF   rH   hostdeviceseqrZ   rk   ro   rt   r|   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r"  r'  r*  r-  r0  r3  r6  r9  r   r   r   <module>r@     s
   % % % % % % ! ! ! ! ! ! 3 3 3 3 3 3   	 	 	 	 	k* 	 	 	M% M M M M
LE Ld L L L L+ +5 +T + + + +@ @5 @T @ @ @ @6% 6E 6d 6 6 6 6 u^__..//	!2!2	3	3eM??,,-- 2344
I 
I 
I 54
I" ,-..C C /.C< O$%%	: 	: &%	:  $%&&@ @ '&@" $%&&
@ 
@ 
@ '&
@ ,-..7 7 7 /.7 O$%%DHD D D &%D  O$%% 04K K K &%K( O$%%> > &%> O$%%	9 	9 &%	9$ %&''	< 	< ('	<  O$%%9=D D D &%D O$%% %)K K K &%K$ ,-.. %)A A A /.A( O$%%
D 
D 
D &%
D O$%%
D 
D 
D &%
D ,-..A A /.A<: : : : :/ : : : 9:;;
 
 
 <;
: : : : :/ : : : 9:;;
 
 
 <;
" '())   *). %&''; ; ; (';& %&'' AE   ('4 %&''; ; ('; %&''	A 	A ('	A  &'((	A 	A )(	A &'((
B 
B )(
B" &'((A A )(A &'((	B 	B )(	B &'((
A 
A )(
A  '())B B B *)B  -.//EID D D 0/D  -.// HL   0/0 -.//EIF F F 0/F  -.// 9=   0/. -.//EIN N N 0/N  -.// HL   0/0 -.//EI? ? ? 0/?  -.// HL   0/8 O$%%> > > &%> O$%%DHE E E &%E( O$%%E E E &%E O$%%DHL L L &%L  O$%%
A 
A &%
A2 %&''
; 
; 
; ('
; %&''    ('0 ,-..A A /.A A Ar   