Beispiel #1
0
from scipy.stats import uniform
from spatiotemporal.temporal_events import RelationFormulaGeometricMean

f = RelationFormulaGeometricMean()

A = uniform(loc=0, scale=4)
B = uniform(1, 1)
C = uniform(2, 1)

print 'A, B', f.compare(A, B)
print 'B, C', f.compare(B, C)
print 'A, C', f.compare(A, C)

Bh = uniform(0, 1)
# Ah = uniform(-0.95, 3.84)
Ah = uniform(0, 1)
print 'Ah, Bh', f.compare(Ah, Bh)

Ch = uniform(1, 1)
print 'Bh, Ch', f.compare(Bh, Ch)
print 'Ah, Ch', f.compare(Ah, Ch)
class CombinationFormulaGeometricMeanTrapezium(BaseCombinationFormula):
    relation_formula = RelationFormulaGeometricMean()

    def __init__(self):
        pass

    def combine(self, relation_a_b_beginning, relation_a_b_ending, relation_b_beginning_c, relation_b_ending_c):
        before_a_b, same_a_b, after_a_b = relation_a_b_beginning
        before_b_c, same_b_c, after_b_c = relation_b_beginning_c
        unknown = 1.0 / 3

        if almost_equals(before_a_b + before_b_c, 2.0, epsilon)\
                or almost_equals(before_a_b + same_b_c, 2.0, epsilon)\
                or almost_equals(same_a_b + before_b_c, 2.0, epsilon):
            return [(1.0, 0.0, 0.0)]

        if almost_equals(after_a_b + after_b_c, 2.0, epsilon)\
                or almost_equals(after_a_b + same_b_c, 2.0, epsilon)\
                or almost_equals(same_a_b + after_b_c, 2.0, epsilon):
            return [(1.0, 0.0, 0.0)]

        if almost_equals(same_a_b + same_b_c, 2.0, epsilon):
            return [(0.0, 1.0, 0.0)]

        if almost_equals(before_a_b + after_b_c, 2.0, epsilon) or almost_equals(after_a_b + before_b_c, 2.0, epsilon):
            return [(unknown, unknown, unknown)]

        relation_a_c_possibilities = []

        a_possibilities, b_ending_1 = self.unpack(relation_a_b_beginning, relation_a_b_ending)
        c_possibilities, b_ending_2 = self.unpack(tuple(reversed(relation_b_beginning_c)), tuple(reversed(relation_b_ending_c)))

        if len(a_possibilities) == 0:
            if before_a_b == 0:
                if len(c_possibilities) == 1:
                    if before_b_c == 0:
                        relation_a_c_possibilities.append((0.0, 0.0, 1.0))
                    else:
                        relation_a_c_possibilities.append((unknown, unknown, unknown))
                else:
                    relation_a_c_possibilities.append((unknown, unknown, unknown))
                    relation_a_c_possibilities.append((0.0, 0.0, 1.0))
            else:
                if len(c_possibilities) == 1:
                    if after_b_c == 0:
                        relation_a_c_possibilities.append((1.0, 0.0, 0.0))
                    else:
                        relation_a_c_possibilities.append((unknown, unknown, unknown))
                else:
                    relation_a_c_possibilities.append((unknown, unknown, unknown))
                    relation_a_c_possibilities.append((1.0, 0.0, 0.0))

        if len(c_possibilities) == 0:
            if before_b_c == 0:
                if len(a_possibilities) == 1:
                    if before_a_b == 0:
                        relation_a_c_possibilities.append((0.0, 0.0, 1.0))
                    else:
                        relation_a_c_possibilities.append((unknown, unknown, unknown))
                else:
                    relation_a_c_possibilities.append((unknown, unknown, unknown))
                    relation_a_c_possibilities.append((0.0, 0.0, 1.0))
            else:
                if len(a_possibilities) == 1:
                    if after_a_b == 0:
                        relation_a_c_possibilities.append((1.0, 0.0, 0.0))
                    else:
                        relation_a_c_possibilities.append((unknown, unknown, unknown))
                else:
                    relation_a_c_possibilities.append((unknown, unknown, unknown))
                    relation_a_c_possibilities.append((1.0, 0.0, 0.0))

        for possible_a in a_possibilities:
            for possible_c in c_possibilities:
                relation_a_c_possibilities.append(self.relation_formula.compare(possible_a, possible_c))

        return relation_a_c_possibilities

    def _find_c_in_the_middle(self, relation_b_beginning_c, relation_b_ending_c, b_ending):
        before_b_beginning_c, same_b_beginning_c, after_b_beginning_c = relation_b_beginning_c
        before_b_ending_c, same_b_ending_c, after_b_ending_c = relation_b_ending_c
        b_ending_start_point, b_ending_end_point = b_ending.args[0], b_ending.args[0] + b_ending.args[1]

        c_start_point = -(same_b_beginning_c *
                          (before_b_ending_c * (b_ending_start_point + b_ending_end_point)
                           + b_ending_start_point + before_b_ending_c)) / (before_b_ending_c *
                                                                           after_b_beginning_c + same_b_beginning_c
                                                                           * (1 + before_b_ending_c))

        c_end_poin = 1 + after_b_beginning_c * c_start_point / same_b_beginning_c

        return uniform(c_start_point, c_end_poin - c_start_point)

    def unpack_partial(self, relation, length_b=1.0):
        before, same, after = relation
        if same == 0:
            return []

        length_a = 1.0 / same ** 2

        if before > 0 and after > 0:
            possibilities = []
            before_portion = before / (before + after)
            possibilities.append(uniform((1 - length_a) * before_portion, length_a))
            length_a = same ** 2
            possibilities.append(uniform((1 - length_a) * (1 - before_portion), length_a))
            return possibilities

        length_a = (same ** 4 + 1) / (2 * same ** 2)    # average case

        if before > 0:
            return [uniform(same * sqrt(length_a) - length_a, length_a)]

        if after > 0:
            return [uniform(1 - same * sqrt(length_a), length_a)]

        return [uniform(0, 1)]

    def unpack(self, relation_a_b_beginning, relation_a_b_ending):
        before_a_b_beginning, same_a_b_beginning, after_a_b_beginning = relation_a_b_beginning
        before_a_b_ending, same_a_b_ending, after_a_b_ending = relation_a_b_ending

        if almost_equals(before_a_b_beginning + same_a_b_beginning + same_a_b_ending + after_a_b_ending, 2.0, epsilon):
            return [], uniform_reference   # Inconsistent

        if almost_equals(before_a_b_beginning + before_a_b_ending, 2.0, epsilon):
            return [], uniform_reference

        if almost_equals(after_a_b_beginning + after_a_b_ending, 2.0, epsilon):
            return [], uniform_reference

        if almost_equals(before_a_b_ending, 1.0, epsilon):
            return self.unpack_partial(relation_a_b_beginning), uniform_reference

        if almost_equals(after_a_b_beginning, 1.0, epsilon):
            return self.unpack_partial(relation_a_b_ending), uniform_reference

        a_possibilities = self.unpack_partial(relation_a_b_beginning)
        if len(a_possibilities) == 1:
            a_possibility = a_possibilities[0]

            return
        else:
            a_possibility_1, a_possibility_2 = a_possibilities
            a_possibility = a_possibility_1
            if a_possibility.args[1] < a_possibility_2.args[1]:
                a_possibility = a_possibility_2

        a_start_point, length_a = a_possibility.args

        if before_a_b_ending * same_a_b_ending * after_a_b_ending > 0:
            if almost_equals(before_a_b_beginning, 0, epsilon):
                length_b_ending = length_a * same_a_b_ending ** 2
            else:
                length_b_ending = same_a_b_ending ** 2 / same_a_b_beginning ** 2
            b_ending = uniform(a_start_point + before_a_b_ending * (length_a - length_b_ending) /
                               (before_a_b_ending + after_a_b_ending), length_b_ending)
            return [a_possibility], b_ending
        else:
            denominator = length_a * same_a_b_ending ** 2
            length_b_ending_lower_bound = (length_a * same_a_b_ending ** 2) ** 2 / denominator
            length_b_ending_upper_bound = (a_start_point + length_a - 1) ** 2 / denominator
            length_b_ending = (length_b_ending_lower_bound + length_b_ending_upper_bound) / 2.0
            b_start_point = a_start_point + length_a - same_a_b_ending * sqrt(length_b_ending * length_a)
            b_ending = uniform(b_start_point, length_b_ending)
            return [a_possibility], b_ending
