py3plex 1.1.4__tar.gz → 1.1.5__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 (898) hide show
  1. {py3plex-1.1.4/py3plex.egg-info → py3plex-1.1.5}/PKG-INFO +4 -3
  2. {py3plex-1.1.4 → py3plex-1.1.5}/README.md +3 -2
  3. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/__init__.py +4 -2
  4. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/cli.py +1 -2
  5. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/config.py +2 -2
  6. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/multinet.py +248 -0
  7. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/__init__.py +38 -0
  8. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/ast.py +123 -0
  9. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/builder.py +209 -9
  10. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/errors.py +20 -1
  11. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/executor.py +46 -5
  12. py3plex-1.1.5/py3plex/dsl/predictive.py +692 -0
  13. py3plex-1.1.5/py3plex/dsl/reduction.py +420 -0
  14. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/embeddings/__init__.py +2 -1
  15. py3plex-1.1.5/py3plex/embeddings/base.py +719 -0
  16. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/graph_ops.py +32 -0
  17. py3plex-1.1.5/py3plex/ml/__init__.py +2 -0
  18. py3plex-1.1.5/py3plex/ml/embedding/__init__.py +27 -0
  19. py3plex-1.1.5/py3plex/ml/embedding/base.py +8 -0
  20. py3plex-1.1.5/py3plex/ml/embedding/deepwalk.py +37 -0
  21. py3plex-1.1.5/py3plex/ml/embedding/evaluation.py +55 -0
  22. py3plex-1.1.5/py3plex/ml/embedding/line.py +87 -0
  23. py3plex-1.1.5/py3plex/ml/embedding/metapath2vec.py +73 -0
  24. py3plex-1.1.5/py3plex/ml/embedding/multiplex.py +95 -0
  25. py3plex-1.1.5/py3plex/ml/embedding/netmf.py +70 -0
  26. py3plex-1.1.5/py3plex/ml/embedding/node2vec.py +90 -0
  27. py3plex-1.1.5/py3plex/ml/embedding/similarity.py +25 -0
  28. py3plex-1.1.5/py3plex/ml/embedding/trainer.py +141 -0
  29. py3plex-1.1.5/py3plex/ml/embedding/utils.py +149 -0
  30. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/pipeline.py +51 -0
  31. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/result.py +5 -5
  32. {py3plex-1.1.4 → py3plex-1.1.5/py3plex.egg-info}/PKG-INFO +4 -3
  33. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/SOURCES.txt +21 -0
  34. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/__init__.py +2 -2
  35. {py3plex-1.1.4 → py3plex-1.1.5}/pyproject.toml +1 -1
  36. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_agents_ergonomics_features.py +3 -3
  37. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_agents_golden_paths.py +1 -1
  38. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_book_conf.py +1 -1
  39. py3plex-1.1.5/tests/test_book_manuscript_integrity.py +53 -0
  40. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_book_snippets.py +55 -0
  41. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_builder_dsl_mutate.py +14 -14
  42. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_cli_check.py +1 -1
  43. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_doc_conf.py +9 -1
  44. py3plex-1.1.5/tests/test_docs_embeddings_section.py +33 -0
  45. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_docs_examples.py +1 -0
  46. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_community_filtering.py +1 -1
  47. py3plex-1.1.5/tests/test_dsl_predict_reduce.py +237 -0
  48. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_query_zoo.py +2 -2
  49. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_v2.py +17 -0
  50. py3plex-1.1.5/tests/test_examples_zoo_consolidation.py +34 -0
  51. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_arrow.py +2 -2
  52. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_roundtrip.py +7 -7
  53. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_link_checker.py +43 -0
  54. py3plex-1.1.5/tests/test_ml_embedding_primitives.py +319 -0
  55. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_visualizations.py +4 -4
  56. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_pymnet_style.py +2 -2
  57. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sbm_autocommunity.py +8 -8
  58. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sbm_runner_integration.py +8 -8
  59. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_selection_uq_empty_groups.py +2 -2
  60. py3plex-1.1.5/tests/test_version_consistency.py +44 -0
  61. py3plex-1.1.4/py3plex/embeddings/base.py +0 -103
  62. {py3plex-1.1.4 → py3plex-1.1.5}/LICENSE +0 -0
  63. {py3plex-1.1.4 → py3plex-1.1.5}/MANIFEST.in +0 -0
  64. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/__main__.py +0 -0
  65. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/_parallel.py +0 -0
  66. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/__init__.py +0 -0
  67. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/backend.py +0 -0
  68. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/closure.py +0 -0
  69. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/fixed_point.py +0 -0
  70. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/lift.py +0 -0
  71. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/paths.py +0 -0
  72. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/registry.py +0 -0
  73. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/semiring.py +0 -0
  74. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algebra/witness.py +0 -0
  75. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/__init__.py +0 -0
  76. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/advanced_random_generators.py +0 -0
  77. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/attribute_correlation.py +0 -0
  78. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality/__init__.py +0 -0
  79. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality/approx_betweenness.py +0 -0
  80. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality/approx_closeness.py +0 -0
  81. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality/approx_pagerank.py +0 -0
  82. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality/explain.py +0 -0
  83. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/centrality_toolkit.py +0 -0
  84. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_comparison.py +0 -0
  85. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/NoRC.py +0 -0
  86. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/__init__.py +0 -0
  87. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/auto_select.py +0 -0
  88. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/autocommunity.py +0 -0
  89. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/autocommunity_executor.py +0 -0
  90. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/budget.py +0 -0
  91. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/community_louvain.py +0 -0
  92. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/community_measures.py +0 -0
  93. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/community_ranking.py +0 -0
  94. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/community_wrapper.py +0 -0
  95. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/distributional.py +0 -0
  96. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/flow_hierarchy.py +0 -0
  97. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/__init__.py +0 -0
  98. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/conftest.py +0 -0
  99. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-bipartite.py +0 -0
  100. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-file-io.py +0 -0
  101. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-multiplex.py +0 -0
  102. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-networkx.py +0 -0
  103. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-simple.py +0 -0
  104. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram-expanded.py +0 -0
  105. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram.py +0 -0
  106. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/infomap.py +0 -0
  107. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/infomap/interfaces/python/setup.py +0 -0
  108. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/label_propagation.py +0 -0
  109. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/leiden_multilayer.py +0 -0
  110. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/leiden_uq.py +0 -0
  111. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/multilayer_benchmark.py +0 -0
  112. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/multilayer_modularity.py +0 -0
  113. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/multilayer_quality_metrics.py +0 -0
  114. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/node_ranking.py +0 -0
  115. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/runner.py +0 -0
  116. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/sbm_metrics.py +0 -0
  117. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/sbm_wrapper.py +0 -0
  118. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/spectral_multilayer.py +0 -0
  119. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/community_detection/successive_halving.py +0 -0
  120. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/curvature/__init__.py +0 -0
  121. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/curvature/ollivier_ricci_multilayer.py +0 -0
  122. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/general/__init__.py +0 -0
  123. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/general/benchmark_classification.py +0 -0
  124. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/general/walkers.py +0 -0
  125. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/graph_summarization.py +0 -0
  126. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/__init__.py +0 -0
  127. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/__main__.py +0 -0
  128. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/assets/builtin.n3 +0 -0
  129. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/__init__.py +0 -0
  130. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/converters.py +0 -0
  131. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/example.py +0 -0
  132. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/helpers.py +0 -0
  133. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/kb.py +0 -0
  134. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/load.py +0 -0
  135. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/predicate.py +0 -0
  136. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/rule.py +0 -0
  137. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/settings.py +0 -0
  138. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/core/term_parsers.py +0 -0
  139. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/learners/__init__.py +0 -0
  140. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/learners/bottomup.py +0 -0
  141. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/learners/learner.py +0 -0
  142. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/learners/optimal.py +0 -0
  143. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/stats/__init__.py +0 -0
  144. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/stats/adjustment.py +0 -0
  145. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/stats/scorefunctions.py +0 -0
  146. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/stats/significance.py +0 -0
  147. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/hedwig/stats/validate.py +0 -0
  148. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/layer_similarity.py +0 -0
  149. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/meta_flow_report.py +0 -0
  150. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multicentrality.py +0 -0
  151. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/__init__.py +0 -0
  152. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/centrality.py +0 -0
  153. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/entanglement.py +0 -0
  154. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/multirank.py +0 -0
  155. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/multixrank.py +0 -0
  156. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/supra_matrix_function_centrality.py +0 -0
  157. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_algorithms/versatility.py +0 -0
  158. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/multilayer_clustering.py +0 -0
  159. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/network_classification/PPR.py +0 -0
  160. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/network_classification/__init__.py +0 -0
  161. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/network_classification/label_propagation.py +0 -0
  162. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/node_ranking/__init__.py +0 -0
  163. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/node_ranking/node_ranking.py +0 -0
  164. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/requirements_registry.py +0 -0
  165. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/robustness_testing.py +0 -0
  166. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/routing/__init__.py +0 -0
  167. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/routing/multiplex_paths.py +0 -0
  168. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/__init__.py +0 -0
  169. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/conversions.py +0 -0
  170. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/diagnostics.py +0 -0
  171. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/inference_vi.py +0 -0
  172. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/model_selection.py +0 -0
  173. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/multilayer_sbm.py +0 -0
  174. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/objectives.py +0 -0
  175. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/uq.py +0 -0
  176. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sbm/utils.py +0 -0
  177. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/sir_multiplex.py +0 -0
  178. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistical_report.py +0 -0
  179. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/__init__.py +0 -0
  180. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/basic_statistics.py +0 -0
  181. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/bayesian_distances.py +0 -0
  182. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/bayesiantests.py +0 -0
  183. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/correlation_networks.py +0 -0
  184. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/critical_distances.py +0 -0
  185. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/enrichment_modules.py +0 -0
  186. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/multilayer_statistics.py +0 -0
  187. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/powerlaw.py +0 -0
  188. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/stats_comparison.py +0 -0
  189. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/statistics/topology.py +0 -0
  190. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/temporal/__init__.py +0 -0
  191. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/temporal/centrality.py +0 -0
  192. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/temporal/community.py +0 -0
  193. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/temporal_multiplex/__init__.py +0 -0
  194. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/algorithms/term_parsers/__init__.py +0 -0
  195. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/alignment/__init__.py +0 -0
  196. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/alignment/features.py +0 -0
  197. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/alignment/metrics.py +0 -0
  198. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/alignment/solvers.py +0 -0
  199. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/benchmarks/__init__.py +0 -0
  200. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/benchmarks/budget.py +0 -0
  201. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/benchmarks/metrics.py +0 -0
  202. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/benchmarks/runners.py +0 -0
  203. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/centrality/__init__.py +0 -0
  204. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/centrality/robustness.py +0 -0
  205. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/claims/__init__.py +0 -0
  206. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/claims/generator.py +0 -0
  207. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/claims/learner.py +0 -0
  208. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/claims/scorer.py +0 -0
  209. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/claims/types.py +0 -0
  210. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/comparison/__init__.py +0 -0
  211. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/comparison/executor.py +0 -0
  212. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/comparison/metrics.py +0 -0
  213. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/comparison/result.py +0 -0
  214. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/__init__.py +0 -0
  215. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/convert.py +0 -0
  216. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/__init__.py +0 -0
  217. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/dgl_converter.py +0 -0
  218. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/igraph_converter.py +0 -0
  219. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/networkx_converter.py +0 -0
  220. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/pyg_converter.py +0 -0
  221. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/converters/scipy_converter.py +0 -0
  222. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/equality.py +0 -0
  223. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/exceptions.py +0 -0
  224. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/ir.py +0 -0
  225. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/schema.py +0 -0
  226. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/compat/sidecar.py +0 -0
  227. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/__init__.py +0 -0
  228. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/contract.py +0 -0
  229. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/engine.py +0 -0
  230. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/failure_modes.py +0 -0
  231. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/predicates.py +0 -0
  232. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/contracts/result.py +0 -0
  233. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/HINMINE/IO.py +0 -0
  234. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/HINMINE/__init__.py +0 -0
  235. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/HINMINE/dataStructures.py +0 -0
  236. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/HINMINE/decomposition.py +0 -0
  237. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/__init__.py +0 -0
  238. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/converters.py +0 -0
  239. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/immutable.py +0 -0
  240. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/lazy_evaluation.py +0 -0
  241. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/nx_compat.py +0 -0
  242. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/parsers.py +0 -0
  243. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/random_generators.py +0 -0
  244. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/schema_validation.py +0 -0
  245. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/supporting.py +0 -0
  246. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/temporal_multinet.py +0 -0
  247. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/core/types.py +0 -0
  248. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/__init__.py +0 -0
  249. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/claim_lang.py +0 -0
  250. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/ddmin.py +0 -0
  251. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/engine.py +0 -0
  252. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/types.py +0 -0
  253. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterexamples/witness.py +0 -0
  254. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/__init__.py +0 -0
  255. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/comparator.py +0 -0
  256. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/engine.py +0 -0
  257. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/presets.py +0 -0
  258. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/result.py +0 -0
  259. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/counterfactual/spec.py +0 -0
  260. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/datasets/__init__.py +0 -0
  261. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/datasets/_data/aarhus_cs.edges +0 -0
  262. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/datasets/_data/synthetic_multilayer.edges +0 -0
  263. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/datasets/_generators.py +0 -0
  264. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/datasets/_loaders.py +0 -0
  265. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/diagnostics/__init__.py +0 -0
  266. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/diagnostics/builders.py +0 -0
  267. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/diagnostics/codes.py +0 -0
  268. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/diagnostics/core.py +0 -0
  269. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/diagnostics/utils.py +0 -0
  270. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/algebra.py +0 -0
  271. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/attribution.py +0 -0
  272. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/benchmark.py +0 -0
  273. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/benchmark_result.py +0 -0
  274. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/cache.py +0 -0
  275. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/communities.py +0 -0
  276. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/community_uq.py +0 -0
  277. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/compositional_uq.py +0 -0
  278. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/context.py +0 -0
  279. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/executor_semiring.py +0 -0
  280. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/executors/__init__.py +0 -0
  281. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/executors/benchmark_executor.py +0 -0
  282. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/explain.py +0 -0
  283. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/export.py +0 -0
  284. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/expressions.py +0 -0
  285. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/fastpath.py +0 -0
  286. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/layers.py +0 -0
  287. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/__init__.py +0 -0
  288. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/diagnostic.py +0 -0
  289. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/lint_context.py +0 -0
  290. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/__init__.py +0 -0
  291. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/base.py +0 -0
  292. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/dsl001_unknown_layer.py +0 -0
  293. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/dsl002_unknown_attribute.py +0 -0
  294. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/dsl101_type_mismatch.py +0 -0
  295. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/dsl201_unsatisfiable.py +0 -0
  296. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/dsl202_redundant.py +0 -0
  297. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/perf301_full_scan.py +0 -0
  298. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/rules/perf302_cross_layer.py +0 -0
  299. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/schema.py +0 -0
  300. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/type_resolver.py +0 -0
  301. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/lint/types.py +0 -0
  302. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/operator_registry.py +0 -0
  303. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/__init__.py +0 -0
  304. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/builder.py +0 -0
  305. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/compiler.py +0 -0
  306. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/engine.py +0 -0
  307. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/ir.py +0 -0
  308. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/patterns/result.py +0 -0
  309. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/planner.py +0 -0
  310. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/__init__.py +0 -0
  311. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/cache.py +0 -0
  312. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/cost.py +0 -0
  313. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/diff.py +0 -0
  314. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/distribution.py +0 -0
  315. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/executor.py +0 -0
  316. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/explain.py +0 -0
  317. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/program.py +0 -0
  318. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/rewrite.py +0 -0
  319. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/program/types.py +0 -0
  320. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/provenance.py +0 -0
  321. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/registry.py +0 -0
  322. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/result.py +0 -0
  323. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/selection_uq.py +0 -0
  324. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/serializer.py +0 -0
  325. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/uq_algebra.py +0 -0
  326. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/uq_resolution.py +0 -0
  327. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl/warnings.py +0 -0
  328. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dsl_legacy.py +0 -0
  329. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/__init__.py +0 -0
  330. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/_utils.py +0 -0
  331. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/ast.py +0 -0
  332. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/builder.py +0 -0
  333. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/compartmental.py +0 -0
  334. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/config.py +0 -0
  335. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/core.py +0 -0
  336. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/errors.py +0 -0
  337. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/executor.py +0 -0
  338. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/models.py +0 -0
  339. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/processes.py +0 -0
  340. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/registry.py +0 -0
  341. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/result.py +0 -0
  342. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/dynamics/serializer.py +0 -0
  343. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/embeddings/cache.py +0 -0
  344. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/embeddings/link_ops.py +0 -0
  345. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/embeddings/metapath2vec.py +0 -0
  346. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/embeddings/netmf.py +0 -0
  347. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/ergonomics.py +0 -0
  348. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/errors.py +0 -0
  349. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/exceptions.py +0 -0
  350. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/__init__.py +0 -0
  351. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/artifacts.py +0 -0
  352. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/cli.py +0 -0
  353. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/env.py +0 -0
  354. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/errors.py +0 -0
  355. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/model.py +0 -0
  356. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/runner.py +0 -0
  357. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/store.py +0 -0
  358. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/experiments/utils.py +0 -0
  359. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/fast_examples.py +0 -0
  360. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/__init__.py +0 -0
  361. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/api.py +0 -0
  362. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/canonical_format.py +0 -0
  363. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/converters.py +0 -0
  364. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/exceptions.py +0 -0
  365. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/formats/__init__.py +0 -0
  366. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/formats/arrow_format.py +0 -0
  367. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/formats/csv_format.py +0 -0
  368. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/formats/json_format.py +0 -0
  369. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/multinet_bridge.py +0 -0
  370. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/parquet_format.py +0 -0
  371. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/io/schema.py +0 -0
  372. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/lab/__init__.py +0 -0
  373. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/lab/base.py +0 -0
  374. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/linter.py +0 -0
  375. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/logging_config.py +0 -0
  376. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/meta/__init__.py +0 -0
  377. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/meta/builder.py +0 -0
  378. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/meta/result.py +0 -0
  379. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/meta/stats.py +0 -0
  380. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/meta/utils.py +0 -0
  381. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/multinet/__init__.py +0 -0
  382. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/multinet/aggregation.py +0 -0
  383. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/nullmodels/__init__.py +0 -0
  384. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/nullmodels/executor.py +0 -0
  385. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/nullmodels/models.py +0 -0
  386. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/nullmodels/result.py +0 -0
  387. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/__init__.py +0 -0
  388. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/cost_model.py +0 -0
  389. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/logical_plan.py +0 -0
  390. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/optimizer.py +0 -0
  391. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/physical_plan.py +0 -0
  392. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/plan_nodes.py +0 -0
  393. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/optimizer/rules.py +0 -0
  394. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/__init__.py +0 -0
  395. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/cli.py +0 -0
  396. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/errors.py +0 -0
  397. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/executor.py +0 -0
  398. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/network.py +0 -0
  399. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/operators.py +0 -0
  400. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/readers.py +0 -0
  401. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/schema.py +0 -0
  402. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/spill.py +0 -0
  403. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/out_of_core/utils.py +0 -0
  404. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/paths/__init__.py +0 -0
  405. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/paths/algorithms.py +0 -0
  406. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/paths/executor.py +0 -0
  407. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/paths/result.py +0 -0
  408. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/plugins/__init__.py +0 -0
  409. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/plugins/base.py +0 -0
  410. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/plugins/examples.py +0 -0
  411. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/plugins/registry.py +0 -0
  412. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/profiling.py +0 -0
  413. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/provenance/__init__.py +0 -0
  414. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/provenance/bundle.py +0 -0
  415. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/provenance/capture.py +0 -0
  416. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/provenance/replay.py +0 -0
  417. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/provenance/schema.py +0 -0
  418. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/requirements.py +0 -0
  419. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/robustness/__init__.py +0 -0
  420. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/robustness/experiments.py +0 -0
  421. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/robustness/perturbations.py +0 -0
  422. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/runtime/__init__.py +0 -0
  423. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/runtime/capabilities.py +0 -0
  424. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/__init__.py +0 -0
  425. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/capabilities.py +0 -0
  426. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/community_registry.py +0 -0
  427. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/evaluate.py +0 -0
  428. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/metric_registry.py +0 -0
  429. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/selection/wins.py +0 -0
  430. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/__init__.py +0 -0
  431. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/core.py +0 -0
  432. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/engine.py +0 -0
  433. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/pareto.py +0 -0
  434. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/registry.py +0 -0
  435. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/semiring/types.py +0 -0
  436. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/sensitivity/__init__.py +0 -0
  437. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/sensitivity/executor.py +0 -0
  438. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/sensitivity/metrics.py +0 -0
  439. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/sensitivity/perturbations.py +0 -0
  440. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/sensitivity/types.py +0 -0
  441. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/stats/__init__.py +0 -0
  442. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/stats/provenance.py +0 -0
  443. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/stats/registry.py +0 -0
  444. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/stats/statvalue.py +0 -0
  445. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/stats/uncertainty.py +0 -0
  446. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/temporal_utils.py +0 -0
  447. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/temporal_utils_extended.py +0 -0
  448. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/temporal_view.py +0 -0
  449. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/__init__.py +0 -0
  450. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/bootstrap.py +0 -0
  451. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/ci_utils.py +0 -0
  452. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/community_ensemble.py +0 -0
  453. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/community_result.py +0 -0
  454. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/context.py +0 -0
  455. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/estimation.py +0 -0
  456. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/noise_models.py +0 -0
  457. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/null_models.py +0 -0
  458. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/partition.py +0 -0
  459. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/partition_metrics.py +0 -0
  460. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/partition_reducers.py +0 -0
  461. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/partition_types.py +0 -0
  462. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/partition_uq.py +0 -0
  463. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/plan.py +0 -0
  464. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/reducers/__init__.py +0 -0
  465. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/reducers/base.py +0 -0
  466. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/resampling_graph.py +0 -0
  467. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/runner.py +0 -0
  468. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/selection_execution.py +0 -0
  469. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/selection_reducers.py +0 -0
  470. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/selection_types.py +0 -0
  471. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/selection_uq.py +0 -0
  472. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/stratification.py +0 -0
  473. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/uncertainty/types.py +0 -0
  474. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/utils.py +0 -0
  475. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/validation.py +0 -0
  476. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/__init__.py +0 -0
  477. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/benchmark_visualizations.py +0 -0
  478. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/bezier.py +0 -0
  479. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/colors.py +0 -0
  480. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/drawing_machinery.py +0 -0
  481. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/embedding_visualization/__init__.py +0 -0
  482. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/embedding_visualization/embedding_tools.py +0 -0
  483. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/embedding_visualization/embedding_visualization.py +0 -0
  484. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/fa2/__init__.py +0 -0
  485. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/fa2/fa2util.py +0 -0
  486. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/fa2/forceatlas2.py +0 -0
  487. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/layout_algorithms.py +0 -0
  488. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/multilayer.py +0 -0
  489. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/polyfit.py +0 -0
  490. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/pymnet_style.py +0 -0
  491. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/ricci_layout.py +0 -0
  492. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/ricci_multilayer_vis.py +0 -0
  493. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/visualization/sankey.py +0 -0
  494. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/workflows.py +0 -0
  495. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/wrappers/__init__.py +0 -0
  496. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/wrappers/benchmark_nodes.py +0 -0
  497. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/wrappers/r_interop.py +0 -0
  498. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex/wrappers/train_node2vec_embedding.py +0 -0
  499. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/dependency_links.txt +0 -0
  500. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/entry_points.txt +0 -0
  501. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/not-zip-safe +0 -0
  502. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/requires.txt +0 -0
  503. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex.egg-info/top_level.txt +0 -0
  504. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/errors.py +0 -0
  505. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/registry.py +0 -0
  506. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/safe_paths.py +0 -0
  507. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/schemas.py +0 -0
  508. {py3plex-1.1.4 → py3plex-1.1.5}/py3plex_mcp/server.py +0 -0
  509. {py3plex-1.1.4 → py3plex-1.1.5}/setup.cfg +0 -0
  510. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_advanced_metrics_properties.py +0 -0
  511. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_aggregation.py +0 -0
  512. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_backend.py +0 -0
  513. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_core.py +0 -0
  514. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_fixed_point.py +0 -0
  515. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_paths.py +0 -0
  516. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_registry.py +0 -0
  517. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algebra_witness.py +0 -0
  518. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithm_properties.py +0 -0
  519. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithms_attribute_correlation.py +0 -0
  520. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithms_correlation_networks.py +0 -0
  521. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithms_init.py +0 -0
  522. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithms_random_generators.py +0 -0
  523. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_algorithms_statistics_bayesian_distances.py +0 -0
  524. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_alignment.py +0 -0
  525. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_alignment_contracts.py +0 -0
  526. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_alignment_correctness_additional.py +0 -0
  527. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_approximate_centrality.py +0 -0
  528. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ast_roundtrip.py +0 -0
  529. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ast_roundtrip_integration.py +0 -0
  530. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_attribute_correlation.py +0 -0
  531. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_attribute_correlation_contracts.py +0 -0
  532. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_auto_community.py +0 -0
  533. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_autocommunity_benchmarks.py +0 -0
  534. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_autocommunity_executor.py +0 -0
  535. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_autocommunity_meta.py +0 -0
  536. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_autocommunity_successive_halving.py +0 -0
  537. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_bayesian_distances.py +0 -0
  538. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_bench_aggregation_unit.py +0 -0
  539. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmark_budget_fairness.py +0 -0
  540. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmark_dsl_basic.py +0 -0
  541. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmark_integration.py +0 -0
  542. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmark_multiplex_centrality.py +0 -0
  543. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmark_time.py +0 -0
  544. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmarks_budget.py +0 -0
  545. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_benchmarks_init.py +0 -0
  546. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_capabilities_basic.py +0 -0
  547. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_capabilities_optional_missing.py +0 -0
  548. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_explain.py +0 -0
  549. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_explain_integration.py +0 -0
  550. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_robustness.py +0 -0
  551. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_robustness_oracles.py +0 -0
  552. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_uncertainty.py +0 -0
  553. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_centrality_weight_handling.py +0 -0
  554. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_check_api_consistency.py +0 -0
  555. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_check_doc_coverage.py +0 -0
  556. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_check_type_coverage.py +0 -0
  557. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_claim_learning.py +0 -0
  558. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_claims_types.py +0 -0
  559. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_cli.py +0 -0
  560. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_cli_ergonomics.py +0 -0
  561. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_cli_piping.py +0 -0
  562. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_clustering_multilayer.py +0 -0
  563. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_code_improvements.py +0 -0
  564. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_community_detection_modules.py +0 -0
  565. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_community_distribution.py +0 -0
  566. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_community_measures.py +0 -0
  567. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison.py +0 -0
  568. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison_executor.py +0 -0
  569. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison_metrics.py +0 -0
  570. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison_metrics_additional.py +0 -0
  571. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison_result.py +0 -0
  572. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_comparison_uninitialized_and_resistance_oracles.py +0 -0
  573. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_compat_exceptions.py +0 -0
  574. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_compat_roundtrip.py +0 -0
  575. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_config_api.py +0 -0
  576. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_config_benchmark.py +0 -0
  577. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_contracts.py +0 -0
  578. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_contracts_basic.py +0 -0
  579. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_contracts_extended.py +0 -0
  580. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_contracts_failure_modes.py +0 -0
  581. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_contracts_integration.py +0 -0
  582. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_functionality.py +0 -0
  583. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_immutable.py +0 -0
  584. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_lazy_evaluation.py +0 -0
  585. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_multinet_and_parsers.py +0 -0
  586. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_multinet_correctness.py +0 -0
  587. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_multiplex_edges.py +0 -0
  588. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_schema_validation.py +0 -0
  589. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_core_supporting.py +0 -0
  590. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_correlation_networks.py +0 -0
  591. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_counterexamples.py +0 -0
  592. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_counterexamples_properties.py +0 -0
  593. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_counterfactual.py +0 -0
  594. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_counterfactual_presets.py +0 -0
  595. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_coverage_grouping.py +0 -0
  596. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_create_mosaic_banner.py +0 -0
  597. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_create_showcase_flow.py +0 -0
  598. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_crosshair_pure_functions.py +0 -0
  599. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_data_files_presence.py +0 -0
  600. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_datasets.py +0 -0
  601. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_datasets_contracts.py +0 -0
  602. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_datasets_oracles.py +0 -0
  603. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_degenerate_networks.py +0 -0
  604. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_determinism_randomness.py +0 -0
  605. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_diagnostics.py +0 -0
  606. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_diagnostics_utils.py +0 -0
  607. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_doctests.py +0 -0
  608. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dplyr_integration.py +0 -0
  609. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl.py +0 -0
  610. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_aggregation_enhancements.py +0 -0
  611. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_ast_equivalence.py +0 -0
  612. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_auto_community.py +0 -0
  613. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_communities.py +0 -0
  614. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_community_uq_integration.py +0 -0
  615. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_compact_compute.py +0 -0
  616. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_compositional_uq.py +0 -0
  617. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_condition_semantics.py +0 -0
  618. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_d_factory.py +0 -0
  619. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_documentation_examples.py +0 -0
  620. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_dplyr_style.py +0 -0
  621. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_dynamics_integration.py +0 -0
  622. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_edge_grouping_coverage.py +0 -0
  623. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_edge_queries.py +0 -0
  624. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_enhancements.py +0 -0
  625. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_ergonomics.py +0 -0
  626. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_errors.py +0 -0
  627. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_errors_extended.py +0 -0
  628. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_executor_additional.py +0 -0
  629. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_explain.py +0 -0
  630. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_export.py +0 -0
  631. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_expressions.py +0 -0
  632. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_extensions.py +0 -0
  633. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_graphops_equivalence.py +0 -0
  634. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_grouping_coverage.py +0 -0
  635. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_interactive.py +0 -0
  636. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_joins.py +0 -0
  637. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_layer_selection.py +0 -0
  638. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_layer_set_algebra.py +0 -0
  639. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_legacy_edges.py +0 -0
  640. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_lint.py +0 -0
  641. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_operators.py +0 -0
  642. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_patterns.py +0 -0
  643. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_patterns_quick_reference.py +0 -0
  644. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_pipes.py +0 -0
  645. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_planner.py +0 -0
  646. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_program_rewrite.py +0 -0
  647. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_program_types.py +0 -0
  648. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_progress_logging.py +0 -0
  649. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_properties.py +0 -0
  650. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_provenance.py +0 -0
  651. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_query_optimization.py +0 -0
  652. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_selection_fastpath.py +0 -0
  653. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_semiring_integration.py +0 -0
  654. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_serializer.py +0 -0
  655. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_smart_defaults.py +0 -0
  656. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_temporal_range_execution.py +0 -0
  657. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_uncertainty.py +0 -0
  658. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_uq_ergonomics.py +0 -0
  659. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_uq_propagation.py +0 -0
  660. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dsl_zoo_features.py +0 -0
  661. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics.py +0 -0
  662. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_algorithm_contracts.py +0 -0
  663. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_config_and_results_correctness.py +0 -0
  664. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_conservation.py +0 -0
  665. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_core.py +0 -0
  666. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_executor_edge_cases.py +0 -0
  667. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_parallel_determinism.py +0 -0
  668. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_reference_runs.py +0 -0
  669. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_uq_integration.py +0 -0
  670. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_dynamics_utils.py +0 -0
  671. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_edge_cases.py +0 -0
  672. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_edgelist_format.py +0 -0
  673. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ergonomic_helpers.py +0 -0
  674. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ergonomics.py +0 -0
  675. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_errors.py +0 -0
  676. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_CBSSD.py +0 -0
  677. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_community_detection.py +0 -0
  678. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_decomposition_and_classification.py +0 -0
  679. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_decomposition_ground_truth.py +0 -0
  680. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_dsl_builder_api.py +0 -0
  681. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_dynamics_core_examples.py +0 -0
  682. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_embedding_construction.py +0 -0
  683. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_embedding_visualization.py +0 -0
  684. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_incidence_gadget_encoding.py +0 -0
  685. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_inverse_network.py +0 -0
  686. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_layer_extraction.py +0 -0
  687. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_manipulation.py +0 -0
  688. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_multilayer_vectorized_aggregation.py +0 -0
  689. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_multiplex_aggregate.py +0 -0
  690. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_multiplex_dynamics.py +0 -0
  691. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_n2v_embedding.py +0 -0
  692. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_network_decomposition.py +0 -0
  693. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_network_decomposition_meta_paths.py +0 -0
  694. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_numeric_encoding.py +0 -0
  695. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_pattern_matching.py +0 -0
  696. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_example_ppr.py +0 -0
  697. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_exception_taxonomy.py +0 -0
  698. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_exceptions.py +0 -0
  699. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_experiments.py +0 -0
  700. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_explain_attribution.py +0 -0
  701. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_fast_examples.py +0 -0
  702. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_flagship_progress_demo.py +0 -0
  703. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_flow_hierarchy.py +0 -0
  704. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_fuzzing_properties.py +0 -0
  705. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_generate_all_outputs.py +0 -0
  706. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_generate_quickstart_outputs.py +0 -0
  707. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_generate_visualization_images.py +0 -0
  708. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_golden_toy_examples.py +0 -0
  709. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_graph_ops.py +0 -0
  710. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_graph_summarization.py +0 -0
  711. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_hedwig_adjustment.py +0 -0
  712. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_hedwig_significance.py +0 -0
  713. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_improved_errors.py +0 -0
  714. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_incidence_gadget_encoding.py +0 -0
  715. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_infomap_fix.py +0 -0
  716. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_interlayer_links_fix.py +0 -0
  717. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_api_edge_cases.py +0 -0
  718. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_contracts_additional.py +0 -0
  719. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_converters.py +0 -0
  720. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_exceptions.py +0 -0
  721. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_integration.py +0 -0
  722. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_io_schema.py +0 -0
  723. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_issue_19_fix.py +0 -0
  724. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_lab.py +0 -0
  725. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_lab_additional.py +0 -0
  726. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_lab_correctness.py +0 -0
  727. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_label_propagation.py +0 -0
  728. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_layer_extraction_fix.py +0 -0
  729. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_layer_similarity.py +0 -0
  730. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_layout_algorithms.py +0 -0
  731. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_lazy_evaluation.py +0 -0
  732. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_leiden_multilayer.py +0 -0
  733. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_linter.py +0 -0
  734. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_logging_conversion.py +0 -0
  735. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_main_module.py +0 -0
  736. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_master_regulators_example.py +0 -0
  737. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_math_invariants.py +0 -0
  738. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_mcp_server.py +0 -0
  739. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_meta_analysis.py +0 -0
  740. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_meta_flow_report.py +0 -0
  741. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_metamorphic.py +0 -0
  742. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_metapath2vec.py +0 -0
  743. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_monoplex_nx_wrapper.py +0 -0
  744. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_mpc.py +0 -0
  745. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_centrality.py +0 -0
  746. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_clustering_coefficients.py +0 -0
  747. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_cornercases.py +0 -0
  748. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_edge_fix.py +0 -0
  749. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_integration.py +0 -0
  750. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_leiden_uq.py +0 -0
  751. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_modularity.py +0 -0
  752. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_quality_metrics.py +0 -0
  753. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multilayer_statistics.py +0 -0
  754. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multinet_aggregation.py +0 -0
  755. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multinet_aggregation_additional.py +0 -0
  756. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multiplex_layer_interop.py +0 -0
  757. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multiplex_participation.py +0 -0
  758. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multiplex_properties.py +0 -0
  759. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multirank.py +0 -0
  760. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_multixrank.py +0 -0
  761. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_network_conversion.py +0 -0
  762. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_network_version.py +0 -0
  763. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_networkx_compatibility.py +0 -0
  764. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_new_algorithms.py +0 -0
  765. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_new_multilayer_metrics.py +0 -0
  766. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_node_edge_parity.py +0 -0
  767. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_node_ranking_comprehensive.py +0 -0
  768. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_norc.py +0 -0
  769. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_nullmodel_sanity.py +0 -0
  770. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_nullmodels.py +0 -0
  771. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_nullmodels_contracts.py +0 -0
  772. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_nx_compat_extended.py +0 -0
  773. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ollivier_ricci_multilayer.py +0 -0
  774. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_out_of_core.py +0 -0
  775. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_parallel.py +0 -0
  776. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_parallel_execution.py +0 -0
  777. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_parsers_comprehensive.py +0 -0
  778. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_parsers_coverage.py +0 -0
  779. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_partition_uq.py +0 -0
  780. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_partition_uq_integration.py +0 -0
  781. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_paths.py +0 -0
  782. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_paths_additional.py +0 -0
  783. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_paths_contracts.py +0 -0
  784. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_paths_executor.py +0 -0
  785. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_paths_result.py +0 -0
  786. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_performance_core.py +0 -0
  787. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_pipeline.py +0 -0
  788. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_plugin_examples.py +0 -0
  789. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_plugin_system.py +0 -0
  790. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_plugins.py +0 -0
  791. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_plugins_contracts.py +0 -0
  792. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_profiling.py +0 -0
  793. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_program.py +0 -0
  794. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_program_cost_executor.py +0 -0
  795. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_properties.py +0 -0
  796. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_provenance_canonical.py +0 -0
  797. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_provenance_replay.py +0 -0
  798. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_provenance_schema.py +0 -0
  799. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_query_algebra.py +0 -0
  800. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_query_equivalence.py +0 -0
  801. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_r_interop.py +0 -0
  802. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_random_generators_additional.py +0 -0
  803. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_random_generators_extended.py +0 -0
  804. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_random_walkers.py +0 -0
  805. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_random_walks.py +0 -0
  806. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_readme_flagship_example.py +0 -0
  807. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_requirements.py +0 -0
  808. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_result_explain_debug.py +0 -0
  809. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_ricci_visualization.py +0 -0
  810. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_robustness.py +0 -0
  811. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_robustness_additional.py +0 -0
  812. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_robustness_testing.py +0 -0
  813. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_root_conftest.py +0 -0
  814. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_roundtrip_invariants.py +0 -0
  815. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_run_quickstart_snippets.py +0 -0
  816. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sankey_visualization.py +0 -0
  817. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sbm_generator.py +0 -0
  818. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sbm_metrics.py +0 -0
  819. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_schema_and_immutable.py +0 -0
  820. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_seeding.py +0 -0
  821. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_selection_uq.py +0 -0
  822. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_selection_uq_integration.py +0 -0
  823. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_semiring_negative_cases.py +0 -0
  824. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_semiring_registry.py +0 -0
  825. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_semiring_types.py +0 -0
  826. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_semiring_verification.py +0 -0
  827. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sidecar.py +0 -0
  828. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sir_epidemic.py +0 -0
  829. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_sir_multiplex.py +0 -0
  830. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_spectral_multilayer.py +0 -0
  831. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_statistical_report.py +0 -0
  832. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_comparison.py +0 -0
  833. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_core.py +0 -0
  834. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_edge_cases.py +0 -0
  835. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_provenance.py +0 -0
  836. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_provenance_dataclass.py +0 -0
  837. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_registry.py +0 -0
  838. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_scalar_uncertainty.py +0 -0
  839. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stats_verify.py +0 -0
  840. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_stratified_uq.py +0 -0
  841. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_streaming_topk.py +0 -0
  842. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_successive_halving.py +0 -0
  843. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_supporting_extended.py +0 -0
  844. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_supra_matrix_function_centrality.py +0 -0
  845. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal.py +0 -0
  846. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_algorithms.py +0 -0
  847. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_builder.py +0 -0
  848. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_dsl.py +0 -0
  849. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_duration_parsing.py +0 -0
  850. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_multinet.py +0 -0
  851. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_utils.py +0 -0
  852. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_utils_extended.py +0 -0
  853. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_view.py +0 -0
  854. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_temporal_windowed_queries.py +0 -0
  855. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_tensor_representation.py +0 -0
  856. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_tutorial_10min.py +0 -0
  857. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty.py +0 -0
  858. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_additional.py +0 -0
  859. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_builder_integration.py +0 -0
  860. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_defaults.py +0 -0
  861. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_dsl_integration.py +0 -0
  862. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_engines.py +0 -0
  863. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_oracles.py +0 -0
  864. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uncertainty_runner.py +0 -0
  865. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uq_algebra.py +0 -0
  866. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uq_integration.py +0 -0
  867. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uq_resolution.py +0 -0
  868. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_uq_spine.py +0 -0
  869. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_user_journey_simulation.py +0 -0
  870. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_utils.py +0 -0
  871. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_utils_coverage.py +0 -0
  872. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_utils_extended.py +0 -0
  873. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_utils_search_paths.py +0 -0
  874. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_validation.py +0 -0
  875. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_validation_module.py +0 -0
  876. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_api_differential.py +0 -0
  877. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_centrality.py +0 -0
  878. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_communities.py +0 -0
  879. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_determinism_parallelism.py +0 -0
  880. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_dsl_equivalence.py +0 -0
  881. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_metamorphic_harness.py +0 -0
  882. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_verification_provenance_oracles.py +0 -0
  883. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_versatility.py +0 -0
  884. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_benchmark.py +0 -0
  885. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_bezier.py +0 -0
  886. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_colors.py +0 -0
  887. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_imports.py +0 -0
  888. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_layouts.py +0 -0
  889. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_multilayer_additional.py +0 -0
  890. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_polyfit.py +0 -0
  891. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualization_supra_heatmap.py +0 -0
  892. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_visualize_matrix_fix.py +0 -0
  893. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_workflows.py +0 -0
  894. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_wrappers_additional.py +0 -0
  895. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_wrappers_benchmark_nodes.py +0 -0
  896. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_wrappers_node2vec.py +0 -0
  897. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_wrappers_r_interop.py +0 -0
  898. {py3plex-1.1.4 → py3plex-1.1.5}/tests/test_wrappers_train_node2vec.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py3plex
