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.
- {py3plex-1.1.5/py3plex.egg-info → py3plex-2.0.0}/PKG-INFO +76 -4
- {py3plex-1.1.5 → py3plex-2.0.0}/README.md +65 -2
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/__init__.py +57 -3
- py3plex-2.0.0/py3plex/agent.py +216 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/autocommunity_executor.py +1 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/powerlaw.py +1 -17
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/metrics.py +3 -3
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/cli.py +101 -38
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/config.py +2 -2
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/multinet.py +114 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/random_generators.py +4 -4
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_generators.py +9 -5
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/ast.py +86 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/builder.py +198 -4
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/errors.py +4 -3
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executor.py +66 -5
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executor_semiring.py +11 -29
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/types.py +5 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/reduction.py +12 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/result.py +126 -2
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/uq_resolution.py +8 -9
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/warnings.py +121 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl_legacy.py +11 -2
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/linter.py +116 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/__init__.py +18 -1
- py3plex-2.0.0/py3plex/ml/embedding/evaluation.py +149 -0
- py3plex-2.0.0/py3plex/ml/embedding/multiplex.py +869 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/runner.py +17 -4
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/utils.py +0 -42
- {py3plex-1.1.5 → py3plex-2.0.0/py3plex.egg-info}/PKG-INFO +76 -4
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/SOURCES.txt +21 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/requires.txt +12 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/__init__.py +2 -2
- {py3plex-1.1.5 → py3plex-2.0.0}/pyproject.toml +13 -2
- py3plex-2.0.0/tests/test_agent_api.py +250 -0
- py3plex-2.0.0/tests/test_agents_documentation_claims.py +42 -0
- py3plex-2.0.0/tests/test_algorithms_requirements_registry.py +84 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_conf.py +1 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_manuscript_integrity.py +5 -5
- py3plex-2.0.0/tests/test_ci_python_versions.py +16 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli.py +30 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_ergonomics.py +19 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_data_files_presence.py +1 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_docs_embeddings_section.py +22 -0
- py3plex-2.0.0/tests/test_docs_quality_pass.py +44 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_edge_grouping_coverage.py +14 -0
- py3plex-2.0.0/tests/test_dsl_legacy_approximate.py +134 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_planner.py +23 -0
- py3plex-2.0.0/tests/test_dsl_result_algebra_edge_cases.py +96 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uncertainty.py +18 -1
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_v2.py +121 -0
- py3plex-2.0.0/tests/test_embeddings_direct_units.py +231 -0
- py3plex-2.0.0/tests/test_ergonomics_helpers.py +105 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_CBSSD.py +4 -19
- py3plex-2.0.0/tests/test_example_interactive_multilayer.py +27 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_roundtrip.py +57 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_linter.py +73 -2
- py3plex-2.0.0/tests/test_ml_embedding_evaluation.py +159 -0
- py3plex-2.0.0/tests/test_multilayer_embedding_models.py +219 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_visualizations.py +0 -108
- py3plex-2.0.0/tests/test_optimizer_submodules.py +329 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugin_system.py +23 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugins_contracts.py +20 -0
- py3plex-2.0.0/tests/test_profiling_additional.py +52 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_replay.py +27 -0
- py3plex-2.0.0/tests/test_public_api_exports.py +60 -0
- py3plex-2.0.0/tests/test_pypi_publish_workflow.py +7 -0
- py3plex-2.0.0/tests/test_readme_contributor_onboarding.py +41 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_roundtrip_invariants.py +25 -3
- py3plex-2.0.0/tests/test_semiring_pareto.py +110 -0
- py3plex-2.0.0/tests/test_sensitivity_executor.py +197 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_dsl.py +29 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_utils.py +7 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_defaults.py +18 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_runner.py +11 -12
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_search_paths.py +0 -23
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_version_consistency.py +49 -0
- py3plex-2.0.0/tests/test_visualization_ricci_layout_helpers.py +60 -0
- py3plex-1.1.5/py3plex/ml/embedding/evaluation.py +0 -55
- py3plex-1.1.5/py3plex/ml/embedding/multiplex.py +0 -95
- {py3plex-1.1.5 → py3plex-2.0.0}/LICENSE +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/MANIFEST.in +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/__main__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/_parallel.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/backend.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/closure.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/fixed_point.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/lift.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/semiring.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algebra/witness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/advanced_random_generators.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/attribute_correlation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_betweenness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_closeness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/approx_pagerank.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality/explain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/centrality_toolkit.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_comparison.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/NoRC.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/auto_select.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/autocommunity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/budget.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_louvain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_measures.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_ranking.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/community_wrapper.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/distributional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/flow_hierarchy.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/conftest.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-bipartite.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-file-io.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-multiplex.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-networkx.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-simple.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram-expanded.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/infomap.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/infomap/interfaces/python/setup.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/label_propagation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/leiden_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/leiden_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_benchmark.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_modularity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/multilayer_quality_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/node_ranking.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/runner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/sbm_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/sbm_wrapper.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/spectral_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/successive_halving.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/curvature/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/curvature/ollivier_ricci_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/benchmark_classification.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/general/walkers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/graph_summarization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/__main__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/assets/builtin.n3 +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/converters.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/example.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/helpers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/kb.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/load.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/predicate.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/rule.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/settings.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/core/term_parsers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/bottomup.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/learner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/learners/optimal.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/adjustment.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/scorefunctions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/significance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/hedwig/stats/validate.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/layer_similarity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/meta_flow_report.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multicentrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/entanglement.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/multirank.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/multixrank.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/supra_matrix_function_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_algorithms/versatility.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/multilayer_clustering.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/PPR.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/network_classification/label_propagation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/node_ranking/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/node_ranking/node_ranking.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/requirements_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/robustness_testing.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/routing/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/routing/multiplex_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/conversions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/diagnostics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/inference_vi.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/model_selection.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/multilayer_sbm.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/objectives.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sbm/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/sir_multiplex.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistical_report.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/basic_statistics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/bayesian_distances.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/bayesiantests.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/correlation_networks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/critical_distances.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/enrichment_modules.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/multilayer_statistics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/stats_comparison.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/statistics/topology.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal/community.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/temporal_multiplex/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/term_parsers/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/features.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/alignment/solvers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/budget.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/benchmarks/runners.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/centrality/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/centrality/robustness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/generator.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/learner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/scorer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/claims/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/comparison/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/convert.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/dgl_converter.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/igraph_converter.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/networkx_converter.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/pyg_converter.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/converters/scipy_converter.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/equality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/ir.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/compat/sidecar.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/contract.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/engine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/failure_modes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/predicates.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/contracts/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/IO.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/dataStructures.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/HINMINE/decomposition.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/converters.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/immutable.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/lazy_evaluation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/nx_compat.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/parsers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/schema_validation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/supporting.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/temporal_multinet.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/core/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/claim_lang.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/ddmin.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/engine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterexamples/witness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/comparator.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/engine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/presets.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/counterfactual/spec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_data/aarhus_cs.edges +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_data/synthetic_multilayer.edges +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/datasets/_loaders.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/builders.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/codes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/diagnostics/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/algebra.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/attribution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/benchmark.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/benchmark_result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/cache.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/communities.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/community_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/compositional_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/context.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executors/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/executors/benchmark_executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/explain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/export.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/expressions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/fastpath.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/layers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/diagnostic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/lint_context.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl001_unknown_layer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl002_unknown_attribute.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl101_type_mismatch.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl201_unsatisfiable.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/dsl202_redundant.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/perf301_full_scan.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/rules/perf302_cross_layer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/type_resolver.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/lint/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/operator_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/builder.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/compiler.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/engine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/ir.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/patterns/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/planner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/predictive.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/cache.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/cost.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/diff.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/distribution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/explain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/program.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/program/rewrite.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/provenance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/selection_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/serializer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dsl/uq_algebra.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/ast.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/builder.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/compartmental.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/config.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/models.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/processes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/dynamics/serializer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/cache.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/link_ops.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/metapath2vec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/embeddings/netmf.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ergonomics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/artifacts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/cli.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/env.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/model.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/runner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/store.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/experiments/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/fast_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/graph_ops.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/api.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/canonical_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/converters.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/arrow_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/csv_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/formats/json_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/multinet_bridge.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/parquet_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/io/schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/lab/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/lab/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/logging_config.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/builder.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/stats.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/meta/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/deepwalk.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/line.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/metapath2vec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/netmf.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/node2vec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/similarity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/trainer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/ml/embedding/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/multinet/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/multinet/aggregation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/models.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/nullmodels/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/cost_model.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/logical_plan.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/optimizer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/physical_plan.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/plan_nodes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/optimizer/rules.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/cli.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/network.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/operators.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/readers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/spill.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/out_of_core/utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/algorithms.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/paths/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/pipeline.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/plugins/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/profiling.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/bundle.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/capture.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/replay.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/provenance/schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/requirements.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/experiments.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/robustness/perturbations.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/runtime/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/runtime/capabilities.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/capabilities.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/community_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/evaluate.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/metric_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/selection/wins.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/engine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/pareto.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/semiring/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/perturbations.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/sensitivity/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/provenance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/statvalue.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/stats/uncertainty.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_utils_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/temporal_view.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/bootstrap.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/ci_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/community_ensemble.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/community_result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/context.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/estimation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/noise_models.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/null_models.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_reducers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/partition_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/plan.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/reducers/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/reducers/base.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/resampling_graph.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_execution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_reducers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/selection_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/stratification.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/uncertainty/types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/validation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/benchmark_visualizations.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/bezier.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/colors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/drawing_machinery.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/embedding_tools.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/embedding_visualization/embedding_visualization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/fa2util.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/fa2/forceatlas2.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/layout_algorithms.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/polyfit.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/pymnet_style.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/ricci_layout.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/ricci_multilayer_vis.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/visualization/sankey.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/workflows.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/__init__.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/benchmark_nodes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/r_interop.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex/wrappers/train_node2vec_embedding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/dependency_links.txt +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/entry_points.txt +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/not-zip-safe +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex.egg-info/top_level.txt +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/safe_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/schemas.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/py3plex_mcp/server.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/setup.cfg +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_advanced_metrics_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_agents_ergonomics_features.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_agents_golden_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_aggregation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_backend.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_fixed_point.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algebra_witness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithm_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_attribute_correlation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_correlation_networks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_init.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_random_generators.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_algorithms_statistics_bayesian_distances.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_alignment_correctness_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_approximate_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ast_roundtrip.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ast_roundtrip_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_attribute_correlation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_attribute_correlation_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_auto_community.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_benchmarks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_meta.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_autocommunity_successive_halving.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_bayesian_distances.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_bench_aggregation_unit.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_budget_fairness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_dsl_basic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_multiplex_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmark_time.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmarks_budget.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_benchmarks_init.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_book_snippets.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_builder_dsl_mutate.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_capabilities_basic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_capabilities_optional_missing.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_explain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_explain_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_robustness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_robustness_oracles.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_uncertainty.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_centrality_weight_handling.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_api_consistency.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_doc_coverage.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_check_type_coverage.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_claim_learning.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_claims_types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_check.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_cli_piping.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_clustering_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_code_improvements.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_detection_modules.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_distribution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_community_measures.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_metrics_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_comparison_uninitialized_and_resistance_oracles.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_compat_exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_compat_roundtrip.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_config_api.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_config_benchmark.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_basic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_failure_modes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_contracts_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_functionality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_immutable.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_lazy_evaluation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multinet_and_parsers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multinet_correctness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_multiplex_edges.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_schema_validation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_core_supporting.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_correlation_networks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterexamples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterexamples_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterfactual.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_counterfactual_presets.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_coverage_grouping.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_create_mosaic_banner.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_create_showcase_flow.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_crosshair_pure_functions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_datasets_oracles.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_degenerate_networks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_determinism_randomness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_diagnostics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_diagnostics_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_doc_conf.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_docs_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_doctests.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dplyr_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_aggregation_enhancements.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_ast_equivalence.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_auto_community.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_communities.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_community_filtering.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_community_uq_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_compact_compute.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_compositional_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_condition_semantics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_d_factory.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_documentation_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_dplyr_style.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_dynamics_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_edge_queries.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_enhancements.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_ergonomics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_errors_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_executor_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_explain.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_export.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_expressions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_extensions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_graphops_equivalence.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_grouping_coverage.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_interactive.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_joins.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_layer_selection.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_layer_set_algebra.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_legacy_edges.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_lint.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_operators.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_patterns.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_patterns_quick_reference.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_pipes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_predict_reduce.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_program_rewrite.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_program_types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_progress_logging.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_provenance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_query_optimization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_query_zoo.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_selection_fastpath.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_semiring_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_serializer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_smart_defaults.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_temporal_range_execution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uq_ergonomics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_uq_propagation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dsl_zoo_features.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_algorithm_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_config_and_results_correctness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_conservation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_executor_edge_cases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_parallel_determinism.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_reference_runs.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_uq_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_dynamics_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_edge_cases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_edgelist_format.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ergonomic_helpers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ergonomics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_community_detection.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_decomposition_and_classification.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_decomposition_ground_truth.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_dsl_builder_api.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_dynamics_core_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_embedding_construction.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_embedding_visualization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_incidence_gadget_encoding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_inverse_network.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_layer_extraction.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_manipulation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multilayer_vectorized_aggregation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multiplex_aggregate.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_multiplex_dynamics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_n2v_embedding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_network_decomposition.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_network_decomposition_meta_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_numeric_encoding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_pattern_matching.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_example_ppr.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_examples_zoo_consolidation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_exception_taxonomy.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_experiments.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_explain_attribution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_fast_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_flagship_progress_demo.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_flow_hierarchy.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_fuzzing_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_all_outputs.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_quickstart_outputs.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_generate_visualization_images.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_golden_toy_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_graph_ops.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_graph_summarization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_hedwig_adjustment.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_hedwig_significance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_improved_errors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_incidence_gadget_encoding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_infomap_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_interlayer_links_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_api_edge_cases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_arrow.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_contracts_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_converters.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_exceptions.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_io_schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_issue_19_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lab_correctness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_label_propagation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layer_extraction_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layer_similarity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_layout_algorithms.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_lazy_evaluation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_leiden_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_link_checker.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_logging_conversion.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_main_module.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_master_regulators_example.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_math_invariants.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_mcp_server.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_meta_analysis.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_meta_flow_report.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_metamorphic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_metapath2vec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ml_embedding_primitives.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_monoplex_nx_wrapper.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_mpc.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_clustering_coefficients.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_cornercases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_edge_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_leiden_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_modularity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_quality_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multilayer_statistics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multinet_aggregation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multinet_aggregation_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_layer_interop.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_participation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multiplex_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multirank.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_multixrank.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_network_conversion.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_network_version.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_networkx_compatibility.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_new_algorithms.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_new_multilayer_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_node_edge_parity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_node_ranking_comprehensive.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_norc.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodel_sanity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodels.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nullmodels_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_nx_compat_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ollivier_ricci_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_out_of_core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parallel.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parallel_execution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parsers_comprehensive.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_parsers_coverage.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_partition_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_partition_uq_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_contracts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_paths_result.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_performance_core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_pipeline.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugin_examples.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_plugins.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_profiling.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_program.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_program_cost_executor.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_properties.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_canonical.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_provenance_schema.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_pymnet_style.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_query_algebra.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_query_equivalence.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_r_interop.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_generators_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_generators_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_walkers.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_random_walks.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_readme_flagship_example.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_requirements.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_result_explain_debug.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_ricci_visualization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_robustness_testing.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_root_conftest.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_run_quickstart_snippets.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sankey_visualization.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_autocommunity.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_generator.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_metrics.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sbm_runner_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_schema_and_immutable.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_seeding.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq_empty_groups.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_selection_uq_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_negative_cases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_types.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_semiring_verification.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sidecar.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sir_epidemic.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_sir_multiplex.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_spectral_multilayer.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_statistical_report.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_comparison.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_core.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_edge_cases.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_provenance.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_provenance_dataclass.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_registry.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_scalar_uncertainty.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stats_verify.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_stratified_uq.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_streaming_topk.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_successive_halving.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_supporting_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_supra_matrix_function_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_algorithms.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_builder.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_duration_parsing.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_multinet.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_utils_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_view.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_temporal_windowed_queries.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_tensor_representation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_tutorial_10min.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_builder_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_dsl_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_engines.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uncertainty_oracles.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_algebra.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_integration.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_resolution.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_uq_spine.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_user_journey_simulation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_coverage.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_utils_extended.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_validation.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_validation_module.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_api_differential.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_centrality.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_communities.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_determinism_parallelism.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_dsl_equivalence.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_metamorphic_harness.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_verification_provenance_oracles.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_versatility.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_benchmark.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_bezier.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_colors.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_imports.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_layouts.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_multilayer_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_polyfit.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualization_supra_heatmap.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_visualize_matrix_fix.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_workflows.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_additional.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_benchmark_nodes.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_node2vec.py +0 -0
- {py3plex-1.1.5 → py3plex-2.0.0}/tests/test_wrappers_r_interop.py +0 -0
- {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:
|
|
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
|
[](https://pypistats.org/packages/py3plex)
|
|
104
113
|

|
|
105
114
|

|
|
106
|
-

|
|
116
|
+

|
|
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
|

|
|
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
|
[](https://pypistats.org/packages/py3plex)
|
|
14
14
|

|
|
15
15
|

|
|
16
|
-

|
|
17
|
+

|
|
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
|

|
|
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__ = "
|
|
55
|
-
__api_version__ = "
|
|
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
|
+
}
|
{py3plex-1.1.5 → py3plex-2.0.0}/py3plex/algorithms/community_detection/autocommunity_executor.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
+
multilayer_modularity,
|
|
129
129
|
)
|
|
130
130
|
|
|
131
131
|
try:
|
|
132
132
|
# Try multilayer-aware modularity first
|
|
133
|
-
if hasattr(network, "
|
|
134
|
-
return
|
|
133
|
+
if hasattr(network, "layers") and layers:
|
|
134
|
+
return multilayer_modularity(network, partition)
|
|
135
135
|
except Exception:
|
|
136
136
|
pass
|
|
137
137
|
|