Beispiel #3
0
from scipy.stats import uniform
from spatiotemporal.temporal_events import RelationFormulaGeometricMean

f = RelationFormulaGeometricMean()

A = uniform(loc=0, scale=4)
B = uniform(1, 1)
C = uniform(2, 1)

print 'A, B', f.compare(A, B)
print 'B, C', f.compare(B, C)
print 'A, C', f.compare(A, C)


Bh = uniform(0, 1)
# Ah = uniform(-0.95, 3.84)
Ah = uniform(0, 1)
print 'Ah, Bh', f.compare(Ah, Bh)

Ch = uniform(1, 1)
print 'Bh, Ch', f.compare(Bh, Ch)
print 'Ah, Ch', f.compare(Ah, Ch)
            return [a_possibility], b_ending
        else:
            denominator = length_a * same_a_b_ending ** 2
            length_b_ending_lower_bound = (length_a * same_a_b_ending ** 2) ** 2 / denominator
            length_b_ending_upper_bound = (a_start_point + length_a - 1) ** 2 / denominator
            length_b_ending = (length_b_ending_lower_bound + length_b_ending_upper_bound) / 2.0
            b_start_point = a_start_point + length_a - same_a_b_ending * sqrt(length_b_ending * length_a)
            b_ending = uniform(b_start_point, length_b_ending)
            return [a_possibility], b_ending



if __name__ == '__main__':
    b_ending = uniform(3, 4)
    c = uniform(0.5, 3)
    rf = RelationFormulaGeometricMean()
    f = CombinationFormulaGeometricMeanTrapezium()
    r_1, r_2 = rf.compare(c, uniform_reference), rf.compare(c, b_ending)
    c = f._find_c_in_the_middle(r_1, r_2, b_ending)
    print c.args
    quit()




    from spatiotemporal.temporal_events.trapezium import TemporalEventTrapezium
    # f = CombinationFormulaGeometricMeanTrapezium()
    # rf = RelationFormulaGeometricMean()
    # a, b_beg, b_end = uniform(5, 2), uniform(1, 3), uniform(8, 4)
    # [a_h], b_end_h = f.unpack(rf.compare(a, b_beg), rf.compare(a, b_end))
    #