3
- Version: 1.1.4
3
+ Version: 1.1.5
4
4
  Summary: A Multilayer network analysis python3 library
5
5
  Author-email: Blaž Škrlj <blaz.skrlj@ijs.si>
6
6
  License: MIT
@@ -100,10 +100,11 @@ Dynamic: license-file
100
100
  [![Formal Verification](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
101
101
  [![Fuzzing](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
102
102
  [![PyPI version](https://img.shields.io/pypi/v/py3plex.svg)](https://pypi.org/project/py3plex/)
103
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/py3plex)](https://pypistats.org/packages/py3plex)
103
104
  ![CLI Tool](https://img.shields.io/badge/CLI%20Tool-Available-brightgreen)
104
105
  ![Docker](https://img.shields.io/badge/Docker-Available-blue)
105
- ![Lines of Code](https://img.shields.io/badge/lines-206.0K-blue)
106
- ![Test Count](https://img.shields.io/badge/tests-8.9K-blue)
106
+ ![Lines of Code](https://img.shields.io/badge/lines-209.4K-blue)
107
+ ![Test Count](https://img.shields.io/badge/tests-9.0K-blue)
107
108
 
108
109
  *Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
109
110
  some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
@@ -10,10 +10,11 @@
10
10
  [![Formal Verification](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
11
11
  [![Fuzzing](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
12
12
  [![PyPI version](https://img.shields.io/pypi/v/py3plex.svg)](https://pypi.org/project/py3plex/)
13
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/py3plex)](https://pypistats.org/packages/py3plex)
13
14
  ![CLI Tool](https://img.shields.io/badge/CLI%20Tool-Available-brightgreen)
14
15
  ![Docker](https://img.shields.io/badge/Docker-Available-blue)
15
- ![Lines of Code](https://img.shields.io/badge/lines-206.0K-blue)
16
- ![Test Count](https://img.shields.io/badge/tests-8.9K-blue)
16
+ ![Lines of Code](https://img.shields.io/badge/lines-209.4K-blue)
17
+ ![Test Count](https://img.shields.io/badge/tests-9.0K-blue)
17
18
 
18
19
  *Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
19
20
  some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
@@ -51,8 +51,8 @@ For detailed documentation, see: https://skblaz.github.io/py3plex/
51
51
  """
52
52
 
53
53
  # Version information
54
- __version__ = "1.1.4"
55
- __api_version__ = "1.1.4"
54
+ __version__ = "1.1.5"
55
+ __api_version__ = "1.1.5"
56
56
 
57
57
  from py3plex.core.multinet import multi_layer_network
58
58
  from py3plex.core.types import (
@@ -146,6 +146,7 @@ from py3plex.pipeline import (
146
146
  ComputeStats,
147
147
  FilterNodes,
148
148
  SaveNetwork,
149
+ NodeEmbedding,
149
150
  )
150
151
 
151
152
  # Config-driven workflows
@@ -284,6 +285,7 @@ __all__ = [
284
285
  "ComputeStats",
285
286
  "FilterNodes",
286
287
  "SaveNetwork",
288
+ "NodeEmbedding",
287
289
  # Workflows
288
290
  "WorkflowConfig",
289
291
  "WorkflowRunner",
@@ -3036,8 +3036,7 @@ def cmd_capabilities(args: argparse.Namespace) -> int:
3036
3036
  print(_json.dumps(flat, indent=2))
3037
3037
  else:
3038
3038
  for key, val in flat.items():
3039
- marker = "✓" if val else "✗"
3040
- print(f" {marker} {key}")
3039
+ print(f" {key}: {bool(val)}")
3041
3040
  return 0
3042
3041
 
3043
3042
  caps = capabilities()
@@ -218,8 +218,8 @@ WARN_DEPRECATED: bool = True
218
218
  # Library Metadata
219
219
  # ─────────────────────────────────────────────────────────────────────────────
220
220
 
221
- __api_version__ = "1.1.4"
222
- __version__ = "1.1.4"
221
+ __api_version__ = "1.1.5"
222
+ __version__ = "1.1.5"
223
223
 
224
224
  # ─────────────────────────────────────────────────────────────────────────────
225
225
  # Helper Functions
@@ -2,7 +2,11 @@
2
2
 
3
3
  import itertools
4
4
  import os
5
+ import hashlib
6
+ import json
7
+ import pathlib
5
8
  from collections import defaultdict
9
+ from datetime import datetime, timezone
6
10
  from typing import Any, Dict, List, Optional, Tuple, Union
7
11
  import matplotlib.pyplot as plt
8
12
 
@@ -2083,6 +2087,250 @@ class multi_layer_network:
2083
2087
 
2084
2088
  yield from self.core_network.nodes(data=data)
2085
2089
 
2090
+ def embed(
2091
+ self,
2092
+ method: str = "node2vec",
2093
+ dimensions: int = 128,
2094
+ walk_length: int = 40,
2095
+ num_walks: int = 10,
2096
+ context_size: int = 10,
2097
+ workers: int = 4,
2098
+ **kwargs: Any,
2099
+ ) -> Any:
2100
+ """Learn node embeddings as a first-class ML primitive.
2101
+
2102
+ Args:
2103
+ method: Embedding backend name.
2104
+ dimensions: Embedding dimensionality.
2105
+ walk_length: Random-walk length for walk-based models.
2106
+ num_walks: Number of walks per node for walk-based models.
2107
+ context_size: Skipgram context window.
2108
+ workers: Number of workers (reserved for backend implementations).
2109
+ **kwargs: Method-specific parameters.
2110
+
2111
+ Returns:
2112
+ EmbeddingResult aligned with ``self.get_nodes()``.
2113
+ """
2114
+ import py3plex
2115
+
2116
+ from py3plex.ml.embedding import (
2117
+ DeepWalkEmbedding,
2118
+ LINEEmbedding,
2119
+ MetaPath2VecEmbedding,
2120
+ MultiplexNode2Vec,
2121
+ NetMFEmbedding,
2122
+ Node2VecEmbedding,
2123
+ SupraAdjacencyEmbedding,
2124
+ LayerRegularizedEmbedding,
2125
+ )
2126
+
2127
+ method_key = str(method).lower()
2128
+ seed = kwargs.pop("seed", None)
2129
+ backend = kwargs.pop("backend", "numpy")
2130
+ window_size = kwargs.pop("window_size", context_size)
2131
+ cache_enabled = bool(kwargs.pop("cache", False))
2132
+ cache_dir = kwargs.pop("cache_dir", None)
2133
+
2134
+ embed_parameters = {
2135
+ "method": method_key,
2136
+ "dimensions": int(dimensions),
2137
+ "walk_length": int(walk_length),
2138
+ "num_walks": int(num_walks),
2139
+ "context_size": int(context_size),
2140
+ "window_size": int(window_size),
2141
+ "workers": int(workers),
2142
+ "seed": seed,
2143
+ "backend": backend,
2144
+ **dict(kwargs),
2145
+ }
2146
+ try:
2147
+ graph_hash = self.fingerprint()
2148
+ if not isinstance(graph_hash, str):
2149
+ graph_hash = json.dumps(graph_hash, sort_keys=True, default=str)
2150
+ except Exception as exc:
2151
+ logger.warning("Failed to compute graph fingerprint for embedding cache: %s", exc)
2152
+ node_snapshot = list(self.get_nodes())
2153
+ layer_labels = sorted(
2154
+ {
2155
+ str(node[1])
2156
+ for node in node_snapshot
2157
+ if isinstance(node, tuple) and len(node) >= 2
2158
+ }
2159
+ )
2160
+ fallback_fp = {
2161
+ "nodes": len(node_snapshot),
2162
+ "edges": len(list(self.get_edges())),
2163
+ "layers": layer_labels,
2164
+ }
2165
+ graph_hash = hashlib.sha256(
2166
+ json.dumps(fallback_fp, sort_keys=True, default=str).encode()
2167
+ ).hexdigest()[:16]
2168
+
2169
+ cache_payload = {
2170
+ "graph_structure_hash": graph_hash,
2171
+ "method": method_key,
2172
+ "parameters": embed_parameters,
2173
+ "version": py3plex.__version__,
2174
+ "network_version": getattr(self, "network_version", None),
2175
+ }
2176
+ cache_hash = hashlib.sha256(
2177
+ json.dumps(cache_payload, sort_keys=True, default=str).encode()
2178
+ ).hexdigest()[:16]
2179
+ cache_path = None
2180
+ fallback_cache_path = None
2181
+ if cache_enabled:
2182
+ cache_root = pathlib.Path(cache_dir) if cache_dir else pathlib.Path.cwd()
2183
+ cache_root.mkdir(parents=True, exist_ok=True)
2184
+ cache_path = cache_root / f"embedding_{cache_hash}.parquet"
2185
+ fallback_cache_path = cache_root / f"embedding_{cache_hash}.npz"
2186
+ existing_cache_path = (
2187
+ cache_path if cache_path.exists() else fallback_cache_path
2188
+ )
2189
+ if existing_cache_path.exists():
2190
+ from py3plex.embeddings.base import EmbeddingResult
2191
+
2192
+ loaded = EmbeddingResult.load(str(existing_cache_path))
2193
+ loaded.meta.update(
2194
+ {
2195
+ "method": method_key,
2196
+ "parameters": embed_parameters,
2197
+ "graph_hash": graph_hash,
2198
+ "creation_time": loaded.meta.get(
2199
+ "creation_time", datetime.now(timezone.utc).isoformat()
2200
+ ),
2201
+ "library_version": py3plex.__version__,
2202
+ "cache_key": cache_hash,
2203
+ "cache_path": str(existing_cache_path),
2204
+ "cache_hit": True,
2205
+ }
2206
+ )
2207
+ if hasattr(self, "embedding"):
2208
+ self.embedding = loaded
2209
+ else:
2210
+ setattr(self, "embedding", loaded)
2211
+ return loaded
2212
+
2213
+ if method_key == "node2vec":
2214
+ model = Node2VecEmbedding(
2215
+ dimensions=dimensions,
2216
+ walk_length=walk_length,
2217
+ num_walks=num_walks,
2218
+ p=float(kwargs.pop("p", 1.0)),
2219
+ q=float(kwargs.pop("q", 1.0)),
2220
+ window_size=window_size,
2221
+ negative_samples=int(kwargs.pop("negative_samples", 5)),
2222
+ workers=workers,
2223
+ backend=backend,
2224
+ seed=seed,
2225
+ )
2226
+ elif method_key == "deepwalk":
2227
+ model = DeepWalkEmbedding(
2228
+ dimensions=dimensions,
2229
+ walk_length=walk_length,
2230
+ num_walks=num_walks,
2231
+ window_size=window_size,
2232
+ negative_samples=int(kwargs.pop("negative_samples", 5)),
2233
+ workers=workers,
2234
+ backend=backend,
2235
+ seed=seed,
2236
+ )
2237
+ elif method_key == "netmf":
2238
+ model = NetMFEmbedding(
2239
+ dimensions=dimensions,
2240
+ window=int(kwargs.pop("window", context_size)),
2241
+ negative=float(kwargs.pop("negative", 1.0)),
2242
+ multilayer=str(kwargs.pop("multilayer", "supra")),
2243
+ gamma=float(kwargs.pop("gamma", 1.0)),
2244
+ approx=str(kwargs.pop("approx", "randomized_svd")),
2245
+ seed=seed,
2246
+ )
2247
+ elif method_key == "line":
2248
+ model = LINEEmbedding(
2249
+ dimensions=dimensions,
2250
+ order=int(kwargs.pop("order", 2)),
2251
+ negative_samples=int(kwargs.pop("negative_samples", 5)),
2252
+ lr=float(kwargs.pop("lr", 0.025)),
2253
+ epochs=int(kwargs.pop("epochs", 5)),
2254
+ seed=seed,
2255
+ )
2256
+ elif method_key == "metapath2vec":
2257
+ model = MetaPath2VecEmbedding(
2258
+ metapaths=list(kwargs.pop("metapaths", [])),
2259
+ dimensions=dimensions,
2260
+ walk_length=walk_length,
2261
+ num_walks=num_walks,
2262
+ window_size=window_size,
2263
+ negative_samples=int(kwargs.pop("negative_samples", 5)),
2264
+ epochs=int(kwargs.pop("epochs", 5)),
2265
+ seed=seed,
2266
+ )
2267
+ elif method_key in {"multiplex_node2vec", "multiplex-node2vec"}:
2268
+ model = MultiplexNode2Vec(
2269
+ dimensions=dimensions,
2270
+ walk_length=walk_length,
2271
+ num_walks=num_walks,
2272
+ p=float(kwargs.pop("p", 1.0)),
2273
+ q=float(kwargs.pop("q", 1.0)),
2274
+ window_size=window_size,
2275
+ negative_samples=int(kwargs.pop("negative_samples", 5)),
2276
+ workers=workers,
2277
+ backend=backend,
2278
+ layer_weight=float(kwargs.pop("layer_weight", 1.0)),
2279
+ seed=seed,
2280
+ )
2281
+ elif method_key in {"supra_adjacency", "supra"}:
2282
+ model = SupraAdjacencyEmbedding(
2283
+ dimensions=dimensions,
2284
+ gamma=float(kwargs.pop("gamma", 1.0)),
2285
+ seed=seed,
2286
+ )
2287
+ elif method_key in {"layer_regularized", "layer-regularized"}:
2288
+ model = LayerRegularizedEmbedding(
2289
+ dimensions=dimensions,
2290
+ alpha=float(kwargs.pop("alpha", 0.5)),
2291
+ seed=seed,
2292
+ )
2293
+ else:
2294
+ raise ValueError(
2295
+ f"Unknown embedding method '{method}'. "
2296
+ "Expected one of: node2vec, deepwalk, netmf, line, "
2297
+ "metapath2vec, multiplex_node2vec, supra_adjacency, layer_regularized."
2298
+ )
2299
+
2300
+ embedding = model.fit_transform(self)
2301
+ embedding.meta.update(
2302
+ {
2303
+ "method": method_key,
2304
+ "parameters": embed_parameters,
2305
+ "graph_hash": graph_hash,
2306
+ "creation_time": datetime.now(timezone.utc).isoformat(),
2307
+ "library_version": py3plex.__version__,
2308
+ "cache_key": cache_hash if cache_enabled else None,
2309
+ "cache_path": str(cache_path) if cache_path else None,
2310
+ "cache_hit": False,
2311
+ }
2312
+ )
2313
+ if cache_enabled and cache_path is not None:
2314
+ try:
2315
+ embedding.to_parquet(str(cache_path))
2316
+ except Exception as exc:
2317
+ logger.warning("Failed to write parquet embedding cache %s: %s", cache_path, exc)
2318
+ if fallback_cache_path is not None:
2319
+ try:
2320
+ embedding.save(str(fallback_cache_path))
2321
+ embedding.meta["cache_path"] = str(fallback_cache_path)
2322
+ except Exception as fallback_exc:
2323
+ logger.warning(
2324
+ "Failed to write fallback embedding cache %s: %s",
2325
+ fallback_cache_path,
2326
+ fallback_exc,
2327
+ )
2328
+ if hasattr(self, "embedding"):
2329
+ self.embedding = embedding
2330
+ else:
2331
+ setattr(self, "embedding", embedding)
2332
+ return embedding
2333
+
2086
2334
  def merge_with(self, target_px_object):
2087
2335
  """
2088
2336
  Merge two px objects.
@@ -106,6 +106,16 @@ from .ast import (
106
106
  SemiringClosureStmt,
107
107
  SemiringFixedPointStmt,
108
108
  SemiringStmt,
109
+ PredictStmt,
110
+ LinkPredictionSpec,
111
+ SplitSpec,
112
+ NegativeSamplingSpec,
113
+ ModelSpec,
114
+ EdgeFeatureSpec,
115
+ EvalSpec,
116
+ ReduceStmt,
117
+ LayerReductionSpec,
118
+ DistanceSpec,
109
119
  # Benchmark AST nodes
110
120
  BenchmarkNode,
111
121
  BenchmarkAlgorithmSpec,
@@ -141,6 +151,8 @@ from .builder import (
141
151
  CounterexampleBuilder,
142
152
  # Claim learning builder
143
153
  ClaimLearnerBuilder,
154
+ LinkPredictionBuilder,
155
+ LayerReductionBuilder,
144
156
  )
145
157
 
146
158
  from .benchmark import (
@@ -190,6 +202,8 @@ from .communities import (
190
202
  )
191
203
 
192
204
  from .result import QueryResult
205
+ from .predictive import PredictionResult
206
+ from .reduction import LayerReductionResult
193
207
 
194
208
  from .executor import execute_ast
195
209
  from .export import export_result, save_to_parquet, load_from_parquet
@@ -209,6 +223,11 @@ from .errors import (
209
223
  InvalidJoinKeyError,
210
224
  ComputedFieldMisuseError,
211
225
  InvalidGroupAggregateError,
226
+ PredictionTaskError,
227
+ SplitStrategyError,
228
+ NegativeSamplingError,
229
+ ReductionMethodError,
230
+ LayerReductionError,
212
231
  )
213
232
 
214
233
  # Import UQ resolution and validation
@@ -349,6 +368,16 @@ __all__ = [
349
368
  "SemiringClosureStmt",
350
369
  "SemiringFixedPointStmt",
351
370
  "SemiringStmt",
371
+ "PredictStmt",
372
+ "LinkPredictionSpec",
373
+ "SplitSpec",
374
+ "NegativeSamplingSpec",
375
+ "ModelSpec",
376
+ "EdgeFeatureSpec",
377
+ "EvalSpec",
378
+ "ReduceStmt",
379
+ "LayerReductionSpec",
380
+ "DistanceSpec",
352
381
  # Benchmark AST
353
382
  "BenchmarkNode",
354
383
  "BenchmarkAlgorithmSpec",
@@ -384,6 +413,8 @@ __all__ = [
384
413
  "CounterexampleBuilder",
385
414
  # Claim Learning Builder
386
415
  "ClaimLearnerBuilder",
416
+ "LinkPredictionBuilder",
417
+ "LayerReductionBuilder",
387
418
  # Benchmark Builder
388
419
  "B",
389
420
  "CommunityBenchmarkBuilder",
@@ -419,6 +450,8 @@ __all__ = [
419
450
  "compute_community_metric",
420
451
  # Result
421
452
  "QueryResult",
453
+ "PredictionResult",
454
+ "LayerReductionResult",
422
455
  "export_result",
423
456
  "save_to_parquet",
424
457
  "load_from_parquet",
@@ -439,6 +472,11 @@ __all__ = [
439
472
  "InvalidJoinKeyError",
440
473
  "ComputedFieldMisuseError",
441
474
  "InvalidGroupAggregateError",
475
+ "PredictionTaskError",
476
+ "SplitStrategyError",
477
+ "NegativeSamplingError",
478
+ "ReductionMethodError",
479
+ "LayerReductionError",
442
480
  # UQ Resolution
443
481
  "ResolvedUQConfig",
444
482
  "UQResolutionError",
@@ -728,6 +728,12 @@ class EmbeddingSpec:
728
728
  of layer names, e.g. ``[["author","paper","author"]]``).
729
729
  walk_length: Random walk length for MetaPath2Vec.
730
730
  num_walks: Number of walks per node for MetaPath2Vec.
731
+ p: Node2Vec return parameter.
732
+ q: Node2Vec in-out parameter.
733
+ window_size: Context window for walk-based embedding training.
734
+ negative_samples: Negative samples for walk-based embedding training.
735
+ workers: Worker count for embedding training.
736
+ order: LINE order (1 or 2).
731
737
  """
732
738
 
733
739
  method: str = "netmf"
@@ -747,6 +753,12 @@ class EmbeddingSpec:
747
753
  metapaths: Optional[List[List[str]]] = None
748
754
  walk_length: int = 80
749
755
  num_walks: int = 10
756
+ p: float = 1.0
757
+ q: float = 1.0
758
+ window_size: int = 10
759
+ negative_samples: int = 5
760
+ workers: int = 1
761
+ order: int = 2
750
762
 
751
763
 
752
764
  @dataclass
@@ -1183,6 +1195,117 @@ class SemiringStmt:
1183
1195
  fixed_point: Optional[SemiringFixedPointStmt] = None
1184
1196
 
1185
1197
 
1198
+ # ==============================================================================
1199
+ # Predictive Task DSL AST Nodes
1200
+ # ==============================================================================
1201
+
1202
+
1203
+ @dataclass
1204
+ class SplitSpec:
1205
+ """Data split strategy for predictive tasks."""
1206
+
1207
+ strategy: str = "random_holdout"
1208
+ test_frac: float = 0.2
1209
+ seed: Optional[int] = None
1210
+ params: Dict[str, Any] = field(default_factory=dict)
1211
+
1212
+
1213
+ @dataclass
1214
+ class NegativeSamplingSpec:
1215
+ """Negative sampling strategy for predictive tasks."""
1216
+
1217
+ strategy: str = "uniform"
1218
+ ratio: float = 1.0
1219
+ seed: Optional[int] = None
1220
+ params: Dict[str, Any] = field(default_factory=dict)
1221
+
1222
+
1223
+ @dataclass
1224
+ class ModelSpec:
1225
+ """Predictive model specification."""
1226
+
1227
+ name: str
1228
+ params: Dict[str, Any] = field(default_factory=dict)
1229
+
1230
+
1231
+ @dataclass
1232
+ class EdgeFeatureSpec:
1233
+ """Edge feature operator for embedding pipelines."""
1234
+
1235
+ kind: str = "hadamard"
1236
+ params: Dict[str, Any] = field(default_factory=dict)
1237
+
1238
+
1239
+ @dataclass
1240
+ class EvalSpec:
1241
+ """Evaluation metrics specification."""
1242
+
1243
+ metrics: List[str] = field(default_factory=lambda: ["roc_auc"])
1244
+ params: Dict[str, Any] = field(default_factory=dict)
1245
+
1246
+
1247
+ @dataclass
1248
+ class LinkPredictionSpec:
1249
+ """Link prediction workflow specification."""
1250
+
1251
+ layers_expr: Optional[Any] = None # LayerExpr or LayerSet
1252
+ scope: Dict[str, Any] = field(default_factory=dict)
1253
+ split: SplitSpec = field(default_factory=SplitSpec)
1254
+ negative_sampling: NegativeSamplingSpec = field(default_factory=NegativeSamplingSpec)
1255
+ model: ModelSpec = field(default_factory=lambda: ModelSpec(name="common_neighbors"))
1256
+ edge_features: EdgeFeatureSpec = field(default_factory=EdgeFeatureSpec)
1257
+ classifier: Optional[ModelSpec] = None
1258
+ eval: EvalSpec = field(default_factory=EvalSpec)
1259
+ top_k: Optional[int] = None
1260
+ uq_config: Optional[UQConfig] = None
1261
+ seed: Optional[int] = None
1262
+
1263
+
1264
+ @dataclass
1265
+ class PredictStmt:
1266
+ """Top-level predictive task statement."""
1267
+
1268
+ task: str = "links"
1269
+ spec: Optional[LinkPredictionSpec] = None
1270
+
1271
+
1272
+ # ==============================================================================
1273
+ # Layer Reduction DSL AST Nodes
1274
+ # ==============================================================================
1275
+
1276
+
1277
+ @dataclass
1278
+ class DistanceSpec:
1279
+ """Distance/similarity function specification for layer reduction."""
1280
+
1281
+ name: str = "js_divergence"
1282
+ params: Dict[str, Any] = field(default_factory=dict)
1283
+
1284
+
1285
+ @dataclass
1286
+ class LayerReductionSpec:
1287
+ """Layer reduction workflow specification."""
1288
+
1289
+ method: str = "hierarchical_js"
1290
+ target_k: int = 1
1291
+ distance: Optional[DistanceSpec] = None
1292
+ criterion: Optional[str] = None
1293
+ min_similarity: Optional[float] = None
1294
+ preserve_interlayer: bool = True
1295
+ aggregate: str = "sum"
1296
+ report_level: str = "full"
1297
+ seed: Optional[int] = None
1298
+ params: Dict[str, Any] = field(default_factory=dict)
1299
+
1300
+
1301
+ @dataclass
1302
+ class ReduceStmt:
1303
+ """Top-level reduce/simplify statement."""
1304
+
1305
+ target: str = "layers"
1306
+ spec: Optional[LayerReductionSpec] = None
1307
+
1308
+
1186
1309
  # ==============================================================================
1187
1310
  # Benchmark AST Nodes
1188
1311
  # ==============================================================================