napistu 0.3.1.dev1__tar.gz → 0.3.2.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/PKG-INFO +1 -1
  2. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/setup.cfg +1 -1
  3. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/__main__.py +1 -1
  4. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/precompute.py +64 -16
  5. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/PKG-INFO +1 -1
  6. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/SOURCES.txt +1 -1
  7. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_precompute.py +58 -8
  8. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/LICENSE +0 -0
  9. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/README.md +0 -0
  10. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/pyproject.toml +0 -0
  11. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/setup.py +0 -0
  12. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/__init__.py +0 -0
  13. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/consensus.py +0 -0
  14. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/constants.py +0 -0
  15. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/context/__init__.py +0 -0
  16. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/context/discretize.py +0 -0
  17. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/context/filtering.py +0 -0
  18. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/gcs/__init__.py +0 -0
  19. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/gcs/constants.py +0 -0
  20. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/gcs/downloads.py +0 -0
  21. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/gcs/utils.py +0 -0
  22. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/identifiers.py +0 -0
  23. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/indices.py +0 -0
  24. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/__init__.py +0 -0
  25. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/bigg.py +0 -0
  26. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/constants.py +0 -0
  27. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/gtex.py +0 -0
  28. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/hpa.py +0 -0
  29. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/identifiers_etl.py +0 -0
  30. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/napistu_edgelist.py +0 -0
  31. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/obo.py +0 -0
  32. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/psi_mi.py +0 -0
  33. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/reactome.py +0 -0
  34. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/sbml.py +0 -0
  35. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/string.py +0 -0
  36. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/trrust.py +0 -0
  37. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ingestion/yeast.py +0 -0
  38. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/matching/__init__.py +0 -0
  39. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/matching/constants.py +0 -0
  40. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/matching/interactions.py +0 -0
  41. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/matching/mount.py +0 -0
  42. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/matching/species.py +0 -0
  43. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/__init__.py +0 -0
  44. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/__main__.py +0 -0
  45. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/client.py +0 -0
  46. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/codebase.py +0 -0
  47. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/codebase_utils.py +0 -0
  48. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/component_base.py +0 -0
  49. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/config.py +0 -0
  50. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/constants.py +0 -0
  51. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/documentation.py +0 -0
  52. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/documentation_utils.py +0 -0
  53. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/execution.py +0 -0
  54. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/health.py +0 -0
  55. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/profiles.py +0 -0
  56. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/server.py +0 -0
  57. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/tutorials.py +0 -0
  58. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/tutorials_utils.py +0 -0
  59. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/mcp/utils.py +0 -0
  60. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/__init__.py +0 -0
  61. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/constants.py +0 -0
  62. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/curation.py +0 -0
  63. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/gaps.py +0 -0
  64. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/pathwayannot.py +0 -0
  65. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/modify/uncompartmentalize.py +0 -0
  66. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/__init__.py +0 -0
  67. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/constants.py +0 -0
  68. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/data_handling.py +0 -0
  69. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/ig_utils.py +0 -0
  70. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/napistu_graph_core.py +0 -0
  71. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/neighborhoods.py +0 -0
  72. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/net_create.py +0 -0
  73. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/net_propagation.py +0 -0
  74. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/ng_utils.py +0 -0
  75. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/network/paths.py +0 -0
  76. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/__init__.py +0 -0
  77. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/constants.py +0 -0
  78. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/dogma.py +0 -0
  79. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/genodexito.py +0 -0
  80. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/mygene.py +0 -0
  81. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/ontologies/renaming.py +0 -0
  82. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/rpy2/__init__.py +0 -0
  83. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/rpy2/callr.py +0 -0
  84. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/rpy2/constants.py +0 -0
  85. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/rpy2/rids.py +0 -0
  86. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/sbml_dfs_core.py +0 -0
  87. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/sbml_dfs_utils.py +0 -0
  88. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/scverse/__init__.py +0 -0
  89. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/scverse/constants.py +0 -0
  90. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/scverse/loading.py +0 -0
  91. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/source.py +0 -0
  92. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu/utils.py +0 -0
  93. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/dependency_links.txt +0 -0
  94. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/entry_points.txt +0 -0
  95. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/requires.txt +0 -0
  96. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/napistu.egg-info/top_level.txt +0 -0
  97. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/__init__.py +0 -0
  98. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/conftest.py +0 -0
  99. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_consensus.py +0 -0
  100. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_constants.py +0 -0
  101. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_context_discretize.py +0 -0
  102. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_context_filtering.py +0 -0
  103. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_curation.py +0 -0
  104. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_data/__init__.py +0 -0
  105. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_gaps.py +0 -0
  106. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_gcs.py +0 -0
  107. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_identifiers.py +0 -0
  108. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_indices.py +0 -0
  109. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_ingestion_napistu_edgelist.py +0 -0
  110. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_ingestion_obo.py +0 -0
  111. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_matching_interactions.py +0 -0
  112. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_matching_mount.py +0 -0
  113. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_matching_species.py +0 -0
  114. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_mcp_config.py +0 -0
  115. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_mcp_documentation_utils.py +0 -0
  116. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_mcp_server.py +0 -0
  117. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_data_handling.py +0 -0
  118. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_ig_utils.py +0 -0
  119. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_neighborhoods.py +0 -0
  120. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_net_create.py +0 -0
  121. /napistu-0.3.1.dev1/src/tests/test_net_propagation.py → /napistu-0.3.2.dev1/src/tests/test_network_net_propagation.py +0 -0
  122. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_ng_utils.py +0 -0
  123. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_network_paths.py +0 -0
  124. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_ontologies_genodexito.py +0 -0
  125. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_ontologies_mygene.py +0 -0
  126. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_ontologies_renaming.py +0 -0
  127. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_pathwayannot.py +0 -0
  128. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_rpy2_callr.py +0 -0
  129. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_rpy2_init.py +0 -0
  130. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_sbml.py +0 -0
  131. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_sbml_dfs_core.py +0 -0
  132. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_sbml_dfs_utils.py +0 -0
  133. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_sbo.py +0 -0
  134. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_scverse_loading.py +0 -0
  135. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_set_coverage.py +0 -0
  136. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_source.py +0 -0
  137. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_uncompartmentalize.py +0 -0
  138. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/test_utils.py +0 -0
  139. {napistu-0.3.1.dev1 → napistu-0.3.2.dev1}/src/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: napistu
