py3plex 1.1.4__tar.gz → 1.1.7__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 (918) hide show
  1. {py3plex-1.1.4/py3plex.egg-info → py3plex-1.1.7}/PKG-INFO +52 -4
  2. {py3plex-1.1.4 → py3plex-1.1.7}/README.md +41 -2
  3. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/__init__.py +59 -3
  4. py3plex-1.1.7/py3plex/agent.py +216 -0
  5. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/powerlaw.py +1 -17
  6. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/benchmarks/metrics.py +3 -3
  7. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/cli.py +102 -40
  8. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/config.py +2 -2
  9. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/multinet.py +361 -0
  10. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/random_generators.py +4 -4
  11. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/datasets/_generators.py +9 -5
  12. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/__init__.py +38 -0
  13. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/ast.py +204 -1
  14. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/builder.py +404 -13
  15. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/errors.py +24 -4
  16. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/executor.py +112 -10
  17. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/executor_semiring.py +11 -29
  18. py3plex-1.1.7/py3plex/dsl/predictive.py +692 -0
  19. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/types.py +5 -1
  20. py3plex-1.1.7/py3plex/dsl/reduction.py +432 -0
  21. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/result.py +126 -2
  22. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/uq_resolution.py +5 -7
  23. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/warnings.py +121 -0
  24. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl_legacy.py +11 -2
  25. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/embeddings/__init__.py +2 -1
  26. py3plex-1.1.7/py3plex/embeddings/base.py +719 -0
  27. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/graph_ops.py +32 -0
  28. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/linter.py +116 -1
  29. py3plex-1.1.7/py3plex/ml/__init__.py +2 -0
  30. py3plex-1.1.7/py3plex/ml/embedding/__init__.py +44 -0
  31. py3plex-1.1.7/py3plex/ml/embedding/base.py +8 -0
  32. py3plex-1.1.7/py3plex/ml/embedding/deepwalk.py +37 -0
  33. py3plex-1.1.7/py3plex/ml/embedding/evaluation.py +149 -0
  34. py3plex-1.1.7/py3plex/ml/embedding/line.py +87 -0
  35. py3plex-1.1.7/py3plex/ml/embedding/metapath2vec.py +73 -0
  36. py3plex-1.1.7/py3plex/ml/embedding/multiplex.py +869 -0
  37. py3plex-1.1.7/py3plex/ml/embedding/netmf.py +70 -0
  38. py3plex-1.1.7/py3plex/ml/embedding/node2vec.py +90 -0
  39. py3plex-1.1.7/py3plex/ml/embedding/similarity.py +25 -0
  40. py3plex-1.1.7/py3plex/ml/embedding/trainer.py +141 -0
  41. py3plex-1.1.7/py3plex/ml/embedding/utils.py +149 -0
  42. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/pipeline.py +51 -0
  43. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/result.py +5 -5
  44. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/runner.py +17 -4
  45. {py3plex-1.1.4 → py3plex-1.1.7/py3plex.egg-info}/PKG-INFO +52 -4
  46. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/SOURCES.txt +41 -0
  47. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/requires.txt +12 -1
  48. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/__init__.py +2 -2
  49. {py3plex-1.1.4 → py3plex-1.1.7}/pyproject.toml +13 -2
  50. py3plex-1.1.7/tests/test_agent_api.py +250 -0
  51. py3plex-1.1.7/tests/test_agents_documentation_claims.py +42 -0
  52. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_agents_ergonomics_features.py +3 -3
  53. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_agents_golden_paths.py +1 -1
  54. py3plex-1.1.7/tests/test_algorithms_requirements_registry.py +84 -0
  55. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_book_conf.py +1 -1
  56. py3plex-1.1.7/tests/test_book_manuscript_integrity.py +53 -0
  57. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_book_snippets.py +55 -0
  58. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_builder_dsl_mutate.py +14 -14
  59. py3plex-1.1.7/tests/test_ci_python_versions.py +16 -0
  60. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_cli.py +30 -1
  61. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_cli_check.py +1 -1
  62. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_cli_ergonomics.py +19 -0
  63. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_doc_conf.py +9 -1
  64. py3plex-1.1.7/tests/test_docs_embeddings_section.py +55 -0
  65. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_docs_examples.py +1 -0
  66. py3plex-1.1.7/tests/test_docs_quality_pass.py +44 -0
  67. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_community_filtering.py +1 -1
  68. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_edge_grouping_coverage.py +14 -0
  69. py3plex-1.1.7/tests/test_dsl_legacy_approximate.py +134 -0
  70. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_planner.py +23 -0
  71. py3plex-1.1.7/tests/test_dsl_predict_reduce.py +237 -0
  72. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_query_zoo.py +2 -2
  73. py3plex-1.1.7/tests/test_dsl_result_algebra_edge_cases.py +96 -0
  74. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_uncertainty.py +18 -1
  75. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_v2.py +138 -0
  76. py3plex-1.1.7/tests/test_embeddings_direct_units.py +231 -0
  77. py3plex-1.1.7/tests/test_ergonomics_helpers.py +105 -0
  78. py3plex-1.1.7/tests/test_example_interactive_multilayer.py +27 -0
  79. py3plex-1.1.7/tests/test_examples_zoo_consolidation.py +34 -0
  80. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_arrow.py +2 -2
  81. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_roundtrip.py +64 -7
  82. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_link_checker.py +43 -0
  83. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_linter.py +73 -2
  84. py3plex-1.1.7/tests/test_ml_embedding_primitives.py +319 -0
  85. py3plex-1.1.7/tests/test_multilayer_embedding_models.py +219 -0
  86. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_visualizations.py +4 -112
  87. py3plex-1.1.7/tests/test_optimizer_submodules.py +329 -0
  88. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_plugin_system.py +23 -0
  89. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_plugins_contracts.py +20 -0
  90. py3plex-1.1.7/tests/test_profiling_additional.py +52 -0
  91. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_provenance_replay.py +27 -0
  92. py3plex-1.1.7/tests/test_public_api_exports.py +60 -0
  93. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_pymnet_style.py +2 -2
  94. py3plex-1.1.7/tests/test_pypi_publish_workflow.py +7 -0
  95. py3plex-1.1.7/tests/test_readme_contributor_onboarding.py +41 -0
  96. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_roundtrip_invariants.py +25 -3
  97. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sbm_autocommunity.py +8 -8
  98. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sbm_runner_integration.py +8 -8
  99. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_selection_uq_empty_groups.py +2 -2
  100. py3plex-1.1.7/tests/test_semiring_pareto.py +110 -0
  101. py3plex-1.1.7/tests/test_sensitivity_executor.py +197 -0
  102. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_dsl.py +29 -0
  103. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_utils.py +7 -0
  104. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_defaults.py +18 -0
  105. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_runner.py +11 -12
  106. py3plex-1.1.7/tests/test_version_consistency.py +66 -0
  107. py3plex-1.1.7/tests/test_visualization_ricci_layout_helpers.py +60 -0
  108. py3plex-1.1.4/py3plex/embeddings/base.py +0 -103
  109. {py3plex-1.1.4 → py3plex-1.1.7}/LICENSE +0 -0
  110. {py3plex-1.1.4 → py3plex-1.1.7}/MANIFEST.in +0 -0
  111. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/__main__.py +0 -0
  112. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/_parallel.py +0 -0
  113. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/__init__.py +0 -0
  114. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/backend.py +0 -0
  115. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/closure.py +0 -0
  116. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/fixed_point.py +0 -0
  117. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/lift.py +0 -0
  118. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/paths.py +0 -0
  119. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/registry.py +0 -0
  120. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/semiring.py +0 -0
  121. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algebra/witness.py +0 -0
  122. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/__init__.py +0 -0
  123. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/advanced_random_generators.py +0 -0
  124. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/attribute_correlation.py +0 -0
  125. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality/__init__.py +0 -0
  126. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality/approx_betweenness.py +0 -0
  127. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality/approx_closeness.py +0 -0
  128. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality/approx_pagerank.py +0 -0
  129. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality/explain.py +0 -0
  130. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/centrality_toolkit.py +0 -0
  131. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_comparison.py +0 -0
  132. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/NoRC.py +0 -0
  133. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/__init__.py +0 -0
  134. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/auto_select.py +0 -0
  135. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/autocommunity.py +0 -0
  136. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/autocommunity_executor.py +0 -0
  137. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/budget.py +0 -0
  138. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/community_louvain.py +0 -0
  139. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/community_measures.py +0 -0
  140. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/community_ranking.py +0 -0
  141. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/community_wrapper.py +0 -0
  142. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/distributional.py +0 -0
  143. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/flow_hierarchy.py +0 -0
  144. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/__init__.py +0 -0
  145. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/conftest.py +0 -0
  146. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-bipartite.py +0 -0
  147. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-file-io.py +0 -0
  148. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-multiplex.py +0 -0
  149. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-networkx.py +0 -0
  150. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-simple.py +0 -0
  151. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram-expanded.py +0 -0
  152. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram.py +0 -0
  153. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/infomap.py +0 -0
  154. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/infomap/interfaces/python/setup.py +0 -0
  155. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/label_propagation.py +0 -0
  156. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/leiden_multilayer.py +0 -0
  157. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/leiden_uq.py +0 -0
  158. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/multilayer_benchmark.py +0 -0
  159. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/multilayer_modularity.py +0 -0
  160. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/multilayer_quality_metrics.py +0 -0
  161. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/node_ranking.py +0 -0
  162. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/runner.py +0 -0
  163. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/sbm_metrics.py +0 -0
  164. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/sbm_wrapper.py +0 -0
  165. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/spectral_multilayer.py +0 -0
  166. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/community_detection/successive_halving.py +0 -0
  167. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/curvature/__init__.py +0 -0
  168. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/curvature/ollivier_ricci_multilayer.py +0 -0
  169. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/general/__init__.py +0 -0
  170. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/general/benchmark_classification.py +0 -0
  171. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/general/walkers.py +0 -0
  172. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/graph_summarization.py +0 -0
  173. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/__init__.py +0 -0
  174. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/__main__.py +0 -0
  175. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/assets/builtin.n3 +0 -0
  176. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/__init__.py +0 -0
  177. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/converters.py +0 -0
  178. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/example.py +0 -0
  179. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/helpers.py +0 -0
  180. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/kb.py +0 -0
  181. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/load.py +0 -0
  182. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/predicate.py +0 -0
  183. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/rule.py +0 -0
  184. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/settings.py +0 -0
  185. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/core/term_parsers.py +0 -0
  186. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/learners/__init__.py +0 -0
  187. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/learners/bottomup.py +0 -0
  188. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/learners/learner.py +0 -0
  189. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/learners/optimal.py +0 -0
  190. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/stats/__init__.py +0 -0
  191. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/stats/adjustment.py +0 -0
  192. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/stats/scorefunctions.py +0 -0
  193. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/stats/significance.py +0 -0
  194. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/hedwig/stats/validate.py +0 -0
  195. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/layer_similarity.py +0 -0
  196. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/meta_flow_report.py +0 -0
  197. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multicentrality.py +0 -0
  198. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/__init__.py +0 -0
  199. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/centrality.py +0 -0
  200. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/entanglement.py +0 -0
  201. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/multirank.py +0 -0
  202. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/multixrank.py +0 -0
  203. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/supra_matrix_function_centrality.py +0 -0
  204. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_algorithms/versatility.py +0 -0
  205. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/multilayer_clustering.py +0 -0
  206. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/network_classification/PPR.py +0 -0
  207. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/network_classification/__init__.py +0 -0
  208. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/network_classification/label_propagation.py +0 -0
  209. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/node_ranking/__init__.py +0 -0
  210. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/node_ranking/node_ranking.py +0 -0
  211. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/requirements_registry.py +0 -0
  212. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/robustness_testing.py +0 -0
  213. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/routing/__init__.py +0 -0
  214. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/routing/multiplex_paths.py +0 -0
  215. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/__init__.py +0 -0
  216. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/conversions.py +0 -0
  217. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/diagnostics.py +0 -0
  218. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/inference_vi.py +0 -0
  219. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/model_selection.py +0 -0
  220. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/multilayer_sbm.py +0 -0
  221. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/objectives.py +0 -0
  222. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/uq.py +0 -0
  223. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sbm/utils.py +0 -0
  224. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/sir_multiplex.py +0 -0
  225. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistical_report.py +0 -0
  226. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/__init__.py +0 -0
  227. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/basic_statistics.py +0 -0
  228. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/bayesian_distances.py +0 -0
  229. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/bayesiantests.py +0 -0
  230. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/correlation_networks.py +0 -0
  231. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/critical_distances.py +0 -0
  232. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/enrichment_modules.py +0 -0
  233. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/multilayer_statistics.py +0 -0
  234. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/stats_comparison.py +0 -0
  235. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/statistics/topology.py +0 -0
  236. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/temporal/__init__.py +0 -0
  237. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/temporal/centrality.py +0 -0
  238. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/temporal/community.py +0 -0
  239. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/temporal_multiplex/__init__.py +0 -0
  240. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/algorithms/term_parsers/__init__.py +0 -0
  241. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/alignment/__init__.py +0 -0
  242. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/alignment/features.py +0 -0
  243. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/alignment/metrics.py +0 -0
  244. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/alignment/solvers.py +0 -0
  245. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/benchmarks/__init__.py +0 -0
  246. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/benchmarks/budget.py +0 -0
  247. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/benchmarks/runners.py +0 -0
  248. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/centrality/__init__.py +0 -0
  249. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/centrality/robustness.py +0 -0
  250. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/claims/__init__.py +0 -0
  251. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/claims/generator.py +0 -0
  252. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/claims/learner.py +0 -0
  253. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/claims/scorer.py +0 -0
  254. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/claims/types.py +0 -0
  255. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/comparison/__init__.py +0 -0
  256. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/comparison/executor.py +0 -0
  257. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/comparison/metrics.py +0 -0
  258. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/comparison/result.py +0 -0
  259. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/__init__.py +0 -0
  260. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/convert.py +0 -0
  261. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/__init__.py +0 -0
  262. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/dgl_converter.py +0 -0
  263. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/igraph_converter.py +0 -0
  264. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/networkx_converter.py +0 -0
  265. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/pyg_converter.py +0 -0
  266. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/converters/scipy_converter.py +0 -0
  267. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/equality.py +0 -0
  268. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/exceptions.py +0 -0
  269. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/ir.py +0 -0
  270. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/schema.py +0 -0
  271. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/compat/sidecar.py +0 -0
  272. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/__init__.py +0 -0
  273. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/contract.py +0 -0
  274. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/engine.py +0 -0
  275. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/failure_modes.py +0 -0
  276. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/predicates.py +0 -0
  277. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/contracts/result.py +0 -0
  278. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/HINMINE/IO.py +0 -0
  279. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/HINMINE/__init__.py +0 -0
  280. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/HINMINE/dataStructures.py +0 -0
  281. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/HINMINE/decomposition.py +0 -0
  282. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/__init__.py +0 -0
  283. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/converters.py +0 -0
  284. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/immutable.py +0 -0
  285. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/lazy_evaluation.py +0 -0
  286. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/nx_compat.py +0 -0
  287. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/parsers.py +0 -0
  288. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/schema_validation.py +0 -0
  289. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/supporting.py +0 -0
  290. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/temporal_multinet.py +0 -0
  291. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/core/types.py +0 -0
  292. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/__init__.py +0 -0
  293. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/claim_lang.py +0 -0
  294. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/ddmin.py +0 -0
  295. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/engine.py +0 -0
  296. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/types.py +0 -0
  297. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterexamples/witness.py +0 -0
  298. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/__init__.py +0 -0
  299. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/comparator.py +0 -0
  300. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/engine.py +0 -0
  301. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/presets.py +0 -0
  302. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/result.py +0 -0
  303. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/counterfactual/spec.py +0 -0
  304. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/datasets/__init__.py +0 -0
  305. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/datasets/_data/aarhus_cs.edges +0 -0
  306. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/datasets/_data/synthetic_multilayer.edges +0 -0
  307. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/datasets/_loaders.py +0 -0
  308. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/diagnostics/__init__.py +0 -0
  309. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/diagnostics/builders.py +0 -0
  310. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/diagnostics/codes.py +0 -0
  311. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/diagnostics/core.py +0 -0
  312. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/diagnostics/utils.py +0 -0
  313. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/algebra.py +0 -0
  314. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/attribution.py +0 -0
  315. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/benchmark.py +0 -0
  316. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/benchmark_result.py +0 -0
  317. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/cache.py +0 -0
  318. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/communities.py +0 -0
  319. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/community_uq.py +0 -0
  320. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/compositional_uq.py +0 -0
  321. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/context.py +0 -0
  322. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/executors/__init__.py +0 -0
  323. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/executors/benchmark_executor.py +0 -0
  324. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/explain.py +0 -0
  325. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/export.py +0 -0
  326. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/expressions.py +0 -0
  327. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/fastpath.py +0 -0
  328. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/layers.py +0 -0
  329. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/__init__.py +0 -0
  330. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/diagnostic.py +0 -0
  331. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/lint_context.py +0 -0
  332. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/__init__.py +0 -0
  333. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/base.py +0 -0
  334. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/dsl001_unknown_layer.py +0 -0
  335. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/dsl002_unknown_attribute.py +0 -0
  336. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/dsl101_type_mismatch.py +0 -0
  337. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/dsl201_unsatisfiable.py +0 -0
  338. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/dsl202_redundant.py +0 -0
  339. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/perf301_full_scan.py +0 -0
  340. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/rules/perf302_cross_layer.py +0 -0
  341. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/schema.py +0 -0
  342. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/type_resolver.py +0 -0
  343. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/lint/types.py +0 -0
  344. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/operator_registry.py +0 -0
  345. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/__init__.py +0 -0
  346. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/builder.py +0 -0
  347. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/compiler.py +0 -0
  348. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/engine.py +0 -0
  349. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/ir.py +0 -0
  350. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/patterns/result.py +0 -0
  351. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/planner.py +0 -0
  352. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/__init__.py +0 -0
  353. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/cache.py +0 -0
  354. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/cost.py +0 -0
  355. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/diff.py +0 -0
  356. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/distribution.py +0 -0
  357. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/executor.py +0 -0
  358. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/explain.py +0 -0
  359. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/program.py +0 -0
  360. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/program/rewrite.py +0 -0
  361. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/provenance.py +0 -0
  362. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/registry.py +0 -0
  363. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/selection_uq.py +0 -0
  364. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/serializer.py +0 -0
  365. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dsl/uq_algebra.py +0 -0
  366. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/__init__.py +0 -0
  367. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/_utils.py +0 -0
  368. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/ast.py +0 -0
  369. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/builder.py +0 -0
  370. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/compartmental.py +0 -0
  371. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/config.py +0 -0
  372. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/core.py +0 -0
  373. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/errors.py +0 -0
  374. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/executor.py +0 -0
  375. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/models.py +0 -0
  376. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/processes.py +0 -0
  377. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/registry.py +0 -0
  378. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/result.py +0 -0
  379. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/dynamics/serializer.py +0 -0
  380. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/embeddings/cache.py +0 -0
  381. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/embeddings/link_ops.py +0 -0
  382. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/embeddings/metapath2vec.py +0 -0
  383. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/embeddings/netmf.py +0 -0
  384. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/ergonomics.py +0 -0
  385. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/errors.py +0 -0
  386. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/exceptions.py +0 -0
  387. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/__init__.py +0 -0
  388. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/artifacts.py +0 -0
  389. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/cli.py +0 -0
  390. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/env.py +0 -0
  391. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/errors.py +0 -0
  392. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/model.py +0 -0
  393. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/runner.py +0 -0
  394. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/store.py +0 -0
  395. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/experiments/utils.py +0 -0
  396. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/fast_examples.py +0 -0
  397. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/__init__.py +0 -0
  398. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/api.py +0 -0
  399. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/canonical_format.py +0 -0
  400. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/converters.py +0 -0
  401. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/exceptions.py +0 -0
  402. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/formats/__init__.py +0 -0
  403. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/formats/arrow_format.py +0 -0
  404. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/formats/csv_format.py +0 -0
  405. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/formats/json_format.py +0 -0
  406. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/multinet_bridge.py +0 -0
  407. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/parquet_format.py +0 -0
  408. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/io/schema.py +0 -0
  409. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/lab/__init__.py +0 -0
  410. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/lab/base.py +0 -0
  411. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/logging_config.py +0 -0
  412. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/meta/__init__.py +0 -0
  413. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/meta/builder.py +0 -0
  414. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/meta/result.py +0 -0
  415. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/meta/stats.py +0 -0
  416. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/meta/utils.py +0 -0
  417. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/multinet/__init__.py +0 -0
  418. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/multinet/aggregation.py +0 -0
  419. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/nullmodels/__init__.py +0 -0
  420. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/nullmodels/executor.py +0 -0
  421. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/nullmodels/models.py +0 -0
  422. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/nullmodels/result.py +0 -0
  423. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/__init__.py +0 -0
  424. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/cost_model.py +0 -0
  425. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/logical_plan.py +0 -0
  426. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/optimizer.py +0 -0
  427. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/physical_plan.py +0 -0
  428. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/plan_nodes.py +0 -0
  429. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/optimizer/rules.py +0 -0
  430. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/__init__.py +0 -0
  431. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/cli.py +0 -0
  432. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/errors.py +0 -0
  433. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/executor.py +0 -0
  434. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/network.py +0 -0
  435. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/operators.py +0 -0
  436. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/readers.py +0 -0
  437. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/schema.py +0 -0
  438. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/spill.py +0 -0
  439. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/out_of_core/utils.py +0 -0
  440. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/paths/__init__.py +0 -0
  441. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/paths/algorithms.py +0 -0
  442. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/paths/executor.py +0 -0
  443. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/paths/result.py +0 -0
  444. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/plugins/__init__.py +0 -0
  445. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/plugins/base.py +0 -0
  446. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/plugins/examples.py +0 -0
  447. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/plugins/registry.py +0 -0
  448. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/profiling.py +0 -0
  449. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/provenance/__init__.py +0 -0
  450. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/provenance/bundle.py +0 -0
  451. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/provenance/capture.py +0 -0
  452. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/provenance/replay.py +0 -0
  453. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/provenance/schema.py +0 -0
  454. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/requirements.py +0 -0
  455. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/robustness/__init__.py +0 -0
  456. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/robustness/experiments.py +0 -0
  457. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/robustness/perturbations.py +0 -0
  458. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/runtime/__init__.py +0 -0
  459. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/runtime/capabilities.py +0 -0
  460. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/__init__.py +0 -0
  461. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/capabilities.py +0 -0
  462. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/community_registry.py +0 -0
  463. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/evaluate.py +0 -0
  464. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/metric_registry.py +0 -0
  465. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/selection/wins.py +0 -0
  466. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/__init__.py +0 -0
  467. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/core.py +0 -0
  468. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/engine.py +0 -0
  469. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/pareto.py +0 -0
  470. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/registry.py +0 -0
  471. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/semiring/types.py +0 -0
  472. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/sensitivity/__init__.py +0 -0
  473. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/sensitivity/executor.py +0 -0
  474. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/sensitivity/metrics.py +0 -0
  475. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/sensitivity/perturbations.py +0 -0
  476. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/sensitivity/types.py +0 -0
  477. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/stats/__init__.py +0 -0
  478. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/stats/provenance.py +0 -0
  479. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/stats/registry.py +0 -0
  480. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/stats/statvalue.py +0 -0
  481. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/stats/uncertainty.py +0 -0
  482. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/temporal_utils.py +0 -0
  483. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/temporal_utils_extended.py +0 -0
  484. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/temporal_view.py +0 -0
  485. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/__init__.py +0 -0
  486. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/bootstrap.py +0 -0
  487. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/ci_utils.py +0 -0
  488. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/community_ensemble.py +0 -0
  489. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/community_result.py +0 -0
  490. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/context.py +0 -0
  491. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/estimation.py +0 -0
  492. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/noise_models.py +0 -0
  493. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/null_models.py +0 -0
  494. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/partition.py +0 -0
  495. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/partition_metrics.py +0 -0
  496. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/partition_reducers.py +0 -0
  497. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/partition_types.py +0 -0
  498. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/partition_uq.py +0 -0
  499. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/plan.py +0 -0
  500. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/reducers/__init__.py +0 -0
  501. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/reducers/base.py +0 -0
  502. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/resampling_graph.py +0 -0
  503. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/selection_execution.py +0 -0
  504. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/selection_reducers.py +0 -0
  505. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/selection_types.py +0 -0
  506. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/selection_uq.py +0 -0
  507. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/stratification.py +0 -0
  508. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/uncertainty/types.py +0 -0
  509. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/utils.py +0 -0
  510. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/validation.py +0 -0
  511. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/__init__.py +0 -0
  512. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/benchmark_visualizations.py +0 -0
  513. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/bezier.py +0 -0
  514. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/colors.py +0 -0
  515. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/drawing_machinery.py +0 -0
  516. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/embedding_visualization/__init__.py +0 -0
  517. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/embedding_visualization/embedding_tools.py +0 -0
  518. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/embedding_visualization/embedding_visualization.py +0 -0
  519. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/fa2/__init__.py +0 -0
  520. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/fa2/fa2util.py +0 -0
  521. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/fa2/forceatlas2.py +0 -0
  522. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/layout_algorithms.py +0 -0
  523. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/multilayer.py +0 -0
  524. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/polyfit.py +0 -0
  525. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/pymnet_style.py +0 -0
  526. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/ricci_layout.py +0 -0
  527. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/ricci_multilayer_vis.py +0 -0
  528. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/visualization/sankey.py +0 -0
  529. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/workflows.py +0 -0
  530. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/wrappers/__init__.py +0 -0
  531. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/wrappers/benchmark_nodes.py +0 -0
  532. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/wrappers/r_interop.py +0 -0
  533. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex/wrappers/train_node2vec_embedding.py +0 -0
  534. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/dependency_links.txt +0 -0
  535. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/entry_points.txt +0 -0
  536. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/not-zip-safe +0 -0
  537. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex.egg-info/top_level.txt +0 -0
  538. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/errors.py +0 -0
  539. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/registry.py +0 -0
  540. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/safe_paths.py +0 -0
  541. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/schemas.py +0 -0
  542. {py3plex-1.1.4 → py3plex-1.1.7}/py3plex_mcp/server.py +0 -0
  543. {py3plex-1.1.4 → py3plex-1.1.7}/setup.cfg +0 -0
  544. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_advanced_metrics_properties.py +0 -0
  545. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_aggregation.py +0 -0
  546. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_backend.py +0 -0
  547. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_core.py +0 -0
  548. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_fixed_point.py +0 -0
  549. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_paths.py +0 -0
  550. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_registry.py +0 -0
  551. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algebra_witness.py +0 -0
  552. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithm_properties.py +0 -0
  553. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithms_attribute_correlation.py +0 -0
  554. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithms_correlation_networks.py +0 -0
  555. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithms_init.py +0 -0
  556. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithms_random_generators.py +0 -0
  557. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_algorithms_statistics_bayesian_distances.py +0 -0
  558. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_alignment.py +0 -0
  559. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_alignment_contracts.py +0 -0
  560. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_alignment_correctness_additional.py +0 -0
  561. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_approximate_centrality.py +0 -0
  562. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ast_roundtrip.py +0 -0
  563. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ast_roundtrip_integration.py +0 -0
  564. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_attribute_correlation.py +0 -0
  565. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_attribute_correlation_contracts.py +0 -0
  566. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_auto_community.py +0 -0
  567. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_autocommunity_benchmarks.py +0 -0
  568. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_autocommunity_executor.py +0 -0
  569. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_autocommunity_meta.py +0 -0
  570. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_autocommunity_successive_halving.py +0 -0
  571. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_bayesian_distances.py +0 -0
  572. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_bench_aggregation_unit.py +0 -0
  573. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmark_budget_fairness.py +0 -0
  574. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmark_dsl_basic.py +0 -0
  575. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmark_integration.py +0 -0
  576. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmark_multiplex_centrality.py +0 -0
  577. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmark_time.py +0 -0
  578. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmarks_budget.py +0 -0
  579. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_benchmarks_init.py +0 -0
  580. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_capabilities_basic.py +0 -0
  581. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_capabilities_optional_missing.py +0 -0
  582. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_explain.py +0 -0
  583. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_explain_integration.py +0 -0
  584. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_robustness.py +0 -0
  585. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_robustness_oracles.py +0 -0
  586. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_uncertainty.py +0 -0
  587. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_centrality_weight_handling.py +0 -0
  588. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_check_api_consistency.py +0 -0
  589. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_check_doc_coverage.py +0 -0
  590. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_check_type_coverage.py +0 -0
  591. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_claim_learning.py +0 -0
  592. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_claims_types.py +0 -0
  593. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_cli_piping.py +0 -0
  594. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_clustering_multilayer.py +0 -0
  595. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_code_improvements.py +0 -0
  596. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_community_detection_modules.py +0 -0
  597. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_community_distribution.py +0 -0
  598. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_community_measures.py +0 -0
  599. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison.py +0 -0
  600. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison_executor.py +0 -0
  601. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison_metrics.py +0 -0
  602. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison_metrics_additional.py +0 -0
  603. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison_result.py +0 -0
  604. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_comparison_uninitialized_and_resistance_oracles.py +0 -0
  605. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_compat_exceptions.py +0 -0
  606. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_compat_roundtrip.py +0 -0
  607. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_config_api.py +0 -0
  608. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_config_benchmark.py +0 -0
  609. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_contracts.py +0 -0
  610. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_contracts_basic.py +0 -0
  611. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_contracts_extended.py +0 -0
  612. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_contracts_failure_modes.py +0 -0
  613. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_contracts_integration.py +0 -0
  614. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_functionality.py +0 -0
  615. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_immutable.py +0 -0
  616. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_lazy_evaluation.py +0 -0
  617. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_multinet_and_parsers.py +0 -0
  618. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_multinet_correctness.py +0 -0
  619. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_multiplex_edges.py +0 -0
  620. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_schema_validation.py +0 -0
  621. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_core_supporting.py +0 -0
  622. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_correlation_networks.py +0 -0
  623. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_counterexamples.py +0 -0
  624. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_counterexamples_properties.py +0 -0
  625. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_counterfactual.py +0 -0
  626. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_counterfactual_presets.py +0 -0
  627. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_coverage_grouping.py +0 -0
  628. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_create_mosaic_banner.py +0 -0
  629. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_create_showcase_flow.py +0 -0
  630. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_crosshair_pure_functions.py +0 -0
  631. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_data_files_presence.py +0 -0
  632. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_datasets.py +0 -0
  633. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_datasets_contracts.py +0 -0
  634. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_datasets_oracles.py +0 -0
  635. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_degenerate_networks.py +0 -0
  636. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_determinism_randomness.py +0 -0
  637. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_diagnostics.py +0 -0
  638. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_diagnostics_utils.py +0 -0
  639. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_doctests.py +0 -0
  640. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dplyr_integration.py +0 -0
  641. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl.py +0 -0
  642. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_aggregation_enhancements.py +0 -0
  643. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_ast_equivalence.py +0 -0
  644. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_auto_community.py +0 -0
  645. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_communities.py +0 -0
  646. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_community_uq_integration.py +0 -0
  647. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_compact_compute.py +0 -0
  648. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_compositional_uq.py +0 -0
  649. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_condition_semantics.py +0 -0
  650. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_d_factory.py +0 -0
  651. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_documentation_examples.py +0 -0
  652. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_dplyr_style.py +0 -0
  653. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_dynamics_integration.py +0 -0
  654. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_edge_queries.py +0 -0
  655. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_enhancements.py +0 -0
  656. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_ergonomics.py +0 -0
  657. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_errors.py +0 -0
  658. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_errors_extended.py +0 -0
  659. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_executor_additional.py +0 -0
  660. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_explain.py +0 -0
  661. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_export.py +0 -0
  662. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_expressions.py +0 -0
  663. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_extensions.py +0 -0
  664. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_graphops_equivalence.py +0 -0
  665. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_grouping_coverage.py +0 -0
  666. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_interactive.py +0 -0
  667. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_joins.py +0 -0
  668. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_layer_selection.py +0 -0
  669. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_layer_set_algebra.py +0 -0
  670. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_legacy_edges.py +0 -0
  671. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_lint.py +0 -0
  672. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_operators.py +0 -0
  673. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_patterns.py +0 -0
  674. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_patterns_quick_reference.py +0 -0
  675. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_pipes.py +0 -0
  676. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_program_rewrite.py +0 -0
  677. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_program_types.py +0 -0
  678. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_progress_logging.py +0 -0
  679. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_properties.py +0 -0
  680. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_provenance.py +0 -0
  681. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_query_optimization.py +0 -0
  682. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_selection_fastpath.py +0 -0
  683. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_semiring_integration.py +0 -0
  684. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_serializer.py +0 -0
  685. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_smart_defaults.py +0 -0
  686. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_temporal_range_execution.py +0 -0
  687. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_uq_ergonomics.py +0 -0
  688. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_uq_propagation.py +0 -0
  689. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dsl_zoo_features.py +0 -0
  690. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics.py +0 -0
  691. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_algorithm_contracts.py +0 -0
  692. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_config_and_results_correctness.py +0 -0
  693. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_conservation.py +0 -0
  694. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_core.py +0 -0
  695. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_executor_edge_cases.py +0 -0
  696. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_parallel_determinism.py +0 -0
  697. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_reference_runs.py +0 -0
  698. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_uq_integration.py +0 -0
  699. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_dynamics_utils.py +0 -0
  700. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_edge_cases.py +0 -0
  701. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_edgelist_format.py +0 -0
  702. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ergonomic_helpers.py +0 -0
  703. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ergonomics.py +0 -0
  704. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_errors.py +0 -0
  705. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_CBSSD.py +0 -0
  706. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_community_detection.py +0 -0
  707. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_decomposition_and_classification.py +0 -0
  708. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_decomposition_ground_truth.py +0 -0
  709. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_dsl_builder_api.py +0 -0
  710. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_dynamics_core_examples.py +0 -0
  711. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_embedding_construction.py +0 -0
  712. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_embedding_visualization.py +0 -0
  713. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_incidence_gadget_encoding.py +0 -0
  714. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_inverse_network.py +0 -0
  715. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_layer_extraction.py +0 -0
  716. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_manipulation.py +0 -0
  717. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_multilayer_vectorized_aggregation.py +0 -0
  718. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_multiplex_aggregate.py +0 -0
  719. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_multiplex_dynamics.py +0 -0
  720. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_n2v_embedding.py +0 -0
  721. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_network_decomposition.py +0 -0
  722. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_network_decomposition_meta_paths.py +0 -0
  723. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_numeric_encoding.py +0 -0
  724. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_pattern_matching.py +0 -0
  725. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_example_ppr.py +0 -0
  726. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_exception_taxonomy.py +0 -0
  727. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_exceptions.py +0 -0
  728. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_experiments.py +0 -0
  729. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_explain_attribution.py +0 -0
  730. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_fast_examples.py +0 -0
  731. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_flagship_progress_demo.py +0 -0
  732. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_flow_hierarchy.py +0 -0
  733. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_fuzzing_properties.py +0 -0
  734. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_generate_all_outputs.py +0 -0
  735. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_generate_quickstart_outputs.py +0 -0
  736. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_generate_visualization_images.py +0 -0
  737. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_golden_toy_examples.py +0 -0
  738. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_graph_ops.py +0 -0
  739. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_graph_summarization.py +0 -0
  740. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_hedwig_adjustment.py +0 -0
  741. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_hedwig_significance.py +0 -0
  742. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_improved_errors.py +0 -0
  743. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_incidence_gadget_encoding.py +0 -0
  744. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_infomap_fix.py +0 -0
  745. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_interlayer_links_fix.py +0 -0
  746. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_api_edge_cases.py +0 -0
  747. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_contracts_additional.py +0 -0
  748. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_converters.py +0 -0
  749. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_exceptions.py +0 -0
  750. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_integration.py +0 -0
  751. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_io_schema.py +0 -0
  752. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_issue_19_fix.py +0 -0
  753. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_lab.py +0 -0
  754. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_lab_additional.py +0 -0
  755. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_lab_correctness.py +0 -0
  756. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_label_propagation.py +0 -0
  757. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_layer_extraction_fix.py +0 -0
  758. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_layer_similarity.py +0 -0
  759. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_layout_algorithms.py +0 -0
  760. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_lazy_evaluation.py +0 -0
  761. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_leiden_multilayer.py +0 -0
  762. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_logging_conversion.py +0 -0
  763. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_main_module.py +0 -0
  764. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_master_regulators_example.py +0 -0
  765. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_math_invariants.py +0 -0
  766. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_mcp_server.py +0 -0
  767. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_meta_analysis.py +0 -0
  768. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_meta_flow_report.py +0 -0
  769. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_metamorphic.py +0 -0
  770. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_metapath2vec.py +0 -0
  771. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_monoplex_nx_wrapper.py +0 -0
  772. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_mpc.py +0 -0
  773. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_centrality.py +0 -0
  774. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_clustering_coefficients.py +0 -0
  775. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_cornercases.py +0 -0
  776. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_edge_fix.py +0 -0
  777. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_integration.py +0 -0
  778. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_leiden_uq.py +0 -0
  779. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_modularity.py +0 -0
  780. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_quality_metrics.py +0 -0
  781. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multilayer_statistics.py +0 -0
  782. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multinet_aggregation.py +0 -0
  783. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multinet_aggregation_additional.py +0 -0
  784. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multiplex_layer_interop.py +0 -0
  785. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multiplex_participation.py +0 -0
  786. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multiplex_properties.py +0 -0
  787. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multirank.py +0 -0
  788. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_multixrank.py +0 -0
  789. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_network_conversion.py +0 -0
  790. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_network_version.py +0 -0
  791. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_networkx_compatibility.py +0 -0
  792. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_new_algorithms.py +0 -0
  793. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_new_multilayer_metrics.py +0 -0
  794. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_node_edge_parity.py +0 -0
  795. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_node_ranking_comprehensive.py +0 -0
  796. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_norc.py +0 -0
  797. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_nullmodel_sanity.py +0 -0
  798. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_nullmodels.py +0 -0
  799. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_nullmodels_contracts.py +0 -0
  800. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_nx_compat_extended.py +0 -0
  801. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ollivier_ricci_multilayer.py +0 -0
  802. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_out_of_core.py +0 -0
  803. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_parallel.py +0 -0
  804. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_parallel_execution.py +0 -0
  805. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_parsers_comprehensive.py +0 -0
  806. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_parsers_coverage.py +0 -0
  807. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_partition_uq.py +0 -0
  808. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_partition_uq_integration.py +0 -0
  809. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_paths.py +0 -0
  810. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_paths_additional.py +0 -0
  811. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_paths_contracts.py +0 -0
  812. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_paths_executor.py +0 -0
  813. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_paths_result.py +0 -0
  814. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_performance_core.py +0 -0
  815. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_pipeline.py +0 -0
  816. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_plugin_examples.py +0 -0
  817. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_plugins.py +0 -0
  818. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_profiling.py +0 -0
  819. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_program.py +0 -0
  820. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_program_cost_executor.py +0 -0
  821. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_properties.py +0 -0
  822. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_provenance_canonical.py +0 -0
  823. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_provenance_schema.py +0 -0
  824. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_query_algebra.py +0 -0
  825. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_query_equivalence.py +0 -0
  826. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_r_interop.py +0 -0
  827. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_random_generators_additional.py +0 -0
  828. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_random_generators_extended.py +0 -0
  829. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_random_walkers.py +0 -0
  830. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_random_walks.py +0 -0
  831. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_readme_flagship_example.py +0 -0
  832. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_requirements.py +0 -0
  833. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_result_explain_debug.py +0 -0
  834. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_ricci_visualization.py +0 -0
  835. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_robustness.py +0 -0
  836. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_robustness_additional.py +0 -0
  837. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_robustness_testing.py +0 -0
  838. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_root_conftest.py +0 -0
  839. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_run_quickstart_snippets.py +0 -0
  840. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sankey_visualization.py +0 -0
  841. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sbm_generator.py +0 -0
  842. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sbm_metrics.py +0 -0
  843. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_schema_and_immutable.py +0 -0
  844. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_seeding.py +0 -0
  845. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_selection_uq.py +0 -0
  846. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_selection_uq_integration.py +0 -0
  847. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_semiring_negative_cases.py +0 -0
  848. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_semiring_registry.py +0 -0
  849. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_semiring_types.py +0 -0
  850. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_semiring_verification.py +0 -0
  851. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sidecar.py +0 -0
  852. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sir_epidemic.py +0 -0
  853. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_sir_multiplex.py +0 -0
  854. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_spectral_multilayer.py +0 -0
  855. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_statistical_report.py +0 -0
  856. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_comparison.py +0 -0
  857. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_core.py +0 -0
  858. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_edge_cases.py +0 -0
  859. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_provenance.py +0 -0
  860. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_provenance_dataclass.py +0 -0
  861. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_registry.py +0 -0
  862. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_scalar_uncertainty.py +0 -0
  863. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stats_verify.py +0 -0
  864. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_stratified_uq.py +0 -0
  865. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_streaming_topk.py +0 -0
  866. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_successive_halving.py +0 -0
  867. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_supporting_extended.py +0 -0
  868. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_supra_matrix_function_centrality.py +0 -0
  869. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal.py +0 -0
  870. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_algorithms.py +0 -0
  871. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_builder.py +0 -0
  872. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_duration_parsing.py +0 -0
  873. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_multinet.py +0 -0
  874. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_utils_extended.py +0 -0
  875. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_view.py +0 -0
  876. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_temporal_windowed_queries.py +0 -0
  877. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_tensor_representation.py +0 -0
  878. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_tutorial_10min.py +0 -0
  879. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty.py +0 -0
  880. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_additional.py +0 -0
  881. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_builder_integration.py +0 -0
  882. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_dsl_integration.py +0 -0
  883. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_engines.py +0 -0
  884. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uncertainty_oracles.py +0 -0
  885. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uq_algebra.py +0 -0
  886. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uq_integration.py +0 -0
  887. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uq_resolution.py +0 -0
  888. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_uq_spine.py +0 -0
  889. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_user_journey_simulation.py +0 -0
  890. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_utils.py +0 -0
  891. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_utils_coverage.py +0 -0
  892. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_utils_extended.py +0 -0
  893. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_utils_search_paths.py +0 -0
  894. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_validation.py +0 -0
  895. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_validation_module.py +0 -0
  896. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_api_differential.py +0 -0
  897. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_centrality.py +0 -0
  898. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_communities.py +0 -0
  899. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_determinism_parallelism.py +0 -0
  900. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_dsl_equivalence.py +0 -0
  901. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_metamorphic_harness.py +0 -0
  902. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_verification_provenance_oracles.py +0 -0
  903. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_versatility.py +0 -0
  904. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_benchmark.py +0 -0
  905. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_bezier.py +0 -0
  906. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_colors.py +0 -0
  907. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_imports.py +0 -0
  908. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_layouts.py +0 -0
  909. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_multilayer_additional.py +0 -0
  910. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_polyfit.py +0 -0
  911. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualization_supra_heatmap.py +0 -0
  912. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_visualize_matrix_fix.py +0 -0
  913. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_workflows.py +0 -0
  914. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_wrappers_additional.py +0 -0
  915. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_wrappers_benchmark_nodes.py +0 -0
  916. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_wrappers_node2vec.py +0 -0
  917. {py3plex-1.1.4 → py3plex-1.1.7}/tests/test_wrappers_r_interop.py +0 -0
  918. {py3plex-1.1.4 → py3plex-1.1.7}/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.7
