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

|
|
104
114
|

|
|
105
|
-

|
|
116
|
+

|
|
107
117
|
|
|
108
118
|
*Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
|
|
109
119
|
some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
|
|
@@ -163,6 +173,14 @@ print(df[["id", "layer", "community_id",
|
|
|
163
173
|
"betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
|
|
164
174
|
```
|
|
165
175
|
|
|
176
|
+
### Safe chaining order (DSL v2)
|
|
177
|
+
|
|
178
|
+
Use a strict two-phase flow:
|
|
179
|
+
|
|
180
|
+
1. **Build query** on `Q...` (`.where()`, `.compute()`, `.order_by()`, `.per_layer()`, `.coverage()`, ...)
|
|
181
|
+
2. **Execute once** with `.execute(network)`
|
|
182
|
+
3. **Handle results** on `QueryResult` (`.to_pandas()`, `.group_summary()`, `.to_json()`, ...)
|
|
183
|
+
|
|
166
184
|
**Example output:**
|
|
167
185
|
```
|
|
168
186
|
id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
|
|
@@ -226,8 +244,38 @@ pip install py3plex[viz]
|
|
|
226
244
|
|
|
227
245
|
# All optional features
|
|
228
246
|
pip install py3plex[mcp,algos,viz]
|
|
247
|
+
|
|
248
|
+
# Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
|
|
249
|
+
pip install py3plex[optional]
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Contributing (First PR Quick Path)
|
|
253
|
+
|
|
254
|
+
If this is your first contribution, use this sequence:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# 1) Create local dev environment and install package
|
|
258
|
+
make setup
|
|
259
|
+
make dev-install
|
|
260
|
+
|
|
261
|
+
# 2) Run formatting and checks before opening a PR
|
|
262
|
+
make format
|
|
263
|
+
make lint
|
|
264
|
+
make test
|
|
229
265
|
```
|
|
230
266
|
|
|
267
|
+
Helpful commands:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
make help # List all project commands
|
|
271
|
+
make ci # Run lint + tests in CI-style order
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Safety notes for contributors:
|
|
275
|
+
- Keep changes focused and add tests next to the feature you modify.
|
|
276
|
+
- Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
|
|
277
|
+
- Prefer running targeted tests first, then broader checks before opening a PR.
|
|
278
|
+
|
|
231
279
|
### MCP Integration (AI Agents)
|
|
232
280
|
|
|
233
281
|
py3plex provides a Model Context Protocol (MCP) server for integration with AI coding assistants:
|
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
|
|
11
11
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
|
|
12
12
|
[](https://pypi.org/project/py3plex/)
|
|
13
|
+
[](https://pypistats.org/packages/py3plex)
|
|
13
14
|

|
|
14
15
|

|
|
15
|
-

|
|
17
|
+

|
|
17
18
|
|
|
18
19
|
*Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
|
|
19
20
|
some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
|
|
@@ -73,6 +74,14 @@ print(df[["id", "layer", "community_id",
|
|
|
73
74
|
"betweenness_centrality_ci95_high", "score", "top_neighbors"]].head(10))
|
|
74
75
|
```
|
|
75
76
|
|
|
77
|
+
### Safe chaining order (DSL v2)
|
|
78
|
+
|
|
79
|
+
Use a strict two-phase flow:
|
|
80
|
+
|
|
81
|
+
1. **Build query** on `Q...` (`.where()`, `.compute()`, `.order_by()`, `.per_layer()`, `.coverage()`, ...)
|
|
82
|
+
2. **Execute once** with `.execute(network)`
|
|
83
|
+
3. **Handle results** on `QueryResult` (`.to_pandas()`, `.group_summary()`, `.to_json()`, ...)
|
|
84
|
+
|
|
76
85
|
**Example output:**
|
|
77
86
|
```
|
|
78
87
|
id layer community_id betweenness_centrality__mean betweenness_centrality_ci95_low betweenness_centrality_ci95_high score top_neighbors
|
|
@@ -136,8 +145,38 @@ pip install py3plex[viz]
|
|
|
136
145
|
|
|
137
146
|
# All optional features
|
|
138
147
|
pip install py3plex[mcp,algos,viz]
|
|
148
|
+
|
|
149
|
+
# Common optional feature bundle (algorithms + visualization + workflows + arrow + mcp)
|
|
150
|
+
pip install py3plex[optional]
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Contributing (First PR Quick Path)
|
|
154
|
+
|
|
155
|
+
If this is your first contribution, use this sequence:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# 1) Create local dev environment and install package
|
|
159
|
+
make setup
|
|
160
|
+
make dev-install
|
|
161
|
+
|
|
162
|
+
# 2) Run formatting and checks before opening a PR
|
|
163
|
+
make format
|
|
164
|
+
make lint
|
|
165
|
+
make test
|
|
139
166
|
```
|
|
140
167
|
|
|
168
|
+
Helpful commands:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
make help # List all project commands
|
|
172
|
+
make ci # Run lint + tests in CI-style order
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Safety notes for contributors:
|
|
176
|
+
- Keep changes focused and add tests next to the feature you modify.
|
|
177
|
+
- Do not add new markdown files unless explicitly requested (enforced by `tests/test_link_checker.py` to prevent documentation drift).
|
|
178
|
+
- Prefer running targeted tests first, then broader checks before opening a PR.
|
|
179
|
+
|
|
141
180
|
### MCP Integration (AI Agents)
|
|
142
181
|
|
|
143
182
|
py3plex provides a Model Context Protocol (MCP) server for integration with AI coding assistants:
|
|
@@ -51,8 +51,8 @@ For detailed documentation, see: https://skblaz.github.io/py3plex/
|
|
|
51
51
|
"""
|
|
52
52
|
|
|
53
53
|
# Version information
|
|
54
|
-
__version__ = "1.1.
|
|
55
|
-
__api_version__ = "1.1.
|
|
54
|
+
__version__ = "1.1.7"
|
|
55
|
+
__api_version__ = "1.1.7"
|
|
56
56
|
|
|
57
57
|
from py3plex.core.multinet import multi_layer_network
|
|
58
58
|
from py3plex.core.types import (
|
|
@@ -123,6 +123,7 @@ from py3plex.profiling import (
|
|
|
123
123
|
profile_performance,
|
|
124
124
|
timed_section,
|
|
125
125
|
)
|
|
126
|
+
import py3plex.config as config
|
|
126
127
|
|
|
127
128
|
# Plugin system - import for easy access
|
|
128
129
|
from py3plex.plugins import (
|
|
@@ -146,6 +147,7 @@ from py3plex.pipeline import (
|
|
|
146
147
|
ComputeStats,
|
|
147
148
|
FilterNodes,
|
|
148
149
|
SaveNetwork,
|
|
150
|
+
NodeEmbedding,
|
|
149
151
|
)
|
|
150
152
|
|
|
151
153
|
# Config-driven workflows
|
|
@@ -162,7 +164,6 @@ from py3plex.datasets import (
|
|
|
162
164
|
make_random_multiplex,
|
|
163
165
|
make_social_network,
|
|
164
166
|
)
|
|
165
|
-
|
|
166
167
|
# Dynamics module for simulating dynamical processes
|
|
167
168
|
from py3plex.dynamics import (
|
|
168
169
|
D,
|
|
@@ -197,6 +198,44 @@ from py3plex.uncertainty import (
|
|
|
197
198
|
uncertainty_enabled,
|
|
198
199
|
estimate_uncertainty,
|
|
199
200
|
)
|
|
201
|
+
from py3plex.agent import (
|
|
202
|
+
load_network_from_path,
|
|
203
|
+
top_hubs_by_layer,
|
|
204
|
+
uncertainty_centrality,
|
|
205
|
+
community_detection_with_uq,
|
|
206
|
+
temporal_slice,
|
|
207
|
+
reproducible_export_bundle,
|
|
208
|
+
compare_networks,
|
|
209
|
+
summarize_result,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def save_to_arrow(network, path, **kwargs):
|
|
214
|
+
"""Lazy top-level alias for :func:`py3plex.io.save_to_arrow`."""
|
|
215
|
+
from py3plex.io import save_to_arrow as _save_to_arrow
|
|
216
|
+
|
|
217
|
+
return _save_to_arrow(network, path, **kwargs)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def load_from_arrow(path, as_multinet=True, **kwargs):
|
|
221
|
+
"""Lazy top-level alias for :func:`py3plex.io.load_from_arrow`."""
|
|
222
|
+
from py3plex.io import load_from_arrow as _load_from_arrow
|
|
223
|
+
|
|
224
|
+
return _load_from_arrow(path, as_multinet=as_multinet, **kwargs)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def save_network_to_parquet(network, path, **kwargs):
|
|
228
|
+
"""Lazy top-level alias for :func:`py3plex.io.save_network_to_parquet`."""
|
|
229
|
+
from py3plex.io import save_network_to_parquet as _save_network_to_parquet
|
|
230
|
+
|
|
231
|
+
return _save_network_to_parquet(network, path, **kwargs)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def load_network_from_parquet(path, **kwargs):
|
|
235
|
+
"""Lazy top-level alias for :func:`py3plex.io.load_network_from_parquet`."""
|
|
236
|
+
from py3plex.io import load_network_from_parquet as _load_network_from_parquet
|
|
237
|
+
|
|
238
|
+
return _load_network_from_parquet(path, **kwargs)
|
|
200
239
|
|
|
201
240
|
__all__ = [
|
|
202
241
|
# Version info
|
|
@@ -284,6 +323,7 @@ __all__ = [
|
|
|
284
323
|
"ComputeStats",
|
|
285
324
|
"FilterNodes",
|
|
286
325
|
"SaveNetwork",
|
|
326
|
+
"NodeEmbedding",
|
|
287
327
|
# Workflows
|
|
288
328
|
"WorkflowConfig",
|
|
289
329
|
"WorkflowRunner",
|
|
@@ -297,6 +337,13 @@ __all__ = [
|
|
|
297
337
|
"make_social_network",
|
|
298
338
|
"list_datasets",
|
|
299
339
|
"get_data_dir",
|
|
340
|
+
# Config module
|
|
341
|
+
"config",
|
|
342
|
+
# I/O convenience functions
|
|
343
|
+
"save_to_arrow",
|
|
344
|
+
"load_from_arrow",
|
|
345
|
+
"save_network_to_parquet",
|
|
346
|
+
"load_network_from_parquet",
|
|
300
347
|
# Dynamics (simulation)
|
|
301
348
|
"D",
|
|
302
349
|
"SimulationBuilder",
|
|
@@ -324,4 +371,13 @@ __all__ = [
|
|
|
324
371
|
"capabilities",
|
|
325
372
|
"capabilities_flat",
|
|
326
373
|
"capabilities_fingerprint",
|
|
374
|
+
# Agent-facing stable API
|
|
375
|
+
"load_network_from_path",
|
|
376
|
+
"top_hubs_by_layer",
|
|
377
|
+
"uncertainty_centrality",
|
|
378
|
+
"community_detection_with_uq",
|
|
379
|
+
"temporal_slice",
|
|
380
|
+
"reproducible_export_bundle",
|
|
381
|
+
"compare_networks",
|
|
382
|
+
"summarize_result",
|
|
327
383
|
]
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Stable machine-facing agent API for py3plex workflows."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
from py3plex.core import multinet
|
|
7
|
+
from py3plex.dsl.builder import L, Q
|
|
8
|
+
from py3plex.dsl.result import QueryResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _extract_replay_payload(result: QueryResult) -> Dict[str, Any]:
|
|
12
|
+
prov = result.provenance or {}
|
|
13
|
+
query_info = prov.get("query", {}) if isinstance(prov, dict) else {}
|
|
14
|
+
return {
|
|
15
|
+
"is_replayable": result.is_replayable,
|
|
16
|
+
"seed": (prov.get("randomness", {}) or {}).get("seed")
|
|
17
|
+
if isinstance(prov, dict)
|
|
18
|
+
else None,
|
|
19
|
+
"ast_hash": query_info.get("ast_hash"),
|
|
20
|
+
"network_fingerprint": prov.get("network_fingerprint") if isinstance(prov, dict) else None,
|
|
21
|
+
"network_version": prov.get("network_version") if isinstance(prov, dict) else None,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _as_agent_response(
|
|
26
|
+
*,
|
|
27
|
+
result: QueryResult,
|
|
28
|
+
assumptions: Optional[List[str]] = None,
|
|
29
|
+
warnings: Optional[List[Dict[str, Any]]] = None,
|
|
30
|
+
export_paths: Optional[List[str]] = None,
|
|
31
|
+
) -> Dict[str, Any]:
|
|
32
|
+
return {
|
|
33
|
+
"status": "ok",
|
|
34
|
+
"assumptions": assumptions or [],
|
|
35
|
+
"warnings": warnings if warnings is not None else result.meta.get("warnings", []),
|
|
36
|
+
"result": result.canonical_export_dict(),
|
|
37
|
+
"provenance": result.meta.get("provenance", {}),
|
|
38
|
+
"replay": _extract_replay_payload(result),
|
|
39
|
+
"export_paths": export_paths or [],
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def load_network_from_path(
|
|
44
|
+
path: str, *, input_type: str = "edgelist", directed: bool = False
|
|
45
|
+
) -> Dict[str, Any]:
|
|
46
|
+
"""Load a network from path and return stable machine-facing payload."""
|
|
47
|
+
net = multinet.multi_layer_network(directed=directed)
|
|
48
|
+
net.load_network(path, input_type=input_type)
|
|
49
|
+
layers = list(net.get_layers())
|
|
50
|
+
return {
|
|
51
|
+
"status": "ok",
|
|
52
|
+
"assumptions": ["Network path is trusted and readable."],
|
|
53
|
+
"warnings": [],
|
|
54
|
+
"result": {
|
|
55
|
+
"network": net,
|
|
56
|
+
"network_stats": {
|
|
57
|
+
"node_replicas": len(list(net.get_nodes())),
|
|
58
|
+
"edges": len(list(net.get_edges())),
|
|
59
|
+
"layers": layers,
|
|
60
|
+
"layer_count": len(layers),
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
"provenance": {"source_path": path, "input_type": input_type, "directed": directed},
|
|
64
|
+
"replay": {},
|
|
65
|
+
"export_paths": [],
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def top_hubs_by_layer(
|
|
70
|
+
network: Any,
|
|
71
|
+
*,
|
|
72
|
+
top_k: int = 10,
|
|
73
|
+
measure: str = "degree",
|
|
74
|
+
seed: Optional[int] = 42,
|
|
75
|
+
) -> Dict[str, Any]:
|
|
76
|
+
"""Compute per-layer hubs with reproducible defaults."""
|
|
77
|
+
query = (
|
|
78
|
+
Q.nodes()
|
|
79
|
+
.from_layers(L["*"])
|
|
80
|
+
.compute(measure, kind="aggregate")
|
|
81
|
+
.per_layer()
|
|
82
|
+
.top_k(top_k, measure)
|
|
83
|
+
.provenance(mode="replayable", seed=seed)
|
|
84
|
+
)
|
|
85
|
+
result = query.execute(network)
|
|
86
|
+
return _as_agent_response(
|
|
87
|
+
result=result,
|
|
88
|
+
assumptions=[
|
|
89
|
+
"Top-k is applied independently per layer.",
|
|
90
|
+
"Degree kind defaults to aggregate unless explicitly overridden.",
|
|
91
|
+
],
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def uncertainty_centrality(
|
|
96
|
+
network: Any,
|
|
97
|
+
*,
|
|
98
|
+
measures: Optional[List[str]] = None,
|
|
99
|
+
method: str = "bootstrap",
|
|
100
|
+
n_samples: int = 50,
|
|
101
|
+
ci: float = 0.95,
|
|
102
|
+
seed: Optional[int] = 42,
|
|
103
|
+
) -> Dict[str, Any]:
|
|
104
|
+
"""Compute uncertainty-aware centrality with structured output."""
|
|
105
|
+
measures = measures or ["pagerank"]
|
|
106
|
+
query = (
|
|
107
|
+
Q.nodes()
|
|
108
|
+
.compute(*measures)
|
|
109
|
+
.uq(method=method, n_samples=n_samples, ci=ci, seed=seed)
|
|
110
|
+
.provenance(mode="replayable", seed=seed)
|
|
111
|
+
)
|
|
112
|
+
result = query.execute(network)
|
|
113
|
+
return _as_agent_response(
|
|
114
|
+
result=result,
|
|
115
|
+
assumptions=["Uncertainty summaries use canonical mean/std/CI schema."],
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def community_detection_with_uq(
|
|
120
|
+
network: Any,
|
|
121
|
+
*,
|
|
122
|
+
method: str = "leiden",
|
|
123
|
+
n_samples: int = 20,
|
|
124
|
+
seed: Optional[int] = 42,
|
|
125
|
+
) -> Dict[str, Any]:
|
|
126
|
+
"""Run reproducible community detection with UQ."""
|
|
127
|
+
query = (
|
|
128
|
+
Q.nodes()
|
|
129
|
+
.community(method=method, random_state=seed)
|
|
130
|
+
.uq(method="seed", n_samples=n_samples, seed=seed)
|
|
131
|
+
.provenance(mode="replayable", seed=seed)
|
|
132
|
+
)
|
|
133
|
+
result = query.execute(network)
|
|
134
|
+
return _as_agent_response(
|
|
135
|
+
result=result,
|
|
136
|
+
assumptions=["Community uncertainty is estimated via seed ensemble."],
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def temporal_slice(
|
|
141
|
+
network: Any,
|
|
142
|
+
*,
|
|
143
|
+
t_start: Optional[float] = None,
|
|
144
|
+
t_end: Optional[float] = None,
|
|
145
|
+
at: Optional[float] = None,
|
|
146
|
+
) -> Dict[str, Any]:
|
|
147
|
+
"""Run temporal slice query with structured result contract."""
|
|
148
|
+
query = Q.edges()
|
|
149
|
+
assumptions = []
|
|
150
|
+
if at is not None:
|
|
151
|
+
query = query.at(float(at))
|
|
152
|
+
assumptions.append("Temporal query uses point-in-time snapshot semantics.")
|
|
153
|
+
else:
|
|
154
|
+
if t_start is None or t_end is None:
|
|
155
|
+
raise ValueError("Provide either 'at' or both 't_start' and 't_end'.")
|
|
156
|
+
query = query.during(float(t_start), float(t_end))
|
|
157
|
+
assumptions.append("Temporal query uses inclusive time window semantics.")
|
|
158
|
+
result = query.execute(network)
|
|
159
|
+
return _as_agent_response(result=result, assumptions=assumptions)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def reproducible_export_bundle(
|
|
163
|
+
result: QueryResult, *, path: str, compress: bool = True
|
|
164
|
+
) -> Dict[str, Any]:
|
|
165
|
+
"""Export replay bundle and return stable path metadata."""
|
|
166
|
+
out_path = str(Path(path))
|
|
167
|
+
result.export_bundle(out_path, compress=compress)
|
|
168
|
+
return _as_agent_response(
|
|
169
|
+
result=result,
|
|
170
|
+
assumptions=["Bundle includes provenance metadata for replay."],
|
|
171
|
+
export_paths=[out_path],
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def compare_networks(
|
|
176
|
+
network_a: Any,
|
|
177
|
+
network_b: Any,
|
|
178
|
+
*,
|
|
179
|
+
measure: str = "degree",
|
|
180
|
+
) -> Dict[str, Any]:
|
|
181
|
+
"""Compare two networks via shared machine-facing summary metric."""
|
|
182
|
+
res_a = Q.nodes().compute(measure).execute(network_a)
|
|
183
|
+
res_b = Q.nodes().compute(measure).execute(network_b)
|
|
184
|
+
vals_a = res_a.attributes.get(measure, {})
|
|
185
|
+
vals_b = res_b.attributes.get(measure, {})
|
|
186
|
+
mean_a = sum(vals_a.values()) / len(vals_a) if vals_a else 0.0
|
|
187
|
+
mean_b = sum(vals_b.values()) / len(vals_b) if vals_b else 0.0
|
|
188
|
+
return {
|
|
189
|
+
"status": "ok",
|
|
190
|
+
"assumptions": ["Comparison uses simple mean of selected metric over node replicas."],
|
|
191
|
+
"warnings": [],
|
|
192
|
+
"result": {
|
|
193
|
+
"metric": measure,
|
|
194
|
+
"mean_a": mean_a,
|
|
195
|
+
"mean_b": mean_b,
|
|
196
|
+
"delta": mean_b - mean_a,
|
|
197
|
+
"count_a": len(vals_a),
|
|
198
|
+
"count_b": len(vals_b),
|
|
199
|
+
},
|
|
200
|
+
"provenance": {},
|
|
201
|
+
"replay": {},
|
|
202
|
+
"export_paths": [],
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def summarize_result(result: QueryResult) -> Dict[str, Any]:
|
|
207
|
+
"""Return compact structured summary for a QueryResult."""
|
|
208
|
+
return {
|
|
209
|
+
"status": "ok",
|
|
210
|
+
"assumptions": [],
|
|
211
|
+
"warnings": result.meta.get("warnings", []),
|
|
212
|
+
"result": result.summary_dict(),
|
|
213
|
+
"provenance": result.meta.get("provenance", {}),
|
|
214
|
+
"replay": _extract_replay_payload(result),
|
|
215
|
+
"export_paths": [],
|
|
216
|
+
}
|
|
@@ -1409,8 +1409,6 @@ class Truncated_Power_Law(Distribution):
|
|
|
1409
1409
|
|
|
1410
1410
|
@property
|
|
1411
1411
|
def _pdf_discrete_normalizer(self):
|
|
1412
|
-
if 0:
|
|
1413
|
-
return False
|
|
1414
1412
|
from mpmath import (
|
|
1415
1413
|
exp, # faster /here/ than numpy.exp
|
|
1416
1414
|
lerchphi,
|
|
@@ -1429,21 +1427,7 @@ class Truncated_Power_Law(Distribution):
|
|
|
1429
1427
|
def pdf(self, data=None):
|
|
1430
1428
|
if data is None and hasattr(self, 'parent_Fit'):
|
|
1431
1429
|
data = self.parent_Fit.data
|
|
1432
|
-
|
|
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
|
|