def run_cupy(lat2, lon2): import cupy as cp # Allocate temporary arrays size = len(lat2) a = cp.empty(size, dtype='float64') dlat = cp.empty(size, dtype='float64') dlon = cp.empty(size, dtype='float64') # Transfer inputs to the GPU lat2 = cp.array(lat2) lon2 = cp.array(lon2) # Begin computation lat1 = 0.70984286 lon1 = 1.23892197 MILES_CONST = 3959.0 cp.subtract(lat2, lat1, out=dlat) cp.subtract(lon2, lon1, out=dlon) # dlat = sin(dlat / 2.0) ** 2.0 cp.divide(dlat, 2.0, out=dlat) cp.sin(dlat, out=dlat) cp.multiply(dlat, dlat, out=dlat) # a = cos(lat1) * cos(lat2) lat1_cos = math.cos(lat1) cp.cos(lat2, out=a) cp.multiply(a, lat1_cos, out=a) # a = a + sin(dlon / 2.0) ** 2.0 cp.divide(dlon, 2.0, out=dlon) cp.sin(dlon, out=dlon) cp.multiply(dlon, dlon, out=dlon) cp.multiply(a, dlon, out=a) cp.add(dlat, a, out=a) c = a cp.sqrt(a, out=a) cp.arcsin(a, out=a) cp.multiply(a, 2.0, out=c) mi = c cp.multiply(c, MILES_CONST, out=mi) # Transfer outputs back to CPU a = cp.asnumpy(a) return a
def geodistance_cp(lng1, lat1, lng2, lat2): lng1, lat1, lng2, lat2 = map(cp.radians, [lng1, lat1, lng2, lat2]) dlon = lng2 - lng1 dlat = lat2 - lat1 a = cp.sin(dlat / 2)**2 + cp.cos(lat1) * cp.cos(lat2) * cp.sin(dlon / 2)**2 dis = 2 * cp.arcsin(cp.sqrt(a)) * 6371 * 1000 return dis
def HaversineLocal(busMatrix, lineMatrix, haversine=True): MatrizOnibus = cp.copy(busMatrix) MatrizLinhas = cp.copy(lineMatrix) MatrizLinhas = cp.dsplit(MatrizLinhas, 2) MatrizOnibus = cp.dsplit(MatrizOnibus, 2) infVector = cp.squeeze(cp.sum(cp.isnan(MatrizLinhas[0]), axis=1), axis=-1) MatrizLinhas[0] = cp.expand_dims(MatrizLinhas[0], axis=-1) MatrizLinhas[1] = cp.expand_dims(MatrizLinhas[1], axis=-1) MatrizOnibus[0] = cp.expand_dims(MatrizOnibus[0], axis=-1) MatrizOnibus[1] = cp.expand_dims(MatrizOnibus[1], axis=-1) MatrizOnibus[0] *= cp.pi / 180 MatrizOnibus[1] *= cp.pi / 180 MatrizLinhas[1] = cp.transpose(MatrizLinhas[1], [2, 3, 0, 1]) * cp.pi / 180 MatrizLinhas[0] = cp.transpose(MatrizLinhas[0], [2, 3, 0, 1]) * cp.pi / 180 # Haversine or euclidian, based on <haversine> if haversine: results = 1000*2*6371.0088*cp.arcsin( cp.sqrt( (cp.sin((MatrizOnibus[0] - MatrizLinhas[0])*0.5)**2 + \ cp.cos(MatrizOnibus[0])* cp.cos(MatrizLinhas[0]) * cp.sin((MatrizOnibus[1] - MatrizLinhas[1])*0.5)**2) )) else: results = cp.sqrt((MatrizOnibus[0] - MatrizLinhas[0])**2 + (MatrizOnibus[1] - MatrizLinhas[1])**2) return results, infVector
def asin(x: Array, /) -> Array: """ Array API compatible wrapper for :py:func:`np.arcsin <numpy.arcsin>`. See its docstring for more information. """ if x.dtype not in _floating_dtypes: raise TypeError("Only floating-point dtypes are allowed in asin") return Array._new(np.arcsin(x._array))
def Algorithm(MO, ML, TOLERANCE, detectionPercentage=None, haversine=True): # global to analise global resultsMin # MatrizOnibus = cp.copy(MO) MatrizLinhas = cp.copy(ML) MatrizLinhas = cp.dsplit(MatrizLinhas, 2) MatrizOnibus = cp.dsplit(MatrizOnibus, 2) infVector = cp.squeeze(cp.sum(cp.isnan(MatrizLinhas[0]), axis=1), axis=-1) MatrizLinhas[0] = cp.expand_dims(MatrizLinhas[0], axis=-1) MatrizLinhas[1] = cp.expand_dims(MatrizLinhas[1], axis=-1) MatrizOnibus[0] = cp.expand_dims(MatrizOnibus[0], axis=-1) MatrizOnibus[1] = cp.expand_dims(MatrizOnibus[1], axis=-1) MatrizOnibus[0] *= cp.pi / 180 MatrizOnibus[1] *= cp.pi / 180 MatrizLinhas[1] = cp.transpose(MatrizLinhas[1], [2, 3, 0, 1]) * cp.pi / 180 MatrizLinhas[0] = cp.transpose(MatrizLinhas[0], [2, 3, 0, 1]) * cp.pi / 180 # Haversine or euclidian, based on <haversine> if haversine: results = 1000*2*6371.0088*cp.arcsin( cp.sqrt( (cp.sin((MatrizOnibus[0] - MatrizLinhas[0])*0.5)**2 + \ cp.cos(MatrizOnibus[0])* cp.cos(MatrizLinhas[0]) * cp.sin((MatrizOnibus[1] - MatrizLinhas[1])*0.5)**2) )) else: results = cp.sqrt((MatrizOnibus[0] - MatrizLinhas[0])**2 + (MatrizOnibus[1] - MatrizLinhas[1])**2) # Matriz D^[min] resultsMin = cp.nanmin(results, axis=1) #resultsGroup = cp.pad(resultsMin,[(0,0),(0,0),(0,resultsMin.shape[2]%groupSize)],constant_values=cp.NaN) #resultsGroup = cp.reshape(resultsGroup,(resultsGroup.shape[0],resultsGroup.shape[1],-1,groupSize)) sizeLine = resultsMin.shape[2] #below = cp.sum(resultsMin,axis=2) below = cp.sum(resultsMin < TOLERANCE, axis=2) resultsPerc = below / (sizeLine - infVector) if detectionPercentage: return resultsPerc > cp.array(detectionPercentage) return resultsPerc
def arccsc__(z): return cp.arcsin(1.0/z)