4
4
  Summary: A Multilayer network analysis python3 library
5
5
  Author-email: Blaž Škrlj <blaz.skrlj@ijs.si>
6
6
  License: MIT
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.9
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
21
22
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
22
23
  Classifier: Topic :: Scientific/Engineering :: Visualization
23
24
  Requires-Python: >=3.8
@@ -27,7 +28,6 @@ Requires-Dist: numpy>=1.19.0
27
28
  Requires-Dist: rdflib>=6.0.0
28
29
  Requires-Dist: scipy>=1.5.0
29
30
  Requires-Dist: networkx>=2.5
30
- Requires-Dist: cython>=0.29.0
31
31
  Requires-Dist: tqdm>=4.40.0
32
32
  Requires-Dist: matplotlib>=3.3.0
33
33
  Requires-Dist: gensim>=4.0.0
@@ -86,6 +86,15 @@ Provides-Extra: dgl-compat
86
86
  Requires-Dist: dgl>=0.9.0; extra == "dgl-compat"
87
87
  Provides-Extra: mcp
88
88
  Requires-Dist: mcp>=0.9.0; python_version >= "3.10" and extra == "mcp"
89
+ Provides-Extra: optional
90
+ Requires-Dist: infomap>=2.0.0; extra == "optional"
91
+ Requires-Dist: python-louvain>=0.16; extra == "optional"
92
+ Requires-Dist: cdlib>=0.3.0; extra == "optional"
93
+ Requires-Dist: plotly>=5.0.0; extra == "optional"
94
+ Requires-Dist: python-igraph>=0.10.0; extra == "optional"
95
+ Requires-Dist: pyyaml>=5.1; extra == "optional"
96
+ Requires-Dist: pyarrow>=10.0.0; extra == "optional"
97
+ Requires-Dist: mcp>=0.9.0; python_version >= "3.10" and extra == "optional"
89
98
  Dynamic: license-file
