U C^@s,ddlmZmZddlZddlmZddlZzddlZddlmZWn e k rddZddZYnXze Wne k re Z YnXze Wne k re Z YnXddZd d Zd d Zd dZd&ddZd'ddZd(ddZd)ddZddZd*ddZddZd+d d!Zd,d"d#Zd$d%ZdS)-)print_functionunicode_literalsN)Path)get_array_modulecCstSN)numpy)_r 4/tmp/pip-install-6_kvzl1k/thinc/thinc/neural/util.pyr cCs$tdkr dSt|tjrdSdSdS)z&Check whether an array is a cupy arrayNFT)cupy isinstancendarrayZarrr r r is_cupy_arrays  rcCst|tjrdSdSdS)z'Check whether an array is a numpy arrayTFN)rrrrr r r is_numpy_array%s rcCs\ddlm}m}|dks*t|tr.|dkr.|S|dksHt|trL|dkrL|Std|dS)N)NumpyOpsCupyOps)rcpur)r Zgpuz'Invalid ops (or device) description: %s)opsrrrint ValueError)rrrr r r get_ops-s rcCsZddl}|jj|}|z"ddl}|j||dWntk rTYnX|S)Nrztorch.cuda.FloatTensor) Zcupy.cuda.deviceZcudadeviceZDeviceZusetorchZ set_deviceZset_default_tensor_type ImportError)gpu_idr rrr r r set_active_gpu8s rcCs,ddlm}|jdkrdSt|ddSdS)z?Use GPU if it's available. Returns True if so, False otherwise.rrNF)rT)rrxp require_gpu)rrr r r prefer_gpuGs    r#cCsDddlm}ddlm}|jdkr*td||_||_t|dS)Nr)Modelr z;GPU is not accessible. Was the library installed correctly?T)Z_classes.modelr$rrr!rZOpsr)rr$rr r r r"Rs   r"ccst|trt|}n|}t|drdt|drdd}|t|krt|}||||V||7}q2n>t|}t|}tt |t|}t|dkrqt|VqldS)zlIterate over batches of items. `size` may be an iterator, so that batch-size can vary on each step. __len__ __getitem__rN) rr itertoolsrepeathasattrlennextiterlistislice)itemssizeZsize_iZ batch_sizebatchr r r minibatch^s     r4cCs>|D]0}|dd|dd|d|dq|dfS)z(Pad sentence sequences with EOL markers.rz-EOL-N)insertappend) sequencesdropsequencer r r mark_sentence_boundariesvs     r;csddidfdd }|S)Nrr5csFt}t|D],\}}|kr0||<|d7}|||<q|dfS)Nr)r+ enumerate)idsr9Zn_vectorr2Zid_Zid_mapr r begin_updateszremap_ids..begin_update)r5r )rr?r r>r remap_idss r@ same_kindcCsZt|tjr&t|tjr&||dd<n0t|rJtj|dd}t||n t||dS)NF)copy)rrrrr arrayZcopyto)dstsrcZcastingwherer r r copy_arrays rGcCs$t|tst|trt|S|SdSr)runicodestrr)pathr r r ensure_pathsrKcCstt|}|tkr|}tj|dd}|ss>