# -*- coding: utf-8 -*-
"""Class for probabilistic distance QSR
:Author: Christian Dondrup <cdondrup@lincoln.ac.uk>
:Organization: University of Lincoln
"""
from __future__ import print_function, division
import numpy as np
from qsr_arg_relations_distance import QSR_Arg_Relations_Distance
from random import uniform
[docs]class QSR_Arg_Prob_Relations_Distance(QSR_Arg_Relations_Distance):
def __init__(self):
super(QSR_Arg_Prob_Relations_Distance, self).__init__()
self._unique_id = "argprobd"
self.allowed_value_types = (tuple, list)
self.value_sort_key = lambda x: x[1][0] # Sort by first element in value tuple, i.e. mean
def __normpdf(self, x, mu, sigma):
u = (x-mu)/np.abs(sigma)
y = (1/(np.sqrt(2*np.pi)*np.abs(sigma)))*np.exp(-u*u/2)
return np.around(y, decimals=3)
def _compute_qsr(self, data1, data2, qsr_params, **kwargs):
d = np.sqrt(np.square(data1.x - data2.x) + np.square(data1.y - data2.y))
r = (None, 0.0)
for values, relation in zip(self.all_possible_values, self._all_possible_relations):
prob = uniform(0.0, self.__normpdf(d, mu=values[0], sigma=values[1]))
r = (relation, prob) if prob > r[1] else r
return r[0] if r[0] else self._all_possible_relations[-1]