def test_set_case(self, process): assert process.check_point_cases == 0 assert process.cases == [] process.set_case('5', 'activityA', datetime(2015, 5, 10, 8, 00, 00)) assert process.check_point_cases == 1 assert process.cases case_test = process.cases[0] assert case_test.id == '5' activity = case_test.activities[0] assert activity.name == 'activityA' assert activity.timestamp == datetime(2015, 5, 10, 8, 00, 00) case1 = Case('1') case2 = Case('2') case3 = Case('3') case4 = Case('4') process.check_point_cases = 0 process.cases = [case1, case2, case3, case4] process.set_case('3', 'activityA', datetime(2015, 5, 10, 8, 00, 00)) assert process.check_point_cases == 0 assert process.cases case_test = process.cases[0] assert case_test.id == '3' activity = case_test.activities[0] assert activity.name == 'activityA' assert activity.timestamp == datetime(2015, 5, 10, 8, 00, 00)
def cases_list(self): case_list = [] case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_list.append(case) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) case_list.append(case) case = Case('4') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case) return case_list
def simple_graph(self): case_list = [] case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_list.append(case) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) case_list.append(case) graph = nx.DiGraph(name='simple_graph') graph = initialize_graph(graph, case_list) return graph
def test_extract_cases_time_and_trace(): case_list = [] with pytest.raises(Exception): assert extract_cases_time_and_trace(case_list) case = Case('1') case.set_activity('activity1', datetime(2015, 5, 10, 8, 30, 00)) case.set_activity('activity2', datetime(2015, 5, 10, 9, 00, 00)) case.set_activity('activity3', datetime(2015, 5, 10, 9, 30, 00)) case.set_activity('activity4', datetime(2015, 5, 10, 10, 00, 00)) case_list.append(case) case = Case('2') case.set_activity('activity1', datetime(2015, 5, 10, 8, 5, 30)) case.set_activity('activity3', datetime(2015, 5, 10, 9, 33, 52)) case.set_activity('activity2', datetime(2015, 5, 10, 10, 30, 00)) case.set_activity('activity4', datetime(2015, 5, 10, 11, 50, 00)) case_list.append(case) case = Case('3') case.set_activity('activity5', datetime(2016, 5, 10, 8, 5, 30)) case.set_activity('activity1', datetime(2017, 5, 10, 9, 33, 52)) case.set_activity('activity3', datetime(2018, 5, 10, 10, 30, 00)) case.set_activity('activity4', datetime(2019, 5, 10, 11, 50, 00)) case_list.append(case) trace_list, time_list = extract_cases_time_and_trace(case_list) expected_trace_list = [[ 'activity1', 'activity2', 'activity3', 'activity4' ], ['activity1', 'activity3', 'activity2', 'activity4'], ['activity5', 'activity1', 'activity3', 'activity4']] expected_time_list = [[ datetime(2015, 5, 10, 8, 30, 00), datetime(2015, 5, 10, 9, 00, 00), datetime(2015, 5, 10, 9, 30, 00), datetime(2015, 5, 10, 10, 00, 00) ], [ datetime(2015, 5, 10, 8, 5, 30), datetime(2015, 5, 10, 9, 33, 52), datetime(2015, 5, 10, 10, 30, 00), datetime(2015, 5, 10, 11, 50, 00) ], [ datetime(2016, 5, 10, 8, 5, 30), datetime(2017, 5, 10, 9, 33, 52), datetime(2018, 5, 10, 10, 30, 00), datetime(2019, 5, 10, 11, 50, 00) ]] assert len(trace_list) == 3 assert len(time_list) == 3 assert trace_list == expected_trace_list assert time_list == expected_time_list
def simple_graph(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), }) case_list.append(case) graph = initialize_graph(case_list) return graph
def test_calculate_empty_distances(self): empty_case = Case("Empty case") assert calculate_case_time_distances(empty_case) == [0] single_event_case = Case("Single event case") single_event_case.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 30, 30) }) assert calculate_case_time_distances(single_event_case) == [0]
def test_initialize_cdesf(self, process, cases_list): assert process.nyquist == 0 assert process.check_point_cases == 0 assert len(process.process_model_graph.edges) == 0 assert len(process.process_model_graph.nodes) == 0 assert process.cases == [] with pytest.raises(Exception): assert initialize_graph([]) case4 = Case("4") case4.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case4.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case4.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) process.cases = cases_list process.cases.insert(0, case4) process.process_model_graph = initialize_graph(process.cases) pmg = initialize_graph(cases_list) for case in cases_list: case.distances = calculate_case_distances(pmg, case)
def test_generate_outlier_clusters(self, denstream): assert denstream.generate_outlier_clusters() == [] case_0 = Case("0") case_1 = Case("1") case_2 = Case("2") case_3 = Case("3") micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.weight = 3 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.weight = 4 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(3, 2, 0, 0.15) micro_cluster.weight = 6 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id assert denstream.all_cases == {"0": 0, "1": 1, "2": 3, "3": 3} cluster_list = denstream.generate_outlier_clusters() cluster = cluster_list[0] assert cluster.id == 0 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 3 assert cluster.case_ids == ["0"] cluster = cluster_list[1] assert cluster.id == 1 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 4 assert cluster.case_ids == ["1"] cluster = cluster_list[2] assert cluster.id == 3 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 6 assert cluster.case_ids == ["2", "3"]
def test_generate_outlier_clusters(self, denstream): assert denstream.generate_outlier_clusters() == [] case_0 = Case('0') case_1 = Case('1') case_2 = Case('2') case_3 = Case('3') micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.weight = 3 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.weight = 4 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(3, 2, 0, 0.15) micro_cluster.weight = 6 denstream.o_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id assert denstream.all_cases == {'0': 0, '1': 1, '2': 3, '3': 3} cluster_list = denstream.generate_outlier_clusters() cluster = cluster_list[0] assert cluster.id == 0 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 3 assert cluster.case_ids == ['0'] cluster = cluster_list[1] assert cluster.id == 1 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 4 assert cluster.case_ids == ['1'] cluster = cluster_list[2] assert cluster.id == 3 assert np.all(cluster.centroid == [0, 0]) assert cluster.radius == 0 assert cluster.weight == 6 assert cluster.case_ids == ['2', '3']
def test_update(): case_list = [] micro_cluster = MicroCluster(0, 2, 0, 0.15) case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 33, 20)) case.set_activity('activityE', datetime(2015, 5, 10, 14, 6, 40)) case_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 1, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 14, 40, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 15, 5, 00)) case_list.append(case) graph = nx.DiGraph() graph = initialize_graph(graph, case_list) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 13, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 13, 00)) case.graph_distance, case.time_distance = extract_case_distances( graph, case) cf = micro_cluster.CF.copy() cf2 = micro_cluster.CF2.copy() weight = micro_cluster.weight micro_cluster.update(case) assert np.all(micro_cluster.CF == cf + case.point) assert np.all(micro_cluster.CF2 == cf2 + case.point * case.point) assert micro_cluster.weight == weight + 1 case = case_list[0] case.graph_distance, case.time_distance = extract_case_distances( graph, case) cf = micro_cluster.CF.copy() cf2 = micro_cluster.CF2.copy() weight = micro_cluster.weight micro_cluster.update(case) assert np.all(micro_cluster.CF == cf + case.point) assert np.all(micro_cluster.CF2 == cf2 + case.point * case.point) assert micro_cluster.weight == weight + 1
def test_get_case(self, process): case1 = Case('1') case2 = Case('2') case3 = Case('3') case4 = Case('4') process.cases = [case1, case2, case3, case4] case = process.get_case('1') assert case == 0 case = process.get_case('3') assert case == 2 process.cases = [case4, case1, case3, case2] case = process.get_case('1') assert case == 1 case = process.get_case('2') assert case == 3 case = process.get_case('5') assert case is None
def test_get_case(self, process): case1 = Case("1") case2 = Case("2") case3 = Case("3") case4 = Case("4") process.cases = [case1, case2, case3, case4] case = process.get_case_index("1") assert case == 0 case = process.get_case_index("3") assert case == 2 process.cases = [case4, case1, case3, case2] case = process.get_case_index("1") assert case == 1 case = process.get_case_index("2") assert case == 3 case = process.get_case_index("5") assert case is None
def test_set_case(self, process: CDESF): assert process.check_point_cases == 0 assert process.cases == [] process.set_case( "5", { "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }, ) assert process.check_point_cases == 1 assert process.cases case_test = process.cases[0] assert case_test.id == "5" assert case_test.events[0].get("concept:name") == "activityA" assert case_test.events[0].get("time:timestamp") == datetime( 2015, 5, 10, 8, 00, 00) case1 = Case("1") case2 = Case("2") case3 = Case("3") case4 = Case("4") process.check_point_cases = 0 process.cases = [case1, case2, case3, case4] process.set_case( "3", { "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }, ) assert process.check_point_cases == 0 assert process.cases case_test = process.cases[0] assert case_test.id == "3" assert case_test.events[0].get("concept:name") == "activityA" assert case_test.events[0].get("time:timestamp") == datetime( 2015, 5, 10, 8, 00, 00)
def test_initialize_cdesf(self, process, cases_list): assert process.nyquist == 0 assert process.check_point_cases == 0 assert len(process.process_model_graph.edges) == 0 assert len(process.process_model_graph.nodes) == 0 assert process.cases == [] with pytest.raises(Exception): assert initialize_graph(nx.DiGraph(), []) case4 = Case('4') case4.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case4.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case4.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) process.cases = cases_list process.cases.insert(0, case4) process.process_model_graph = initialize_graph(nx.DiGraph(), process.cases) pmg = initialize_graph(nx.DiGraph(), cases_list) for case in cases_list: graph_distance, time_distance = extract_case_distances(pmg, case) case.graph_distance = graph_distance case.time_distance = time_distance case_4 = process.cases[0] process.initialize_cdesf() graph_dist_4, time_dist_4 = extract_case_distances(pmg, case_4) assert case_4.graph_distance == graph_dist_4 assert case_4.time_distance == time_dist_4 assert len(process.denstream.p_micro_clusters) == 1 assert process.denstream.all_cases.keys() == {'1', '4'} new_p_mc = process.denstream.p_micro_clusters[0] assert new_p_mc.weight == 2 assert new_p_mc.creation_time == 0 assert new_p_mc.lambda_ == 0.15 assert process.initialized
def test_release_cases_from_memory(self, process): case1 = Case('1') case2 = Case('2') case3 = Case('3') case4 = Case('4') case4.set_activity('activity1', datetime(2015, 5, 10, 8, 30, 00)) case1.set_activity('activity1', datetime(2015, 5, 10, 9, 00, 00)) case3.set_activity('activity1', datetime(2015, 5, 10, 9, 30, 00)) case2.set_activity('activity1', datetime(2015, 5, 10, 10, 00, 00)) process.cases = [case2, case3, case1, case4] process.release_cases_from_memory() assert process.cases == [] process.cases = [case2, case3, case1, case4] process.nyquist = 1 process.release_cases_from_memory() assert process.cases == [case2] process.cases = [case2, case3, case1, case4] process.nyquist = 2 process.release_cases_from_memory() assert process.cases == [case2, case3] process.cases = [case2, case3, case1, case4] process.nyquist = 3 process.release_cases_from_memory() assert process.cases == [case2, case3, case1] process.cases = [case2, case3, case1, case4] process.nyquist = 4 process.release_cases_from_memory() assert process.cases == [case2, case3, case1, case4]
def test_train(self, denstream): #anomalous_denstream = DenStream(2, 0.15, 0.3, 0.1, 4, 1000) cases_list = [] case = Case('5') case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) case.set_activity('activityE', datetime(2015, 5, 10, 8, 00, 40)) cases_list.append(case) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) cases_list.append(case) case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) cases_list.append(case) case = Case('4') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) cases_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) cases_list.append(case) pmg = initialize_graph(nx.DiGraph(), cases_list) for case in cases_list: graph_distance, time_distance = extract_case_distances(pmg, case) case.graph_distance = graph_distance case.time_distance = time_distance denstream.dbscan(cases_list) assert denstream.stream_speed == 1000 assert denstream.no_processed_points == 0 assert denstream.time == 0 assert len(denstream.p_micro_clusters) == 1 assert len(denstream.o_micro_clusters) == 0 case_5 = cases_list[0] denstream.train(case_5) assert denstream.all_cases == {'1': 0, '4': 0, '5': 1} assert denstream.time == 0 assert denstream.no_processed_points == 1 assert not denstream.p_micro_clusters == [] assert not denstream.o_micro_clusters == [] assert len(denstream.p_micro_clusters) == 1 assert len(denstream.o_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [0.25, 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [0.03125, 0]) assert denstream.p_micro_clusters[0].weight == 2 assert denstream.p_micro_clusters[0].creation_time == 0 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 case_3 = cases_list[1] denstream.train(case_3) assert denstream.all_cases == {'1': 0, '3': 0, '4': 0, '5': 1} assert denstream.time == 0 assert denstream.no_processed_points == 2 assert len(denstream.p_micro_clusters) == 1 assert len(denstream.o_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [0.5, 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [0.09375, 0]) assert denstream.p_micro_clusters[0].weight == 3 assert denstream.p_micro_clusters[0].creation_time == 0 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 case_1 = cases_list[2] denstream.train(case_1) assert denstream.all_cases == {'1': 0, '3': 0, '4': 0, '5': 1} assert denstream.time == 0 assert denstream.no_processed_points == 3 assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [(7 / 64), 0]) assert denstream.p_micro_clusters[0].weight == 4 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 case_4 = cases_list[3] denstream.train(case_4) assert denstream.all_cases == {'1': 0, '3': 0, '4': 0, '5': 1} assert denstream.time == 0 assert denstream.no_processed_points == 4 assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [0.75, 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [0.125, 0]) assert denstream.p_micro_clusters[0].weight == 5 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 case_1 = cases_list[4] denstream.train(case_1) assert denstream.all_cases == {'1': 0, '2': 0, '3': 0, '4': 0, '5': 1} assert denstream.time == 0 assert denstream.no_processed_points == 5 assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [0.75, 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [0.125, 0]) assert denstream.p_micro_clusters[0].weight == 6 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 case = Case('6') case.set_activity('activityE', datetime(2015, 5, 10, 8, 00, 40)) case.set_activity('activityF', datetime(2015, 5, 10, 8, 00, 50)) graph_distance, time_distance = extract_case_distances(pmg, case) case.graph_distance = graph_distance case.time_distance = time_distance cases_list.insert(0, case) denstream.train(cases_list[0]) assert denstream.all_cases == { '1': 0, '2': 0, '3': 0, '4': 0, '5': 1, '6': 2 } assert denstream.time == 0 assert denstream.no_processed_points == 6 assert len(denstream.o_micro_clusters) == 2 assert len(denstream.p_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == [0.75, 0]) assert np.all(denstream.p_micro_clusters[0].CF2 == [0.125, 0]) assert denstream.p_micro_clusters[0].weight == 6 assert denstream.o_micro_clusters[0].id == 1 assert np.all(denstream.o_micro_clusters[0].CF == [(5 / 8), 0]) assert np.all(denstream.o_micro_clusters[0].CF2 == [(5 / 8)**2, 0]) assert denstream.o_micro_clusters[0].weight == 1 assert denstream.o_micro_clusters[0].creation_time == 0 assert denstream.o_micro_clusters[1].id == 2 assert np.all(denstream.o_micro_clusters[1].CF == [1, 1]) assert np.all(denstream.o_micro_clusters[1].CF2 == [1, 1]) assert denstream.o_micro_clusters[1].weight == 1 assert denstream.o_micro_clusters[1].creation_time == 0 assert denstream.all_cases == { '1': 0, '2': 0, '3': 0, '4': 0, '5': 1, '6': 2 } denstream.stream_speed = 7 denstream.train(cases_list[0]) assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 2 CF = np.array([0.75, 0]) * (2**(-0.15)) CF2 = np.array([0.125, 0]) * (2**(-0.15)) weight = 6 * (2**(-0.15)) assert denstream.p_micro_clusters[0].id == 0 assert np.all(denstream.p_micro_clusters[0].CF == CF) assert np.all(denstream.p_micro_clusters[0].CF2 == CF2) assert denstream.p_micro_clusters[0].weight == weight CF = (np.array([1, 1]) + cases_list[0].point) * (2**(-0.15)) CF2 = (np.array([1, 1]) + (cases_list[0].point * cases_list[0].point)) * (2**(-0.15)) weight = (1 + 1) * (2**(-0.15)) assert denstream.p_micro_clusters[1].id == 2 assert np.all(denstream.p_micro_clusters[1].CF == CF) assert np.all(denstream.p_micro_clusters[1].CF2 == CF2) assert denstream.p_micro_clusters[1].weight == weight for i in range(16): assert denstream.all_cases == { '1': 0, '2': 0, '3': 0, '4': 0, '5': 1, '6': 2 } denstream.stream_speed = 8 + i # mc.weight > self.beta * self.mu denstream.train(cases_list[0]) assert denstream.time == i + 2 assert denstream.p_micro_clusters[0].id == 0 CF = np.array([0.75, 0]) * (2**(-0.15)) CF2 = np.array([0.125, 0]) * (2**(-0.15)) weight = 6 * (2**(-0.15)) for x in range(i + 1): CF *= (2**(-0.15)) CF2 *= (2**(-0.15)) weight *= (2**(-0.15)) assert np.all(denstream.p_micro_clusters[0].CF == CF) assert np.all(denstream.p_micro_clusters[0].CF2 == CF2) assert denstream.p_micro_clusters[0].weight == weight assert denstream.p_micro_clusters[1].id == 2 CF_1 = (np.array([1, 1]) + cases_list[0].point) * (2**(-0.15)) CF2_1 = (np.array([1, 1]) + (cases_list[0].point * cases_list[0].point)) * (2 **(-0.15)) weight_1 = (1 + 1) * (2**(-0.15)) for x in range(i + 1): CF_1 += cases_list[0].point CF_1 *= (2**(-0.15)) CF2_1 += cases_list[0].point * cases_list[0].point CF2_1 *= (2**(-0.15)) weight_1 += 1 weight_1 *= (2**(-0.15)) assert np.all(denstream.p_micro_clusters[1].CF == CF_1) assert np.all(denstream.p_micro_clusters[1].CF2 == CF2_1) assert denstream.p_micro_clusters[1].weight == weight_1 assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 2 assert denstream.time == 17 assert denstream.no_processed_points == 23 assert denstream.stream_speed == 23 denstream.stream_speed += 1 case = Case('7') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityG', datetime(2015, 5, 10, 8, 1, 00)) graph_distance, time_distance = extract_case_distances(pmg, case) case.graph_distance = graph_distance case.time_distance = time_distance cases_list.insert(0, case) assert cases_list[0].id == '7' denstream.train(cases_list[0]) assert denstream.all_cases == { '1': 0, '2': 0, '3': 0, '4': 0, '5': 1, '6': 2, '7': 3 } assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 1 assert denstream.p_micro_clusters[0].id == 2 CF_1 *= (2**(-0.15)) CF2_1 *= (2**(-0.15)) weight_1 *= (2**(-0.15)) assert np.all(denstream.p_micro_clusters[0].CF == CF_1) assert np.all(denstream.p_micro_clusters[0].CF2 == CF2_1) assert denstream.p_micro_clusters[0].weight == weight_1 assert denstream.o_micro_clusters[0].id == 3 assert np.all(denstream.o_micro_clusters[0].CF == [1, log10(60)]) assert np.all(denstream.o_micro_clusters[0].CF2 == [1, log10(60)**2]) assert denstream.o_micro_clusters[0].weight == 1
def test_generate_clusters(self, denstream): assert len(denstream.p_micro_clusters) == 0 dense_group, not_dense_group = denstream.generate_clusters() assert dense_group == [[]] assert not_dense_group == [[]] case_0 = Case('0') case_1 = Case('1') micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([5.0, 5.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 5 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id assert len(denstream.p_micro_clusters) == 1 assert micro_cluster.weight >= denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert not dense_group == [[]] assert not_dense_group == [[]] cluster_list = dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 5 assert cluster.case_ids == ['0', '1'] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([3.0, 3.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 3 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id assert len(denstream.p_micro_clusters) == 1 assert micro_cluster.weight < denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert dense_group == [[]] assert not not_dense_group == [[]] cluster_list = not_dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 3 assert cluster.case_ids == ['0', '1'] case_2 = Case('2') case_3 = Case('3') micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([3.0, 3.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 3 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([4.0, 4.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 4 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) <= 2 * denstream.epsilon assert cl1.weight + cl2.weight >= denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert not dense_group == [[]] assert not_dense_group == [[]] cluster_list = dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 3 assert cluster.case_ids == ['0', '1'] cluster = cluster_list[1] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 4 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert dense_group[1] assert cluster_list[2] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([3.0, 3.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 1 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([3.0, 3.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 1 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) <= 2 * denstream.epsilon assert cl1.weight + cl2.weight < denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert dense_group == [[]] assert not not_dense_group == [[]] cluster_list = not_dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [3, 3]) assert cluster.radius == 0 assert cluster.weight == 1 assert cluster.case_ids == ['0', '1'] cluster = cluster_list[1] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [3, 3]) assert cluster.radius == 0 assert cluster.weight == 1 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert not_dense_group[1] assert cluster_list[2] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([3.0, 3.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 3 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([1.0, 1.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 4 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) > 2 * denstream.epsilon assert cl1.weight < denstream.mu assert cl2.weight >= denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert not dense_group == [[]] assert not not_dense_group == [[]] cluster_list = not_dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 3 assert cluster.case_ids == ['0', '1'] with pytest.raises(IndexError): assert cluster_list[1] cluster_list = dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [0.25, 0.25]) assert cluster.radius == cl2.radius assert cluster.weight == 4 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert not_dense_group[1] assert dense_group[1] assert cluster_list[1] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([6.0, 6.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 6 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([1.0, 1.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 2 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) > 2 * denstream.epsilon assert cl1.weight >= denstream.mu assert cl2.weight < denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert not dense_group == [[]] assert not not_dense_group == [[]] cluster_list = dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 6 assert cluster.case_ids == ['0', '1'] with pytest.raises(IndexError): assert cluster_list[1] cluster_list = not_dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [0.5, 0.5]) assert cluster.radius == cl2.radius assert cluster.weight == 2 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert not_dense_group[1] assert dense_group[1] assert cluster_list[1] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([6.0, 6.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 6 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([1.0, 1.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 4 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) > 2 * denstream.epsilon assert cl1.weight >= denstream.mu assert cl2.weight >= denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert not dense_group == [[]] assert not_dense_group == [[]] cluster_list = dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [1, 1]) assert cluster.radius == 0 assert cluster.weight == 6 assert cluster.case_ids == ['0', '1'] with pytest.raises(IndexError): assert cluster_list[1] cluster_list = dense_group[1] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [0.25, 0.25]) assert cluster.radius == cl2.radius assert cluster.weight == 4 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert dense_group[2] assert cluster_list[1] micro_cluster = MicroCluster(0, 2, 0, 0.15) micro_cluster.CF = np.array([1.0, 1.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 3 denstream.p_micro_clusters = [] denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_0.id] = micro_cluster.id denstream.all_cases[case_1.id] = micro_cluster.id micro_cluster = MicroCluster(1, 2, 0, 0.15) micro_cluster.CF = np.array([1.0, 1.0]) micro_cluster.CF2 = np.array([1.0, 1.0]) micro_cluster.weight = 2 denstream.p_micro_clusters.append(micro_cluster) denstream.all_cases[case_2.id] = micro_cluster.id denstream.all_cases[case_3.id] = micro_cluster.id cl1 = denstream.p_micro_clusters[0] cl2 = denstream.p_micro_clusters[1] assert len(denstream.p_micro_clusters) > 1 assert denstream.euclidean_distance( cl1.centroid, cl2.centroid) > 2 * denstream.epsilon assert cl1.weight < denstream.mu assert cl2.weight < denstream.mu dense_group, not_dense_group = denstream.generate_clusters() assert dense_group == [[]] assert not not_dense_group == [[]] cluster_list = not_dense_group[0] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 0 assert np.all(cluster.centroid == [(1 / 3), (1 / 3)]) assert cluster.radius == cl1.radius assert cluster.weight == 3 assert cluster.case_ids == ['0', '1'] with pytest.raises(IndexError): assert cluster_list[1] cluster_list = not_dense_group[1] cluster = cluster_list[0] assert isinstance(cluster, Cluster) assert cluster.id == 1 assert np.all(cluster.centroid == [0.5, 0.5]) assert cluster.radius == cl2.radius assert cluster.weight == 2 assert cluster.case_ids == ['2', '3'] with pytest.raises(IndexError): assert not_dense_group[2] assert cluster_list[1]
def test_add_point(self, denstream): case_list = [] case_1 = Case('1') case_1.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_1.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_1.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case_1) case_2 = Case('2') case_2.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_2.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_list.append(case_2) graph = nx.DiGraph() graph = initialize_graph(graph, case_list) case_3 = Case('3') case_3.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_3.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_3.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_3.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) trace_distance, time_distance = extract_case_distances(graph, case_3) case_3.graph_distance = trace_distance case_3.time_distance = time_distance micro_cluster = MicroCluster(10, 2, 0, 0.15) micro_cluster.CF = np.array([0.5, -0.5]) micro_cluster.CF2 = np.array([0.5, -0.1]) micro_cluster.weight = 10 denstream.p_micro_clusters.append(micro_cluster) micro_cluster = MicroCluster(11, 2, 0, 0.15) micro_cluster.CF = np.array([0.0, 0.0]) micro_cluster.CF2 = np.array([0.0, 0.0]) micro_cluster.weight = 5 denstream.o_micro_clusters.append(micro_cluster) denstream.mc_id = 2 mc_id = denstream.add_point(case_3) assert mc_id == 2 assert len(denstream.o_micro_clusters) == 2 assert denstream.o_micro_clusters[1].radius == 0 assert denstream.o_micro_clusters[1].weight == 1 assert np.all(denstream.o_micro_clusters[1].CF == case_3.point) assert np.all(denstream.o_micro_clusters[1].CF2 == case_3.point * case_3.point) cf = denstream.o_micro_clusters[1].CF.copy() cf2 = denstream.o_micro_clusters[1].CF2.copy() mc_id = denstream.add_point(case_3) assert mc_id == 2 assert len(denstream.o_micro_clusters) == 1 assert len(denstream.p_micro_clusters) == 2 assert denstream.p_micro_clusters[1].weight == 2 assert np.all(denstream.p_micro_clusters[1].CF == cf + case_3.point) assert np.all(denstream.p_micro_clusters[1].CF2 == cf2 + case_3.point * case_3.point)
def test_update(): case_list = [] micro_cluster = MicroCluster(0, 2, 0, 0.15) case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 33, 20), }) case.add_event({ "concept:name": "activityE", "time:timestamp": datetime(2015, 5, 10, 14, 6, 40), }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 1, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 14, 40, 00), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 15, 5, 00), }) case_list.append(case) graph = initialize_graph(case_list) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case.distances = calculate_case_distances(graph, case) cf = micro_cluster.cf1.copy() cf2 = micro_cluster.cf2.copy() weight = micro_cluster.weight micro_cluster.update(case) assert np.all(micro_cluster.cf1 == cf + case.point) assert np.all(micro_cluster.cf2 == cf2 + case.point * case.point) assert micro_cluster.weight == weight + 1 case = case_list[0] case.distances = calculate_case_distances(graph, case) cf = micro_cluster.cf1.copy() cf2 = micro_cluster.cf2.copy() weight = micro_cluster.weight micro_cluster.update(case) assert np.all(micro_cluster.cf1 == cf + case.point) assert np.all(micro_cluster.cf2 == cf2 + case.point * case.point) assert micro_cluster.weight == weight + 1
def test_extract_case_distances(): case_list = [] case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 33, 20)) case.set_activity('activityE', datetime(2015, 5, 10, 14, 6, 40)) case_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 1, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 14, 40, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 15, 5, 00)) case_list.append(case) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 13, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 13, 00)) case_list.append(case) case = Case('4') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case) case = Case('5') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('6') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 15, 30, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 15, 30, 00)) case_list.append(case) case = Case('7') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 11, 8, 00, 00)) case_list.append(case) case = Case('8') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 11, 46, 40)) case_list.append(case) case = Case('9') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('10') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('11') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) graph = nx.DiGraph() graph = initialize_graph(graph, case_list) case = Case('12') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 9, 18, 20)) case.set_activity('activityC', datetime(2015, 5, 10, 10, 8, 20)) trace_distance, time_distance = extract_case_distances(graph, case) assert trace_distance == pytest.approx(0.05) assert time_distance == pytest.approx(-1.42, rel=1e-2)
def cases_list(self): case_1 = Case('1') case_1.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_1.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_1.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_2 = Case('2') case_2.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_2.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_3 = Case('3') case_3.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case_3.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 10)) case_3.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_3.set_activity('activityD', datetime(2015, 5, 10, 8, 00, 30)) return [case_3, case_2, case_1]
def simple_graph_with_attributes(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 10, "attribute_two": 5, }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 0, "attribute_two": 7, }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), "attribute_one": 2, "attribute_two": 4, }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 3, "attribute_two": 10, }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 6, "attribute_two": 2, }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 8, "attribute_two": 4, }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 1, "attribute_two": 12, }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), "attribute_one": 2, "attribute_two": 2, }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), "attribute_one": 1, "attribute_two": 1, }) case_list.append(case) graph = initialize_graph(case_list, ["attribute_one", "attribute_two"]) return graph
def complex_graph(self): case_list = [] case = Case('1') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 8, 33, 20)) case.set_activity('activityE', datetime(2015, 5, 10, 14, 6, 40)) case_list.append(case) case = Case('2') case.set_activity('activityA', datetime(2015, 5, 10, 1, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 14, 40, 00)) case.set_activity('activityD', datetime(2015, 5, 10, 15, 5, 00)) case_list.append(case) case = Case('3') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 13, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 13, 00)) case_list.append(case) case = Case('4') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 20)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 20)) case_list.append(case) case = Case('5') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('6') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 15, 30, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 15, 30, 00)) case_list.append(case) case = Case('7') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 11, 8, 00, 00)) case_list.append(case) case = Case('8') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 11, 46, 40)) case_list.append(case) case = Case('9') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('10') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityF', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) case = Case('11') case.set_activity('activityA', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityB', datetime(2015, 5, 10, 8, 00, 00)) case.set_activity('activityC', datetime(2015, 5, 10, 8, 00, 00)) case_list.append(case) graph = nx.DiGraph(name='complex_graph') graph = initialize_graph(graph, case_list) return graph
def test_release_cases_from_memory(self, process): case1 = Case("1") case2 = Case("2") case3 = Case("3") case4 = Case("4") case4.add_event({ "concept:name": "activity1", "time:timestamp": datetime(2015, 5, 10, 8, 30, 00), }) case1.add_event({ "concept:name": "activity1", "time:timestamp": datetime(2015, 5, 10, 9, 00, 00), }) case3.add_event({ "concept:name": "activity1", "time:timestamp": datetime(2015, 5, 10, 9, 30, 00), }) case2.add_event({ "concept:name": "activity1", "time:timestamp": datetime(2015, 5, 10, 10, 00, 00), }) process.cases = [case2, case3, case1, case4] process.release_cases_from_memory() assert process.cases == [] process.cases = [case2, case3, case1, case4] process.nyquist = 1 process.release_cases_from_memory() assert process.cases == [case2] process.cases = [case2, case3, case1, case4] process.nyquist = 2 process.release_cases_from_memory() assert process.cases == [case2, case3] process.cases = [case2, case3, case1, case4] process.nyquist = 3 process.release_cases_from_memory() assert process.cases == [case2, case3, case1] process.cases = [case2, case3, case1, case4] process.nyquist = 4 process.release_cases_from_memory() assert process.cases == [case2, case3, case1, case4]
def test_train(self, denstream: DenStream): # anomalous_denstream = DenStream(2, 0.15, 0.3, 0.1, 4, 1000) cases_list = [] case = Case("5") case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), }) case.add_event({ "concept:name": "activityE", "time:timestamp": datetime(2015, 5, 10, 8, 00, 40), }) cases_list.append(case) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), }) cases_list.append(case) case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) cases_list.append(case) case = Case("4") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) cases_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) cases_list.append(case) pmg = initialize_graph(cases_list) for case in cases_list: case.distances = calculate_case_distances(pmg, case)
def test_calculate_actual_distances(self): case_one = Case("Case 1") case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 30, 30) }) case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 45, 30) }) case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 50, 30) }) case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 53, 30) }) case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 8, 59, 30) }) case_one.add_event({ "concept:name": "", "time:timestamp": datetime(2015, 5, 10, 9, 1, 30) }) expected_distances = [900, 300, 180, 360, 120] assert calculate_case_time_distances(case_one) == expected_distances
def complex_graph(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 33, 20), }) case.add_event({ "concept:name": "activityE", "time:timestamp": datetime(2015, 5, 10, 14, 6, 40), }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 1, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 14, 40, 00), }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 15, 5, 00), }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case_list.append(case) case = Case("4") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_list.append(case) case = Case("5") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("6") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case.add_event({ "concept:name": "activityF", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case_list.append(case) case = Case("7") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityF", "time:timestamp": datetime(2015, 5, 11, 8, 00, 00), }) case_list.append(case) case = Case("8") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityF", "time:timestamp": datetime(2015, 5, 10, 11, 46, 40), }) case_list.append(case) case = Case("9") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityF", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("10") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityF", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("11") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) graph = initialize_graph(case_list) return graph
class TestCalculateCaseDistances: @pytest.fixture def simple_graph_with_attributes(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 10, "attribute_two": 5, "color": "red", }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 0, "attribute_two": 7, "color": "green", }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), "attribute_one": 2, "attribute_two": 4, "color": "green", }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 3, "attribute_two": 10, "color": "blue", }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 6, "attribute_two": 2, "color": "green", }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 8, "attribute_two": 4, "color": "red", }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), "attribute_one": 1, "attribute_two": 12, "color": "blue", }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), "attribute_one": 2, "attribute_two": 2, "color": "blue", }) case.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), "attribute_one": 1, "attribute_two": 1, "color": "blue", }) case_list.append(case) graph = initialize_graph(case_list, ["attribute_one", "attribute_two", "color"]) return graph def test_calculate_case_distances(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity D", "time:timestamp": datetime(2015, 5, 10, 8, 33, 20), }) case.add_event({ "concept:name": "Activity E", "time:timestamp": datetime(2015, 5, 10, 14, 6, 40), }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 1, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 14, 40, 00), }) case.add_event({ "concept:name": "Activity D", "time:timestamp": datetime(2015, 5, 10, 15, 5, 00), }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case_list.append(case) case = Case("4") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_list.append(case) case = Case("5") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("6") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case_list.append(case) case = Case("7") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 11, 8, 00, 00), }) case_list.append(case) case = Case("8") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 11, 46, 40), }) case_list.append(case) case = Case("9") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("10") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("11") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) graph = initialize_graph(case_list) case = Case("12") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 9, 18, 20), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 10, 8, 20), }) distances = calculate_case_distances(graph, case) assert distances.get("graph") == pytest.approx(0.05) assert distances.get("time") == pytest.approx(-1.42, rel=1e-2) def test_calculate_case_distances_with_attributes( self, simple_graph_with_attributes: nx.DiGraph, ): case = Case("4") case.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), "attribute_one": 9, "attribute_two": 6, "color": "red", }) case.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 9, 18, 20), "attribute_one": 5, "attribute_two": 10, "color": "red", }) case.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 10, 8, 20), "attribute_one": 2, "attribute_two": 2, "color": "green", }) distances = calculate_case_distances( simple_graph_with_attributes, case, additional_attributes=["attribute_one", "attribute_two", "color"], ) assert distances.get("attribute_one") == pytest.approx(0.4121, rel=1e-2) assert distances.get("attribute_two") == pytest.approx(0.2651, rel=1e-2) assert distances.get("color") == pytest.approx(0.6111, rel=1e-2)
def cases_list(self): case_1 = Case("1") case_1.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_1.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case_1.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_2 = Case("2") case_2.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_2.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case_3 = Case("3") case_3.add_event({ "concept:name": "activityA", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_3.add_event({ "concept:name": "activityB", "time:timestamp": datetime(2015, 5, 10, 8, 00, 10), }) case_3.add_event({ "concept:name": "activityC", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_3.add_event({ "concept:name": "activityD", "time:timestamp": datetime(2015, 5, 10, 8, 00, 30), }) return [case_3, case_2, case_1]
def test_calculate_case_distances(self): case_list = [] case = Case("1") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity D", "time:timestamp": datetime(2015, 5, 10, 8, 33, 20), }) case.add_event({ "concept:name": "Activity E", "time:timestamp": datetime(2015, 5, 10, 14, 6, 40), }) case_list.append(case) case = Case("2") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 1, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 14, 40, 00), }) case.add_event({ "concept:name": "Activity D", "time:timestamp": datetime(2015, 5, 10, 15, 5, 00), }) case_list.append(case) case = Case("3") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 13, 00), }) case_list.append(case) case = Case("4") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 20), }) case_list.append(case) case = Case("5") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("6") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 15, 30, 00), }) case_list.append(case) case = Case("7") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 11, 8, 00, 00), }) case_list.append(case) case = Case("8") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 11, 46, 40), }) case_list.append(case) case = Case("9") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("10") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity F", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) case = Case("11") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case_list.append(case) graph = initialize_graph(case_list) case = Case("12") case.add_event({ "concept:name": "Activity A", "time:timestamp": datetime(2015, 5, 10, 8, 00, 00), }) case.add_event({ "concept:name": "Activity B", "time:timestamp": datetime(2015, 5, 10, 9, 18, 20), }) case.add_event({ "concept:name": "Activity C", "time:timestamp": datetime(2015, 5, 10, 10, 8, 20), }) distances = calculate_case_distances(graph, case) assert distances.get("graph") == pytest.approx(0.05) assert distances.get("time") == pytest.approx(-1.42, rel=1e-2)