o C6g&@s~ddlZddlmZmZddlmZddlmZddlZ ddl m Z ddl m Z GdddeZ d d Zd d ZeeZdS) N) haversinereversepairwise_distances)Metric) BatchedKDE)tqdmcsleZdZdZggdddffdd ZddZd d Zdd d ZdddZddZ ddZ dddZ Z S)HaversineMetricsa^ Computes the average haversine distance between the predicted and ground truth points. Compute the accuracy given some radiuses. Compute the Geoguessr score given some radiuses. Args: acc_radiuses (list): list of radiuses to compute the accuracy from acc_area (list): list of areas to compute the accuracy from. )countryregionz sub-regioncityFcst||_|jdtddd|jdtddd|D]}|jd|tdddq |D]}|jd|tddd|jd|tdddq3||_||_|jd tddd|jd gdd |jd gdd ||_dS) N haversine_sumgsum)defaultdist_reduce_fx geoguessr_sumclose_enough_points_count_rcount real_points)r fake_points) super__init__use_kde add_statetorchtensor acc_radiusacc_area manifold_k)self acc_radiusesrrr acc __class__;/home/dufour/Documents/diff_plonk/metrics/distance_based.pyrsB  zHaversineMetrics.__init__c Cs|jrt|d\\}}}tj||gdd|d<|dr@|djdd}|d|}|d|}t|dkr?dSn|d}|d}t||} |jD]} |j d| | | k 7<qPt|j dkrst |||j \} } |j D]0} |j d| | | | d d| gk 7<|j d| t| d d| g7<qv|j| 7_|jd t| d  7_|j||j||j|jd7_dS) Ngpsdimrr_uniquerigR@)restimate_kde_moderstackisnananylenrr__dict__rrrjoinrrexprappendrrshape) r!predgtx_modey_modekde valid_maskZpred_gpsZgt_gpshaversine_distancer# area_predarea_gtr&r&r'update?s>      ,"  zHaversineMetrics.updatecCs|j|j|j|jd}|jD]}|jd||j|d|d<q|jD]}|jd||jd||d|<q'tj|jdd}tj|j dd}| |||j \|d<|d <|d <|d <|S) N) Haversine Geoguessrr Accuracy_ _km_radiusrrr* precisionrecalldensitycoverage) rrrrr3rrcatrrmanifold_metricsr )r!outputr#rrr&r&r'computebs(    zHaversineMetrics.computeNcCs |dur|}t||ddd}|S)z Args: data_x: numpy.ndarray([N, feature_dim], dtype=np.float32) data_y: numpy.ndarray([N, feature_dim], dtype=np.float32) Returns: numpy.ndarray([N, N], dtype=np.float32) of pairwise distances. Nr)metricn_jobsr)r!data_xdata_ydistsr&r&r'compute_pairwise_distancezsz*HaversineMetrics.compute_pairwise_distancecCs<tj|||ddd|f}tj|||d}|j|d}|S)z Args: unsorted: numpy.ndarray of any dimensionality. k: int Returns: kth values along the designated axis. axis.N)np argpartitiontake_along_axismax)r!unsortedkrWindices k_smallests kth_valuesr&r&r' get_kth_values zHaversineMetrics.get_kth_valuecCs"||}|j||ddd}|S)z Args: input_features: numpy.ndarray([N, feature_dim], dtype=np.float32) nearest_k: int Returns: Distances to kth nearest neighbours. r)rU)r]rW)rTra)r!input_features nearest_k distancesradiir&r&r'#compute_nearest_neighbour_distancess z4HaversineMetrics.compute_nearest_neighbour_distancesc Cs|||}|||}|||}|tj|ddkjdd}|tj|ddkjdd}dt||tj|ddkjdd} |jdd|k} ||| | fS)ak Computes precision, recall, density, and coverage given two manifolds. Args: real_features: numpy.ndarray([N, feature_dim], dtype=np.float32) fake_features: numpy.ndarray([N, feature_dim], dtype=np.float32) nearest_k: int. Returns: dict of precision, recall, density, and coverage. r)rVrg?) rfrTrX expand_dimsr1meanfloatrmin) r! real_features fake_featuresrc real_nearest_neighbour_distances fake_nearest_neighbour_distancesdistance_real_fakerFrGrHrIr&r&r' compute_prdcsF      zHaversineMetrics.compute_prdccCs|j|dd}|j|dd}ggggf\}}}}tt||ddD]D\} } |j| | |d\} } } }|tj| | j d|tj| | j d|tj| | j d|tj|| j dq!t | t | t | t | fS)a Computes precision, recall, density, and coverage given two manifolds. Args: real_features: torch.Tensor([N, feature_dim], dtype=torch.float32) fake_features: torch.Tensor([N, feature_dim], dtype=torch.float32) nearest_k: int. num_splits: int. Number of splits to use for computing metrics. Returns: dict of precision, recall, density, and coverage. rr*zComputing manifold)desc)rc)device) chunkrziprpcpunumpyr6rrrsr/rhitem)r!rkrlrc num_splitsrFrGrHrIrealfakeprdcr&r&r'rKs$  z!HaversineMetrics.manifold_metrics)N)rU)rq) __name__ __module__ __qualname____doc__rrArMrTrarfrprK __classcell__r&r&r$r'r s )#    2r c Cst}|||jd}t|\}}}||j}||j}||j}|||j}||dt |||dj ddf}||dt |||dj ddf}||f|fS)NrrUr)r*) rfitr7batched_make_gridrvtorsscorereshaperarangeargmax) pointsr< batch_sizeXY positionsZr:r;r&r&r'r.s        r.c Cs||jdd\\}}}|jdd\\}}}t||d}t||d}t||\}} t|| gdd} || | fS)Nr*drU)rjr[rlinspacemeshgridvstackflatten transpose) rlat_minlong_minr,lat_maxlong_maxxyrrrr&r&r' make_grids r)r metrics.utilsrrsklearn.metricsr torchmetricsrrwrX utils.kderrr r.rvmaprr&r&r&r's    i