py3plex 2.0.92__tar.gz → 2.0.93__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-2.0.92/py3plex.egg-info → py3plex-2.0.93}/PKG-INFO +7 -7
- {py3plex-2.0.92 → py3plex-2.0.93}/README.md +4 -4
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/_version.py +1 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/attribute_correlation.py +7 -3
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/kb.py +4 -4
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/bayesiantests.py +4 -9
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/critical_distances.py +34 -15
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/cli.py +27 -9
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/parsers.py +92 -16
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/ast.py +13 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/compositional_uq.py +83 -31
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/executor.py +21 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/explain.py +24 -35
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/program.py +6 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/result.py +37 -19
- {py3plex-2.0.92 → py3plex-2.0.93/py3plex.egg-info}/PKG-INFO +7 -7
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/SOURCES.txt +13 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/requires.txt +2 -2
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/__init__.py +1 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/pyproject.toml +2 -2
- py3plex-2.0.93/tests/test_arrow_attribute_alignment.py +16 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_book_conf.py +1 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_book_manuscript_integrity.py +1 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_multinet_and_parsers.py +67 -3
- py3plex-2.0.93/tests/test_correlation_probability_bounds.py +12 -0
- py3plex-2.0.93/tests/test_critical_distance_rendering.py +46 -0
- py3plex-2.0.93/tests/test_critical_distance_tied_ranks.py +19 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_compositional_uq.py +130 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_edgelist_format.py +24 -2
- py3plex-2.0.93/tests/test_hedwig_binary_members.py +28 -0
- py3plex-2.0.93/tests/test_json_key_collisions.py +26 -0
- py3plex-2.0.93/tests/test_layer_set_json_regressions.py +49 -0
- py3plex-2.0.93/tests/test_networkx_four_field_replicas.py +26 -0
- py3plex-2.0.93/tests/test_networkx_selected_edge_metrics.py +37 -0
- py3plex-2.0.93/tests/test_program_explanation_options.py +20 -0
- py3plex-2.0.93/tests/test_program_layerset_explain.py +18 -0
- py3plex-2.0.93/tests/test_readme_downloads_badge.py +14 -0
- py3plex-2.0.93/tests/test_simplex_degenerate.py +18 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_version_consistency.py +1 -1
- {py3plex-2.0.92 → py3plex-2.0.93}/LICENSE +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/MANIFEST.in +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/__main__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/_parallel.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/_safe_expression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/agent.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/backend.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/closure.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/fixed_point.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/lift.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/semiring.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algebra/witness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/advanced_random_generators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality/approx_betweenness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality/approx_closeness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality/approx_pagerank.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality/explain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/centrality_toolkit.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_comparison.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/NoRC.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/auto_select.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/autocommunity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/autocommunity_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/budget.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/community_louvain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/community_measures.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/community_ranking.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/community_wrapper.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/distributional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/flow_hierarchy.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/conftest.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-bipartite.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-file-io.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-multiplex.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-networkx.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-simple.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram-expanded.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/examples/python/example-trigram.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/infomap.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/infomap/interfaces/python/setup.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/label_propagation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/leiden_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/leiden_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/mdl_benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/multilayer_benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/multilayer_modularity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/multilayer_quality_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/node_ranking.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/runner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/sbm_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/sbm_wrapper.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/spectral_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/community_detection/successive_halving.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/curvature/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/curvature/ollivier_ricci_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/general/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/general/benchmark_classification.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/general/walkers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/graph_summarization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/__main__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/assets/builtin.n3 +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/converters.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/example.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/helpers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/load.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/predicate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/rule.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/settings.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/core/term_parsers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/learners/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/learners/bottomup.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/learners/learner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/learners/optimal.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/stats/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/stats/adjustment.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/stats/scorefunctions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/stats/significance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/hedwig/stats/validate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/layer_similarity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/meta_flow_report.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multicentrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/entanglement.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/multirank.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/multixrank.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/supra_matrix_function_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_algorithms/versatility.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/multilayer_clustering.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/network_classification/PPR.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/network_classification/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/network_classification/label_propagation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/node_ranking/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/node_ranking/node_ranking.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/requirements_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/robustness_testing.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/routing/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/routing/multiplex_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/conversions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/diagnostics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/inference_vi.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/model_selection.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/multilayer_sbm.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/objectives.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sbm/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/sir_multiplex.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistical_report.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/basic_statistics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/bayesian_distances.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/correlation_networks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/enrichment_modules.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/multilayer_statistics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/powerlaw.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/stats_comparison.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/statistics/topology.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/temporal/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/temporal/centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/temporal/community.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/temporal_multiplex/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/algorithms/term_parsers/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/alignment/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/alignment/features.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/alignment/metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/alignment/solvers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/benchmarks/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/benchmarks/budget.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/benchmarks/metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/benchmarks/runners.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/centrality/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/centrality/robustness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/claims/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/claims/generator.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/claims/learner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/claims/scorer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/claims/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/comparison/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/comparison/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/comparison/metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/comparison/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/convert.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/dgl_converter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/igraph_converter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/networkx_converter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/pyg_converter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/converters/scipy_converter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/equality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/ir.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/compat/sidecar.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/config.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/contract.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/engine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/failure_modes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/predicates.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/contracts/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/HINMINE/IO.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/HINMINE/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/HINMINE/dataStructures.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/HINMINE/decomposition.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/converters.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/immutable.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/lazy_evaluation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/multinet.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/nx_compat.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/random_generators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/schema_validation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/supporting.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/temporal_multinet.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/core/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/claim_lang.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/ddmin.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/engine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterexamples/witness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/comparator.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/engine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/presets.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/counterfactual/spec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/datasets/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/datasets/_data/aarhus_cs.edges +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/datasets/_data/synthetic_multilayer.edges +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/datasets/_generators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/datasets/_loaders.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/diagnostics/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/diagnostics/builders.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/diagnostics/codes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/diagnostics/core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/diagnostics/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/algebra.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/attribution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/benchmark_result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/builder.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/builder_parser.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/cache.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/communities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/community_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/context.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/executor_semiring.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/executors/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/executors/benchmark_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/explain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/export.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/expressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/fastpath.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/layers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/diagnostic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/lint_context.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/dsl001_unknown_layer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/dsl002_unknown_attribute.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/dsl101_type_mismatch.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/dsl201_unsatisfiable.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/dsl202_redundant.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/perf301_full_scan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/rules/perf302_cross_layer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/type_resolver.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/lint/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/operator_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/operators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/builder.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/compiler.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/engine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/ir.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/patterns/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/plan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/planner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/predictive.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/cache.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/cost.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/diff.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/distribution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/rewrite.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/program/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/provenance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/reduction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/selection_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/serializer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/uq_algebra.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/uq_resolution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl/warnings.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dsl_legacy.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/ast.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/builder.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/compartmental.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/config.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/models.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/processes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/dynamics/serializer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/cache.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/link_ops.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/metapath2vec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/embeddings/netmf.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ergonomics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/artifacts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/cli.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/env.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/model.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/runner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/store.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/experiments/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/fast_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/graph_ops.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/api.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/canonical_format.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/converters.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/formats/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/formats/arrow_format.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/formats/csv_format.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/formats/json_format.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/multinet_bridge.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/parquet_format.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/io/schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/lab/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/lab/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/linter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/logging_config.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/meta/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/meta/builder.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/meta/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/meta/stats.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/meta/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/deepwalk.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/evaluation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/line.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/metapath2vec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/multiplex.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/netmf.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/node2vec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/similarity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/trainer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/ml/embedding/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/multinet/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/multinet/aggregation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/nullmodels/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/nullmodels/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/nullmodels/models.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/nullmodels/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/cost_model.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/logical_plan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/optimizer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/physical_plan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/plan_nodes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/optimizer/rules.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/cli.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/network.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/operators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/readers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/spill.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/out_of_core/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/paths/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/paths/algorithms.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/paths/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/paths/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/pipeline.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/plugins/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/plugins/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/plugins/examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/plugins/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/profiling.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/provenance/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/provenance/bundle.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/provenance/capture.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/provenance/replay.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/provenance/schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/requirements.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/robustness/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/robustness/experiments.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/robustness/perturbations.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/runtime/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/runtime/capabilities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/safe_dsl_expression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/capabilities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/community_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/evaluate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/metric_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/selection/wins.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/engine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/pareto.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/semiring/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/sensitivity/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/sensitivity/executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/sensitivity/metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/sensitivity/perturbations.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/sensitivity/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/stats/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/stats/provenance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/stats/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/stats/statvalue.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/stats/uncertainty.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/temporal_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/temporal_utils_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/temporal_view.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/bootstrap.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/ci_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/community_ensemble.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/community_result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/context.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/estimation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/noise_models.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/null_models.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/partition.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/partition_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/partition_reducers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/partition_types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/partition_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/plan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/reducers/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/reducers/base.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/resampling_graph.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/runner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/selection_execution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/selection_reducers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/selection_types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/selection_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/stratification.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/uncertainty/types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/validation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/benchmark_visualizations.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/bezier.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/colors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/drawing_machinery.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/embedding_visualization/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/embedding_visualization/embedding_tools.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/embedding_visualization/embedding_visualization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/fa2/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/fa2/fa2util.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/fa2/forceatlas2.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/layout_algorithms.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/polyfit.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/pymnet_style.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/ricci_layout.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/ricci_multilayer_vis.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/visualization/sankey.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/workflows.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/wrappers/__init__.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/wrappers/benchmark_nodes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/wrappers/r_interop.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex/wrappers/train_node2vec_embedding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/dependency_links.txt +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/entry_points.txt +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/not-zip-safe +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex.egg-info/top_level.txt +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/safe_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/schemas.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/py3plex_mcp/server.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/setup.cfg +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_advanced_metrics_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_agent_api.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_agent_loading_stats.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_agents_documentation_claims.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_agents_ergonomics_features.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_agents_golden_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_aggregation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_backend.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_fixed_point.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algebra_witness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithm_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_attribute_correlation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_correlation_networks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_init.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_random_generators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_requirements_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_algorithms_statistics_bayesian_distances.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_alignment.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_alignment_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_alignment_correctness_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_approximate_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_approximation_dispatch_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_approximation_sample_scope_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_arrow_scalar_ids.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ast_json_specs_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ast_json_target_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ast_roundtrip.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ast_roundtrip_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_attribute_correlation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_attribute_correlation_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_auto_community.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_autocommunity_benchmarks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_autocommunity_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_autocommunity_meta.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_autocommunity_successive_halving.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bayesian_distances.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bench_aggregation_unit.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_budget_fairness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_dsl_basic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_multiplex_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_runner_modes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_runner_seeds.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmark_time.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmarks_budget.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_benchmarks_init.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_betweenness_sampling_scaling_regression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_book_snippets.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bridge_edge_attributes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bridge_empty_export.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bridge_node_identifiers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_bridge_replica_collisions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_builder_ast_replay_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_builder_dsl_mutate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_cache_method_identity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_canonical_ast_isolation_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_canonical_projection_order_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_canonical_query_settings_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_capabilities_basic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_capabilities_optional_missing.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_explain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_explain_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_robustness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_robustness_oracles.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_uncertainty.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_centrality_weight_handling.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_check_api_consistency.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_check_doc_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_check_type_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ci_python_versions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_claim_learning.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_claims_types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_cli.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_cli_check.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_cli_ergonomics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_cli_piping.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_closeness_allocation_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_closeness_direction_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_closeness_normalization_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_closeness_seed_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_clustering_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_code_improvements.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_community_comparison_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_community_detection_modules.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_community_distribution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_community_measures.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_community_measures_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison_metrics_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison_result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_comparison_uninitialized_and_resistance_oracles.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_compat_exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_compat_roundtrip.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_config_api.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_config_benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_configuration_directed_degrees.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_contracts_basic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_contracts_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_contracts_failure_modes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_contracts_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_functionality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_immutable.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_lazy_evaluation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_multinet_correctness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_multiplex_edges.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_schema_validation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_core_supporting.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_correlation_mixed_identities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_correlation_networks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_counterexamples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_counterexamples_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_counterfactual.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_counterfactual_presets.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_coverage_grouping.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_create_mosaic_banner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_create_showcase_flow.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_crosshair_pure_functions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_data_files_presence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_datasets.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_datasets_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_datasets_oracles.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_degenerate_networks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dependency_cleanup.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dependency_cleanup_compat.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_determinism_randomness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_diagnostics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_diagnostics_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_doc_conf.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_docs_embeddings_section.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_docs_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_docs_quality_pass.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_doctests.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dplyr_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_aggregation_enhancements.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_ast_equivalence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_ast_immutability.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_auto_community.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_communities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_community_filtering.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_community_uq_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_compact_compute.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_compiler_explain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_compiler_pipeline.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_condition_semantics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_d_factory.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_documentation_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_dplyr_style.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_dynamics_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_edge_grouping_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_edge_queries.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_enhancements.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_ergonomics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_errors_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_executor_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_explain.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_export.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_expressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_extensions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_graphops_equivalence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_grouping_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_interactive.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_joins.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_layer_resolution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_layer_selection.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_layer_set_algebra.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_legacy_approximate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_legacy_edges.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_lint.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_metric_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_multilayer_measure_topology.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_operators.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_optimizer_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_optimizer_rewrites.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_patterns.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_patterns_correctness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_patterns_quick_reference.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_pipes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_planner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_planner_config.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_predict_reduce.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_program_rewrite.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_program_types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_progress_logging.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_provenance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_query_optimization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_query_zoo.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_result_algebra_edge_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_selection_fastpath.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_semiring_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_serializer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_smart_defaults.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_temporal_range_execution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_uncertainty.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_uq_ergonomics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_uq_propagation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_v2.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dsl_zoo_features.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_algorithm_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_config_and_results_correctness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_conservation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_executor_edge_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_metamorphic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_parallel_determinism.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_reference_runs.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_uq_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_dynamics_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_edge_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_edgelist_reload_regression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_embeddings_direct_units.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_erdos_renyi_directed.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ergonomic_helpers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ergonomics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ergonomics_helpers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_errors_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_CBSSD.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_community_detection.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_decomposition_and_classification.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_decomposition_ground_truth.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_dsl_builder_api.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_dynamics_core_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_embedding_construction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_embedding_visualization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_incidence_gadget_encoding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_interactive_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_inverse_network.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_layer_extraction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_manipulation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_multilayer_vectorized_aggregation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_multiplex_aggregate.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_multiplex_dynamics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_n2v_embedding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_network_decomposition.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_network_decomposition_meta_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_numeric_encoding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_pattern_matching.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_example_ppr.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_examples_zoo_consolidation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_exception_taxonomy.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_experiments.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_explain_attribution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_fast_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_flagship_progress_demo.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_flow_direction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_flow_hierarchy.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_flow_parallel_capacity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_formal_phase1_alignment.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_fuzzing_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_generate_all_outputs.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_generate_quickstart_outputs.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_generate_visualization_images.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_gml_data_preservation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_golden_toy_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_gpickle_directed_conversion.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_gpickle_layer_data.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_graph_ops.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_graph_summarization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_graphml_loading.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_hedwig_adjustment.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_hedwig_significance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_improved_errors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_incidence_gadget_encoding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_infomap_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_interlayer_links_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_api_edge_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_arrow.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_contracts_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_conversion_formats.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_converters.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_exceptions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_roundtrip.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_io_schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_issue_19_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_lab.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_lab_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_lab_correctness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_label_propagation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_layer_extraction_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_layer_shuffle_seed_order.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_layer_similarity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_layer_similarity_edge_orientation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_layout_algorithms.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_lazy_evaluation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_leiden_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_link_checker.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_linter.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_load_directed_default.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_logging_config_unit.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_logging_conversion.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_main_module.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_master_regulators_example.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_math_invariants.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_matrix_network_weights.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mcp_server.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mdl_benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mdl_score.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mdl_score_corruption_monotonicity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mdl_score_reference_differential.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mdl_score_resolution_limit_sweep.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_meta_analysis.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_meta_flow_report.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_meta_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_metamorphic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_metapath2vec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mixed_layer_enumeration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ml_embedding_evaluation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ml_embedding_primitives.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_monoplex_nx_wrapper.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_mpc.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multiedgelist_weights_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_clustering_coefficients.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_cornercases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_edge_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_embedding_models.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_leiden_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_modularity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_quality_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_quality_metrics_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_statistics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multilayer_visualizations.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multinet_aggregation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multinet_aggregation_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multiplex_layer_interop.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multiplex_participation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multiplex_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multirank.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_multixrank.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_network_conversion.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_network_version.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_networkx_compatibility.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_new_algorithms.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_new_multilayer_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_node_edge_parity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_node_ranking_comprehensive.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_norc.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_nullmodel_sanity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_nullmodels.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_nullmodels_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_numeric_cache_mutations.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_numeric_parallel_weights.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_nx_compat_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ollivier_ricci_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_optimizer_submodules.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_out_of_core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_parallel.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_parallel_execution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_parse_nx_direction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_parsers_comprehensive.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_parsers_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_partition_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_partition_uq_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_paths_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_paths_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_paths_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_paths_result.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_performance_core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_pipeline.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_plugin_examples.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_plugin_system.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_plugins.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_plugins_contracts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_profiling.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_profiling_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_program.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_program_cache_identity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_program_cost_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_properties.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_provenance_canonical.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_provenance_replay.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_provenance_schema.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_public_api_exports.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_pymnet_style.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_pypi_publish_workflow.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_query_algebra.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_query_equivalence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_r_interop.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_random_generators_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_random_generators_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_random_walkers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_random_walks.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_readme_contributor_onboarding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_readme_flagship_example.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_requirements.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_by_id_conflicts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_difference_attributes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_edge_identifier_export.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_explain_debug.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_networkx_direction.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_networkx_edge_keys.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_networkx_edge_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_networkx_node_lists.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_symmetric_difference_attributes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_result_union_falsy_identifiers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_ricci_visualization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_robustness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_robustness_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_robustness_directed_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_robustness_testing.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_root_conftest.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_roundtrip_invariants.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_run_quickstart_snippets.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_safe_expression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sankey_visualization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sbm_autocommunity.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sbm_generator.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sbm_metrics.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sbm_runner_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_schema_and_immutable.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_scoped_canonical_embedding_regressions.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_seeding.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_selection_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_selection_uq_empty_groups.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_selection_uq_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_semiring_negative_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_semiring_pareto.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_semiring_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_semiring_types.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_semiring_verification.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sensitivity_executor.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sidecar.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sidecar_empty_tables.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sir_epidemic.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sir_long_convergence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sir_multiplex.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_sparse_conversion_preserves_data.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_spectral_multilayer.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_statistical_report.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_comparison.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_core.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_edge_cases.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_provenance.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_provenance_dataclass.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_registry.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_scalar_uncertainty.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stats_verify.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_stratified_uq.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_streaming_degree_normalization.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_streaming_pagerank_dangling.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_streaming_pagerank_selfloops.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_streaming_topk.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_successive_halving.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_supporting_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_supra_matrix_function_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_algorithms.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_builder.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_dsl.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_duration_parsing.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_multinet.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_numeric_strings.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_single_timestamp.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_utils_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_view.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_temporal_windowed_queries.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_tensor_representation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_tutorial_10min.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_type_coverage_scan.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_builder_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_defaults.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_dsl_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_engines.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_oracles.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uncertainty_runner.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uq_algebra.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uq_integration.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uq_resolution.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_uq_spine.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_user_journey_simulation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_utils.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_utils_coverage.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_utils_extended.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_utils_search_paths.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_validation.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_validation_module.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_api_differential.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_centrality.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_communities.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_determinism_parallelism.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_dsl_equivalence.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_metamorphic_harness.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_verification_provenance_oracles.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_versatility.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_benchmark.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_bezier.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_colors.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_imports.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_layouts.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_multilayer_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_polyfit.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_ricci_layout_helpers.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualization_supra_heatmap.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_visualize_matrix_fix.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_weighted_betweenness_identity_regression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_weighted_multigraph_sampling_regression.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_workflows.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_additional.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_benchmark_nodes.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_node2vec.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_optional_gensim.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_r_interop.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_topk_zero.py +0 -0
- {py3plex-2.0.92 → py3plex-2.0.93}/tests/test_wrappers_train_node2vec.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: py3plex
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.93
|
|
4
4
|
Summary: A Multilayer network analysis python3 library
|
|
5
5
|
Author-email: Blaž Škrlj <blaz.skrlj@ijs.si>
|
|
6
6
|
License: MIT
|
|
@@ -33,7 +33,7 @@ Requires-Dist: scikit-learn>=0.24.0
|
|
|
33
33
|
Requires-Dist: bitarray>=2.0.0
|
|
34
34
|
Requires-Dist: seaborn>=0.11.0
|
|
35
35
|
Provides-Extra: dev
|
|
36
|
-
Requires-Dist: pytest
|
|
36
|
+
Requires-Dist: pytest<9,>=7.0; extra == "dev"
|
|
37
37
|
Requires-Dist: tomli>=1.1.0; python_version < "3.11" and extra == "dev"
|
|
38
38
|
Requires-Dist: pytest-timeout>=2.1; extra == "dev"
|
|
39
39
|
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
@@ -49,7 +49,7 @@ Requires-Dist: icontract>=2.6.0; extra == "dev"
|
|
|
49
49
|
Requires-Dist: z3-solver>=4.12.0; extra == "dev"
|
|
50
50
|
Requires-Dist: hypothesis>=6.0; extra == "dev"
|
|
51
51
|
Provides-Extra: tests
|
|
52
|
-
Requires-Dist: pytest
|
|
52
|
+
Requires-Dist: pytest<9,>=7.0; extra == "tests"
|
|
53
53
|
Requires-Dist: tomli>=1.1.0; python_version < "3.11" and extra == "tests"
|
|
54
54
|
Requires-Dist: pytest-timeout>=2.1; extra == "tests"
|
|
55
55
|
Requires-Dist: pytest-cov>=4.0; extra == "tests"
|
|
@@ -118,12 +118,12 @@ Dynamic: license-file
|
|
|
118
118
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
|
|
119
119
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/formal.yml)
|
|
120
120
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
|
|
121
|
-
[](https://pypi.org/project/py3plex/)
|
|
122
|
+
[](https://pypistats.org/packages/py3plex)
|
|
123
123
|

|
|
124
124
|

|
|
125
|
-

|
|
126
|
+

|
|
127
127
|
|
|
128
128
|
*Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
|
|
129
129
|
some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/verify.yml)
|
|
13
13
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/formal.yml)
|
|
14
14
|
[](https://github.com/SkBlaz/py3plex/actions/workflows/fuzzing.yml)
|
|
15
|
-
[](https://pypi.org/project/py3plex/)
|
|
16
|
+
[](https://pypistats.org/packages/py3plex)
|
|
17
17
|

|
|
18
18
|

|
|
19
|
-

|
|
20
|
+

|
|
21
21
|
|
|
22
22
|
*Multilayer networks* are complex networks with additional information assigned to nodes or edges (or both). This library includes
|
|
23
23
|
some of the state-of-the-art algorithms for decomposition, visualization and analysis of such networks.
|
|
@@ -329,11 +329,11 @@ def _compute_correlation(x: np.ndarray, y: np.ndarray, method: str) -> Tuple[flo
|
|
|
329
329
|
"""
|
|
330
330
|
valid_methods = ["pearson", "spearman", "kendall"]
|
|
331
331
|
if method == "pearson":
|
|
332
|
-
|
|
332
|
+
result = pearsonr(x, y)
|
|
333
333
|
elif method == "spearman":
|
|
334
|
-
|
|
334
|
+
result = spearmanr(x, y)
|
|
335
335
|
elif method == "kendall":
|
|
336
|
-
|
|
336
|
+
result = kendalltau(x, y)
|
|
337
337
|
else:
|
|
338
338
|
from py3plex.errors import find_similar
|
|
339
339
|
did_you_mean = find_similar(method, valid_methods)
|
|
@@ -349,6 +349,9 @@ def _compute_correlation(x: np.ndarray, y: np.ndarray, method: str) -> Tuple[flo
|
|
|
349
349
|
did_you_mean=did_you_mean
|
|
350
350
|
)
|
|
351
351
|
|
|
352
|
+
corr, pval = result
|
|
353
|
+
return float(np.clip(corr, -1.0, 1.0)), float(np.clip(pval, 0.0, 1.0))
|
|
354
|
+
|
|
352
355
|
|
|
353
356
|
def multilayer_assortativity(
|
|
354
357
|
network: Any,
|
|
@@ -613,3 +616,4 @@ def attribute_centrality_independence_test(
|
|
|
613
616
|
'n_nodes': len(attrs)
|
|
614
617
|
}
|
|
615
618
|
|
|
619
|
+
|
|
@@ -44,7 +44,7 @@ class ExperimentKB:
|
|
|
44
44
|
self._calc_predicate_members(triplets)
|
|
45
45
|
self._find_roots(all_annotations)
|
|
46
46
|
self._calc_members_closure()
|
|
47
|
-
self._calc_binary_members()
|
|
47
|
+
self._calc_binary_members(triplets)
|
|
48
48
|
self._propagate_annotation_names(triplets)
|
|
49
49
|
|
|
50
50
|
# Statistics
|
|
@@ -236,7 +236,7 @@ class ExperimentKB:
|
|
|
236
236
|
# Run the closure from root
|
|
237
237
|
closure(self.dummy_root, 0)
|
|
238
238
|
|
|
239
|
-
def _calc_binary_members(self):
|
|
239
|
+
def _calc_binary_members(self, g):
|
|
240
240
|
self.binary_members = defaultdict(dict)
|
|
241
241
|
self.reverse_binary_members = defaultdict(dict)
|
|
242
242
|
|
|
@@ -245,13 +245,13 @@ class ExperimentKB:
|
|
|
245
245
|
|
|
246
246
|
for pair in pairs:
|
|
247
247
|
el1, el2 = self.uri_to_idx[pair[0]], self.uri_to_idx[pair[1]]
|
|
248
|
-
if self.binary_members[pred]
|
|
248
|
+
if el1 in self.binary_members[pred]:
|
|
249
249
|
self.binary_members[pred][el1].append(el2)
|
|
250
250
|
else:
|
|
251
251
|
self.binary_members[pred][el1] = [el2]
|
|
252
252
|
|
|
253
253
|
# Add the reverse as well
|
|
254
|
-
if self.reverse_binary_members[pred]
|
|
254
|
+
if el2 in self.reverse_binary_members[pred]:
|
|
255
255
|
self.reverse_binary_members[pred][el2].append(el1)
|
|
256
256
|
else:
|
|
257
257
|
self.reverse_binary_members[pred][el2] = [el1]
|
|
@@ -649,15 +649,6 @@ def plot_simplex(points, names=("C1", "C2"), proba_triplet=None):
|
|
|
649
649
|
fig = plt.figure()
|
|
650
650
|
fig.set_size_inches(8, 7)
|
|
651
651
|
|
|
652
|
-
nl, ne, nr = np.max(points, axis=0)
|
|
653
|
-
for i, n in enumerate((nl, ne, nr)):
|
|
654
|
-
if n < 0.001:
|
|
655
|
-
print(
|
|
656
|
-
"p{} is too small, switching to 2d plot".format(names[::-1] + ["rope"])
|
|
657
|
-
)
|
|
658
|
-
coords = sorted(set(range(3)) - i)
|
|
659
|
-
return plot2d(points[:, coords], labels[coords])
|
|
660
|
-
|
|
661
652
|
# triangle
|
|
662
653
|
fig.gca().add_line(
|
|
663
654
|
Line2D([0, 0.5, 1.0, 0], [0, np.sqrt(3) / 2, 0, 0], color="black")
|
|
@@ -669,6 +660,10 @@ def plot_simplex(points, names=("C1", "C2"), proba_triplet=None):
|
|
|
669
660
|
[vert0[0, 0], vert0[i, 0]], [vert0[0, 1], vert0[i, 1]], color="black"
|
|
670
661
|
)
|
|
671
662
|
)
|
|
663
|
+
# Degenerate posteriors remain valid points on a simplex edge.
|
|
664
|
+
if proba_triplet is None:
|
|
665
|
+
proba_triplet = np.mean(points, axis=0)
|
|
666
|
+
|
|
672
667
|
# vertex labels
|
|
673
668
|
rcParams.update({"font.size": 16})
|
|
674
669
|
fig.gca().text(-0.08, -0.08, f"p({names[0]} ({proba_triplet[0]}))", color="black")
|
|
@@ -35,13 +35,14 @@ def diagram(
|
|
|
35
35
|
the_algorithm_candidate: Optional[str],
|
|
36
36
|
output_figure_file: Optional[str],
|
|
37
37
|
fontsize: int = 10,
|
|
38
|
+
critical_distance: Optional[float] = None,
|
|
38
39
|
) -> Optional[str]:
|
|
39
40
|
"""
|
|
40
41
|
Draws critical distance diagram for Nemenyi or Bonferroni-Dunn post-hoc test.
|
|
41
42
|
The diagram is shown if output_figure_file is None, and saved otherwise
|
|
42
43
|
to the file.
|
|
43
44
|
:param list_of_algorithms: [[(alg_name1, avg_rank1)], ...]
|
|
44
|
-
:param critical_distance:
|
|
45
|
+
:param critical_distance: Optional positive Nemenyi critical distance.
|
|
45
46
|
:param output_figure_file: If not none, the diagram produced is saved to the specified file.
|
|
46
47
|
Otherwise, the diagram is shown.
|
|
47
48
|
:param the_algorithm_candidate: If we were performing Bonferroni-Dunn post-hcc test (1 vs all),
|
|
@@ -50,6 +51,10 @@ def diagram(
|
|
|
50
51
|
:return: output_figure_file
|
|
51
52
|
"""
|
|
52
53
|
|
|
54
|
+
if critical_distance is not None and (
|
|
55
|
+
not np.isfinite(critical_distance) or critical_distance <= 0
|
|
56
|
+
):
|
|
57
|
+
raise ValueError("critical_distance must be a positive finite number")
|
|
53
58
|
n = len(list_of_algorithms)
|
|
54
59
|
sorted_algorithms = sorted(list_of_algorithms, key=lambda t: t[1])
|
|
55
60
|
the_index = None
|
|
@@ -96,7 +101,7 @@ def diagram(
|
|
|
96
101
|
weight="normal",
|
|
97
102
|
stretch="normal",
|
|
98
103
|
)
|
|
99
|
-
|
|
104
|
+
# Respect the caller's text renderer; plotting does not require LaTeX.
|
|
100
105
|
rc("font", **fontProperties)
|
|
101
106
|
|
|
102
107
|
def name_length(name: str) -> float:
|
|
@@ -256,9 +261,9 @@ def diagram(
|
|
|
256
261
|
plot_algorithm(i, alg_rank_tuple[0], alg_rank_tuple[1])
|
|
257
262
|
# critical distance
|
|
258
263
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
264
|
+
if critical_distance is not None:
|
|
265
|
+
plot_critical_distance()
|
|
266
|
+
plot_groups(algorithm_groups())
|
|
262
267
|
# save / show the results
|
|
263
268
|
if output_figure_file is not None:
|
|
264
269
|
folder_end = output_figure_file.rfind("/")
|
|
@@ -333,7 +338,6 @@ def plot_critical_distance(
|
|
|
333
338
|
fontsize: int = 10,
|
|
334
339
|
) -> None:
|
|
335
340
|
|
|
336
|
-
import operator
|
|
337
341
|
from collections import defaultdict
|
|
338
342
|
|
|
339
343
|
if groupby is None:
|
|
@@ -350,10 +354,12 @@ def plot_critical_distance(
|
|
|
350
354
|
|
|
351
355
|
for _k, v in ranks.items():
|
|
352
356
|
a = dict(v)
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
+
from scipy.stats import rankdata
|
|
358
|
+
names = list(a)
|
|
359
|
+
# Higher scores are better; ties receive their shared average rank.
|
|
360
|
+
dataset_ranks = rankdata([-a[name] for name in names], method="average")
|
|
361
|
+
for name, rank in zip(names, dataset_ranks):
|
|
362
|
+
clf_ranks[name].append(float(rank))
|
|
357
363
|
|
|
358
364
|
fname[groupby[0]].nunique()
|
|
359
365
|
clf_score = {k: np.mean(v) for k, v in clf_ranks.items()}
|
|
@@ -361,9 +367,22 @@ def plot_critical_distance(
|
|
|
361
367
|
avranks = list(clf_score.values())
|
|
362
368
|
pairs = list(zip(names, avranks))
|
|
363
369
|
if crit_dist:
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
)
|
|
370
|
+
# Nemenyi's CD uses the full algorithm count and independent datasets.
|
|
371
|
+
k = len(avranks)
|
|
372
|
+
comparisons = len(ranks)
|
|
373
|
+
if k < 2 or comparisons < 1:
|
|
374
|
+
raise ValueError("Critical distance requires at least two algorithms and one dataset")
|
|
375
|
+
algorithms = set(clf_score)
|
|
376
|
+
if any({name for name, _ in rows} != algorithms for rows in ranks.values()):
|
|
377
|
+
raise ValueError("Critical distance requires the same algorithms in every dataset")
|
|
378
|
+
if not np.all(np.isfinite(rkx.to_numpy())):
|
|
379
|
+
raise ValueError("Critical distance requires finite scores")
|
|
380
|
+
try:
|
|
381
|
+
from scipy.stats import studentized_range
|
|
382
|
+
except ImportError as exc:
|
|
383
|
+
raise ImportError("Critical distance plotting requires scipy>=1.7") from exc
|
|
384
|
+
q_alpha = studentized_range.ppf(0.95, k, np.inf) / np.sqrt(2)
|
|
385
|
+
cd = float(q_alpha * np.sqrt(k * (k + 1) / (6 * comparisons)))
|
|
386
|
+
diagram(pairs, None, outfile, fontsize=fontsize, critical_distance=cd)
|
|
367
387
|
else:
|
|
368
|
-
|
|
369
|
-
diagram(pairs, cd, outfile, fontsize=fontsize)
|
|
388
|
+
diagram(pairs, None, outfile, fontsize=fontsize)
|
|
@@ -232,6 +232,20 @@ def _load_network(file_path: str) -> "multinet.multi_layer_network":
|
|
|
232
232
|
first_line = f.readline().strip()
|
|
233
233
|
if first_line:
|
|
234
234
|
parts = first_line.split()
|
|
235
|
+
if len(parts) == 3:
|
|
236
|
+
try:
|
|
237
|
+
float(parts[2])
|
|
238
|
+
except ValueError:
|
|
239
|
+
# Compact multilayer rows: source target layer.
|
|
240
|
+
f.seek(0)
|
|
241
|
+
for row in f:
|
|
242
|
+
row = row.strip()
|
|
243
|
+
if not row or row.startswith("#"):
|
|
244
|
+
continue
|
|
245
|
+
source, target, layer = row.split()
|
|
246
|
+
network.add_edges([{"source": source, "target": target,
|
|
247
|
+
"source_type": layer, "target_type": layer}])
|
|
248
|
+
return network
|
|
235
249
|
if len(parts) in [4, 5]:
|
|
236
250
|
# Multilayer format (with or without weight)
|
|
237
251
|
network.load_network(file_path, input_type="multiedgelist")
|
|
@@ -1038,6 +1052,9 @@ Examples:
|
|
|
1038
1052
|
help="Output format (default: csv)",
|
|
1039
1053
|
)
|
|
1040
1054
|
|
|
1055
|
+
embed_parser.add_argument("--verbose", "-v", action="store_true",
|
|
1056
|
+
help="Print detailed progress information")
|
|
1057
|
+
|
|
1041
1058
|
# EXPERIMENT command group
|
|
1042
1059
|
from py3plex.experiments.cli import add_experiment_subparser
|
|
1043
1060
|
|
|
@@ -3905,8 +3922,7 @@ def cmd_dynamics(args: argparse.Namespace) -> int:
|
|
|
3905
3922
|
print(f"Loading network from: {args.input}")
|
|
3906
3923
|
|
|
3907
3924
|
# Load network
|
|
3908
|
-
net =
|
|
3909
|
-
net.load_network(args.input, input_type="multiedgelist")
|
|
3925
|
+
net = _load_network(args.input)
|
|
3910
3926
|
|
|
3911
3927
|
if args.verbose:
|
|
3912
3928
|
print(f"Network loaded: {len(net.get_nodes())} nodes, {len(net.get_edges())} edges")
|
|
@@ -4110,11 +4126,10 @@ def cmd_embed(args: argparse.Namespace) -> int:
|
|
|
4110
4126
|
print(f"Loading network from: {args.input}")
|
|
4111
4127
|
|
|
4112
4128
|
# Load network
|
|
4113
|
-
net =
|
|
4114
|
-
net.load_network(args.input, input_type="multiedgelist")
|
|
4129
|
+
net = _load_network(args.input)
|
|
4115
4130
|
|
|
4116
4131
|
if args.verbose:
|
|
4117
|
-
print(f"Network loaded: {
|
|
4132
|
+
print(f"Network loaded: {net.core_network.number_of_nodes()} nodes, {net.core_network.number_of_edges()} edges")
|
|
4118
4133
|
|
|
4119
4134
|
# Prepare embedding parameters
|
|
4120
4135
|
embed_params = {
|
|
@@ -4160,7 +4175,10 @@ def cmd_embed(args: argparse.Namespace) -> int:
|
|
|
4160
4175
|
print("Embeddings learned successfully!")
|
|
4161
4176
|
|
|
4162
4177
|
# Prepare output
|
|
4163
|
-
if hasattr(result, "
|
|
4178
|
+
if hasattr(result, "vectors"):
|
|
4179
|
+
embeddings = result.vectors
|
|
4180
|
+
node_list = result.item_ids
|
|
4181
|
+
elif hasattr(result, "embeddings"):
|
|
4164
4182
|
# EmbeddingResult object
|
|
4165
4183
|
embeddings = result.embeddings
|
|
4166
4184
|
node_list = result.nodes if hasattr(result, "nodes") else list(embeddings.keys())
|
|
@@ -4180,9 +4198,9 @@ def cmd_embed(args: argparse.Namespace) -> int:
|
|
|
4180
4198
|
"seed": args.seed,
|
|
4181
4199
|
},
|
|
4182
4200
|
"network": {
|
|
4183
|
-
"nodes":
|
|
4184
|
-
"edges":
|
|
4185
|
-
"layers": net.
|
|
4201
|
+
"nodes": net.core_network.number_of_nodes(),
|
|
4202
|
+
"edges": net.core_network.number_of_edges(),
|
|
4203
|
+
"layers": list(net.layers),
|
|
4186
4204
|
},
|
|
4187
4205
|
"embeddings": {},
|
|
4188
4206
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# set of parsers used in Py3plex.
|
|
2
2
|
|
|
3
3
|
import glob
|
|
4
|
+
import base64
|
|
4
5
|
import gzip
|
|
5
6
|
import itertools
|
|
6
7
|
import json
|
|
@@ -341,6 +342,8 @@ def parse_multi_edgelist(
|
|
|
341
342
|
else:
|
|
342
343
|
continue
|
|
343
344
|
|
|
345
|
+
weight = float(weight)
|
|
346
|
+
|
|
344
347
|
if layer_first == layer_second and node_first == node_second:
|
|
345
348
|
|
|
346
349
|
# first case
|
|
@@ -408,10 +411,24 @@ def parse_simple_edgelist(
|
|
|
408
411
|
if len(parts) in (2, 3):
|
|
409
412
|
node_first_str, node_second_str = parts[:2]
|
|
410
413
|
layer_first = layer_second = "null"
|
|
411
|
-
|
|
414
|
+
if len(parts) == 3 and parts[2].startswith("@json:"):
|
|
415
|
+
edge_attributes = json.loads(
|
|
416
|
+
base64.urlsafe_b64decode(parts[2][6:].encode("ascii"))
|
|
417
|
+
)
|
|
418
|
+
else:
|
|
419
|
+
edge_attributes = {"weight": 1.0}
|
|
420
|
+
if len(parts) == 3:
|
|
421
|
+
edge_attributes["weight"] = float(parts[2])
|
|
412
422
|
elif len(parts) in (4, 5):
|
|
413
423
|
node_first_str, layer_first, node_second_str, layer_second = parts[:4]
|
|
414
|
-
|
|
424
|
+
if len(parts) == 5 and parts[4].startswith("@json:"):
|
|
425
|
+
edge_attributes = json.loads(
|
|
426
|
+
base64.urlsafe_b64decode(parts[4][6:].encode("ascii"))
|
|
427
|
+
)
|
|
428
|
+
else:
|
|
429
|
+
edge_attributes = {"weight": 1.0}
|
|
430
|
+
if len(parts) == 5:
|
|
431
|
+
edge_attributes["weight"] = float(parts[4])
|
|
415
432
|
else:
|
|
416
433
|
continue
|
|
417
434
|
|
|
@@ -421,7 +438,7 @@ def parse_simple_edgelist(
|
|
|
421
438
|
G.add_node(node_first, type=layer_first)
|
|
422
439
|
G.add_node(node_second, type=layer_second)
|
|
423
440
|
|
|
424
|
-
G.add_edge(node_first, node_second,
|
|
441
|
+
G.add_edge(node_first, node_second, **edge_attributes)
|
|
425
442
|
|
|
426
443
|
return (G, None)
|
|
427
444
|
|
|
@@ -486,7 +503,12 @@ def parse_edgelist_multi_types(
|
|
|
486
503
|
|
|
487
504
|
G.add_node((node_first, "null"), type="null")
|
|
488
505
|
G.add_node((node_second, "null"), type="null")
|
|
489
|
-
G.add_edge(
|
|
506
|
+
G.add_edge(
|
|
507
|
+
(node_first, "null"),
|
|
508
|
+
(node_second, "null"),
|
|
509
|
+
weight=weight,
|
|
510
|
+
type=edge_type,
|
|
511
|
+
)
|
|
490
512
|
return (G, None)
|
|
491
513
|
|
|
492
514
|
|
|
@@ -502,13 +524,12 @@ def parse_spin_edgelist(input_name: str, directed: bool) -> Tuple[nx.Graph, None
|
|
|
502
524
|
|
|
503
525
|
Args:
|
|
504
526
|
input_name: Path to SPIN edgelist file
|
|
505
|
-
directed: Whether to create directed graph
|
|
527
|
+
directed: Whether to create a directed graph
|
|
506
528
|
|
|
507
529
|
Returns:
|
|
508
530
|
Tuple[nx.Graph, None]: (parsed_graph, None for labels)
|
|
509
531
|
|
|
510
532
|
Notes:
|
|
511
|
-
- Currently always returns nx.Graph (undirected) regardless of directed parameter
|
|
512
533
|
- Edge tag is stored in edge 'type' attribute
|
|
513
534
|
- Default weight is 1 if not specified (4th column)
|
|
514
535
|
|
|
@@ -519,7 +540,7 @@ def parse_spin_edgelist(input_name: str, directed: bool) -> Tuple[nx.Graph, None
|
|
|
519
540
|
>>> graph, _ = parse_spin_edgelist('spin_edges.txt', directed=False) # doctest: +SKIP
|
|
520
541
|
"""
|
|
521
542
|
|
|
522
|
-
G = nx.Graph()
|
|
543
|
+
G = nx.DiGraph() if directed else nx.Graph()
|
|
523
544
|
with open(input_name) as IN:
|
|
524
545
|
for line in IN:
|
|
525
546
|
stripped = line.strip()
|
|
@@ -561,11 +582,21 @@ def parse_embedding(input_name: str) -> Tuple[np.ndarray, np.ndarray]:
|
|
|
561
582
|
with open(input_name) as IN:
|
|
562
583
|
for line in IN:
|
|
563
584
|
parts = line.strip().split()
|
|
564
|
-
if
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
585
|
+
if not parts:
|
|
586
|
+
continue
|
|
587
|
+
if not embedding_matrix and len(parts) == 2:
|
|
588
|
+
# Word2vec text files may start with a (count, dimensions)
|
|
589
|
+
# header. Do not treat every two-column row as a header: that
|
|
590
|
+
# is also the valid representation of 1D embeddings.
|
|
591
|
+
try:
|
|
592
|
+
int(parts[0])
|
|
593
|
+
int(parts[1])
|
|
594
|
+
except ValueError:
|
|
595
|
+
pass
|
|
596
|
+
else:
|
|
597
|
+
continue
|
|
598
|
+
embedding_matrix.append(parts[1:])
|
|
599
|
+
embedding_indices.append(parts[0])
|
|
569
600
|
embedding_matrix_np = np.asarray(embedding_matrix)
|
|
570
601
|
embedding_indices_np = np.array(embedding_indices)
|
|
571
602
|
return (embedding_matrix_np, embedding_indices_np)
|
|
@@ -749,7 +780,7 @@ def parse_multiplex_folder(
|
|
|
749
780
|
n1, n2, timestamp, layer_name = parts[:4]
|
|
750
781
|
time_series_tuples.append(
|
|
751
782
|
{
|
|
752
|
-
"node_first":
|
|
783
|
+
"node_first": n1,
|
|
753
784
|
"node_second": n2,
|
|
754
785
|
"layer": layer_dict[layer_name],
|
|
755
786
|
"timestamp": timestamp,
|
|
@@ -815,6 +846,29 @@ def parse_network(
|
|
|
815
846
|
Tuple of (parsed_network, labels, time_series)
|
|
816
847
|
"""
|
|
817
848
|
|
|
849
|
+
supported_types = {
|
|
850
|
+
"gml",
|
|
851
|
+
"graphml",
|
|
852
|
+
"nx",
|
|
853
|
+
"multiplex_folder",
|
|
854
|
+
"sparse",
|
|
855
|
+
"sparse_network",
|
|
856
|
+
"gpickle_biomine",
|
|
857
|
+
"gpickle",
|
|
858
|
+
"multiedgelist",
|
|
859
|
+
"detangler_json",
|
|
860
|
+
"edgelist",
|
|
861
|
+
"edgelist_spin",
|
|
862
|
+
"edgelist_with_edge_types",
|
|
863
|
+
"multiedge_tuple_list",
|
|
864
|
+
"multiplex_edges",
|
|
865
|
+
}
|
|
866
|
+
if f_type not in supported_types:
|
|
867
|
+
raise ValueError(
|
|
868
|
+
f"Unsupported network format {f_type!r}. "
|
|
869
|
+
f"Supported formats: {', '.join(sorted(supported_types))}"
|
|
870
|
+
)
|
|
871
|
+
|
|
818
872
|
time_series = None
|
|
819
873
|
if f_type == "gml":
|
|
820
874
|
parsed_network, labels = parse_gml(input_name, directed)
|
|
@@ -1027,15 +1081,37 @@ def save_edgelist(
|
|
|
1027
1081
|
for edge in input_network.edges(data=attributes):
|
|
1028
1082
|
n1, l1 = edge[0]
|
|
1029
1083
|
n2, l2 = edge[1]
|
|
1030
|
-
|
|
1084
|
+
suffix = (
|
|
1085
|
+
" "
|
|
1086
|
+
+ "@json:"
|
|
1087
|
+
+ base64.urlsafe_b64encode(
|
|
1088
|
+
json.dumps(
|
|
1089
|
+
edge[2], separators=(",", ":"), sort_keys=True
|
|
1090
|
+
).encode("utf-8")
|
|
1091
|
+
).decode("ascii")
|
|
1092
|
+
if attributes
|
|
1093
|
+
else ""
|
|
1094
|
+
)
|
|
1095
|
+
fh.write(f"{n1} {l1} {n2} {l2}{suffix}\n")
|
|
1031
1096
|
else:
|
|
1032
1097
|
# For regular networks, convert to integers as before
|
|
1033
1098
|
input_network = nx.convert_node_labels_to_integers(
|
|
1034
1099
|
input_network, first_label=0, ordering="default", label_attribute=None
|
|
1035
1100
|
)
|
|
1036
1101
|
# Save in simple format: node1 node2
|
|
1037
|
-
for edge in input_network.edges():
|
|
1038
|
-
|
|
1102
|
+
for edge in input_network.edges(data=attributes):
|
|
1103
|
+
suffix = (
|
|
1104
|
+
" "
|
|
1105
|
+
+ "@json:"
|
|
1106
|
+
+ base64.urlsafe_b64encode(
|
|
1107
|
+
json.dumps(
|
|
1108
|
+
edge[2], separators=(",", ":"), sort_keys=True
|
|
1109
|
+
).encode("utf-8")
|
|
1110
|
+
).decode("ascii")
|
|
1111
|
+
if attributes
|
|
1112
|
+
else ""
|
|
1113
|
+
)
|
|
1114
|
+
fh.write(f"{edge[0]} {edge[1]}{suffix}\n")
|
|
1039
1115
|
|
|
1040
1116
|
logger.info("Finished writing the network..")
|
|
1041
1117
|
|
|
@@ -1928,6 +1928,8 @@ def ast_to_json(query: Query, canonical: bool = True) -> str:
|
|
|
1928
1928
|
>>> json_str = ast_to_json(ast)
|
|
1929
1929
|
>>> # Can be deserialized with ast_from_json()
|
|
1930
1930
|
"""
|
|
1931
|
+
from .layers import LayerExpr as LayerSetExpr, LayerSet
|
|
1932
|
+
|
|
1931
1933
|
if canonical:
|
|
1932
1934
|
query = canonicalize_ast(query)
|
|
1933
1935
|
|
|
@@ -1943,9 +1945,12 @@ def ast_to_json(query: Query, canonical: bool = True) -> str:
|
|
|
1943
1945
|
return [_serialize(item) for item in obj]
|
|
1944
1946
|
if isinstance(obj, dict):
|
|
1945
1947
|
return {k: _serialize(v) for k, v in obj.items()}
|
|
1948
|
+
if isinstance(obj, LayerSet):
|
|
1949
|
+
return {'__type__': 'LayerSet', 'expr': _serialize(obj.expr)}
|
|
1946
1950
|
if hasattr(obj, '__dataclass_fields__'):
|
|
1947
1951
|
# Dataclass
|
|
1948
|
-
|
|
1952
|
+
type_name = 'LayerSetExpr' if isinstance(obj, LayerSetExpr) else obj.__class__.__name__
|
|
1953
|
+
result = {'__type__': type_name}
|
|
1949
1954
|
for field_name in obj.__dataclass_fields__:
|
|
1950
1955
|
value = getattr(obj, field_name)
|
|
1951
1956
|
result[field_name] = _serialize(value)
|
|
@@ -1976,6 +1981,8 @@ def ast_from_json(json_str: str) -> Query:
|
|
|
1976
1981
|
>>> reconstructed = ast_from_json(json_str)
|
|
1977
1982
|
>>> ast_equals(ast, reconstructed) # True
|
|
1978
1983
|
"""
|
|
1984
|
+
from .layers import LayerExpr as LayerSetExpr, LayerSet
|
|
1985
|
+
|
|
1979
1986
|
data = json.loads(json_str)
|
|
1980
1987
|
|
|
1981
1988
|
# Check schema version
|
|
@@ -2016,6 +2023,8 @@ def ast_from_json(json_str: str) -> Query:
|
|
|
2016
2023
|
'Query': Query,
|
|
2017
2024
|
'SelectStmt': SelectStmt,
|
|
2018
2025
|
'LayerExpr': LayerExpr,
|
|
2026
|
+
'LayerSet': LayerSet,
|
|
2027
|
+
'LayerSetExpr': LayerSetExpr,
|
|
2019
2028
|
'LayerTerm': LayerTerm,
|
|
2020
2029
|
'ConditionExpr': ConditionExpr,
|
|
2021
2030
|
'ConditionAtom': ConditionAtom,
|
|
@@ -2047,6 +2056,9 @@ def ast_from_json(json_str: str) -> Query:
|
|
|
2047
2056
|
for field_name, field_value in obj_data.items():
|
|
2048
2057
|
deserialized_data[field_name] = _deserialize(field_value)
|
|
2049
2058
|
|
|
2059
|
+
if target_class is LayerSet:
|
|
2060
|
+
return LayerSet(deserialized_data['expr'])
|
|
2061
|
+
|
|
2050
2062
|
if target_class is SelectStmt and 'target' in deserialized_data:
|
|
2051
2063
|
# Schema 2.0 exports previously wrote str-backed Target enums
|
|
2052
2064
|
# as bare strings. Continue to accept those stored queries.
|