3
- Version: 0.3.1.dev1
3
+ Version: 0.3.2.dev1
4
4
  Summary: Connecting high-dimensional data to curated pathways
5
5
  Home-page: https://github.com/napistu/napistu-py
6
6
  Author: Sean Hackett
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = napistu
3
- version = 0.3.1.dev1
3
+ version = 0.3.2.dev1
4
4
  description = Connecting high-dimensional data to curated pathways
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -753,7 +753,7 @@ def export_precomputed_distances(
753
753
  weights_vars=weights_vars_list,
754
754
  )
755
755
 
756
- utils.save_json(output_uri, precomputed_distances.to_json())
756
+ precompute.save_precomputed_distances(precomputed_distances, output_uri)
757
757
 
758
758
 
759
759
  @exporter.command(name="export_smbl_dfs_tables")
@@ -2,12 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import math
5
+ from pathlib import Path
6
+ from typing import Union
5
7
 
6
8
  import numpy as np
7
9
  import pandas as pd
10
+ from fs.errors import ResourceNotFound
8
11
 
9
12
  from napistu.network.napistu_graph_core import NapistuGraph
10
13
  from napistu.network.ig_utils import validate_edge_attributes
14
+ from napistu.utils import load_json, save_json
11
15
 
12
16
  logger = logging.getLogger(__name__)
13
17
 
