Пример #1
0
    def __init__(self, distribution_beginning, distribution_ending,
                 bins=50, relation_formula=None):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError("'distribution_beginning' should be a scipy frozen distribution")
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError("'distribution_ending' should be a scipy frozen distribution")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(distribution_beginning)
        ending, b = calculate_bounds_of_probability_distribution(distribution_ending)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
        if relation_formula is None:
            relation_formula = RelationFormulaGeometricMean()
        elif not isinstance(relation_formula, BaseRelationFormula):
            raise TypeError("'relation_formula' should be of type 'BaseRelationFormula'")
        relation_formula.bounds[distribution_beginning] = self.a, self.beginning
        relation_formula.bounds[distribution_ending] = self.ending, self.b
        self._formula_creator = FormulaCreator(relation_formula)
Пример #2
0
class TemporalEvent(list, TimeInterval):
    _distribution_beginning = None
    _distribution_ending = None
    _beginning = None
    _ending = None
    _dict = None

    def __init__(self,
                 distribution_beginning,
                 distribution_ending,
                 bins=50,
                 relation_formula=None):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError(
                "'distribution_beginning' should be a scipy frozen distribution"
            )
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError(
                "'distribution_ending' should be a scipy frozen distribution")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(
            distribution_beginning)
        ending, b = calculate_bounds_of_probability_distribution(
            distribution_ending)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
        # if relation_formula is None:
        #     relation_formula = RelationFormulaGeometricMean()
        # elif not isinstance(relation_formula, BaseRelationFormula):
        #     raise TypeError("'relation_formula' should be of type 'BaseRelationFormula'")
        relation_formula = RelationFormulaGeometricMean()
        relation_formula.bounds[
            distribution_beginning] = self.a, self.beginning
        relation_formula.bounds[distribution_ending] = self.ending, self.b
        self._formula_creator = FormulaCreator(relation_formula)

    def degree(self, time_step=None, a=None, b=None, interval=None):
        """
        usage: provide 'time_step' or 'a' and 'b' or 'interval'
        """
        if time_step is not None:
            return self.membership_function(time_step)

        if interval is None:
            if (a, b) == (None, None):
                interval = self
            else:
                interval = TimeInterval(a, b)
        else:
            check_is_time_interval(interval)
        return integral(self.membership_function, interval.a, interval.b)

    def temporal_relations_with(self, other):
        return self._formula_creator.temporal_relations_between(self, other)

    def instance(self):
        return TemporalInstance(self.distribution_beginning.rvs(),
                                self.distribution_ending.rvs())

    def to_dict(self):
        if self._dict is None:
            self._dict = {}
            for time_step in self.to_list():
                self._dict[time_step] = self.membership_function(time_step)
        return self._dict

    # def plot(self, show_distributions=False):
    #     import matplotlib.pyplot as plt
    #     plt.plot(self.to_datetime_list(), self.membership_function())
    #     if show_distributions:
    #         if hasattr(self.distribution_beginning, 'plot'):
    #             self.distribution_beginning.plot()
    #         else:
    #             plt.plot(self.interval_beginning.to_datetime_list(),
    #                      self.distribution_beginning.pdf(self.interval_beginning))
    #         if hasattr(self.distribution_ending, 'plot'):
    #             self.distribution_ending.plot()
    #         else:
    #             plt.plot(self.interval_ending.to_datetime_list(),
    #                      self.distribution_ending.pdf(self.interval_ending))
    #     return plt

    def plot(self, plt=None, show_distributions=False):
        if plt is None:
            import matplotlib.pyplot as plt
        plt.plot(self.to_float_list(), self.membership_function())
        if show_distributions:
            if hasattr(self.distribution_beginning, 'plot'):
                self.distribution_beginning.plot()
            else:
                plt.plot(
                    self.interval_beginning.to_float_list(),
                    self.distribution_beginning.pdf(self.interval_beginning))
            if hasattr(self.distribution_ending, 'plot'):
                self.distribution_ending.plot()
            else:
                plt.plot(self.interval_ending.to_float_list(),
                         self.distribution_ending.pdf(self.interval_ending))
        return plt

    @property
    def distribution_beginning(self):
        return self._distribution_beginning

    @property
    def distribution_ending(self):
        return self._distribution_ending

    @property
    def beginning(self):
        return self._beginning

    @property
    def ending(self):
        return self._ending

    def __mul__(self, other):
        return self.temporal_relations_with(other)

    def __str__(self):
        return repr(self)
Пример #3
0
from spatiotemporal.temporal_events.trapezium import TemporalEventTrapezium
from spatiotemporal.temporal_events.relation_formulas import FormulaCreator
from spatiotemporal.temporal_events.composition.non_linear_least_squares import DecompositionFitter

import matplotlib.pyplot as plt


all_relations = "pmoFDseSdfOMP"

