def test_merge(): ts_a = TimeSeries() ts_b = TimeSeries() # ts_a[0] = None ts_b[0] = True ts_merge = TimeSeries.merge([ts_a, ts_b]) assert True in ts_merge[0] assert None in ts_merge[0] ts_c = TimeSeries.merge([]) assert list(ts_c.items()) == []
def test_single_merges(): # a single empty time series ts = TimeSeries() assert TimeSeries.merge([ts]) == TimeSeries(default=[None]) # multiple empty time series ts_a = TimeSeries() ts_b = TimeSeries() assert TimeSeries.merge([ts_a, ts_b]) == \ TimeSeries(default=[None, None]) # test a single time series with only one measurement ts = TimeSeries() ts[21] = 42 merged = TimeSeries.merge([ts]) assert list(merged.items()) == [(21, [42])] # test an empty time series and a time series with one measurement ts_a = TimeSeries() ts_a[21] = 42 ts_b = TimeSeries() ts = TimeSeries.merge([ts_a, ts_b]) assert ts[20] == [None, None] assert ts[23] == [42, None] # test an empty time series and a time series with one entry ts_a = TimeSeries() ts_a[21] = 42 ts_a[22] = 41 ts_a[23] = 40 ts_b = TimeSeries() ts_b[20] = 1 ts_b[22] = 2 ts_b[24] = 3 merged = TimeSeries.merge([ts_a, ts_b]) assert list(merged.items()) == [ (20, [None, 1]), (21, [42, 1]), (22, [41, 2]), (23, [40, 2]), (24, [40, 3]), ]
def test_single_merges(): # a single empty time series ts = TimeSeries() nose.tools.assert_raises(ValueError, TimeSeries.merge, [ts]) # multiple empty time series ts_a = TimeSeries() ts_b = TimeSeries() nose.tools.assert_raises(ValueError, TimeSeries.merge, [ts_a, ts_b]) # test a single time series with only one measurement ts = TimeSeries() ts[21] = 42 merged = TimeSeries.merge([ts]) assert merged.items() == [(21, [42])] # test an empty time series and a time series with one measurement ts_a = TimeSeries() ts_a[21] = 42 ts_b = TimeSeries() nose.tools.assert_raises(ValueError, TimeSeries.merge, [ts_a, ts_b]) # test an empty time series and a time series with one entry ts_a = TimeSeries() ts_a[21] = 42 ts_a[22] = 41 ts_a[23] = 40 ts_b = TimeSeries() ts_b[20] = 1 ts_b[22] = 2 ts_b[24] = 3 merged = TimeSeries.merge([ts_a, ts_b]) assert merged.items() == [ (20, [42, 1]), (22, [41, 2]), (23, [40, 2]), (24, [40, 3]), ]
def test_merge(): ts_a = TimeSeries(default=None) ts_b = TimeSeries(default=None) ts_a[0] = None ts_b[0] = True ts_merge = TimeSeries.merge([ts_a, ts_b]) assert True in ts_merge[0] assert None in ts_merge[0]
def group_total_beh(self): """ Returns: float of group total behavior index as a fraction of interval """ if len(self.ts_list) > 1: ts = TimeSeries() ts = ts.merge(self.ts_list) return self.beh_index(ts) else: return self.individual_total_beh()
def test_merge(): # since this is random, do it a bunch of times for n_trial in range(1000): # make a list of TimeSeries that is anywhere from 0 to 5 # long. Each TimeSeries is of random length between 0 and 20, # with random time points and random values. ts_list = [] for i in range(random.randint(1, 5)): ts_list.append(make_random_timeseries()) method_a = list(TimeSeries.merge(ts_list, compact=False)) method_b = list(TimeSeries.iter_merge(ts_list)) msg = '%s != %s' % (pprint.pformat(method_a), pprint.pformat(method_b)) assert method_a == method_b, msg
def example_sum(): a = TimeSeries() a.set(datetime.datetime(2015, 3, 1), 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 1) a.set(datetime.datetime(2015, 3, 5), 0) a.set(datetime.datetime(2015, 3, 6), 0) b = TimeSeries() b.set(datetime.datetime(2015, 3, 1), 0) b.set(datetime.datetime(2015, 3, 2, 12), 1) b.set(datetime.datetime(2015, 3, 3, 13, 13), 0) b.set(datetime.datetime(2015, 3, 4), 1) b.set(datetime.datetime(2015, 3, 5), 0) b.set(datetime.datetime(2015, 3, 5, 12), 1) b.set(datetime.datetime(2015, 3, 5, 19), 0) c = TimeSeries() c.set(datetime.datetime(2015, 3, 1, 17), 0) c.set(datetime.datetime(2015, 3, 1, 21), 1) c.set(datetime.datetime(2015, 3, 2, 13, 13), 0) c.set(datetime.datetime(2015, 3, 4, 18), 1) c.set(datetime.datetime(2015, 3, 5, 4), 0) # output the three time series for i, ts in enumerate([a, b, c]): for (t0, v0), (t1, v1) in ts.iterintervals(1): print(t0.isoformat(), i) print(t1.isoformat(), i) print('') for (t0, v0), (t1, v1) in ts.iterintervals(0): print(t0.isoformat(), i) print(t1.isoformat(), i) print('') # output the sum # for dt, i in sum([a, b, c]): # print dt.isoformat(), i # print '' for dt, i in TimeSeries.merge([a, b, c], operation=sum): print(dt.isoformat(), i)
def collect_states( trace: Trace, conditions: Iterable[SafetyCondition] ) -> Iterator[tuple[float, set[tuple[str, Any]]]]: atoms = set(domain.keys()) | set( Monitor(frozenset(c.condition for c in conditions)).atoms() ) event_keys: list[_Atom] = sorted(atoms, key=lambda d: d.id) events: TimeSeries = TimeSeries.merge([trace.values[e] for e in event_keys]) events.compact() t: float for t, v in events.items(): s = set() for e, i in zip(event_keys, v): if e in domain: d = domain[e] s.add((e.id, d.value(i))) else: s.add((e.id, i)) yield t, s
def test_sum(): a = TimeSeries() a.set(datetime.datetime(2015, 3, 1), 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 1) a.set(datetime.datetime(2015, 3, 4), 0) b = TimeSeries() b.set(datetime.datetime(2015, 3, 1), 0) b.set(datetime.datetime(2015, 3, 1, 12), 1) b.set(datetime.datetime(2015, 3, 2), 0) b.set(datetime.datetime(2015, 3, 2, 12), 1) b.set(datetime.datetime(2015, 3, 3), 0) c = TimeSeries() c.set(datetime.datetime(2015, 3, 1), 0) c.set(datetime.datetime(2015, 3, 1, 18), 1) c.set(datetime.datetime(2015, 3, 5), 0) ts_sum = TimeSeries.merge([a, b, c], operation=ignorant(sum)) # test before domain, should give default value assert ts_sum[datetime.datetime(2015, 2, 24)] == 0 # test values throughout sum assert ts_sum[datetime.datetime(2015, 3, 1)] == 1 assert ts_sum[datetime.datetime(2015, 3, 1, 6)] == 1 assert ts_sum[datetime.datetime(2015, 3, 1, 12)] == 2 assert ts_sum[datetime.datetime(2015, 3, 1, 13)] == 2 assert ts_sum[datetime.datetime(2015, 3, 1, 17)] == 2 assert ts_sum[datetime.datetime(2015, 3, 1, 18)] == 3 assert ts_sum[datetime.datetime(2015, 3, 1, 19)] == 3 assert ts_sum[datetime.datetime(2015, 3, 3)] == 2 assert ts_sum[datetime.datetime(2015, 3, 4)] == 1 assert ts_sum[datetime.datetime(2015, 3, 4, 18)] == 1 assert ts_sum[datetime.datetime(2015, 3, 5)] == 0 # test after domain, should give last value assert ts_sum[datetime.datetime(2015, 3, 6)] == 0 assert 0 + a + b == a + b
def register(self, trace: Trace): """Record the consecutive states encountered in the trace""" # FIXME Key sorting relies on id field being present, not the case for non Atom keys event_keys = sorted( self.domain, key=lambda d: getattr(d, "id", (str(d), )), ) events = TimeSeries.merge( [trace.values[getattr(e, "id", e)] for e in event_keys]) events.compact() for _, v in events.items(): entry = set() for (e, d), i in zip( sorted( self.domain.items(), key=lambda d: getattr(d[0], "id", (str(d[0]), )), ), v, ): entry.add((e, d.value(i))) self.combinations.add(frozenset(entry))
def collect_predicates(trace: Trace): # -> Iterator[tuple[float, set[tuple[str, bool]]]]: predicate_keys = sorted(predicates, key=lambda d: str(d)) predicate_values = list() for predicate in predicate_keys: v = Monitor().evaluate( trace, predicate, dt=0.01, quantitative=True, logic=mtfl.connective.zadeh, time=None, ) v = [(t, c >= mtfl.connective.zadeh.const_true) for t, c in v] ts: TimeSeries = TimeSeries(v) ts.compact() predicate_values.append(ts) # events: TimeSeries = TimeSeries.merge(predicate_values) for t, v in events.items(): s = set() for e, i in zip(predicate_keys, v): s.add((e, i)) yield t, s
def update(self, other: Trace) -> Trace: """Update the values of the current trace with the other""" for t, s in other.values.items(): c = self.values.get(t, TimeSeries()) self.values[t] = TimeSeries.merge([c, s], operation=self._merge_values) return self