@@ -75,21 +79,17 @@ def precompute_distances(
75
79
  # interate through all partitions of "from" nodes and find their shortest and lowest weighted paths
76
80
  unique_partitions = vs_to_partition.index.unique().tolist()
77
81
 
78
- precomputed_distances = (
79
- pd.concat(
80
- [
81
- _calculate_distances_subset(
82
- napistu_graph,
83
- vs_to_partition,
84
- vs_to_partition.loc[uq_part],
85
- weights_vars=weights_vars,
86
- )
87
- for uq_part in unique_partitions
88
- ]
89
- )
90
- .reset_index(drop=True)
91
- .query("sc_id_origin != sc_id_dest")
92
- )
82
+ precomputed_distances = pd.concat(
83
+ [
84
+ _calculate_distances_subset(
85
+ napistu_graph,
86
+ vs_to_partition,
87
+ vs_to_partition.loc[uq_part],
88
+ weights_vars=weights_vars,
89
+ )
90
+ for uq_part in unique_partitions
91
+ ]
92
+ ).query("sc_id_origin != sc_id_dest")
93
93
 
94
94
  # filter by path length and/or weight
95
95
  filtered_precomputed_distances = _filter_precomputed_distances(
@@ -97,11 +97,59 @@ def precompute_distances(
97
97
  max_steps=max_steps,
98
98
  max_score_q=max_score_q,
99
99
  path_weights_vars=["path_" + w for w in weights_vars],
100
- )
100
+ ).reset_index(drop=True)
101
101
 
102
102
  return filtered_precomputed_distances
103
103
 
104
104
 
105
+ def save_precomputed_distances(
106
+ precomputed_distances: pd.DataFrame, uri: Union[str, Path]
107
+ ) -> None:
108
+ """
109
+ Save a precomputed distances DataFrame to a JSON file.
110
+
111
+ Parameters
112
+ ----------
113
+ precomputed_distances : pd.DataFrame
114
+ The precomputed distances DataFrame to save
115
+ uri : Union[str, Path]
116
+ Path where to save the JSON file. Can be a local path or a GCS URI.
117
+
118
+ Raises
119
+ ------
120
+ OSError
121
+ If the file cannot be written to (permission issues, etc.)
122
+ """
123
+ save_json(str(uri), precomputed_distances.to_dict(orient="index"))
124
+
125
+
126
+ def load_precomputed_distances(uri: Union[str, Path]) -> pd.DataFrame:
127
+ """
128
+ Load a precomputed distances DataFrame from a JSON file.
129
+
130
+ Parameters
131
+ ----------
132
+ uri : Union[str, Path]
133
+ Path to the JSON file to load
134
+
135
+ Returns
136
+ -------
137
+ pd.DataFrame
138
+ The reconstructed precomputed distances DataFrame
139
+
140
+ Raises
141
+ ------
142
+ FileNotFoundError
143
+ If the specified file does not exist
144
+ """
145
+ try:
146
+ data_dict = load_json(str(uri))
147
+ except ResourceNotFound as e:
148
+ raise FileNotFoundError(f"File not found: {uri}") from e
149
+
150
+ return pd.DataFrame.from_dict(data_dict, orient="index").rename(index=int)
151
+
152
+
105
153
  def _calculate_distances_subset(
106
154
  napistu_graph: NapistuGraph,
107
155
  vs_to_partition: pd.DataFrame,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: napistu
3
- Version: 0.3.1.dev1
3
+ Version: 0.3.2.dev1
4
4
  Summary: Connecting high-dimensional data to curated pathways
5
5
  Home-page: https://github.com/napistu/napistu-py
6
6
  Author: Sean Hackett
@@ -111,11 +111,11 @@ src/tests/test_matching_species.py
111
111
  src/tests/test_mcp_config.py
112
112
  src/tests/test_mcp_documentation_utils.py
113
113
  src/tests/test_mcp_server.py
114
- src/tests/test_net_propagation.py
115
114
  src/tests/test_network_data_handling.py
116
115
  src/tests/test_network_ig_utils.py
117
116
  src/tests/test_network_neighborhoods.py
118
117
  src/tests/test_network_net_create.py
118
+ src/tests/test_network_net_propagation.py
119
119
  src/tests/test_network_ng_utils.py
120
120
  src/tests/test_network_paths.py
121
121
  src/tests/test_network_precompute.py
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import pytest
3
4
  import os
5
+ import tempfile
4
6
 
5
7
  import numpy as np
6
8
  import pandas as pd
@@ -214,11 +216,59 @@ def test_precomputed_distances_neighborhoods():
214
216
  assert upstream_disagreement_w_precompute.shape[0] == 0
215
217
 
216
218
 
217
- ################################################
218
- # __main__
219
- ################################################
220
-
221
- if __name__ == "__main__":
222
- test_precomputed_distances()
223
- test_precomputed_distances_shortest_paths()
224
- test_precomputed_distances_neighborhoods()
219
+ @pytest.mark.skip_on_windows
220
+ def test_precomputed_distances_serialization():
221
+ """
222
+ Test that validates the serialization -> deserialization approach works correctly.
223
+
224
+ Notes
225
+ -----
226
+ This function creates a sample DataFrame with the structure of precomputed
227
+ distances data, saves it to a temporary JSON file, loads it back, and
228
+ validates that all data is preserved correctly through the serialization
229
+ round-trip.
230
+ """
231
+ # Create a sample DataFrame that mimics the precomputed distances structure
232
+ sample_data = {
233
+ "sc_id_origin": {
234
+ 1: "SC00000000",
235
+ 3: "SC00000003",
236
+ 4: "SC00000004",
237
+ 5: "SC00000005",
238
+ 6: "SC00000011",
239
+ },
240
+ "sc_id_dest": {
241
+ 1: "SC00000001",
242
+ 3: "SC00000001",
243
+ 4: "SC00000001",
244
+ 5: "SC00000001",
245
+ 6: "SC00000001",
246
+ },
247
+ "path_length": {1: 1.0, 3: 4.0, 4: 6.0, 5: 6.0, 6: 1.0},
248
+ "path_upstream_weights": {1: 1.0, 3: 4.0, 4: 6.0, 5: 6.0, 6: 1.0},
249
+ "path_weights": {1: 1.0, 3: 4.0, 4: 6.0, 5: 6.0, 6: 1.0},
250
+ }
251
+
252
+ # Create original DataFrame
253
+ original_df = pd.DataFrame(sample_data)
254
+
255
+ # Create a temporary file path
256
+ with tempfile.NamedTemporaryFile(
257
+ mode="w", suffix=".json", delete=False
258
+ ) as tmp_file:
259
+ temp_path = tmp_file.name
260
+
261
+ try:
262
+ # Test serialization
263
+ precompute.save_precomputed_distances(original_df, temp_path)
264
+
265
+ # Test deserialization
266
+ loaded_df = precompute.load_precomputed_distances(temp_path)
267
+
268
+ # Validate that the loaded DataFrame is identical to the original
269
+ pd.testing.assert_frame_equal(original_df, loaded_df, check_like=True)
270
+
271
+ finally:
272
+ # Clean up the temporary file
273
+ if os.path.exists(temp_path):
274
+ os.remove(temp_path)
File without changes
File without changes
File without changes