a = TemporalEventTrapezium(1, 12, 4, 8)
b = TemporalEventTrapezium(9, 17, 13, 15)

# compute relations between events
temporal_relations = a * b
print("Relations: {0}".format(temporal_relations.to_list()))
# print degree for every relation
for relation in all_relations:
    print(relation, temporal_relations[relation])

# plot events
a.plot(show_distributions=True).ylim(ymin=-0.1, ymax=1.1)
b.plot(show_distributions=True).figure()
plt.show()

# from the 13 relations, learns parameters for all combinations of the
# before, same, and after relationships between the beginning and
# ending distributions of the two intervals
formula = FormulaCreator(DecompositionFitter(temporal_relations))
# from these relationships, computes the 13 relations again
relations_estimate = formula.calculate_relations()
print("Estimated relations: {0}".format(relations_estimate.to_list()))
Пример #4
0
class TemporalEvent(list, TimeInterval):
    _distribution_beginning = None
    _distribution_ending = None
    _beginning = None
    _ending = None
    _dict = None

    def __init__(self, distribution_beginning, distribution_ending,
                 bins=50, relation_formula=None):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError("'distribution_beginning' should be a scipy frozen distribution")
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError("'distribution_ending' should be a scipy frozen distribution")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(distribution_beginning)
        ending, b = calculate_bounds_of_probability_distribution(distribution_ending)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
        if relation_formula is None:
            relation_formula = RelationFormulaGeometricMean()
        elif not isinstance(relation_formula, BaseRelationFormula):
            raise TypeError("'relation_formula' should be of type 'BaseRelationFormula'")
        relation_formula.bounds[distribution_beginning] = self.a, self.beginning
        relation_formula.bounds[distribution_ending] = self.ending, self.b
        self._formula_creator = FormulaCreator(relation_formula)

    def degree(self, time_step=None, a=None, b=None, interval=None):
        """
        usage: provide 'time_step' or 'a' and 'b' or 'interval'
        """
        if time_step is not None:
            return self.membership_function(time_step)

        if interval is None:
            if (a, b) == (None, None):
                interval = self
            else:
                interval = TimeInterval(a, b)
        else:
            check_is_time_interval(interval)
        return integral(self.membership_function, interval.a, interval.b)

    def temporal_relations_with(self, other):
        return self._formula_creator.temporal_relations_between(self, other)

    def instance(self):
        return TemporalInstance(self.distribution_beginning.rvs(), self.distribution_ending.rvs())

    def to_dict(self):
        if self._dict is None:
            self._dict = {}
            for time_step in self.to_list():
                self._dict[time_step] = self.membership_function(time_step)
        return self._dict

    def plot(self, show_distributions=False):
        import matplotlib.pyplot as plt
        plt.plot(self.to_datetime_list(), self.membership_function())
        if show_distributions:
            if hasattr(self.distribution_beginning, 'plot'):
                self.distribution_beginning.plot()
            else:
                plt.plot(self.interval_beginning.to_datetime_list(),
                         self.distribution_beginning.pdf(self.interval_beginning))
            if hasattr(self.distribution_ending, 'plot'):
                self.distribution_ending.plot()
            else:
                plt.plot(self.interval_ending.to_datetime_list(),
                         self.distribution_ending.pdf(self.interval_ending))
        return plt

    @property
    def distribution_beginning(self):
        return self._distribution_beginning

    @property
    def distribution_ending(self):
        return self._distribution_ending

    @property
    def beginning(self):
        return self._beginning

    @property
    def ending(self):
        return self._ending

    def __mul__(self, other):
        return self.temporal_relations_with(other)

    def __str__(self):
        return repr(self)
Пример #5
0
from spatiotemporal.temporal_events.trapezium import TemporalEventTrapezium
from spatiotemporal.temporal_events.relation_formulas import FormulaCreator
from spatiotemporal.temporal_events.composition.non_linear_least_squares import DecompositionFitter

import matplotlib.pyplot as plt

all_relations = "pmoFDseSdfOMP"

a = TemporalEventTrapezium(1, 12, 4, 8)
b = TemporalEventTrapezium(9, 17, 13, 15)

# compute relations between events
temporal_relations = a * b
print("Relations: {0}".format(temporal_relations.to_list()))
# print degree for every relation
for relation in all_relations:
    print(relation, temporal_relations[relation])

# plot events
a.plot(show_distributions=True).ylim(ymin=-0.1, ymax=1.1)
b.plot(show_distributions=True).figure()
plt.show()

# from the 13 relations, learns parameters for all combinations of the
# before, same, and after relationships between the beginning and
# ending distributions of the two intervals
formula = FormulaCreator(DecompositionFitter(temporal_relations))
# from these relationships, computes the 13 relations again
relations_estimate = formula.calculate_relations()
print("Estimated relations: {0}".format(relations_estimate.to_list()))