py3plex 1.1.5__tar.gz → 2.0.0__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 (920) hide show
  1. {py3plex-1.1.5/py3plex.egg-info → py3plex-2.0.0}/PKG-INFO +76 -4
  2. {py3plex-1.1.5 → py3plex-2.0.0}/README.md +65 -2
  3. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/__init__.py +57 -3
  4. py3plex-2.0.0/py3plex/agent.py +216 -0
  5. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/autocommunity_executor.py +1 -1
  6. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/powerlaw.py +1 -17
  7. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/metrics.py +3 -3
  8. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/cli.py +101 -38
  9. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/config.py +2 -2
  10. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/multinet.py +114 -1
  11. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/random_generators.py +4 -4
  12. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_generators.py +9 -5
  13. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/ast.py +86 -1
  14. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/builder.py +198 -4
  15. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/errors.py +4 -3
  16. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executor.py +66 -5
  17. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executor_semiring.py +11 -29
  18. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/types.py +5 -1
  19. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/reduction.py +12 -0
  20. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/result.py +126 -2
  21. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/uq_resolution.py +8 -9
  22. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/warnings.py +121 -0
  23. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl_legacy.py +11 -2
  24. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/linter.py +116 -1
  25. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/__init__.py +18 -1
  26. py3plex-2.0.0/py3plex/ml/embedding/evaluation.py +149 -0
  27. py3plex-2.0.0/py3plex/ml/embedding/multiplex.py +869 -0
  28. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/runner.py +17 -4
  29. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/utils.py +0 -42
  30. {py3plex-1.1.5 → py3plex-2.0.0/py3plex.egg-info}/PKG-INFO +76 -4
  31. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/SOURCES.txt +21 -0
  32. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/requires.txt +12 -1
  33. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/__init__.py +2 -2
  34. {py3plex-1.1.5 → py3plex-2.0.0}/pyproject.toml +13 -2
  35. py3plex-2.0.0/tests/test_agent_api.py +250 -0
  36. py3plex-2.0.0/tests/test_agents_documentation_claims.py +42 -0
  37. py3plex-2.0.0/tests/test_algorithms_requirements_registry.py +84 -0
  38. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_conf.py +1 -1
  39. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_manuscript_integrity.py +5 -5
  40. py3plex-2.0.0/tests/test_ci_python_versions.py +16 -0
  41. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli.py +30 -1
  42. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_ergonomics.py +19 -0
  43. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_data_files_presence.py +1 -1
  44. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_docs_embeddings_section.py +22 -0
  45. py3plex-2.0.0/tests/test_docs_quality_pass.py +44 -0
  46. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_edge_grouping_coverage.py +14 -0
  47. py3plex-2.0.0/tests/test_dsl_legacy_approximate.py +134 -0
  48. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_planner.py +23 -0
  49. py3plex-2.0.0/tests/test_dsl_result_algebra_edge_cases.py +96 -0
  50. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uncertainty.py +18 -1
  51. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_v2.py +121 -0
  52. py3plex-2.0.0/tests/test_embeddings_direct_units.py +231 -0
  53. py3plex-2.0.0/tests/test_ergonomics_helpers.py +105 -0
  54. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_CBSSD.py +4 -19
  55. py3plex-2.0.0/tests/test_example_interactive_multilayer.py +27 -0
  56. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_roundtrip.py +57 -0
  57. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_linter.py +73 -2
  58. py3plex-2.0.0/tests/test_ml_embedding_evaluation.py +159 -0
  59. py3plex-2.0.0/tests/test_multilayer_embedding_models.py +219 -0
  60. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_visualizations.py +0 -108
  61. py3plex-2.0.0/tests/test_optimizer_submodules.py +329 -0
  62. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugin_system.py +23 -0
  63. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugins_contracts.py +20 -0
  64. py3plex-2.0.0/tests/test_profiling_additional.py +52 -0
  65. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_replay.py +27 -0
  66. py3plex-2.0.0/tests/test_public_api_exports.py +60 -0
  67. py3plex-2.0.0/tests/test_pypi_publish_workflow.py +7 -0
  68. py3plex-2.0.0/tests/test_readme_contributor_onboarding.py +41 -0
  69. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_roundtrip_invariants.py +25 -3
  70. py3plex-2.0.0/tests/test_semiring_pareto.py +110 -0
  71. py3plex-2.0.0/tests/test_sensitivity_executor.py +197 -0
  72. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_dsl.py +29 -0
  73. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_utils.py +7 -0
  74. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_defaults.py +18 -0
  75. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_runner.py +11 -12
  76. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_search_paths.py +0 -23
  77. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_version_consistency.py +49 -0
  78. py3plex-2.0.0/tests/test_visualization_ricci_layout_helpers.py +60 -0
  79. py3plex-1.1.5/py3plex/ml/embedding/evaluation.py +0 -55
  80. py3plex-1.1.5/py3plex/ml/embedding/multiplex.py +0 -95
  81. {py3plex-1.1.5 → py3plex-2.0.0}/LICENSE +0 -0
  82. {py3plex-1.1.5 → py3plex-2.0.0}/MANIFEST.in +0 -0
  83. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/__main__.py +0 -0
  84. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/_parallel.py +0 -0
  85. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/__init__.py +0 -0
  86. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/backend.py +0 -0
  87. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/closure.py +0 -0
  88. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/fixed_point.py +0 -0
  89. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/lift.py +0 -0
  90. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/paths.py +0 -0
  91. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/registry.py +0 -0
  92. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/semiring.py +0 -0
  93. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/witness.py +0 -0
  94. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/__init__.py +0 -0
  95. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/advanced_random_generators.py +0 -0
  96. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/attribute_correlation.py +0 -0
  97. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/__init__.py +0 -0
  98. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_betweenness.py +0 -0
  99. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_closeness.py +0 -0
  100. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_pagerank.py +0 -0
  101. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/explain.py +0 -0
  102. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality_toolkit.py +0 -0
  103. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_comparison.py +0 -0
  104. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/NoRC.py +0 -0
  105. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/__init__.py +0 -0
  106. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/auto_select.py +0 -0
  107. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/autocommunity.py +0 -0
  108. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/budget.py +0 -0
  109. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_louvain.py +0 -0
  110. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_measures.py +0 -0
  111. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_ranking.py +0 -0
  112. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_wrapper.py +0 -0
  113. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/distributional.py +0 -0
  114. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/flow_hierarchy.py +0 -0
  115. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/__init__.py +0 -0
  116. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/conftest.py +0 -0
  117. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-bipartite.py +0 -0
  118. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-file-io.py +0 -0
  119. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-multiplex.py +0 -0
  120. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-networkx.py +0 -0
  121. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-simple.py +0 -0
  122. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram-expanded.py +0 -0
  123. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram.py +0 -0
  124. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/infomap.py +0 -0
  125. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/interfaces/python/setup.py +0 -0
  126. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/label_propagation.py +0 -0
  127. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/leiden_multilayer.py +0 -0
  128. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/leiden_uq.py +0 -0
  129. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_benchmark.py +0 -0
  130. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_modularity.py +0 -0
  131. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_quality_metrics.py +0 -0
  132. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/node_ranking.py +0 -0
  133. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/runner.py +0 -0
  134. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/sbm_metrics.py +0 -0
  135. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/sbm_wrapper.py +0 -0
  136. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/spectral_multilayer.py +0 -0
  137. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/successive_halving.py +0 -0
  138. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/curvature/__init__.py +0 -0
  139. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/curvature/ollivier_ricci_multilayer.py +0 -0
  140. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/__init__.py +0 -0
  141. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/benchmark_classification.py +0 -0
  142. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/walkers.py +0 -0
  143. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/graph_summarization.py +0 -0
  144. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/__init__.py +0 -0
  145. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/__main__.py +0 -0
  146. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/assets/builtin.n3 +0 -0
  147. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/__init__.py +0 -0
  148. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/converters.py +0 -0
  149. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/example.py +0 -0
  150. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/helpers.py +0 -0
  151. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/kb.py +0 -0
  152. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/load.py +0 -0
  153. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/predicate.py +0 -0
  154. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/rule.py +0 -0
  155. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/settings.py +0 -0
  156. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/term_parsers.py +0 -0
  157. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/__init__.py +0 -0
  158. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/bottomup.py +0 -0
  159. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/learner.py +0 -0
  160. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/optimal.py +0 -0
  161. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/__init__.py +0 -0
  162. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/adjustment.py +0 -0
  163. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/scorefunctions.py +0 -0
  164. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/significance.py +0 -0
  165. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/validate.py +0 -0
  166. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/layer_similarity.py +0 -0
  167. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/meta_flow_report.py +0 -0
  168. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multicentrality.py +0 -0
  169. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/__init__.py +0 -0
  170. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/centrality.py +0 -0
  171. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/entanglement.py +0 -0
  172. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/multirank.py +0 -0
  173. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/multixrank.py +0 -0
  174. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/supra_matrix_function_centrality.py +0 -0
  175. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/versatility.py +0 -0
  176. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_clustering.py +0 -0
  177. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/PPR.py +0 -0
  178. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/__init__.py +0 -0
  179. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/label_propagation.py +0 -0
  180. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/node_ranking/__init__.py +0 -0
  181. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/node_ranking/node_ranking.py +0 -0
  182. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/requirements_registry.py +0 -0
  183. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/robustness_testing.py +0 -0
  184. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/routing/__init__.py +0 -0
  185. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/routing/multiplex_paths.py +0 -0
  186. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/__init__.py +0 -0
  187. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/conversions.py +0 -0
  188. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/diagnostics.py +0 -0
  189. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/inference_vi.py +0 -0
  190. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/model_selection.py +0 -0
  191. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/multilayer_sbm.py +0 -0
  192. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/objectives.py +0 -0
  193. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/uq.py +0 -0
  194. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/utils.py +0 -0
  195. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sir_multiplex.py +0 -0
  196. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistical_report.py +0 -0
  197. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/__init__.py +0 -0
  198. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/basic_statistics.py +0 -0
  199. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/bayesian_distances.py +0 -0
  200. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/bayesiantests.py +0 -0
  201. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/correlation_networks.py +0 -0
  202. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/critical_distances.py +0 -0
  203. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/enrichment_modules.py +0 -0
  204. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/multilayer_statistics.py +0 -0
  205. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/stats_comparison.py +0 -0
  206. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/topology.py +0 -0
  207. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/__init__.py +0 -0
  208. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/centrality.py +0 -0
  209. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/community.py +0 -0
  210. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal_multiplex/__init__.py +0 -0
  211. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/term_parsers/__init__.py +0 -0
  212. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/__init__.py +0 -0
  213. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/features.py +0 -0
  214. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/metrics.py +0 -0
  215. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/solvers.py +0 -0
  216. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/__init__.py +0 -0
  217. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/budget.py +0 -0
  218. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/runners.py +0 -0
  219. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/centrality/__init__.py +0 -0
  220. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/centrality/robustness.py +0 -0
  221. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/__init__.py +0 -0
  222. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/generator.py +0 -0
  223. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/learner.py +0 -0
  224. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/scorer.py +0 -0
  225. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/types.py +0 -0
  226. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/__init__.py +0 -0
  227. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/executor.py +0 -0
  228. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/metrics.py +0 -0
  229. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/result.py +0 -0
  230. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/__init__.py +0 -0
  231. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/convert.py +0 -0
  232. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/__init__.py +0 -0
  233. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/dgl_converter.py +0 -0
  234. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/igraph_converter.py +0 -0
  235. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/networkx_converter.py +0 -0
  236. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/pyg_converter.py +0 -0
  237. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/scipy_converter.py +0 -0
  238. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/equality.py +0 -0
  239. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/exceptions.py +0 -0
  240. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/ir.py +0 -0
  241. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/schema.py +0 -0
  242. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/sidecar.py +0 -0
  243. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/__init__.py +0 -0
  244. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/contract.py +0 -0
  245. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/engine.py +0 -0
  246. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/failure_modes.py +0 -0
  247. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/predicates.py +0 -0
  248. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/result.py +0 -0
  249. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/IO.py +0 -0
  250. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/__init__.py +0 -0
  251. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/dataStructures.py +0 -0
  252. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/decomposition.py +0 -0
  253. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/__init__.py +0 -0
  254. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/converters.py +0 -0
  255. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/immutable.py +0 -0
  256. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/lazy_evaluation.py +0 -0
  257. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/nx_compat.py +0 -0
  258. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/parsers.py +0 -0
  259. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/schema_validation.py +0 -0
  260. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/supporting.py +0 -0
  261. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/temporal_multinet.py +0 -0
  262. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/types.py +0 -0
  263. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/__init__.py +0 -0
  264. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/claim_lang.py +0 -0
  265. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/ddmin.py +0 -0
  266. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/engine.py +0 -0
  267. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/types.py +0 -0
  268. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/witness.py +0 -0
  269. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/__init__.py +0 -0
  270. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/comparator.py +0 -0
  271. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/engine.py +0 -0
  272. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/presets.py +0 -0
  273. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/result.py +0 -0
  274. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/spec.py +0 -0
  275. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/__init__.py +0 -0
  276. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_data/aarhus_cs.edges +0 -0
  277. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_data/synthetic_multilayer.edges +0 -0
  278. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_loaders.py +0 -0
  279. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/__init__.py +0 -0
  280. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/builders.py +0 -0
  281. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/codes.py +0 -0
  282. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/core.py +0 -0
  283. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/utils.py +0 -0
  284. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/__init__.py +0 -0
  285. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/algebra.py +0 -0
  286. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/attribution.py +0 -0
  287. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/benchmark.py +0 -0
  288. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/benchmark_result.py +0 -0
  289. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/cache.py +0 -0
  290. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/communities.py +0 -0
  291. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/community_uq.py +0 -0
  292. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/compositional_uq.py +0 -0
  293. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/context.py +0 -0
  294. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executors/__init__.py +0 -0
  295. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executors/benchmark_executor.py +0 -0
  296. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/explain.py +0 -0
  297. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/export.py +0 -0
  298. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/expressions.py +0 -0
  299. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/fastpath.py +0 -0
  300. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/layers.py +0 -0
  301. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/__init__.py +0 -0
  302. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/diagnostic.py +0 -0
  303. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/lint_context.py +0 -0
  304. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/__init__.py +0 -0
  305. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/base.py +0 -0
  306. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl001_unknown_layer.py +0 -0
  307. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl002_unknown_attribute.py +0 -0
  308. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl101_type_mismatch.py +0 -0
  309. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl201_unsatisfiable.py +0 -0
  310. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl202_redundant.py +0 -0
  311. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/perf301_full_scan.py +0 -0
  312. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/perf302_cross_layer.py +0 -0
  313. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/schema.py +0 -0
  314. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/type_resolver.py +0 -0
  315. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/types.py +0 -0
  316. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/operator_registry.py +0 -0
  317. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/__init__.py +0 -0
  318. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/builder.py +0 -0
  319. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/compiler.py +0 -0
  320. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/engine.py +0 -0
  321. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/ir.py +0 -0
  322. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/result.py +0 -0
  323. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/planner.py +0 -0
  324. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/predictive.py +0 -0
  325. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/__init__.py +0 -0
  326. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/cache.py +0 -0
  327. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/cost.py +0 -0
  328. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/diff.py +0 -0
  329. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/distribution.py +0 -0
  330. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/executor.py +0 -0
  331. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/explain.py +0 -0
  332. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/program.py +0 -0
  333. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/rewrite.py +0 -0
  334. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/provenance.py +0 -0
  335. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/registry.py +0 -0
  336. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/selection_uq.py +0 -0
  337. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/serializer.py +0 -0
  338. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/uq_algebra.py +0 -0
  339. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/__init__.py +0 -0
  340. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/_utils.py +0 -0
  341. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/ast.py +0 -0
  342. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/builder.py +0 -0
  343. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/compartmental.py +0 -0
  344. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/config.py +0 -0
  345. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/core.py +0 -0
  346. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/errors.py +0 -0
  347. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/executor.py +0 -0
  348. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/models.py +0 -0
  349. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/processes.py +0 -0
  350. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/registry.py +0 -0
  351. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/result.py +0 -0
  352. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/serializer.py +0 -0
  353. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/__init__.py +0 -0
  354. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/base.py +0 -0
  355. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/cache.py +0 -0
  356. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/link_ops.py +0 -0
  357. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/metapath2vec.py +0 -0
  358. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/netmf.py +0 -0
  359. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ergonomics.py +0 -0
  360. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/errors.py +0 -0
  361. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/exceptions.py +0 -0
  362. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/__init__.py +0 -0
  363. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/artifacts.py +0 -0
  364. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/cli.py +0 -0
  365. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/env.py +0 -0
  366. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/errors.py +0 -0
  367. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/model.py +0 -0
  368. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/runner.py +0 -0
  369. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/store.py +0 -0
  370. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/utils.py +0 -0
  371. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/fast_examples.py +0 -0
  372. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/graph_ops.py +0 -0
  373. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/__init__.py +0 -0
  374. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/api.py +0 -0
  375. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/canonical_format.py +0 -0
  376. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/converters.py +0 -0
  377. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/exceptions.py +0 -0
  378. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/__init__.py +0 -0
  379. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/arrow_format.py +0 -0
  380. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/csv_format.py +0 -0
  381. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/json_format.py +0 -0
  382. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/multinet_bridge.py +0 -0
  383. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/parquet_format.py +0 -0
  384. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/schema.py +0 -0
  385. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/lab/__init__.py +0 -0
  386. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/lab/base.py +0 -0
  387. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/logging_config.py +0 -0
  388. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/__init__.py +0 -0
  389. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/builder.py +0 -0
  390. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/result.py +0 -0
  391. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/stats.py +0 -0
  392. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/utils.py +0 -0
  393. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/__init__.py +0 -0
  394. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/base.py +0 -0
  395. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/deepwalk.py +0 -0
  396. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/line.py +0 -0
  397. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/metapath2vec.py +0 -0
  398. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/netmf.py +0 -0
  399. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/node2vec.py +0 -0
  400. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/similarity.py +0 -0
  401. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/trainer.py +0 -0
  402. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/utils.py +0 -0
  403. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/multinet/__init__.py +0 -0
  404. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/multinet/aggregation.py +0 -0
  405. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/__init__.py +0 -0
  406. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/executor.py +0 -0
  407. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/models.py +0 -0
  408. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/result.py +0 -0
  409. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/__init__.py +0 -0
  410. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/cost_model.py +0 -0
  411. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/logical_plan.py +0 -0
  412. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/optimizer.py +0 -0
  413. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/physical_plan.py +0 -0
  414. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/plan_nodes.py +0 -0
  415. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/rules.py +0 -0
  416. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/__init__.py +0 -0
  417. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/cli.py +0 -0
  418. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/errors.py +0 -0
  419. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/executor.py +0 -0
  420. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/network.py +0 -0
  421. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/operators.py +0 -0
  422. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/readers.py +0 -0
  423. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/schema.py +0 -0
  424. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/spill.py +0 -0
  425. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/utils.py +0 -0
  426. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/__init__.py +0 -0
  427. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/algorithms.py +0 -0
  428. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/executor.py +0 -0
  429. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/result.py +0 -0
  430. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/pipeline.py +0 -0
  431. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/__init__.py +0 -0
  432. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/base.py +0 -0
  433. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/examples.py +0 -0
  434. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/registry.py +0 -0
  435. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/profiling.py +0 -0
  436. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/__init__.py +0 -0
  437. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/bundle.py +0 -0
  438. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/capture.py +0 -0
  439. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/replay.py +0 -0
  440. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/schema.py +0 -0
  441. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/requirements.py +0 -0
  442. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/__init__.py +0 -0
  443. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/experiments.py +0 -0
  444. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/perturbations.py +0 -0
  445. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/runtime/__init__.py +0 -0
  446. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/runtime/capabilities.py +0 -0
  447. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/__init__.py +0 -0
  448. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/capabilities.py +0 -0
  449. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/community_registry.py +0 -0
  450. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/evaluate.py +0 -0
  451. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/metric_registry.py +0 -0
  452. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/result.py +0 -0
  453. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/wins.py +0 -0
  454. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/__init__.py +0 -0
  455. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/core.py +0 -0
  456. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/engine.py +0 -0
  457. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/pareto.py +0 -0
  458. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/registry.py +0 -0
  459. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/types.py +0 -0
  460. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/__init__.py +0 -0
  461. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/executor.py +0 -0
  462. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/metrics.py +0 -0
  463. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/perturbations.py +0 -0
  464. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/types.py +0 -0
  465. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/__init__.py +0 -0
  466. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/provenance.py +0 -0
  467. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/registry.py +0 -0
  468. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/statvalue.py +0 -0
  469. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/uncertainty.py +0 -0
  470. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_utils.py +0 -0
  471. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_utils_extended.py +0 -0
  472. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_view.py +0 -0
  473. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/__init__.py +0 -0
  474. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/bootstrap.py +0 -0
  475. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/ci_utils.py +0 -0
  476. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/community_ensemble.py +0 -0
  477. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/community_result.py +0 -0
  478. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/context.py +0 -0
  479. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/estimation.py +0 -0
  480. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/noise_models.py +0 -0
  481. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/null_models.py +0 -0
  482. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition.py +0 -0
  483. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_metrics.py +0 -0
  484. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_reducers.py +0 -0
  485. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_types.py +0 -0
  486. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_uq.py +0 -0
  487. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/plan.py +0 -0
  488. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/reducers/__init__.py +0 -0
  489. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/reducers/base.py +0 -0
  490. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/resampling_graph.py +0 -0
  491. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_execution.py +0 -0
  492. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_reducers.py +0 -0
  493. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_types.py +0 -0
  494. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_uq.py +0 -0
  495. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/stratification.py +0 -0
  496. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/types.py +0 -0
  497. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/validation.py +0 -0
  498. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/__init__.py +0 -0
  499. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/benchmark_visualizations.py +0 -0
  500. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/bezier.py +0 -0
  501. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/colors.py +0 -0
  502. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/drawing_machinery.py +0 -0
  503. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/__init__.py +0 -0
  504. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/embedding_tools.py +0 -0
  505. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/embedding_visualization.py +0 -0
  506. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/__init__.py +0 -0
  507. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/fa2util.py +0 -0
  508. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/forceatlas2.py +0 -0
  509. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/layout_algorithms.py +0 -0
  510. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/multilayer.py +0 -0
  511. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/polyfit.py +0 -0
  512. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/pymnet_style.py +0 -0
  513. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/ricci_layout.py +0 -0
  514. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/ricci_multilayer_vis.py +0 -0
  515. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/sankey.py +0 -0
  516. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/workflows.py +0 -0
  517. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/__init__.py +0 -0
  518. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/benchmark_nodes.py +0 -0
  519. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/r_interop.py +0 -0
  520. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/train_node2vec_embedding.py +0 -0
  521. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/dependency_links.txt +0 -0
  522. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/entry_points.txt +0 -0
  523. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/not-zip-safe +0 -0
  524. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/top_level.txt +0 -0
  525. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/errors.py +0 -0
  526. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/registry.py +0 -0
  527. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/safe_paths.py +0 -0
  528. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/schemas.py +0 -0
  529. {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/server.py +0 -0
  530. {py3plex-1.1.5 → py3plex-2.0.0}/setup.cfg +0 -0
  531. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_advanced_metrics_properties.py +0 -0
  532. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_agents_ergonomics_features.py +0 -0
  533. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_agents_golden_paths.py +0 -0
  534. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_aggregation.py +0 -0
  535. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_backend.py +0 -0
  536. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_core.py +0 -0
  537. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_fixed_point.py +0 -0
  538. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_paths.py +0 -0
  539. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_registry.py +0 -0
  540. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_witness.py +0 -0
  541. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithm_properties.py +0 -0
  542. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_attribute_correlation.py +0 -0
  543. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_correlation_networks.py +0 -0
  544. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_init.py +0 -0
  545. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_random_generators.py +0 -0
  546. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_statistics_bayesian_distances.py +0 -0
  547. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment.py +0 -0
  548. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment_contracts.py +0 -0
  549. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment_correctness_additional.py +0 -0
  550. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_approximate_centrality.py +0 -0
  551. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ast_roundtrip.py +0 -0
  552. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ast_roundtrip_integration.py +0 -0
  553. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_attribute_correlation.py +0 -0
  554. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_attribute_correlation_contracts.py +0 -0
  555. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_auto_community.py +0 -0
  556. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_benchmarks.py +0 -0
  557. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_executor.py +0 -0
  558. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_meta.py +0 -0
  559. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_successive_halving.py +0 -0
  560. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_bayesian_distances.py +0 -0
  561. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_bench_aggregation_unit.py +0 -0
  562. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_budget_fairness.py +0 -0
  563. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_dsl_basic.py +0 -0
  564. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_integration.py +0 -0
  565. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_multiplex_centrality.py +0 -0
  566. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_time.py +0 -0
  567. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmarks_budget.py +0 -0
  568. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmarks_init.py +0 -0
  569. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_snippets.py +0 -0
  570. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_builder_dsl_mutate.py +0 -0
  571. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_capabilities_basic.py +0 -0
  572. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_capabilities_optional_missing.py +0 -0
  573. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_explain.py +0 -0
  574. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_explain_integration.py +0 -0
  575. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_robustness.py +0 -0
  576. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_robustness_oracles.py +0 -0
  577. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_uncertainty.py +0 -0
  578. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_weight_handling.py +0 -0
  579. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_api_consistency.py +0 -0
  580. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_doc_coverage.py +0 -0
  581. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_type_coverage.py +0 -0
  582. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_claim_learning.py +0 -0
  583. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_claims_types.py +0 -0
  584. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_check.py +0 -0
  585. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_piping.py +0 -0
  586. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_clustering_multilayer.py +0 -0
  587. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_code_improvements.py +0 -0
  588. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_detection_modules.py +0 -0
  589. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_distribution.py +0 -0
  590. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_measures.py +0 -0
  591. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison.py +0 -0
  592. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_executor.py +0 -0
  593. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_metrics.py +0 -0
  594. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_metrics_additional.py +0 -0
  595. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_result.py +0 -0
  596. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_uninitialized_and_resistance_oracles.py +0 -0
  597. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_compat_exceptions.py +0 -0
  598. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_compat_roundtrip.py +0 -0
  599. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_config_api.py +0 -0
  600. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_config_benchmark.py +0 -0
  601. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts.py +0 -0
  602. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_basic.py +0 -0
  603. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_extended.py +0 -0
  604. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_failure_modes.py +0 -0
  605. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_integration.py +0 -0
  606. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_functionality.py +0 -0
  607. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_immutable.py +0 -0
  608. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_lazy_evaluation.py +0 -0
  609. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multinet_and_parsers.py +0 -0
  610. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multinet_correctness.py +0 -0
  611. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multiplex_edges.py +0 -0
  612. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_schema_validation.py +0 -0
  613. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_supporting.py +0 -0
  614. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_correlation_networks.py +0 -0
  615. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterexamples.py +0 -0
  616. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterexamples_properties.py +0 -0
  617. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterfactual.py +0 -0
  618. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterfactual_presets.py +0 -0
  619. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_coverage_grouping.py +0 -0
  620. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_create_mosaic_banner.py +0 -0
  621. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_create_showcase_flow.py +0 -0
  622. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_crosshair_pure_functions.py +0 -0
  623. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets.py +0 -0
  624. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets_contracts.py +0 -0
  625. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets_oracles.py +0 -0
  626. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_degenerate_networks.py +0 -0
  627. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_determinism_randomness.py +0 -0
  628. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_diagnostics.py +0 -0
  629. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_diagnostics_utils.py +0 -0
  630. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_doc_conf.py +0 -0
  631. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_docs_examples.py +0 -0
  632. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_doctests.py +0 -0
  633. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dplyr_integration.py +0 -0
  634. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl.py +0 -0
  635. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_aggregation_enhancements.py +0 -0
  636. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_ast_equivalence.py +0 -0
  637. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_auto_community.py +0 -0
  638. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_communities.py +0 -0
  639. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_community_filtering.py +0 -0
  640. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_community_uq_integration.py +0 -0
  641. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_compact_compute.py +0 -0
  642. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_compositional_uq.py +0 -0
  643. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_condition_semantics.py +0 -0
  644. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_d_factory.py +0 -0
  645. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_documentation_examples.py +0 -0
  646. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_dplyr_style.py +0 -0
  647. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_dynamics_integration.py +0 -0
  648. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_edge_queries.py +0 -0
  649. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_enhancements.py +0 -0
  650. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_ergonomics.py +0 -0
  651. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_errors.py +0 -0
  652. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_errors_extended.py +0 -0
  653. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_executor_additional.py +0 -0
  654. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_explain.py +0 -0
  655. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_export.py +0 -0
  656. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_expressions.py +0 -0
  657. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_extensions.py +0 -0
  658. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_graphops_equivalence.py +0 -0
  659. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_grouping_coverage.py +0 -0
  660. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_interactive.py +0 -0
  661. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_joins.py +0 -0
  662. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_layer_selection.py +0 -0
  663. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_layer_set_algebra.py +0 -0
  664. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_legacy_edges.py +0 -0
  665. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_lint.py +0 -0
  666. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_operators.py +0 -0
  667. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_patterns.py +0 -0
  668. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_patterns_quick_reference.py +0 -0
  669. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_pipes.py +0 -0
  670. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_predict_reduce.py +0 -0
  671. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_program_rewrite.py +0 -0
  672. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_program_types.py +0 -0
  673. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_progress_logging.py +0 -0
  674. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_properties.py +0 -0
  675. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_provenance.py +0 -0
  676. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_query_optimization.py +0 -0
  677. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_query_zoo.py +0 -0
  678. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_selection_fastpath.py +0 -0
  679. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_semiring_integration.py +0 -0
  680. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_serializer.py +0 -0
  681. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_smart_defaults.py +0 -0
  682. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_temporal_range_execution.py +0 -0
  683. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uq_ergonomics.py +0 -0
  684. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uq_propagation.py +0 -0
  685. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_zoo_features.py +0 -0
  686. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics.py +0 -0
  687. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_algorithm_contracts.py +0 -0
  688. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_config_and_results_correctness.py +0 -0
  689. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_conservation.py +0 -0
  690. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_core.py +0 -0
  691. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_executor_edge_cases.py +0 -0
  692. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_parallel_determinism.py +0 -0
  693. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_reference_runs.py +0 -0
  694. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_uq_integration.py +0 -0
  695. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_utils.py +0 -0
  696. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_edge_cases.py +0 -0
  697. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_edgelist_format.py +0 -0
  698. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ergonomic_helpers.py +0 -0
  699. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ergonomics.py +0 -0
  700. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_errors.py +0 -0
  701. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_community_detection.py +0 -0
  702. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_decomposition_and_classification.py +0 -0
  703. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_decomposition_ground_truth.py +0 -0
  704. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_dsl_builder_api.py +0 -0
  705. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_dynamics_core_examples.py +0 -0
  706. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_embedding_construction.py +0 -0
  707. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_embedding_visualization.py +0 -0
  708. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_incidence_gadget_encoding.py +0 -0
  709. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_inverse_network.py +0 -0
  710. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_layer_extraction.py +0 -0
  711. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_manipulation.py +0 -0
  712. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multilayer_vectorized_aggregation.py +0 -0
  713. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multiplex_aggregate.py +0 -0
  714. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multiplex_dynamics.py +0 -0
  715. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_n2v_embedding.py +0 -0
  716. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_network_decomposition.py +0 -0
  717. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_network_decomposition_meta_paths.py +0 -0
  718. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_numeric_encoding.py +0 -0
  719. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_pattern_matching.py +0 -0
  720. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_ppr.py +0 -0
  721. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_examples_zoo_consolidation.py +0 -0
  722. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_exception_taxonomy.py +0 -0
  723. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_exceptions.py +0 -0
  724. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_experiments.py +0 -0
  725. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_explain_attribution.py +0 -0
  726. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_fast_examples.py +0 -0
  727. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_flagship_progress_demo.py +0 -0
  728. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_flow_hierarchy.py +0 -0
  729. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_fuzzing_properties.py +0 -0
  730. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_all_outputs.py +0 -0
  731. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_quickstart_outputs.py +0 -0
  732. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_visualization_images.py +0 -0
  733. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_golden_toy_examples.py +0 -0
  734. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_graph_ops.py +0 -0
  735. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_graph_summarization.py +0 -0
  736. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_hedwig_adjustment.py +0 -0
  737. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_hedwig_significance.py +0 -0
  738. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_improved_errors.py +0 -0
  739. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_incidence_gadget_encoding.py +0 -0
  740. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_infomap_fix.py +0 -0
  741. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_interlayer_links_fix.py +0 -0
  742. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_api_edge_cases.py +0 -0
  743. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_arrow.py +0 -0
  744. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_contracts_additional.py +0 -0
  745. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_converters.py +0 -0
  746. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_exceptions.py +0 -0
  747. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_integration.py +0 -0
  748. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_schema.py +0 -0
  749. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_issue_19_fix.py +0 -0
  750. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab.py +0 -0
  751. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab_additional.py +0 -0
  752. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab_correctness.py +0 -0
  753. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_label_propagation.py +0 -0
  754. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layer_extraction_fix.py +0 -0
  755. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layer_similarity.py +0 -0
  756. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layout_algorithms.py +0 -0
  757. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lazy_evaluation.py +0 -0
  758. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_leiden_multilayer.py +0 -0
  759. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_link_checker.py +0 -0
  760. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_logging_conversion.py +0 -0
  761. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_main_module.py +0 -0
  762. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_master_regulators_example.py +0 -0
  763. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_math_invariants.py +0 -0
  764. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_mcp_server.py +0 -0
  765. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_meta_analysis.py +0 -0
  766. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_meta_flow_report.py +0 -0
  767. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_metamorphic.py +0 -0
  768. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_metapath2vec.py +0 -0
  769. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ml_embedding_primitives.py +0 -0
  770. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_monoplex_nx_wrapper.py +0 -0
  771. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_mpc.py +0 -0
  772. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_centrality.py +0 -0
  773. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_clustering_coefficients.py +0 -0
  774. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_cornercases.py +0 -0
  775. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_edge_fix.py +0 -0
  776. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_integration.py +0 -0
  777. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_leiden_uq.py +0 -0
  778. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_modularity.py +0 -0
  779. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_quality_metrics.py +0 -0
  780. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_statistics.py +0 -0
  781. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multinet_aggregation.py +0 -0
  782. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multinet_aggregation_additional.py +0 -0
  783. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_layer_interop.py +0 -0
  784. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_participation.py +0 -0
  785. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_properties.py +0 -0
  786. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multirank.py +0 -0
  787. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multixrank.py +0 -0
  788. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_network_conversion.py +0 -0
  789. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_network_version.py +0 -0
  790. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_networkx_compatibility.py +0 -0
  791. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_new_algorithms.py +0 -0
  792. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_new_multilayer_metrics.py +0 -0
  793. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_node_edge_parity.py +0 -0
  794. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_node_ranking_comprehensive.py +0 -0
  795. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_norc.py +0 -0
  796. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodel_sanity.py +0 -0
  797. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodels.py +0 -0
  798. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodels_contracts.py +0 -0
  799. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nx_compat_extended.py +0 -0
  800. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ollivier_ricci_multilayer.py +0 -0
  801. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_out_of_core.py +0 -0
  802. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parallel.py +0 -0
  803. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parallel_execution.py +0 -0
  804. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parsers_comprehensive.py +0 -0
  805. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parsers_coverage.py +0 -0
  806. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_partition_uq.py +0 -0
  807. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_partition_uq_integration.py +0 -0
  808. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths.py +0 -0
  809. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_additional.py +0 -0
  810. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_contracts.py +0 -0
  811. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_executor.py +0 -0
  812. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_result.py +0 -0
  813. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_performance_core.py +0 -0
  814. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_pipeline.py +0 -0
  815. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugin_examples.py +0 -0
  816. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugins.py +0 -0
  817. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_profiling.py +0 -0
  818. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_program.py +0 -0
  819. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_program_cost_executor.py +0 -0
  820. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_properties.py +0 -0
  821. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_canonical.py +0 -0
  822. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_schema.py +0 -0
  823. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_pymnet_style.py +0 -0
  824. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_query_algebra.py +0 -0
  825. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_query_equivalence.py +0 -0
  826. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_r_interop.py +0 -0
  827. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_generators_additional.py +0 -0
  828. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_generators_extended.py +0 -0
  829. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_walkers.py +0 -0
  830. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_walks.py +0 -0
  831. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_readme_flagship_example.py +0 -0
  832. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_requirements.py +0 -0
  833. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_result_explain_debug.py +0 -0
  834. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ricci_visualization.py +0 -0
  835. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness.py +0 -0
  836. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness_additional.py +0 -0
  837. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness_testing.py +0 -0
  838. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_root_conftest.py +0 -0
  839. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_run_quickstart_snippets.py +0 -0
  840. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sankey_visualization.py +0 -0
  841. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_autocommunity.py +0 -0
  842. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_generator.py +0 -0
  843. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_metrics.py +0 -0
  844. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_runner_integration.py +0 -0
  845. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_schema_and_immutable.py +0 -0
  846. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_seeding.py +0 -0
  847. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq.py +0 -0
  848. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq_empty_groups.py +0 -0
  849. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq_integration.py +0 -0
  850. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_negative_cases.py +0 -0
  851. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_registry.py +0 -0
  852. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_types.py +0 -0
  853. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_verification.py +0 -0
  854. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sidecar.py +0 -0
  855. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sir_epidemic.py +0 -0
  856. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sir_multiplex.py +0 -0
  857. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_spectral_multilayer.py +0 -0
  858. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_statistical_report.py +0 -0
  859. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_comparison.py +0 -0
  860. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_core.py +0 -0
  861. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_edge_cases.py +0 -0
  862. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_provenance.py +0 -0
  863. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_provenance_dataclass.py +0 -0
  864. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_registry.py +0 -0
  865. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_scalar_uncertainty.py +0 -0
  866. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_verify.py +0 -0
  867. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stratified_uq.py +0 -0
  868. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_streaming_topk.py +0 -0
  869. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_successive_halving.py +0 -0
  870. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_supporting_extended.py +0 -0
  871. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_supra_matrix_function_centrality.py +0 -0
  872. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal.py +0 -0
  873. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_algorithms.py +0 -0
  874. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_builder.py +0 -0
  875. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_duration_parsing.py +0 -0
  876. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_multinet.py +0 -0
  877. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_utils_extended.py +0 -0
  878. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_view.py +0 -0
  879. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_windowed_queries.py +0 -0
  880. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_tensor_representation.py +0 -0
  881. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_tutorial_10min.py +0 -0
  882. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty.py +0 -0
  883. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_additional.py +0 -0
  884. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_builder_integration.py +0 -0
  885. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_dsl_integration.py +0 -0
  886. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_engines.py +0 -0
  887. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_oracles.py +0 -0
  888. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_algebra.py +0 -0
  889. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_integration.py +0 -0
  890. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_resolution.py +0 -0
  891. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_spine.py +0 -0
  892. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_user_journey_simulation.py +0 -0
  893. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils.py +0 -0
  894. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_coverage.py +0 -0
  895. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_extended.py +0 -0
  896. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_validation.py +0 -0
  897. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_validation_module.py +0 -0
  898. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_api_differential.py +0 -0
  899. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_centrality.py +0 -0
  900. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_communities.py +0 -0
  901. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_determinism_parallelism.py +0 -0
  902. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_dsl_equivalence.py +0 -0
  903. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_metamorphic_harness.py +0 -0
  904. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_provenance_oracles.py +0 -0
  905. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_versatility.py +0 -0
  906. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_benchmark.py +0 -0
  907. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_bezier.py +0 -0
  908. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_colors.py +0 -0
  909. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_imports.py +0 -0
  910. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_layouts.py +0 -0
  911. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_multilayer_additional.py +0 -0
  912. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_polyfit.py +0 -0
  913. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_supra_heatmap.py +0 -0
  914. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualize_matrix_fix.py +0 -0
  915. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_workflows.py +0 -0
  916. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_additional.py +0 -0
  917. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_benchmark_nodes.py +0 -0
  918. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_node2vec.py +0 -0
  919. {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_r_interop.py +0 -0
  920. {py3plex-1.1.5 → py3plex-2.0.0}/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.5
3
+ Version: 2.0.0
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
 
@@ -103,8 +112,8 @@ Dynamic: license-file
103
112
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/py3plex)](https://pypistats.org/packages/py3plex)
104
113
  ![CLI Tool](https://img.shields.io/badge/CLI%20Tool-Available-brightgreen)
105
114
  ![Docker](https://img.shields.io/badge/Docker-Available-blue)
106
- ![Lines of Code](https://img.shields.io/badge/lines-209.4K-blue)
107
- ![Test Count](https://img.shields.io/badge/tests-9.0K-blue)
115
+ ![Lines of Code](https://img.shields.io/badge/lines-211.4K-blue)
116
+ ![Test Count](https://img.shields.io/badge/tests-9.2K-blue)
108
117
 
109
118
  *Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
110
119
  some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
@@ -164,6 +173,14 @@ print(df[["id", "layer", "community_id",
164
173
  "betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
165
174
  ```
166
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
+
167
184
  **Example output:**
168
185
  ```
169
186
  id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
@@ -183,6 +200,30 @@ print(df[["id", "layer", "community_id",
183
200
  - **Interpretability**: `.explain()` enriches results with community IDs, top interaction partners, and layer presence
184
201
  - **Composite scoring**: Weighted combination of multiple centrality measures for robust ranking
185
202
 
203
+ ### Ecosystem positioning
204
+
205
+ | Comparator | Ecosystem | Primary scope | Where it overlaps with py3plex 2.0 | py3plex 2.0 positioning |
206
+ |---|---|---|---|---|
207
+ | **py3plex 2019** | Python | Multilayer network visualization and analysis | Direct historical predecessor: multilayer representation, aggregation, indexing, traversal, visualization, and embedding-assisted layouts | **Historical foundation.** py3plex 2.0 extends the original toolkit from visualization-oriented analysis into a reproducible, query-driven multilayer network science environment. |
208
+ | **pymnet** | Python | General multilayer network representation, metrics, random models, and visualization | Strong overlap on formal multilayer data structures, multilayer metrics, transformations, random models, and visualization | **Closest Python multilayer comparator.** pymnet is strongest as a formal multilayer framework; py3plex 2.0 is strongest as a workflow, DSL, uncertainty, and reproducibility layer. |
209
+ | **MultiNetX** | Python / NetworkX | NetworkX-style multilayer graph manipulation, spectral analysis, and visualization | Overlap on Python-native multilayer graph objects, supra-adjacency/Laplacian workflows, and visualization | **Lightweight Python comparator.** MultiNetX provides compact multilayer graph utilities; py3plex 2.0 provides a broader end-to-end analysis and workflow environment. |
210
+ | **muxViz** | R / desktop ecosystem | Multilayer and multiplex visual analytics | Overlap on multilayer visualization, centrality, community detection, motifs, structural reducibility, and dynamic visualization | **R visual-analytics comparator.** muxViz is strongest for visual exploration; py3plex 2.0 emphasizes Python-native, scriptable, DSL-driven, reproducible analysis. |
211
+ | **R `multinet`** | R | Multiplex and multilayer social-network analysis and mining | Overlap on multilayer representation, import/export, attributes, centrality, community detection, generation, and plotting | **R social-network comparator.** `multinet` is strongest for multiplex social-network analysis; py3plex 2.0 targets broader heterogeneous scientific multilayer workflows in Python. |
212
+ | **tnetwork** | Python | Temporal-network manipulation and dynamic communities | Overlap on temporal slicing, dynamic graphs, and evolving-community analysis | **Temporal-community comparator.** tnetwork focuses on temporal community workflows; py3plex 2.0 embeds temporal analysis inside a broader multilayer DSL/workflow stack. |
213
+ | **DyNetx** | Python / NetworkX | Dynamic graph extension for NetworkX | Overlap on time-varying graph representation, snapshots, interaction streams, and temporal slicing | **Dynamic-NetworkX comparator.** DyNetx handles dynamic graphs; py3plex 2.0 adds multilayer semantics, declarative analysis, integrated dynamics, and reusable workflows. |
214
+ | **Reticula** | Python with C++ core | Fast static and temporal network / hypergraph analysis | Overlap on temporal networks, reachability, randomized models, and dynamical-process analysis | **Performance temporal/hypergraph comparator.** Reticula is stronger for fast temporal and hypergraph analysis; py3plex 2.0 is stronger for multilayer workflow integration and analyst ergonomics. |
215
+ | **Raphtory** | Rust / Python | Temporal graph engine and deployment platform | Overlap on temporal graph views, time-aware querying, reachability, motifs, and deployment-oriented graph analysis | **Modern temporal-engine comparator.** Raphtory is an engine/platform; py3plex 2.0 is a multilayer network-science workflow layer with DSL, uncertainty, dynamics, and reproducible analysis. |
216
+ | **pathpy / pathpyG** | Python / PyTorch ecosystem | Path-centric temporal-network analytics and graph learning | Overlap on temporal analytics, time-respecting paths, temporal centralities, visualization, and graph-learning handoff | **Temporal graph-learning comparator.** pathpy/pathpyG is adjacent; py3plex 2.0 focuses on multilayer network science, layer-aware querying, uncertainty, and reproducible workflows. |
217
+ | **NetworkX** | Python | General graph creation, manipulation, and algorithms | Overlap on core graph algorithms, graph data structures, centrality, communities, and Python graph workflows | **General graph substrate.** NetworkX is the base graph ecosystem; py3plex 2.0 adds multilayer semantics, DSL queries, layer algebra, temporal/dynamics workflows, and structured outputs. |
218
+ | **igraph** | C / R / Python | Efficient general-purpose network analysis | Overlap on centrality, community detection, graph transformations, and scalable graph analysis | **Efficient general-graph comparator.** igraph is the speed/breadth baseline; py3plex 2.0 differentiates through multilayer-specific workflows and reproducible analyst interfaces. |
219
+ | **graph-tool** | Python with C++ core | High-performance graph algorithms and statistical network modeling | Overlap on large-network statistics, community detection, inference, and performance-sensitive graph analysis | **Performance/statistical comparator.** graph-tool is strongest for efficient statistical graph analysis; py3plex 2.0 prioritizes multilayer expressiveness, querying, uncertainty, and workflow integration. |
220
+ | **tidygraph** | R / tidyverse | Tidy, dplyr-style graph manipulation | Overlap on chainable, analyst-friendly node/edge manipulation and graph-as-table workflows | **Analyst-grammar comparator.** tidygraph motivates fluent graph manipulation; py3plex 2.0 adapts this style to Python multilayer networks with DSL, builder APIs, and layer-aware grouping. |
221
+ | **NDlib** | Python | Diffusion and epidemic processes on networks | Overlap on SIS/SIR-style processes, random walks, spreading dynamics, and simulation workflows | **Dynamics comparator.** NDlib specializes in diffusion; py3plex 2.0 embeds dynamics inside multilayer, temporal, queryable, uncertainty-aware workflows. |
222
+ | **PyTorch Geometric** | Python / PyTorch | Graph neural networks and geometric deep learning | Overlap on graph embeddings, graph data preparation, and downstream graph-learning workflows | **Graph-ML comparator.** PyG trains graph neural models; py3plex 2.0 prepares, queries, explains, summarizes, and analyzes multilayer networks. |
223
+ | **DGL** | Python / deep-learning frameworks | Scalable graph deep learning and message passing | Overlap on heterogeneous graph processing, graph learning, and scalable graph ML pipelines | **Scalable graph-ML comparator.** DGL addresses GNN systems engineering; py3plex 2.0 addresses multilayer network science, query abstractions, uncertainty, temporal analysis, and workflows. |
224
+ | **Neo4j / Cypher** | Database systems | Persistent property-graph storage and declarative graph querying | Overlap on declarative graph querying and pattern-style graph access | **Graph-query comparator.** Cypher queries persistent property graphs; py3plex 2.0 provides an in-memory scientific DSL for multilayer network analysis, metrics, uncertainty, and exports. |
225
+ | **py3plex 2.0** | Python | Query-driven, reproducible multilayer network analysis | Integrates capabilities otherwise spread across multilayer libraries, temporal engines, graph libraries, graph-ML frameworks, graph-query systems, and workflow tools | **Current version** py3plex 2.0 is best framed as a Python-native workflow layer for multilayer network science: DSL + builder API, layer algebra, QueryResult exports, uncertainty-first statistics, temporal/dynamics workflows, null models, CLI/config execution, and agent-facing interfaces. |
226
+
186
227
  ![Py3plex Visualization Showcase](example_images/py3plex_showcase.png)
187
228
 
188
229
  ## Getting Started
@@ -227,8 +268,39 @@ pip install py3plex[viz]
227
268
 
228
269
  # All optional features
229
270
  pip install py3plex[mcp,algos,viz]
271
+
272
+ # Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
273
+ pip install py3plex[optional]
230
274
  ```
231
275
 
276
+ ### Contributing (First PR Quick Path)
277
+
278
+ If this is your first contribution, use this sequence:
279
+
280
+ ```bash
281
+ # 1) Create local dev environment and install package
282
+ make setup
283
+ make dev-install
284
+
285
+ # 2) Run formatting and checks before opening a PR
286
+ make format
287
+ make lint
288
+ make test
289
+ ```
290
+
291
+ Helpful commands:
292
+
293
+ ```bash
294
+ make help # List all project commands
295
+ make ci # Run lint + tests in CI-style order
296
+ ```
297
+
298
+ Safety notes for contributors:
299
+ - Keep changes focused and add tests next to the feature you modify.
300
+ - Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
301
+ - Prefer running targeted tests first, then broader checks before opening a PR.
302
+ - For docs-only updates, run `make docs-check` before opening a PR.
303
+
232
304
  ### MCP Integration (AI Agents)
233
305
 
234
306
  py3plex provides a Model Context Protocol (MCP) server for integration with AI coding assistants:
@@ -13,8 +13,8 @@
13
13
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/py3plex)](https://pypistats.org/packages/py3plex)
14
14
  ![CLI Tool](https://img.shields.io/badge/CLI%20Tool-Available-brightgreen)
15
15
  ![Docker](https://img.shields.io/badge/Docker-Available-blue)
16
- ![Lines of Code](https://img.shields.io/badge/lines-209.4K-blue)
17
- ![Test Count](https://img.shields.io/badge/tests-9.0K-blue)
16
+ ![Lines of Code](https://img.shields.io/badge/lines-211.4K-blue)
17
+ ![Test Count](https://img.shields.io/badge/tests-9.2K-blue)
18
18
 
19
19
  *Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
20
20
  some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
@@ -74,6 +74,14 @@ print(df[["id", "layer", "community_id",
74
74
  "betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
75
75
  ```
76
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
+
77
85
  **Example output:**
78
86
  ```
79
87
  id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
@@ -93,6 +101,30 @@ print(df[["id", "layer", "community_id",
93
101
  - **Interpretability**: `.explain()` enriches results with community IDs, top interaction partners, and layer presence
94
102
  - **Composite scoring**: Weighted combination of multiple centrality measures for robust ranking
95
103
 
104
+ ### Ecosystem positioning
105
+
106
+ | Comparator | Ecosystem | Primary scope | Where it overlaps with py3plex 2.0 | py3plex 2.0 positioning |
107
+ |---|---|---|---|---|
108
+ | **py3plex 2019** | Python | Multilayer network visualization and analysis | Direct historical predecessor: multilayer representation, aggregation, indexing, traversal, visualization, and embedding-assisted layouts | **Historical foundation.** py3plex 2.0 extends the original toolkit from visualization-oriented analysis into a reproducible, query-driven multilayer network science environment. |
109
+ | **pymnet** | Python | General multilayer network representation, metrics, random models, and visualization | Strong overlap on formal multilayer data structures, multilayer metrics, transformations, random models, and visualization | **Closest Python multilayer comparator.** pymnet is strongest as a formal multilayer framework; py3plex 2.0 is strongest as a workflow, DSL, uncertainty, and reproducibility layer. |
110
+ | **MultiNetX** | Python / NetworkX | NetworkX-style multilayer graph manipulation, spectral analysis, and visualization | Overlap on Python-native multilayer graph objects, supra-adjacency/Laplacian workflows, and visualization | **Lightweight Python comparator.** MultiNetX provides compact multilayer graph utilities; py3plex 2.0 provides a broader end-to-end analysis and workflow environment. |
111
+ | **muxViz** | R / desktop ecosystem | Multilayer and multiplex visual analytics | Overlap on multilayer visualization, centrality, community detection, motifs, structural reducibility, and dynamic visualization | **R visual-analytics comparator.** muxViz is strongest for visual exploration; py3plex 2.0 emphasizes Python-native, scriptable, DSL-driven, reproducible analysis. |
112
+ | **R `multinet`** | R | Multiplex and multilayer social-network analysis and mining | Overlap on multilayer representation, import/export, attributes, centrality, community detection, generation, and plotting | **R social-network comparator.** `multinet` is strongest for multiplex social-network analysis; py3plex 2.0 targets broader heterogeneous scientific multilayer workflows in Python. |
113
+ | **tnetwork** | Python | Temporal-network manipulation and dynamic communities | Overlap on temporal slicing, dynamic graphs, and evolving-community analysis | **Temporal-community comparator.** tnetwork focuses on temporal community workflows; py3plex 2.0 embeds temporal analysis inside a broader multilayer DSL/workflow stack. |
114
+ | **DyNetx** | Python / NetworkX | Dynamic graph extension for NetworkX | Overlap on time-varying graph representation, snapshots, interaction streams, and temporal slicing | **Dynamic-NetworkX comparator.** DyNetx handles dynamic graphs; py3plex 2.0 adds multilayer semantics, declarative analysis, integrated dynamics, and reusable workflows. |
115
+ | **Reticula** | Python with C++ core | Fast static and temporal network / hypergraph analysis | Overlap on temporal networks, reachability, randomized models, and dynamical-process analysis | **Performance temporal/hypergraph comparator.** Reticula is stronger for fast temporal and hypergraph analysis; py3plex 2.0 is stronger for multilayer workflow integration and analyst ergonomics. |
116
+ | **Raphtory** | Rust / Python | Temporal graph engine and deployment platform | Overlap on temporal graph views, time-aware querying, reachability, motifs, and deployment-oriented graph analysis | **Modern temporal-engine comparator.** Raphtory is an engine/platform; py3plex 2.0 is a multilayer network-science workflow layer with DSL, uncertainty, dynamics, and reproducible analysis. |
117
+ | **pathpy / pathpyG** | Python / PyTorch ecosystem | Path-centric temporal-network analytics and graph learning | Overlap on temporal analytics, time-respecting paths, temporal centralities, visualization, and graph-learning handoff | **Temporal graph-learning comparator.** pathpy/pathpyG is adjacent; py3plex 2.0 focuses on multilayer network science, layer-aware querying, uncertainty, and reproducible workflows. |
118
+ | **NetworkX** | Python | General graph creation, manipulation, and algorithms | Overlap on core graph algorithms, graph data structures, centrality, communities, and Python graph workflows | **General graph substrate.** NetworkX is the base graph ecosystem; py3plex 2.0 adds multilayer semantics, DSL queries, layer algebra, temporal/dynamics workflows, and structured outputs. |
119
+ | **igraph** | C / R / Python | Efficient general-purpose network analysis | Overlap on centrality, community detection, graph transformations, and scalable graph analysis | **Efficient general-graph comparator.** igraph is the speed/breadth baseline; py3plex 2.0 differentiates through multilayer-specific workflows and reproducible analyst interfaces. |
120
+ | **graph-tool** | Python with C++ core | High-performance graph algorithms and statistical network modeling | Overlap on large-network statistics, community detection, inference, and performance-sensitive graph analysis | **Performance/statistical comparator.** graph-tool is strongest for efficient statistical graph analysis; py3plex 2.0 prioritizes multilayer expressiveness, querying, uncertainty, and workflow integration. |
121
+ | **tidygraph** | R / tidyverse | Tidy, dplyr-style graph manipulation | Overlap on chainable, analyst-friendly node/edge manipulation and graph-as-table workflows | **Analyst-grammar comparator.** tidygraph motivates fluent graph manipulation; py3plex 2.0 adapts this style to Python multilayer networks with DSL, builder APIs, and layer-aware grouping. |
122
+ | **NDlib** | Python | Diffusion and epidemic processes on networks | Overlap on SIS/SIR-style processes, random walks, spreading dynamics, and simulation workflows | **Dynamics comparator.** NDlib specializes in diffusion; py3plex 2.0 embeds dynamics inside multilayer, temporal, queryable, uncertainty-aware workflows. |
123
+ | **PyTorch Geometric** | Python / PyTorch | Graph neural networks and geometric deep learning | Overlap on graph embeddings, graph data preparation, and downstream graph-learning workflows | **Graph-ML comparator.** PyG trains graph neural models; py3plex 2.0 prepares, queries, explains, summarizes, and analyzes multilayer networks. |
124
+ | **DGL** | Python / deep-learning frameworks | Scalable graph deep learning and message passing | Overlap on heterogeneous graph processing, graph learning, and scalable graph ML pipelines | **Scalable graph-ML comparator.** DGL addresses GNN systems engineering; py3plex 2.0 addresses multilayer network science, query abstractions, uncertainty, temporal analysis, and workflows. |
125
+ | **Neo4j / Cypher** | Database systems | Persistent property-graph storage and declarative graph querying | Overlap on declarative graph querying and pattern-style graph access | **Graph-query comparator.** Cypher queries persistent property graphs; py3plex 2.0 provides an in-memory scientific DSL for multilayer network analysis, metrics, uncertainty, and exports. |
126
+ | **py3plex 2.0** | Python | Query-driven, reproducible multilayer network analysis | Integrates capabilities otherwise spread across multilayer libraries, temporal engines, graph libraries, graph-ML frameworks, graph-query systems, and workflow tools | **Current version** py3plex 2.0 is best framed as a Python-native workflow layer for multilayer network science: DSL + builder API, layer algebra, QueryResult exports, uncertainty-first statistics, temporal/dynamics workflows, null models, CLI/config execution, and agent-facing interfaces. |
127
+
96
128
  ![Py3plex Visualization Showcase](example_images/py3plex_showcase.png)
97
129
 
98
130
  ## Getting Started
@@ -137,8 +169,39 @@ pip install py3plex[viz]
137
169
 
138
170
  # All optional features
139
171
  pip install py3plex[mcp,algos,viz]
172
+
173
+ # Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
174
+ pip install py3plex[optional]
140
175
  ```
141
176
 
177
+ ### Contributing (First PR Quick Path)
178
+
179
+ If this is your first contribution, use this sequence:
180
+
181
+ ```bash
182
+ # 1) Create local dev environment and install package
183
+ make setup
184
+ make dev-install
185
+
186
+ # 2) Run formatting and checks before opening a PR
187
+ make format
188
+ make lint
189
+ make test
190
+ ```
191
+
192
+ Helpful commands:
193
+
194
+ ```bash
195
+ make help # List all project commands
196
+ make ci # Run lint + tests in CI-style order
197
+ ```
198
+
199
+ Safety notes for contributors:
200
+ - Keep changes focused and add tests next to the feature you modify.
201
+ - Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
202
+ - Prefer running targeted tests first, then broader checks before opening a PR.
203
+ - For docs-only updates, run `make docs-check` before opening a PR.
204
+
142
205
  ### MCP Integration (AI Agents)
143
206
 
144
207
  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.5"
55
- __api_version__ = "1.1.5"
54
+ __version__ = "2.0.0"
55
+ __api_version__ = "2.0.0"
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 (
@@ -163,7 +164,6 @@ from py3plex.datasets import (
163
164
  make_random_multiplex,
164
165
  make_social_network,
165
166
  )
166
-
167
167
  # Dynamics module for simulating dynamical processes
168
168
  from py3plex.dynamics import (
169
169
  D,
@@ -198,6 +198,44 @@ from py3plex.uncertainty import (
198
198
  uncertainty_enabled,
199
199
  estimate_uncertainty,
200
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)
201
239
 
202
240
  __all__ = [
203
241
  # Version info
@@ -299,6 +337,13 @@ __all__ = [
299
337
  "make_social_network",
300
338
  "list_datasets",
301
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",
302
347
  # Dynamics (simulation)
303
348
  "D",
304
349
  "SimulationBuilder",
@@ -326,4 +371,13 @@ __all__ = [
326
371
  "capabilities",
327
372
  "capabilities_flat",
328
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",
329
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
+ }
@@ -1221,7 +1221,7 @@ def execute_autocommunity_sh(
1221
1221
  import importlib.metadata
1222
1222
  py3plex_version = importlib.metadata.version('py3plex')
1223
1223
  except Exception:
1224
- py3plex_version = '1.1.2' # Fallback for development installs
1224
+ from py3plex import __version__ as py3plex_version
1225
1225
 
1226
1226
  provenance = {
1227
1227
  'engine': 'autocommunity_successive_halving',
@@ -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