aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py')
-rw-r--r--.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py431
1 files changed, 431 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py b/.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py
new file mode 100644
index 00000000..1e256f4b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_time_dependent.py
@@ -0,0 +1,431 @@
+"""Unit testing for time dependent algorithms."""
+
+from datetime import datetime, timedelta
+
+import pytest
+
+import networkx as nx
+
+_delta = timedelta(days=5 * 365)
+
+
+class TestCdIndex:
+ """Unit testing for the cd index function."""
+
+ def test_common_graph(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 1)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(1997, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1)},
+ 7: {"time": datetime(1999, 1, 1)},
+ 8: {"time": datetime(1999, 1, 1)},
+ 9: {"time": datetime(1998, 1, 1)},
+ 10: {"time": datetime(1997, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 4, time_delta=_delta) == 0.17
+
+ def test_common_graph_with_given_attributes(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 1)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"date": datetime(1992, 1, 1)},
+ 1: {"date": datetime(1992, 1, 1)},
+ 2: {"date": datetime(1993, 1, 1)},
+ 3: {"date": datetime(1993, 1, 1)},
+ 4: {"date": datetime(1995, 1, 1)},
+ 5: {"date": datetime(1997, 1, 1)},
+ 6: {"date": datetime(1998, 1, 1)},
+ 7: {"date": datetime(1999, 1, 1)},
+ 8: {"date": datetime(1999, 1, 1)},
+ 9: {"date": datetime(1998, 1, 1)},
+ 10: {"date": datetime(1997, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 4, time_delta=_delta, time="date") == 0.17
+
+ def test_common_graph_with_int_attributes(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 1)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": 20},
+ 1: {"time": 20},
+ 2: {"time": 30},
+ 3: {"time": 30},
+ 4: {"time": 50},
+ 5: {"time": 70},
+ 6: {"time": 80},
+ 7: {"time": 90},
+ 8: {"time": 90},
+ 9: {"time": 80},
+ 10: {"time": 74},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 4, time_delta=50) == 0.17
+
+ def test_common_graph_with_float_attributes(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 1)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": 20.2},
+ 1: {"time": 20.2},
+ 2: {"time": 30.7},
+ 3: {"time": 30.7},
+ 4: {"time": 50.9},
+ 5: {"time": 70.1},
+ 6: {"time": 80.6},
+ 7: {"time": 90.7},
+ 8: {"time": 90.7},
+ 9: {"time": 80.6},
+ 10: {"time": 74.2},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 4, time_delta=50) == 0.17
+
+ def test_common_graph_with_weights(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 1)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(1997, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1), "weight": 5},
+ 7: {"time": datetime(1999, 1, 1), "weight": 2},
+ 8: {"time": datetime(1999, 1, 1), "weight": 6},
+ 9: {"time": datetime(1998, 1, 1), "weight": 3},
+ 10: {"time": datetime(1997, 4, 1), "weight": 10},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+ assert nx.cd_index(G, 4, time_delta=_delta, weight="weight") == 0.04
+
+ def test_node_with_no_predecessors(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(2005, 1, 1)},
+ 6: {"time": datetime(2010, 1, 1)},
+ 7: {"time": datetime(2001, 1, 1)},
+ 8: {"time": datetime(2020, 1, 1)},
+ 9: {"time": datetime(2017, 1, 1)},
+ 10: {"time": datetime(2004, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+ assert nx.cd_index(G, 4, time_delta=_delta) == 0.0
+
+ def test_node_with_no_successors(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(8, 2)
+ G.add_edge(6, 0)
+ G.add_edge(6, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(1997, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1)},
+ 7: {"time": datetime(1999, 1, 1)},
+ 8: {"time": datetime(1999, 1, 1)},
+ 9: {"time": datetime(1998, 1, 1)},
+ 10: {"time": datetime(1997, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+ assert nx.cd_index(G, 4, time_delta=_delta) == 1.0
+
+ def test_n_equals_zero(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 3)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(2005, 1, 1)},
+ 6: {"time": datetime(2010, 1, 1)},
+ 7: {"time": datetime(2001, 1, 1)},
+ 8: {"time": datetime(2020, 1, 1)},
+ 9: {"time": datetime(2017, 1, 1)},
+ 10: {"time": datetime(2004, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ with pytest.raises(
+ nx.NetworkXError, match="The cd index cannot be defined."
+ ) as ve:
+ nx.cd_index(G, 4, time_delta=_delta)
+
+ def test_time_timedelta_compatibility(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(4, 2)
+ G.add_edge(4, 0)
+ G.add_edge(4, 3)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": 20.2},
+ 1: {"time": 20.2},
+ 2: {"time": 30.7},
+ 3: {"time": 30.7},
+ 4: {"time": 50.9},
+ 5: {"time": 70.1},
+ 6: {"time": 80.6},
+ 7: {"time": 90.7},
+ 8: {"time": 90.7},
+ 9: {"time": 80.6},
+ 10: {"time": 74.2},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ with pytest.raises(
+ nx.NetworkXError,
+ match="Addition and comparison are not supported between",
+ ) as ve:
+ nx.cd_index(G, 4, time_delta=_delta)
+
+ def test_node_with_no_time(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ G.add_edge(8, 2)
+ G.add_edge(6, 0)
+ G.add_edge(6, 3)
+ G.add_edge(5, 2)
+ G.add_edge(6, 2)
+ G.add_edge(6, 4)
+ G.add_edge(7, 4)
+ G.add_edge(8, 4)
+ G.add_edge(9, 4)
+ G.add_edge(9, 1)
+ G.add_edge(9, 3)
+ G.add_edge(10, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1)},
+ 7: {"time": datetime(1999, 1, 1)},
+ 8: {"time": datetime(1999, 1, 1)},
+ 9: {"time": datetime(1998, 1, 1)},
+ 10: {"time": datetime(1997, 4, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ with pytest.raises(
+ nx.NetworkXError, match="Not all nodes have a 'time' attribute."
+ ) as ve:
+ nx.cd_index(G, 4, time_delta=_delta)
+
+ def test_maximally_consolidating(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
+ G.add_edge(5, 1)
+ G.add_edge(5, 2)
+ G.add_edge(5, 3)
+ G.add_edge(5, 4)
+ G.add_edge(6, 1)
+ G.add_edge(6, 5)
+ G.add_edge(7, 1)
+ G.add_edge(7, 5)
+ G.add_edge(8, 2)
+ G.add_edge(8, 5)
+ G.add_edge(9, 5)
+ G.add_edge(9, 3)
+ G.add_edge(10, 5)
+ G.add_edge(10, 3)
+ G.add_edge(10, 4)
+ G.add_edge(11, 5)
+ G.add_edge(11, 4)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(1997, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1)},
+ 7: {"time": datetime(1999, 1, 1)},
+ 8: {"time": datetime(1999, 1, 1)},
+ 9: {"time": datetime(1998, 1, 1)},
+ 10: {"time": datetime(1997, 4, 1)},
+ 11: {"time": datetime(1998, 5, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 5, time_delta=_delta) == -1
+
+ def test_maximally_destabilizing(self):
+ G = nx.DiGraph()
+ G.add_nodes_from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
+ G.add_edge(5, 1)
+ G.add_edge(5, 2)
+ G.add_edge(5, 3)
+ G.add_edge(5, 4)
+ G.add_edge(6, 5)
+ G.add_edge(7, 5)
+ G.add_edge(8, 5)
+ G.add_edge(9, 5)
+ G.add_edge(10, 5)
+ G.add_edge(11, 5)
+
+ node_attrs = {
+ 0: {"time": datetime(1992, 1, 1)},
+ 1: {"time": datetime(1992, 1, 1)},
+ 2: {"time": datetime(1993, 1, 1)},
+ 3: {"time": datetime(1993, 1, 1)},
+ 4: {"time": datetime(1995, 1, 1)},
+ 5: {"time": datetime(1997, 1, 1)},
+ 6: {"time": datetime(1998, 1, 1)},
+ 7: {"time": datetime(1999, 1, 1)},
+ 8: {"time": datetime(1999, 1, 1)},
+ 9: {"time": datetime(1998, 1, 1)},
+ 10: {"time": datetime(1997, 4, 1)},
+ 11: {"time": datetime(1998, 5, 1)},
+ }
+
+ nx.set_node_attributes(G, node_attrs)
+
+ assert nx.cd_index(G, 5, time_delta=_delta) == 1