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

|
|
104
105
|

|
|
105
|
-

|
|
107
|
+

|
|
107
108
|
|
|
108
109
|
*Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
|
|
109
110
|
some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
|
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
[](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.
|
|
@@ -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.5"
|
|
55
|
+
__api_version__ = "1.1.5"
|
|
56
56
|
|
|
57
57
|
from py3plex.core.multinet import multi_layer_network
|
|
58
58
|
from py3plex.core.types import (
|
|
@@ -146,6 +146,7 @@ from py3plex.pipeline import (
|
|
|
146
146
|
ComputeStats,
|
|
147
147
|
FilterNodes,
|
|
148
148
|
SaveNetwork,
|
|
149
|
+
NodeEmbedding,
|
|
149
150
|
)
|
|
150
151
|
|
|
151
152
|
# Config-driven workflows
|
|
@@ -284,6 +285,7 @@ __all__ = [
|
|
|
284
285
|
"ComputeStats",
|
|
285
286
|
"FilterNodes",
|
|
286
287
|
"SaveNetwork",
|
|
288
|
+
"NodeEmbedding",
|
|
287
289
|
# Workflows
|
|
288
290
|
"WorkflowConfig",
|
|
289
291
|
"WorkflowRunner",
|
|
@@ -3036,8 +3036,7 @@ def cmd_capabilities(args: argparse.Namespace) -> int:
|
|
|
3036
3036
|
print(_json.dumps(flat, indent=2))
|
|
3037
3037
|
else:
|
|
3038
3038
|
for key, val in flat.items():
|
|
3039
|
-
|
|
3040
|
-
print(f" {marker} {key}")
|
|
3039
|
+
print(f" {key}: {bool(val)}")
|
|
3041
3040
|
return 0
|
|
3042
3041
|
|
|
3043
3042
|
caps = capabilities()
|
|
@@ -218,8 +218,8 @@ WARN_DEPRECATED: bool = True
|
|
|
218
218
|
# Library Metadata
|
|
219
219
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
220
220
|
|
|
221
|
-
__api_version__ = "1.1.
|
|
222
|
-
__version__ = "1.1.
|
|
221
|
+
__api_version__ = "1.1.5"
|
|
222
|
+
__version__ = "1.1.5"
|
|
223
223
|
|
|
224
224
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
225
225
|
# Helper Functions
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import itertools
|
|
4
4
|
import os
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import pathlib
|
|
5
8
|
from collections import defaultdict
|
|
9
|
+
from datetime import datetime, timezone
|
|
6
10
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
7
11
|
import matplotlib.pyplot as plt
|
|
8
12
|
|
|
@@ -2083,6 +2087,250 @@ class multi_layer_network:
|
|
|
2083
2087
|
|
|
2084
2088
|
yield from self.core_network.nodes(data=data)
|
|
2085
2089
|
|
|
2090
|
+
def embed(
|
|
2091
|
+
self,
|
|
2092
|
+
method: str = "node2vec",
|
|
2093
|
+
dimensions: int = 128,
|
|
2094
|
+
walk_length: int = 40,
|
|
2095
|
+
num_walks: int = 10,
|
|
2096
|
+
context_size: int = 10,
|
|
2097
|
+
workers: int = 4,
|
|
2098
|
+
**kwargs: Any,
|
|
2099
|
+
) -> Any:
|
|
2100
|
+
"""Learn node embeddings as a first-class ML primitive.
|
|
2101
|
+
|
|
2102
|
+
Args:
|
|
2103
|
+
method: Embedding backend name.
|
|
2104
|
+
dimensions: Embedding dimensionality.
|
|
2105
|
+
walk_length: Random-walk length for walk-based models.
|
|
2106
|
+
num_walks: Number of walks per node for walk-based models.
|
|
2107
|
+
context_size: Skipgram context window.
|
|
2108
|
+
workers: Number of workers (reserved for backend implementations).
|
|
2109
|
+
**kwargs: Method-specific parameters.
|
|
2110
|
+
|
|
2111
|
+
Returns:
|
|
2112
|
+
EmbeddingResult aligned with ``self.get_nodes()``.
|
|
2113
|
+
"""
|
|
2114
|
+
import py3plex
|
|
2115
|
+
|
|
2116
|
+
from py3plex.ml.embedding import (
|
|
2117
|
+
DeepWalkEmbedding,
|
|
2118
|
+
LINEEmbedding,
|
|
2119
|
+
MetaPath2VecEmbedding,
|
|
2120
|
+
MultiplexNode2Vec,
|
|
2121
|
+
NetMFEmbedding,
|
|
2122
|
+
Node2VecEmbedding,
|
|
2123
|
+
SupraAdjacencyEmbedding,
|
|
2124
|
+
LayerRegularizedEmbedding,
|
|
2125
|
+
)
|
|
2126
|
+
|
|
2127
|
+
method_key = str(method).lower()
|
|
2128
|
+
seed = kwargs.pop("seed", None)
|
|
2129
|
+
backend = kwargs.pop("backend", "numpy")
|
|
2130
|
+
window_size = kwargs.pop("window_size", context_size)
|
|
2131
|
+
cache_enabled = bool(kwargs.pop("cache", False))
|
|
2132
|
+
cache_dir = kwargs.pop("cache_dir", None)
|
|
2133
|
+
|
|
2134
|
+
embed_parameters = {
|
|
2135
|
+
"method": method_key,
|
|
2136
|
+
"dimensions": int(dimensions),
|
|
2137
|
+
"walk_length": int(walk_length),
|
|
2138
|
+
"num_walks": int(num_walks),
|
|
2139
|
+
"context_size": int(context_size),
|
|
2140
|
+
"window_size": int(window_size),
|
|
2141
|
+
"workers": int(workers),
|
|
2142
|
+
"seed": seed,
|
|
2143
|
+
"backend": backend,
|
|
2144
|
+
**dict(kwargs),
|
|
2145
|
+
}
|
|
2146
|
+
try:
|
|
2147
|
+
graph_hash = self.fingerprint()
|
|
2148
|
+
if not isinstance(graph_hash, str):
|
|
2149
|
+
graph_hash = json.dumps(graph_hash, sort_keys=True, default=str)
|
|
2150
|
+
except Exception as exc:
|
|
2151
|
+
logger.warning("Failed to compute graph fingerprint for embedding cache: %s", exc)
|
|
2152
|
+
node_snapshot = list(self.get_nodes())
|
|
2153
|
+
layer_labels = sorted(
|
|
2154
|
+
{
|
|
2155
|
+
str(node[1])
|
|
2156
|
+
for node in node_snapshot
|
|
2157
|
+
if isinstance(node, tuple) and len(node) >= 2
|
|
2158
|
+
}
|
|
2159
|
+
)
|
|
2160
|
+
fallback_fp = {
|
|
2161
|
+
"nodes": len(node_snapshot),
|
|
2162
|
+
"edges": len(list(self.get_edges())),
|
|
2163
|
+
"layers": layer_labels,
|
|
2164
|
+
}
|
|
2165
|
+
graph_hash = hashlib.sha256(
|
|
2166
|
+
json.dumps(fallback_fp, sort_keys=True, default=str).encode()
|
|
2167
|
+
).hexdigest()[:16]
|
|
2168
|
+
|
|
2169
|
+
cache_payload = {
|
|
2170
|
+
"graph_structure_hash": graph_hash,
|
|
2171
|
+
"method": method_key,
|
|
2172
|
+
"parameters": embed_parameters,
|
|
2173
|
+
"version": py3plex.__version__,
|
|
2174
|
+
"network_version": getattr(self, "network_version", None),
|
|
2175
|
+
}
|
|
2176
|
+
cache_hash = hashlib.sha256(
|
|
2177
|
+
json.dumps(cache_payload, sort_keys=True, default=str).encode()
|
|
2178
|
+
).hexdigest()[:16]
|
|
2179
|
+
cache_path = None
|
|
2180
|
+
fallback_cache_path = None
|
|
2181
|
+
if cache_enabled:
|
|
2182
|
+
cache_root = pathlib.Path(cache_dir) if cache_dir else pathlib.Path.cwd()
|
|
2183
|
+
cache_root.mkdir(parents=True, exist_ok=True)
|
|
2184
|
+
cache_path = cache_root / f"embedding_{cache_hash}.parquet"
|
|
2185
|
+
fallback_cache_path = cache_root / f"embedding_{cache_hash}.npz"
|
|
2186
|
+
existing_cache_path = (
|
|
2187
|
+
cache_path if cache_path.exists() else fallback_cache_path
|
|
2188
|
+
)
|
|
2189
|
+
if existing_cache_path.exists():
|
|
2190
|
+
from py3plex.embeddings.base import EmbeddingResult
|
|
2191
|
+
|
|
2192
|
+
loaded = EmbeddingResult.load(str(existing_cache_path))
|
|
2193
|
+
loaded.meta.update(
|
|
2194
|
+
{
|
|
2195
|
+
"method": method_key,
|
|
2196
|
+
"parameters": embed_parameters,
|
|
2197
|
+
"graph_hash": graph_hash,
|
|
2198
|
+
"creation_time": loaded.meta.get(
|
|
2199
|
+
"creation_time", datetime.now(timezone.utc).isoformat()
|
|
2200
|
+
),
|
|
2201
|
+
"library_version": py3plex.__version__,
|
|
2202
|
+
"cache_key": cache_hash,
|
|
2203
|
+
"cache_path": str(existing_cache_path),
|
|
2204
|
+
"cache_hit": True,
|
|
2205
|
+
}
|
|
2206
|
+
)
|
|
2207
|
+
if hasattr(self, "embedding"):
|
|
2208
|
+
self.embedding = loaded
|
|
2209
|
+
else:
|
|
2210
|
+
setattr(self, "embedding", loaded)
|
|
2211
|
+
return loaded
|
|
2212
|
+
|
|
2213
|
+
if method_key == "node2vec":
|
|
2214
|
+
model = Node2VecEmbedding(
|
|
2215
|
+
dimensions=dimensions,
|
|
2216
|
+
walk_length=walk_length,
|
|
2217
|
+
num_walks=num_walks,
|
|
2218
|
+
p=float(kwargs.pop("p", 1.0)),
|
|
2219
|
+
q=float(kwargs.pop("q", 1.0)),
|
|
2220
|
+
window_size=window_size,
|
|
2221
|
+
negative_samples=int(kwargs.pop("negative_samples", 5)),
|
|
2222
|
+
workers=workers,
|
|
2223
|
+
backend=backend,
|
|
2224
|
+
seed=seed,
|
|
2225
|
+
)
|
|
2226
|
+
elif method_key == "deepwalk":
|
|
2227
|
+
model = DeepWalkEmbedding(
|
|
2228
|
+
dimensions=dimensions,
|
|
2229
|
+
walk_length=walk_length,
|
|
2230
|
+
num_walks=num_walks,
|
|
2231
|
+
window_size=window_size,
|
|
2232
|
+
negative_samples=int(kwargs.pop("negative_samples", 5)),
|
|
2233
|
+
workers=workers,
|
|
2234
|
+
backend=backend,
|
|
2235
|
+
seed=seed,
|
|
2236
|
+
)
|
|
2237
|
+
elif method_key == "netmf":
|
|
2238
|
+
model = NetMFEmbedding(
|
|
2239
|
+
dimensions=dimensions,
|
|
2240
|
+
window=int(kwargs.pop("window", context_size)),
|
|
2241
|
+
negative=float(kwargs.pop("negative", 1.0)),
|
|
2242
|
+
multilayer=str(kwargs.pop("multilayer", "supra")),
|
|
2243
|
+
gamma=float(kwargs.pop("gamma", 1.0)),
|
|
2244
|
+
approx=str(kwargs.pop("approx", "randomized_svd")),
|
|
2245
|
+
seed=seed,
|
|
2246
|
+
)
|
|
2247
|
+
elif method_key == "line":
|
|
2248
|
+
model = LINEEmbedding(
|
|
2249
|
+
dimensions=dimensions,
|
|
2250
|
+
order=int(kwargs.pop("order", 2)),
|
|
2251
|
+
negative_samples=int(kwargs.pop("negative_samples", 5)),
|
|
2252
|
+
lr=float(kwargs.pop("lr", 0.025)),
|
|
2253
|
+
epochs=int(kwargs.pop("epochs", 5)),
|
|
2254
|
+
seed=seed,
|
|
2255
|
+
)
|
|
2256
|
+
elif method_key == "metapath2vec":
|
|
2257
|
+
model = MetaPath2VecEmbedding(
|
|
2258
|
+
metapaths=list(kwargs.pop("metapaths", [])),
|
|
2259
|
+
dimensions=dimensions,
|
|
2260
|
+
walk_length=walk_length,
|
|
2261
|
+
num_walks=num_walks,
|
|
2262
|
+
window_size=window_size,
|
|
2263
|
+
negative_samples=int(kwargs.pop("negative_samples", 5)),
|
|
2264
|
+
epochs=int(kwargs.pop("epochs", 5)),
|
|
2265
|
+
seed=seed,
|
|
2266
|
+
)
|
|
2267
|
+
elif method_key in {"multiplex_node2vec", "multiplex-node2vec"}:
|
|
2268
|
+
model = MultiplexNode2Vec(
|
|
2269
|
+
dimensions=dimensions,
|
|
2270
|
+
walk_length=walk_length,
|
|
2271
|
+
num_walks=num_walks,
|
|
2272
|
+
p=float(kwargs.pop("p", 1.0)),
|
|
2273
|
+
q=float(kwargs.pop("q", 1.0)),
|
|
2274
|
+
window_size=window_size,
|
|
2275
|
+
negative_samples=int(kwargs.pop("negative_samples", 5)),
|
|
2276
|
+
workers=workers,
|
|
2277
|
+
backend=backend,
|
|
2278
|
+
layer_weight=float(kwargs.pop("layer_weight", 1.0)),
|
|
2279
|
+
seed=seed,
|
|
2280
|
+
)
|
|
2281
|
+
elif method_key in {"supra_adjacency", "supra"}:
|
|
2282
|
+
model = SupraAdjacencyEmbedding(
|
|
2283
|
+
dimensions=dimensions,
|
|
2284
|
+
gamma=float(kwargs.pop("gamma", 1.0)),
|
|
2285
|
+
seed=seed,
|
|
2286
|
+
)
|
|
2287
|
+
elif method_key in {"layer_regularized", "layer-regularized"}:
|
|
2288
|
+
model = LayerRegularizedEmbedding(
|
|
2289
|
+
dimensions=dimensions,
|
|
2290
|
+
alpha=float(kwargs.pop("alpha", 0.5)),
|
|
2291
|
+
seed=seed,
|
|
2292
|
+
)
|
|
2293
|
+
else:
|
|
2294
|
+
raise ValueError(
|
|
2295
|
+
f"Unknown embedding method '{method}'. "
|
|
2296
|
+
"Expected one of: node2vec, deepwalk, netmf, line, "
|
|
2297
|
+
"metapath2vec, multiplex_node2vec, supra_adjacency, layer_regularized."
|
|
2298
|
+
)
|
|
2299
|
+
|
|
2300
|
+
embedding = model.fit_transform(self)
|
|
2301
|
+
embedding.meta.update(
|
|
2302
|
+
{
|
|
2303
|
+
"method": method_key,
|
|
2304
|
+
"parameters": embed_parameters,
|
|
2305
|
+
"graph_hash": graph_hash,
|
|
2306
|
+
"creation_time": datetime.now(timezone.utc).isoformat(),
|
|
2307
|
+
"library_version": py3plex.__version__,
|
|
2308
|
+
"cache_key": cache_hash if cache_enabled else None,
|
|
2309
|
+
"cache_path": str(cache_path) if cache_path else None,
|
|
2310
|
+
"cache_hit": False,
|
|
2311
|
+
}
|
|
2312
|
+
)
|
|
2313
|
+
if cache_enabled and cache_path is not None:
|
|
2314
|
+
try:
|
|
2315
|
+
embedding.to_parquet(str(cache_path))
|
|
2316
|
+
except Exception as exc:
|
|
2317
|
+
logger.warning("Failed to write parquet embedding cache %s: %s", cache_path, exc)
|
|
2318
|
+
if fallback_cache_path is not None:
|
|
2319
|
+
try:
|
|
2320
|
+
embedding.save(str(fallback_cache_path))
|
|
2321
|
+
embedding.meta["cache_path"] = str(fallback_cache_path)
|
|
2322
|
+
except Exception as fallback_exc:
|
|
2323
|
+
logger.warning(
|
|
2324
|
+
"Failed to write fallback embedding cache %s: %s",
|
|
2325
|
+
fallback_cache_path,
|
|
2326
|
+
fallback_exc,
|
|
2327
|
+
)
|
|
2328
|
+
if hasattr(self, "embedding"):
|
|
2329
|
+
self.embedding = embedding
|
|
2330
|
+
else:
|
|
2331
|
+
setattr(self, "embedding", embedding)
|
|
2332
|
+
return embedding
|
|
2333
|
+
|
|
2086
2334
|
def merge_with(self, target_px_object):
|
|
2087
2335
|
"""
|
|
2088
2336
|
Merge two px objects.
|
|
@@ -106,6 +106,16 @@ from .ast import (
|
|
|
106
106
|
SemiringClosureStmt,
|
|
107
107
|
SemiringFixedPointStmt,
|
|
108
108
|
SemiringStmt,
|
|
109
|
+
PredictStmt,
|
|
110
|
+
LinkPredictionSpec,
|
|
111
|
+
SplitSpec,
|
|
112
|
+
NegativeSamplingSpec,
|
|
113
|
+
ModelSpec,
|
|
114
|
+
EdgeFeatureSpec,
|
|
115
|
+
EvalSpec,
|
|
116
|
+
ReduceStmt,
|
|
117
|
+
LayerReductionSpec,
|
|
118
|
+
DistanceSpec,
|
|
109
119
|
# Benchmark AST nodes
|
|
110
120
|
BenchmarkNode,
|
|
111
121
|
BenchmarkAlgorithmSpec,
|
|
@@ -141,6 +151,8 @@ from .builder import (
|
|
|
141
151
|
CounterexampleBuilder,
|
|
142
152
|
# Claim learning builder
|
|
143
153
|
ClaimLearnerBuilder,
|
|
154
|
+
LinkPredictionBuilder,
|
|
155
|
+
LayerReductionBuilder,
|
|
144
156
|
)
|
|
145
157
|
|
|
146
158
|
from .benchmark import (
|
|
@@ -190,6 +202,8 @@ from .communities import (
|
|
|
190
202
|
)
|
|
191
203
|
|
|
192
204
|
from .result import QueryResult
|
|
205
|
+
from .predictive import PredictionResult
|
|
206
|
+
from .reduction import LayerReductionResult
|
|
193
207
|
|
|
194
208
|
from .executor import execute_ast
|
|
195
209
|
from .export import export_result, save_to_parquet, load_from_parquet
|
|
@@ -209,6 +223,11 @@ from .errors import (
|
|
|
209
223
|
InvalidJoinKeyError,
|
|
210
224
|
ComputedFieldMisuseError,
|
|
211
225
|
InvalidGroupAggregateError,
|
|
226
|
+
PredictionTaskError,
|
|
227
|
+
SplitStrategyError,
|
|
228
|
+
NegativeSamplingError,
|
|
229
|
+
ReductionMethodError,
|
|
230
|
+
LayerReductionError,
|
|
212
231
|
)
|
|
213
232
|
|
|
214
233
|
# Import UQ resolution and validation
|
|
@@ -349,6 +368,16 @@ __all__ = [
|
|
|
349
368
|
"SemiringClosureStmt",
|
|
350
369
|
"SemiringFixedPointStmt",
|
|
351
370
|
"SemiringStmt",
|
|
371
|
+
"PredictStmt",
|
|
372
|
+
"LinkPredictionSpec",
|
|
373
|
+
"SplitSpec",
|
|
374
|
+
"NegativeSamplingSpec",
|
|
375
|
+
"ModelSpec",
|
|
376
|
+
"EdgeFeatureSpec",
|
|
377
|
+
"EvalSpec",
|
|
378
|
+
"ReduceStmt",
|
|
379
|
+
"LayerReductionSpec",
|
|
380
|
+
"DistanceSpec",
|
|
352
381
|
# Benchmark AST
|
|
353
382
|
"BenchmarkNode",
|
|
354
383
|
"BenchmarkAlgorithmSpec",
|
|
@@ -384,6 +413,8 @@ __all__ = [
|
|
|
384
413
|
"CounterexampleBuilder",
|
|
385
414
|
# Claim Learning Builder
|
|
386
415
|
"ClaimLearnerBuilder",
|
|
416
|
+
"LinkPredictionBuilder",
|
|
417
|
+
"LayerReductionBuilder",
|
|
387
418
|
# Benchmark Builder
|
|
388
419
|
"B",
|
|
389
420
|
"CommunityBenchmarkBuilder",
|
|
@@ -419,6 +450,8 @@ __all__ = [
|
|
|
419
450
|
"compute_community_metric",
|
|
420
451
|
# Result
|
|
421
452
|
"QueryResult",
|
|
453
|
+
"PredictionResult",
|
|
454
|
+
"LayerReductionResult",
|
|
422
455
|
"export_result",
|
|
423
456
|
"save_to_parquet",
|
|
424
457
|
"load_from_parquet",
|
|
@@ -439,6 +472,11 @@ __all__ = [
|
|
|
439
472
|
"InvalidJoinKeyError",
|
|
440
473
|
"ComputedFieldMisuseError",
|
|
441
474
|
"InvalidGroupAggregateError",
|
|
475
|
+
"PredictionTaskError",
|
|
476
|
+
"SplitStrategyError",
|
|
477
|
+
"NegativeSamplingError",
|
|
478
|
+
"ReductionMethodError",
|
|
479
|
+
"LayerReductionError",
|
|
442
480
|
# UQ Resolution
|
|
443
481
|
"ResolvedUQConfig",
|
|
444
482
|
"UQResolutionError",
|
|
@@ -728,6 +728,12 @@ class EmbeddingSpec:
|
|
|
728
728
|
of layer names, e.g. ``[["author","paper","author"]]``).
|
|
729
729
|
walk_length: Random walk length for MetaPath2Vec.
|
|
730
730
|
num_walks: Number of walks per node for MetaPath2Vec.
|
|
731
|
+
p: Node2Vec return parameter.
|
|
732
|
+
q: Node2Vec in-out parameter.
|
|
733
|
+
window_size: Context window for walk-based embedding training.
|
|
734
|
+
negative_samples: Negative samples for walk-based embedding training.
|
|
735
|
+
workers: Worker count for embedding training.
|
|
736
|
+
order: LINE order (1 or 2).
|
|
731
737
|
"""
|
|
732
738
|
|
|
733
739
|
method: str = "netmf"
|
|
@@ -747,6 +753,12 @@ class EmbeddingSpec:
|
|
|
747
753
|
metapaths: Optional[List[List[str]]] = None
|
|
748
754
|
walk_length: int = 80
|
|
749
755
|
num_walks: int = 10
|
|
756
|
+
p: float = 1.0
|
|
757
|
+
q: float = 1.0
|
|
758
|
+
window_size: int = 10
|
|
759
|
+
negative_samples: int = 5
|
|
760
|
+
workers: int = 1
|
|
761
|
+
order: int = 2
|
|
750
762
|
|
|
751
763
|
|
|
752
764
|
@dataclass
|
|
@@ -1183,6 +1195,117 @@ class SemiringStmt:
|
|
|
1183
1195
|
fixed_point: Optional[SemiringFixedPointStmt] = None
|
|
1184
1196
|
|
|
1185
1197
|
|
|
1198
|
+
# ==============================================================================
|
|
1199
|
+
# Predictive Task DSL AST Nodes
|
|
1200
|
+
# ==============================================================================
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
@dataclass
|
|
1204
|
+
class SplitSpec:
|
|
1205
|
+
"""Data split strategy for predictive tasks."""
|
|
1206
|
+
|
|
1207
|
+
strategy: str = "random_holdout"
|
|
1208
|
+
test_frac: float = 0.2
|
|
1209
|
+
seed: Optional[int] = None
|
|
1210
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
@dataclass
|
|
1214
|
+
class NegativeSamplingSpec:
|
|
1215
|
+
"""Negative sampling strategy for predictive tasks."""
|
|
1216
|
+
|
|
1217
|
+
strategy: str = "uniform"
|
|
1218
|
+
ratio: float = 1.0
|
|
1219
|
+
seed: Optional[int] = None
|
|
1220
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
@dataclass
|
|
1224
|
+
class ModelSpec:
|
|
1225
|
+
"""Predictive model specification."""
|
|
1226
|
+
|
|
1227
|
+
name: str
|
|
1228
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
@dataclass
|
|
1232
|
+
class EdgeFeatureSpec:
|
|
1233
|
+
"""Edge feature operator for embedding pipelines."""
|
|
1234
|
+
|
|
1235
|
+
kind: str = "hadamard"
|
|
1236
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
@dataclass
|
|
1240
|
+
class EvalSpec:
|
|
1241
|
+
"""Evaluation metrics specification."""
|
|
1242
|
+
|
|
1243
|
+
metrics: List[str] = field(default_factory=lambda: ["roc_auc"])
|
|
1244
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
@dataclass
|
|
1248
|
+
class LinkPredictionSpec:
|
|
1249
|
+
"""Link prediction workflow specification."""
|
|
1250
|
+
|
|
1251
|
+
layers_expr: Optional[Any] = None # LayerExpr or LayerSet
|
|
1252
|
+
scope: Dict[str, Any] = field(default_factory=dict)
|
|
1253
|
+
split: SplitSpec = field(default_factory=SplitSpec)
|
|
1254
|
+
negative_sampling: NegativeSamplingSpec = field(default_factory=NegativeSamplingSpec)
|
|
1255
|
+
model: ModelSpec = field(default_factory=lambda: ModelSpec(name="common_neighbors"))
|
|
1256
|
+
edge_features: EdgeFeatureSpec = field(default_factory=EdgeFeatureSpec)
|
|
1257
|
+
classifier: Optional[ModelSpec] = None
|
|
1258
|
+
eval: EvalSpec = field(default_factory=EvalSpec)
|
|
1259
|
+
top_k: Optional[int] = None
|
|
1260
|
+
uq_config: Optional[UQConfig] = None
|
|
1261
|
+
seed: Optional[int] = None
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
@dataclass
|
|
1265
|
+
class PredictStmt:
|
|
1266
|
+
"""Top-level predictive task statement."""
|
|
1267
|
+
|
|
1268
|
+
task: str = "links"
|
|
1269
|
+
spec: Optional[LinkPredictionSpec] = None
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
# ==============================================================================
|
|
1273
|
+
# Layer Reduction DSL AST Nodes
|
|
1274
|
+
# ==============================================================================
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
@dataclass
|
|
1278
|
+
class DistanceSpec:
|
|
1279
|
+
"""Distance/similarity function specification for layer reduction."""
|
|
1280
|
+
|
|
1281
|
+
name: str = "js_divergence"
|
|
1282
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
@dataclass
|
|
1286
|
+
class LayerReductionSpec:
|
|
1287
|
+
"""Layer reduction workflow specification."""
|
|
1288
|
+
|
|
1289
|
+
method: str = "hierarchical_js"
|
|
1290
|
+
target_k: int = 1
|
|
1291
|
+
distance: Optional[DistanceSpec] = None
|
|
1292
|
+
criterion: Optional[str] = None
|
|
1293
|
+
min_similarity: Optional[float] = None
|
|
1294
|
+
preserve_interlayer: bool = True
|
|
1295
|
+
aggregate: str = "sum"
|
|
1296
|
+
report_level: str = "full"
|
|
1297
|
+
seed: Optional[int] = None
|
|
1298
|
+
params: Dict[str, Any] = field(default_factory=dict)
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
@dataclass
|
|
1302
|
+
class ReduceStmt:
|
|
1303
|
+
"""Top-level reduce/simplify statement."""
|
|
1304
|
+
|
|
1305
|
+
target: str = "layers"
|
|
1306
|
+
spec: Optional[LayerReductionSpec] = None
|
|
1307
|
+
|
|
1308
|
+
|
|
1186
1309
|
# ==============================================================================
|
|
1187
1310
|
# Benchmark AST Nodes
|
|
1188
1311
|
# ==============================================================================
|