90
99
 
91
100
 
@@ -100,10 +109,11 @@ Dynamic: license-file
100
109
  [![Formal Verification](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
101
110
  [![Fuzzing](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml/badge.svg)](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
102
111
  [![PyPI version](https://img.shields.io/pypi/v/py3plex.svg)](https://pypi.org/project/py3plex/)
112
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/py3plex)](https://pypistats.org/packages/py3plex)
103
113
  ![CLI Tool](https://img.shields.io/badge/CLI%20Tool-Available-brightgreen)
104
114
  ![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)
115
+ ![Lines of Code](https://img.shields.io/badge/lines-211.4K-blue)
116
+ ![Test Count](https://img.shields.io/badge/tests-9.1K-blue)
107
117
 
108
118
  *Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
109
119
  some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
@@ -163,6 +173,14 @@ print(df[["id", "layer", "community_id",
163
173
  "betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
164
174
  ```
165
175
 
176
+ ### Safe chaining order (DSL v2)
177
+
178
+ Use a strict two-phase flow:
179
+
180
+ 1. **Build query** on `Q...` (`.where()`, `.compute()`, `.order_by()`, `.per_layer()`, `.coverage()`, ...)
181
+ 2. **Execute once** with `.execute(network)`
182
+ 3. **Handle results** on `QueryResult` (`.to_pandas()`, `.group_summary()`, `.to_json()`, ...)
183
+
166
184
  **Example output:**
167
185
  ```
168
186
  id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
@@ -226,8 +244,38 @@ pip install py3plex[viz]
226
244
 
227
245
  # All optional features
228
246
  pip install py3plex[mcp,algos,viz]
247
+
248
+ # Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
249
+ pip install py3plex[optional]
250
+ ```
251
+
252
+ ### Contributing (First PR Quick Path)
253
+
254
+ If this is your first contribution, use this sequence:
255
+
256
+ ```bash
257
+ # 1) Create local dev environment and install package
258
+ make setup
259
+ make dev-install
260
+
261
+ # 2) Run formatting and checks before opening a PR
262
+ make format
263
+ make lint
264
+ make test
229
265
  ```
230
266
 
267
+ Helpful commands:
268
+
269
+ ```bash
270
+ make help # List all project commands
271
+ make ci # Run lint + tests in CI-style order
272
+ ```
273
+
274
+ Safety notes for contributors:
275
+ - Keep changes focused and add tests next to the feature you modify.
276
+ - Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
277
+ - Prefer running targeted tests first, then broader checks before opening a PR.
278
+
231
279
  ### MCP Integration (AI Agents)
232
280
 
233
281
  py3plex provides a Model Context Protocol (MCP) server for integration with AI coding assistants:
@@ -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-211.4K-blue)
17
+ ![Test Count](https://img.shields.io/badge/tests-9.1K-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.
@@ -73,6 +74,14 @@ print(df[["id", "layer", "community_id",
73
74
  "betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
74
75
  ```
75
76
 
77
+ ### Safe chaining order (DSL v2)
78
+
79
+ Use a strict two-phase flow:
80
+
81
+ 1. **Build query** on `Q...` (`.where()`, `.compute()`, `.order_by()`, `.per_layer()`, `.coverage()`, ...)
82
+ 2. **Execute once** with `.execute(network)`
83
+ 3. **Handle results** on `QueryResult` (`.to_pandas()`, `.group_summary()`, `.to_json()`, ...)
84
+
76
85
  **Example output:**
77
86
  ```
78
87
  id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
@@ -136,8 +145,38 @@ pip install py3plex[viz]
136
145
 
137
146
  # All optional features
138
147
  pip install py3plex[mcp,algos,viz]
148
+
149
+ # Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
150
+ pip install py3plex[optional]
151
+ ```
152
+
153
+ ### Contributing (First PR Quick Path)
154
+
155
+ If this is your first contribution, use this sequence:
156
+
157
+ ```bash
158
+ # 1) Create local dev environment and install package
159
+ make setup
160
+ make dev-install
161
+
162
+ # 2) Run formatting and checks before opening a PR
163
+ make format
164
+ make lint
165
+ make test
139
166
  ```
140
167
 
168
+ Helpful commands:
169
+
170
+ ```bash
171
+ make help # List all project commands
172
+ make ci # Run lint + tests in CI-style order
173
+ ```
174
+
175
+ Safety notes for contributors:
176
+ - Keep changes focused and add tests next to the feature you modify.
177
+ - Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
178
+ - Prefer running targeted tests first, then broader checks before opening a PR.
179
+
141
180
  ### MCP Integration (AI Agents)
142
181
 
143
182
  py3plex provides a Model Context Protocol (MCP) server for integration with AI coding assistants:
@@ -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.7"
55
+ __api_version__ = "1.1.7"
56
56
 
57
57
  from py3plex.core.multinet import multi_layer_network
58
58
  from py3plex.core.types import (
@@ -123,6 +123,7 @@ from py3plex.profiling import (
123
123
  profile_performance,
124
124
  timed_section,
125
125
  )
126
+ import py3plex.config as config
126
127
 
127
128
  # Plugin system - import for easy access
128
129
  from py3plex.plugins import (
@@ -146,6 +147,7 @@ from py3plex.pipeline import (
146
147
  ComputeStats,
147
148
  FilterNodes,
148
149
  SaveNetwork,
150
+ NodeEmbedding,
149
151
  )
150
152
 
151
153
  # Config-driven workflows
@@ -162,7 +164,6 @@ from py3plex.datasets import (
162
164
  make_random_multiplex,
163
165
  make_social_network,
164
166
  )
165
-
166
167
  # Dynamics module for simulating dynamical processes
167
168
  from py3plex.dynamics import (
168
169
  D,
@@ -197,6 +198,44 @@ from py3plex.uncertainty import (
197
198
  uncertainty_enabled,
198
199
  estimate_uncertainty,
199
200
  )
201
+ from py3plex.agent import (
202
+ load_network_from_path,
203
+ top_hubs_by_layer,
204
+ uncertainty_centrality,
205
+ community_detection_with_uq,
206
+ temporal_slice,
207
+ reproducible_export_bundle,
208
+ compare_networks,
209
+ summarize_result,
210
+ )
211
+
212
+
213
+ def save_to_arrow(network, path, **kwargs):
214
+ """Lazy top-level alias for :func:`py3plex.io.save_to_arrow`."""
215
+ from py3plex.io import save_to_arrow as _save_to_arrow
216
+
217
+ return _save_to_arrow(network, path, **kwargs)
218
+
219
+
220
+ def load_from_arrow(path, as_multinet=True, **kwargs):
221
+ """Lazy top-level alias for :func:`py3plex.io.load_from_arrow`."""
222
+ from py3plex.io import load_from_arrow as _load_from_arrow
223
+
224
+ return _load_from_arrow(path, as_multinet=as_multinet, **kwargs)
225
+
226
+
227
+ def save_network_to_parquet(network, path, **kwargs):
228
+ """Lazy top-level alias for :func:`py3plex.io.save_network_to_parquet`."""
229
+ from py3plex.io import save_network_to_parquet as _save_network_to_parquet
230
+
231
+ return _save_network_to_parquet(network, path, **kwargs)
232
+
233
+
234
+ def load_network_from_parquet(path, **kwargs):
235
+ """Lazy top-level alias for :func:`py3plex.io.load_network_from_parquet`."""
236
+ from py3plex.io import load_network_from_parquet as _load_network_from_parquet
237
+
238
+ return _load_network_from_parquet(path, **kwargs)
200
239
 
201
240
  __all__ = [
202
241
  # Version info
@@ -284,6 +323,7 @@ __all__ = [
284
323
  "ComputeStats",
285
324
  "FilterNodes",
286
325
  "SaveNetwork",
326
+ "NodeEmbedding",
287
327
  # Workflows
288
328
  "WorkflowConfig",
289
329
  "WorkflowRunner",
@@ -297,6 +337,13 @@ __all__ = [
297
337
  "make_social_network",
298
338
  "list_datasets",
299
339
  "get_data_dir",
340
+ # Config module
341
+ "config",
342
+ # I/O convenience functions
343
+ "save_to_arrow",
344
+ "load_from_arrow",
345
+ "save_network_to_parquet",
346
+ "load_network_from_parquet",
300
347
  # Dynamics (simulation)
301
348
  "D",
302
349
  "SimulationBuilder",
@@ -324,4 +371,13 @@ __all__ = [
324
371
  "capabilities",
325
372
  "capabilities_flat",
326
373
  "capabilities_fingerprint",
374
+ # Agent-facing stable API
375
+ "load_network_from_path",
376
+ "top_hubs_by_layer",
377
+ "uncertainty_centrality",
378
+ "community_detection_with_uq",
379
+ "temporal_slice",
380
+ "reproducible_export_bundle",
381
+ "compare_networks",
382
+ "summarize_result",
327
383
  ]
@@ -0,0 +1,216 @@
1
+ """Stable machine-facing agent API for py3plex workflows."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from py3plex.core import multinet
7
+ from py3plex.dsl.builder import L, Q
8
+ from py3plex.dsl.result import QueryResult
9
+
10
+
11
+ def _extract_replay_payload(result: QueryResult) -> Dict[str, Any]:
12
+ prov = result.provenance or {}
13
+ query_info = prov.get("query", {}) if isinstance(prov, dict) else {}
14
+ return {
15
+ "is_replayable": result.is_replayable,
16
+ "seed": (prov.get("randomness", {}) or {}).get("seed")
17
+ if isinstance(prov, dict)
18
+ else None,
19
+ "ast_hash": query_info.get("ast_hash"),
20
+ "network_fingerprint": prov.get("network_fingerprint") if isinstance(prov, dict) else None,
21
+ "network_version": prov.get("network_version") if isinstance(prov, dict) else None,
22
+ }
23
+
24
+
25
+ def _as_agent_response(
26
+ *,
27
+ result: QueryResult,
28
+ assumptions: Optional[List[str]] = None,
29
+ warnings: Optional[List[Dict[str, Any]]] = None,
30
+ export_paths: Optional[List[str]] = None,
31
+ ) -> Dict[str, Any]:
32
+ return {
33
+ "status": "ok",
34
+ "assumptions": assumptions or [],
35
+ "warnings": warnings if warnings is not None else result.meta.get("warnings", []),
36
+ "result": result.canonical_export_dict(),
37
+ "provenance": result.meta.get("provenance", {}),
38
+ "replay": _extract_replay_payload(result),
39
+ "export_paths": export_paths or [],
40
+ }
41
+
42
+
43
+ def load_network_from_path(
44
+ path: str, *, input_type: str = "edgelist", directed: bool = False
45
+ ) -> Dict[str, Any]:
46
+ """Load a network from path and return stable machine-facing payload."""
47
+ net = multinet.multi_layer_network(directed=directed)
48
+ net.load_network(path, input_type=input_type)
49
+ layers = list(net.get_layers())
50
+ return {
51
+ "status": "ok",
52
+ "assumptions": ["Network path is trusted and readable."],
53
+ "warnings": [],
54
+ "result": {
55
+ "network": net,
56
+ "network_stats": {
57
+ "node_replicas": len(list(net.get_nodes())),
58
+ "edges": len(list(net.get_edges())),
59
+ "layers": layers,
60
+ "layer_count": len(layers),
61
+ },
62
+ },
63
+ "provenance": {"source_path": path, "input_type": input_type, "directed": directed},
64
+ "replay": {},
65
+ "export_paths": [],
66
+ }
67
+
68
+
69
+ def top_hubs_by_layer(
70
+ network: Any,
71
+ *,
72
+ top_k: int = 10,
73
+ measure: str = "degree",
74
+ seed: Optional[int] = 42,
75
+ ) -> Dict[str, Any]:
76
+ """Compute per-layer hubs with reproducible defaults."""
77
+ query = (
78
+ Q.nodes()
79
+ .from_layers(L["*"])
80
+ .compute(measure, kind="aggregate")
81
+ .per_layer()
82
+ .top_k(top_k, measure)
83
+ .provenance(mode="replayable", seed=seed)
84
+ )
85
+ result = query.execute(network)
86
+ return _as_agent_response(
87
+ result=result,
88
+ assumptions=[
89
+ "Top-k is applied independently per layer.",
90
+ "Degree kind defaults to aggregate unless explicitly overridden.",
91
+ ],
92
+ )
93
+
94
+
95
+ def uncertainty_centrality(
96
+ network: Any,
97
+ *,
98
+ measures: Optional[List[str]] = None,
99
+ method: str = "bootstrap",
100
+ n_samples: int = 50,
101
+ ci: float = 0.95,
102
+ seed: Optional[int] = 42,
103
+ ) -> Dict[str, Any]:
104
+ """Compute uncertainty-aware centrality with structured output."""
105
+ measures = measures or ["pagerank"]
106
+ query = (
107
+ Q.nodes()
108
+ .compute(*measures)
109
+ .uq(method=method, n_samples=n_samples, ci=ci, seed=seed)
110
+ .provenance(mode="replayable", seed=seed)
111
+ )
112
+ result = query.execute(network)
113
+ return _as_agent_response(
114
+ result=result,
115
+ assumptions=["Uncertainty summaries use canonical mean/std/CI schema."],
116
+ )
117
+
118
+
119
+ def community_detection_with_uq(
120
+ network: Any,
121
+ *,
122
+ method: str = "leiden",
123
+ n_samples: int = 20,
124
+ seed: Optional[int] = 42,
125
+ ) -> Dict[str, Any]:
126
+ """Run reproducible community detection with UQ."""
127
+ query = (
128
+ Q.nodes()
129
+ .community(method=method, random_state=seed)
130
+ .uq(method="seed", n_samples=n_samples, seed=seed)
131
+ .provenance(mode="replayable", seed=seed)
132
+ )
133
+ result = query.execute(network)
134
+ return _as_agent_response(
135
+ result=result,
136
+ assumptions=["Community uncertainty is estimated via seed ensemble."],
137
+ )
138
+
139
+
140
+ def temporal_slice(
141
+ network: Any,
142
+ *,
143
+ t_start: Optional[float] = None,
144
+ t_end: Optional[float] = None,
145
+ at: Optional[float] = None,
146
+ ) -> Dict[str, Any]:
147
+ """Run temporal slice query with structured result contract."""
148
+ query = Q.edges()
149
+ assumptions = []
150
+ if at is not None:
151
+ query = query.at(float(at))
152
+ assumptions.append("Temporal query uses point-in-time snapshot semantics.")
153
+ else:
154
+ if t_start is None or t_end is None:
155
+ raise ValueError("Provide either 'at' or both 't_start' and 't_end'.")
156
+ query = query.during(float(t_start), float(t_end))
157
+ assumptions.append("Temporal query uses inclusive time window semantics.")
158
+ result = query.execute(network)
159
+ return _as_agent_response(result=result, assumptions=assumptions)
160
+
161
+
162
+ def reproducible_export_bundle(
163
+ result: QueryResult, *, path: str, compress: bool = True
164
+ ) -> Dict[str, Any]:
165
+ """Export replay bundle and return stable path metadata."""
166
+ out_path = str(Path(path))
167
+ result.export_bundle(out_path, compress=compress)
168
+ return _as_agent_response(
169
+ result=result,
170
+ assumptions=["Bundle includes provenance metadata for replay."],
171
+ export_paths=[out_path],
172
+ )
173
+
174
+
175
+ def compare_networks(
176
+ network_a: Any,
177
+ network_b: Any,
178
+ *,
179
+ measure: str = "degree",
180
+ ) -> Dict[str, Any]:
181
+ """Compare two networks via shared machine-facing summary metric."""
182
+ res_a = Q.nodes().compute(measure).execute(network_a)
183
+ res_b = Q.nodes().compute(measure).execute(network_b)
184
+ vals_a = res_a.attributes.get(measure, {})
185
+ vals_b = res_b.attributes.get(measure, {})
186
+ mean_a = sum(vals_a.values()) / len(vals_a) if vals_a else 0.0
187
+ mean_b = sum(vals_b.values()) / len(vals_b) if vals_b else 0.0
188
+ return {
189
+ "status": "ok",
190
+ "assumptions": ["Comparison uses simple mean of selected metric over node replicas."],
191
+ "warnings": [],
192
+ "result": {
193
+ "metric": measure,
194
+ "mean_a": mean_a,
195
+ "mean_b": mean_b,
196
+ "delta": mean_b - mean_a,
197
+ "count_a": len(vals_a),
198
+ "count_b": len(vals_b),
199
+ },
200
+ "provenance": {},
201
+ "replay": {},
202
+ "export_paths": [],
203
+ }
204
+
205
+
206
+ def summarize_result(result: QueryResult) -> Dict[str, Any]:
207
+ """Return compact structured summary for a QueryResult."""
208
+ return {
209
+ "status": "ok",
210
+ "assumptions": [],
211
+ "warnings": result.meta.get("warnings", []),
212
+ "result": result.summary_dict(),
213
+ "provenance": result.meta.get("provenance", {}),
214
+ "replay": _extract_replay_payload(result),
215
+ "export_paths": [],
216
+ }
@@ -1409,8 +1409,6 @@ class Truncated_Power_Law(Distribution):
1409
1409
 
1410
1410
  @property
1411
1411
  def _pdf_discrete_normalizer(self):
1412
- if 0:
1413
- return False
1414
1412
  from mpmath import (
1415
1413
  exp, # faster /here/ than numpy.exp
1416
1414
  lerchphi,
@@ -1429,21 +1427,7 @@ class Truncated_Power_Law(Distribution):
1429
1427
  def pdf(self, data=None):
1430
1428
  if data is None and hasattr(self, 'parent_Fit'):
1431
1429
  data = self.parent_Fit.data
1432
- if not self.discrete and self.in_range() and False:
1433
- data = trim_to_range(data, xmin=self.xmin, xmax=self.xmax)
1434
- from mpmath import gammainc
1435
- from numpy import exp
1436
- # (Lambda**(1-alpha))/\
1437
- # float(gammainc(1-alpha,Lambda*xmin))
1438
- likelihoods = (
1439
- self.Lambda**(1 - self.alpha) /
1440
- (data**self.alpha * exp(self.Lambda * data) * gammainc(
1441
- 1 - self.alpha, self.Lambda * self.xmin)).astype(float))
1442
- # Simplified so as not to throw a nan from infs being divided by each other
1443
- from sys import float_info
1444
- likelihoods[likelihoods == 0] = 10**float_info.min_10_exp
1445
- else:
1446
- likelihoods = Distribution.pdf(self, data)
1430
+ likelihoods = Distribution.pdf(self, data)
1447
1431
  return likelihoods
1448
1432
 
1449
1433
  def _generate_random_continuous(self, r):
@@ -125,13 +125,13 @@ def _compute_modularity(
125
125
  Modularity score
126
126
  """
127
127
  from py3plex.algorithms.community_detection.multilayer_modularity import (
128
- compute_multilayer_modularity,
128
+ multilayer_modularity,
129
129
  )
130
130
 
131
131
  try:
132
132
  # Try multilayer-aware modularity first
133
- if hasattr(network, "get_layers") and layers:
134
- return compute_multilayer_modularity(network, partition, layers)
133
+ if hasattr(network, "layers") and layers:
134
+ return multilayer_modularity(network, partition)
135
135
  except Exception:
136
136
  pass
137
137