tgraphx 1.4.0__tar.gz → 1.4.2__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.
- {tgraphx-1.4.0/tgraphx.egg-info → tgraphx-1.4.2}/PKG-INFO +58 -4
- {tgraphx-1.4.0 → tgraphx-1.4.2}/README.md +55 -2
- {tgraphx-1.4.0 → tgraphx-1.4.2}/pyproject.toml +3 -2
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_notebook_workflows_v138.py +17 -2
- tgraphx-1.4.2/tests/test_audit_fixes_v142.py +263 -0
- tgraphx-1.4.2/tests/test_user_friendly_syntax_groups_101_115_v141.py +575 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/__init__.py +51 -52
- tgraphx-1.4.2/tgraphx/__main__.py +107 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/graph.py +20 -1
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/__init__.py +1 -1
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/torchvision_wrappers.py +2 -2
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/pre_encoder.py +4 -1
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/training.py +6 -0
- tgraphx-1.4.2/tgraphx/ux/__init__.py +144 -0
- tgraphx-1.4.2/tgraphx/ux/dashboard_audit.py +206 -0
- tgraphx-1.4.2/tgraphx/ux/generation_wrappers.py +578 -0
- tgraphx-1.4.2/tgraphx/ux/helpers.py +772 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/public_api.py +50 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/serialization.py +31 -1
- {tgraphx-1.4.0 → tgraphx-1.4.2/tgraphx.egg-info}/PKG-INFO +58 -4
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx.egg-info/SOURCES.txt +4 -0
- tgraphx-1.4.0/tgraphx/__main__.py +0 -71
- tgraphx-1.4.0/tgraphx/ux/__init__.py +0 -104
- tgraphx-1.4.0/tgraphx/ux/dashboard_audit.py +0 -124
- {tgraphx-1.4.0 → tgraphx-1.4.2}/LICENSE +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/setup.cfg +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_3d_support.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_notebook_execution_v138.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_notebook_report_consistency_v137.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_notebook_report_consistency_v138.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_notebook_workflows_v137.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_advanced_real_dataset_notebooks.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_algorithms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_amp_compile.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_api_stability_labels.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_backward_compatibility.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_benchmark_smoke.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_calibration.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_chunking.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_cluster_gcn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_colab_notebook_regressions_v136.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_colab_regressions_v134.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_colab_regressions_v135.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_continuous_rl_algorithms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dashboard.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dashboard_metadata.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dataset_cache.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dataset_docs_claims.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dataset_download_mocked.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_dataset_registry.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_datasets_base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_devices.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_distributed_compat.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_distributed_helpers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_distributed_smoke.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_documentation_claims.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_edge_features.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_edge_weight.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_estimators_v05.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_evolutionary_graph_optimization.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_evolutionary_history_v132.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_experiments.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_explainability.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_factories.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_folder_datasets.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_gat_chunking.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_generation_rl_benchmarks_smoke.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_gnn_families.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_gradients.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_action_spaces.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_builders.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_generation_data_model.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_generation_metrics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_rl_algorithms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_rl_environments.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_transformer_v027.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graph_utils.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_graphsaint.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_han_hgt_overfit.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_hard_negative_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_hetero_batch.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_hetero_layers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_hetero_layers_v05.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_hetero_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_imports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_io_graphml_v120.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_benchmarks_smoke.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_data_model.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_datasets.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_evaluation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_feature_aware_v131.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_gnn_integration.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_hpo_v130.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_multimodal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_negative_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_reasoning.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_rescal_v120.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_simple_v130.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_temporal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_kg_training.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_layers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_llm_predictability_v136.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_loader_feature_store_integration.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_loader_robustness_v110.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_loaders_feature_store.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_matching_coloring_flow.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_math.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_math_correctness_v110.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_math_invariants_v030.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_metrics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_centrality.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_core.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_generators_spectral.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_graph_learning.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_paths_algorithms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_mining_structural.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_model_zoo.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_negative_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_neural_mining.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_neural_mining_batched.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_node2vec_kg_hypergraph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_notebooks_v130.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_ogb_tgb_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_packaging.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_performance_smoke.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_plotting.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_public_benchmarks.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_pyg_dgl_ogb_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_random_walk_sample.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_readme_links.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_release_validation_v030.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_reproducibility.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_reproducibility_easy_v133.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_rl_baselines.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_rl_callbacks_v120.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_rl_high_level_api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_rollout_buffer.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_sampling_loaders.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_sparse_backend_select.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_sparse_vgae_rgcn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_synthetic_datasets.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_temporal_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_temporal_v025.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_temporal_v05.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_tgn_tgat_overfit.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_time_encoding.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_tiny_overfit_v030.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_torchvision_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_tracking.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_training.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_transforms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_user_friendly_llm_snippets.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_user_friendly_syntax_groups_71_100_v140.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tests/test_v024_features.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/algorithms/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/algorithms/connectivity.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/algorithms/structural.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/algorithms/traversal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/benchmarks/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/benchmarks/public.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/benchmarks/run_v13_benchmark_suite.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/benchmarks/suite.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/calibration.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/cluster_gcn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/dataloader.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/graph_utils.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/hetero_batch.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/hetero_graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/temporal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/temporal_batch.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/core/utils.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/dashboard/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/dashboard/__main__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/dashboard/app.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/dashboard/static/dashboard.css +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/dashboard/static/dashboard.js +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/cache.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/converters.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/dgl_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/download.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/errors.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/folder.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/metadata.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/ogb_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/pyg_wrappers.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/registry.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/datasets/synthetic.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/distributed.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/doctor.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_data.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_diagnostics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_discovery.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_exceptions.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_results.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/easy/_workflows.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/early_stopping.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/label_propagation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/node2vec.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/splits.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/estimators/vgae.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/algorithms.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/config.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/fitness.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/genome.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/high_level_api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/metrics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/multi_objective.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/operators.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/evolutionary/selection.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/callbacks.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/checkpoints.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/cli.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/config.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/grid.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/runner.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/experiments/summarize.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/attention.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/edge_attribution.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/export.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/integrated_gradients.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/patch_heatmap.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/saliency.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/explain/utils.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/feature_store.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/actions.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/classical.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/config.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/data_model.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/high_level_api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/metrics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/neural.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/projectors.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/generation/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/graph_builders.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/graphsaint.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/hetero_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/interop.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/io/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/io/graphml.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/data.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/datasets.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/evaluation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/gnn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/hpo.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/losses.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/multimodal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/projectors.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/reasoning.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/temporal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/kg/trainer.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/_dim.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/_scatter.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/aggregator.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/appnp.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/attention_message.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/conv_message.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/factory.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/gat.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/gatv2.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/gin.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/graph_transformer.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/han.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/hetero.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/hetero_readout.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/hgt.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/pooling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/rgcn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/safe_pool.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/sage.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/temporal_readout.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/transformer_encodings.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/layers/vector_gcn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/learned_graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/loaders.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/classification.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/link_prediction.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/ogb.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/ranking.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/regression.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/metrics/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/anomaly.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/centrality.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/communities.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/embeddings.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/frequent.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/generators.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/graph_io.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/graph_learning.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/hetero.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/hypergraph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/kernels.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/knowledge_graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/label_prop.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/link_prediction.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/matching_coloring.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/motifs.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/neural.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/node2vec.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/paths.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/patterns.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/prototype.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/random_walk.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/sequence_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/similarity.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/spectral.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/structural.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/structural_encodings.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/temporal.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/mining/vgae.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/cnn_encoder.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/cnn_gnn_model.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/edge_predictor.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/factory.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/graph_classifier.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/hetero_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/knowledge_graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/model_zoo.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/node_classifier.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/regressors.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/models/temporal_models.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/performance.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/plotting/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/plotting/graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/plotting/layouts.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/plotting/mining.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/plotting/utils.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/reproducibility.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/actor_critic.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/baselines.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/continuous.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/dqn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/ppo.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/reinforce.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/algorithms/replay_buffer.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/callbacks.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/config.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/base.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/coloring.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/continuous.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/generation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/kg_reasoning.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/max_cut.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/navigation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/shortest_path.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/environments/vertex_cover.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/exploration/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/exploration/strategies.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/high_level_api.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/metrics.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/actor_critic.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/policy.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/projectors.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/qnetwork.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/networks/value.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/rl/reports.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/sampling_loaders.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/sampling_negative.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/sparse.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/temporal/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/temporal/tgat.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/temporal/tgn.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/temporal/time_encoding.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/temporal_sampling.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/tracking.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/__init__.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/compose.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/features.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/graph.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/patch.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/positional.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/transforms/splits.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/compare.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/describe.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/graph_construction.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/leakage.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/reproducible_ctx.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/validation.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx/ux/workflow.py +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx.egg-info/dependency_links.txt +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx.egg-info/entry_points.txt +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx.egg-info/requires.txt +0 -0
- {tgraphx-1.4.0 → tgraphx-1.4.2}/tgraphx.egg-info/top_level.txt +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tgraphx
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.2
|
|
4
4
|
Summary: Tensor-aware graph neural networks preserving spatial node feature layouts
|
|
5
5
|
Author-email: Arash Sajjadi <arash.sajjadi@usask.ca>
|
|
6
6
|
Maintainer-email: Arash Sajjadi <arash.sajjadi@usask.ca>
|
|
7
7
|
License-Expression: MIT
|
|
8
|
-
Project-URL: Homepage, https://
|
|
8
|
+
Project-URL: Homepage, https://tgraphx.com
|
|
9
|
+
Project-URL: Source, https://github.com/arashsajjadi/TGraphX
|
|
9
10
|
Project-URL: Repository, https://github.com/arashsajjadi/TGraphX
|
|
10
11
|
Project-URL: Documentation, https://github.com/arashsajjadi/TGraphX/tree/main/docs
|
|
11
12
|
Project-URL: Issues, https://github.com/arashsajjadi/TGraphX/issues
|
|
@@ -80,11 +81,13 @@ Dynamic: license-file
|
|
|
80
81
|
|
|
81
82
|
**Preprint:** [TGraphX: Tensor-Aware Graph Neural Network for Multi-Dimensional Feature Learning](https://arxiv.org/abs/2504.03953) · *Sajjadi & Eramian, arXiv 2025*
|
|
82
83
|
|
|
83
|
-
|
|
84
|
+
**Official website:** [https://tgraphx.com](https://tgraphx.com)
|
|
85
|
+
|
|
86
|
+
TGraphX is a **tensor-native graph intelligence framework** for research workflows that combine graph learning, graph mining, knowledge graphs, graph generation, evolutionary optimization, graph reinforcement learning, reproducibility, and dashboard-ready reporting — all in PyTorch. The base package does not require PyG, DGL, OGB, PyKEEN, Stable-Baselines3, or RLlib; it depends only on the PyTorch stack and the lightweight runtime utilities declared in `pyproject.toml` (`torch`, `torchvision`, `pyyaml`).
|
|
84
87
|
|
|
85
88
|
It preserves **multi-dimensional node/edge features** (`[C, H, W]`, `[C, D, H, W]`, `[D]`) through every message-passing step, supports scalable mini-batch samplers (GraphSAINT, Cluster-GCN), multimodal tensor-aware knowledge graphs, 13 graph RL algorithms, classical and neural graph generation, multi-objective evolutionary optimization, a local dashboard with offline HTML export, sklearn-like estimators, and a full benchmark + tutorial suite.
|
|
86
89
|
|
|
87
|
-
**Quick links:** [Graph algorithms](docs/graph_algorithms.md) · [Graph mining](docs/graph_mining.md) · [Tensor GNNs](docs/vector_gnn.md) · [Sampling](docs/graphsaint.md) · [FeatureStore](docs/feature_store.md) · [KG](docs/knowledge_graphs.md) · [Dashboard](docs/dashboard.md) · [Easy Mode](docs/easy_mode.md) · [LLM guide](docs/llm_usage_guide.md)
|
|
90
|
+
**Quick links:** [Official website](https://tgraphx.com) · [Graph algorithms](docs/graph_algorithms.md) · [Graph mining](docs/graph_mining.md) · [Tensor GNNs](docs/vector_gnn.md) · [Sampling](docs/graphsaint.md) · [FeatureStore](docs/feature_store.md) · [KG](docs/knowledge_graphs.md) · [Dashboard](docs/dashboard.md) · [Easy Mode](docs/easy_mode.md) · [LLM guide](docs/llm_usage_guide.md)
|
|
88
91
|
|
|
89
92
|
---
|
|
90
93
|
|
|
@@ -142,6 +145,57 @@ Advanced users can always drop down to PyTorch: `result.model`, `result.graph`,
|
|
|
142
145
|
|
|
143
146
|
---
|
|
144
147
|
|
|
148
|
+
## v1.4.1: final usability hardening
|
|
149
|
+
|
|
150
|
+
v1.4.1 adds one-call entry points for common workflows. All v1.4.0 and
|
|
151
|
+
v1.3.x syntax is preserved.
|
|
152
|
+
|
|
153
|
+
**Tensor node classification in one call.**
|
|
154
|
+
```python
|
|
155
|
+
result = tgx.classify_nodes(
|
|
156
|
+
x=images, edge_index=edge_index, labels=y,
|
|
157
|
+
model="tensor_gcn", seed=42, device="auto",
|
|
158
|
+
)
|
|
159
|
+
print(result.metrics["val_accuracy"])
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**KG link prediction in one call.**
|
|
163
|
+
```python
|
|
164
|
+
result = tgx.kg_completion(
|
|
165
|
+
triples=triples, num_entities=N, num_relations=R,
|
|
166
|
+
model="transe", seed=42,
|
|
167
|
+
)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Graph construction from any format.**
|
|
171
|
+
```python
|
|
172
|
+
g = tgx.make_graph(x=x, edges=[(0,1),(1,2)], labels=y)
|
|
173
|
+
g = tgx.make_graph(x=x, adjacency=adj)
|
|
174
|
+
g = tgx.make_graph(networkx_graph=G)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Graph generation, optimization, and RL in one call.**
|
|
178
|
+
```python
|
|
179
|
+
g = tgx.generate_graph("ba", num_nodes=100, m=3, node_shape=(8,), seed=42)
|
|
180
|
+
|
|
181
|
+
result = tgx.optimize_graph(objective="connectivity", algorithm="ga", num_nodes=30, seed=42)
|
|
182
|
+
|
|
183
|
+
rl = tgx.train_graph_rl(env="maxcut", algorithm="random", episodes=5, seed=42)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Troubleshooting.**
|
|
187
|
+
```python
|
|
188
|
+
print(tgx.explain_error(error)) # returns actionable guidance
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Package readiness.**
|
|
192
|
+
```bash
|
|
193
|
+
python -m tgraphx readiness
|
|
194
|
+
python -m tgraphx list-datasets
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
145
199
|
## v1.4.0: user-friendly tensor-native workflows
|
|
146
200
|
|
|
147
201
|
v1.4.0 keeps every canonical API stable while adding **mathematically-safe**
|
|
@@ -25,11 +25,13 @@
|
|
|
25
25
|
|
|
26
26
|
**Preprint:** [TGraphX: Tensor-Aware Graph Neural Network for Multi-Dimensional Feature Learning](https://arxiv.org/abs/2504.03953) · *Sajjadi & Eramian, arXiv 2025*
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
**Official website:** [https://tgraphx.com](https://tgraphx.com)
|
|
29
|
+
|
|
30
|
+
TGraphX is a **tensor-native graph intelligence framework** for research workflows that combine graph learning, graph mining, knowledge graphs, graph generation, evolutionary optimization, graph reinforcement learning, reproducibility, and dashboard-ready reporting — all in PyTorch. The base package does not require PyG, DGL, OGB, PyKEEN, Stable-Baselines3, or RLlib; it depends only on the PyTorch stack and the lightweight runtime utilities declared in `pyproject.toml` (`torch`, `torchvision`, `pyyaml`).
|
|
29
31
|
|
|
30
32
|
It preserves **multi-dimensional node/edge features** (`[C, H, W]`, `[C, D, H, W]`, `[D]`) through every message-passing step, supports scalable mini-batch samplers (GraphSAINT, Cluster-GCN), multimodal tensor-aware knowledge graphs, 13 graph RL algorithms, classical and neural graph generation, multi-objective evolutionary optimization, a local dashboard with offline HTML export, sklearn-like estimators, and a full benchmark + tutorial suite.
|
|
31
33
|
|
|
32
|
-
**Quick links:** [Graph algorithms](docs/graph_algorithms.md) · [Graph mining](docs/graph_mining.md) · [Tensor GNNs](docs/vector_gnn.md) · [Sampling](docs/graphsaint.md) · [FeatureStore](docs/feature_store.md) · [KG](docs/knowledge_graphs.md) · [Dashboard](docs/dashboard.md) · [Easy Mode](docs/easy_mode.md) · [LLM guide](docs/llm_usage_guide.md)
|
|
34
|
+
**Quick links:** [Official website](https://tgraphx.com) · [Graph algorithms](docs/graph_algorithms.md) · [Graph mining](docs/graph_mining.md) · [Tensor GNNs](docs/vector_gnn.md) · [Sampling](docs/graphsaint.md) · [FeatureStore](docs/feature_store.md) · [KG](docs/knowledge_graphs.md) · [Dashboard](docs/dashboard.md) · [Easy Mode](docs/easy_mode.md) · [LLM guide](docs/llm_usage_guide.md)
|
|
33
35
|
|
|
34
36
|
---
|
|
35
37
|
|
|
@@ -87,6 +89,57 @@ Advanced users can always drop down to PyTorch: `result.model`, `result.graph`,
|
|
|
87
89
|
|
|
88
90
|
---
|
|
89
91
|
|
|
92
|
+
## v1.4.1: final usability hardening
|
|
93
|
+
|
|
94
|
+
v1.4.1 adds one-call entry points for common workflows. All v1.4.0 and
|
|
95
|
+
v1.3.x syntax is preserved.
|
|
96
|
+
|
|
97
|
+
**Tensor node classification in one call.**
|
|
98
|
+
```python
|
|
99
|
+
result = tgx.classify_nodes(
|
|
100
|
+
x=images, edge_index=edge_index, labels=y,
|
|
101
|
+
model="tensor_gcn", seed=42, device="auto",
|
|
102
|
+
)
|
|
103
|
+
print(result.metrics["val_accuracy"])
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**KG link prediction in one call.**
|
|
107
|
+
```python
|
|
108
|
+
result = tgx.kg_completion(
|
|
109
|
+
triples=triples, num_entities=N, num_relations=R,
|
|
110
|
+
model="transe", seed=42,
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Graph construction from any format.**
|
|
115
|
+
```python
|
|
116
|
+
g = tgx.make_graph(x=x, edges=[(0,1),(1,2)], labels=y)
|
|
117
|
+
g = tgx.make_graph(x=x, adjacency=adj)
|
|
118
|
+
g = tgx.make_graph(networkx_graph=G)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Graph generation, optimization, and RL in one call.**
|
|
122
|
+
```python
|
|
123
|
+
g = tgx.generate_graph("ba", num_nodes=100, m=3, node_shape=(8,), seed=42)
|
|
124
|
+
|
|
125
|
+
result = tgx.optimize_graph(objective="connectivity", algorithm="ga", num_nodes=30, seed=42)
|
|
126
|
+
|
|
127
|
+
rl = tgx.train_graph_rl(env="maxcut", algorithm="random", episodes=5, seed=42)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Troubleshooting.**
|
|
131
|
+
```python
|
|
132
|
+
print(tgx.explain_error(error)) # returns actionable guidance
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Package readiness.**
|
|
136
|
+
```bash
|
|
137
|
+
python -m tgraphx readiness
|
|
138
|
+
python -m tgraphx list-datasets
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
90
143
|
## v1.4.0: user-friendly tensor-native workflows
|
|
91
144
|
|
|
92
145
|
v1.4.0 keeps every canonical API stable while adding **mathematically-safe**
|
|
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tgraphx"
|
|
7
7
|
# Keep this in sync with tgraphx/__init__.py::__version__
|
|
8
|
-
version = "1.4.
|
|
8
|
+
version = "1.4.2"
|
|
9
9
|
description = "Tensor-aware graph neural networks preserving spatial node feature layouts"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.10"
|
|
@@ -96,7 +96,8 @@ tgraphx-doctor = "tgraphx.__main__:main"
|
|
|
96
96
|
tgraphx-info = "tgraphx.__main__:main"
|
|
97
97
|
|
|
98
98
|
[project.urls]
|
|
99
|
-
Homepage = "https://
|
|
99
|
+
Homepage = "https://tgraphx.com"
|
|
100
|
+
Source = "https://github.com/arashsajjadi/TGraphX"
|
|
100
101
|
Repository = "https://github.com/arashsajjadi/TGraphX"
|
|
101
102
|
Documentation = "https://github.com/arashsajjadi/TGraphX/tree/main/docs"
|
|
102
103
|
Issues = "https://github.com/arashsajjadi/TGraphX/issues"
|
|
@@ -351,15 +351,30 @@ def test_nb35_mutag_workflow_with_edge_attr() -> None:
|
|
|
351
351
|
|
|
352
352
|
def test_pyg_singleton_graph_label_normalized() -> None:
|
|
353
353
|
"""Regression: PyG MUTAG stores graph label as tensor([1]) (shape [1]).
|
|
354
|
-
from_pyg_data should normalize this to scalar so cross_entropy works after batching.
|
|
354
|
+
from_pyg_data should normalize this to scalar so cross_entropy works after batching.
|
|
355
|
+
|
|
356
|
+
This test only runs when MUTAG is already cached locally; it never
|
|
357
|
+
initiates a network download from the test suite. Set the env var
|
|
358
|
+
``TGRAPHX_TESTS_ALLOW_NETWORK=1`` to opt back in to downloads.
|
|
359
|
+
"""
|
|
355
360
|
import importlib
|
|
361
|
+
import os
|
|
356
362
|
pyg = importlib.util.find_spec("torch_geometric")
|
|
357
363
|
if pyg is None:
|
|
358
364
|
pytest.skip("torch_geometric not installed")
|
|
359
365
|
from tgraphx.datasets import PyGTUDatasetAdapter
|
|
366
|
+
from tgraphx.datasets.cache import resolve_dataset_root
|
|
360
367
|
from tgraphx import GraphDataLoader
|
|
361
368
|
|
|
362
|
-
|
|
369
|
+
allow_net = os.environ.get("TGRAPHX_TESTS_ALLOW_NETWORK") == "1"
|
|
370
|
+
cached_root = resolve_dataset_root(None, "pyg/TUDataset") / "MUTAG"
|
|
371
|
+
has_raw = (cached_root / "raw").exists() or (cached_root / "processed").exists()
|
|
372
|
+
if not has_raw and not allow_net:
|
|
373
|
+
pytest.skip(
|
|
374
|
+
"MUTAG raw files not cached locally and "
|
|
375
|
+
"TGRAPHX_TESTS_ALLOW_NETWORK!=1; skipping to avoid network."
|
|
376
|
+
)
|
|
377
|
+
ds = PyGTUDatasetAdapter(name="MUTAG", download=allow_net)
|
|
363
378
|
g = ds.get(0)
|
|
364
379
|
# graph_label must be scalar tensor (shape []), not [1]
|
|
365
380
|
assert g.graph_label.dim() == 0, (
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""Regression tests for the v1.4.2 audit-fix release.
|
|
2
|
+
|
|
3
|
+
Each test pins down one of the validated audit findings so it cannot
|
|
4
|
+
silently regress. Tests prefer synthetic inputs and CPU-only behaviour
|
|
5
|
+
so they stay deterministic and offline-safe in CI.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
import torch
|
|
14
|
+
|
|
15
|
+
import tgraphx
|
|
16
|
+
from tgraphx import Graph
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ── Codex/Composer TGX-AUDIT-002 / 001: make_graph + NetworkX ──────────────
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _require_nx():
|
|
23
|
+
try:
|
|
24
|
+
import networkx # noqa: F401
|
|
25
|
+
except ImportError:
|
|
26
|
+
pytest.skip("networkx not installed")
|
|
27
|
+
import networkx as nx
|
|
28
|
+
return nx
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_make_graph_networkx_preserves_external_features() -> None:
|
|
32
|
+
nx = _require_nx()
|
|
33
|
+
G = nx.path_graph(3)
|
|
34
|
+
x = torch.arange(15, dtype=torch.float32).reshape(3, 5)
|
|
35
|
+
g = tgraphx.make_graph(x=x, networkx_graph=G)
|
|
36
|
+
assert g.node_features.shape == (3, 5)
|
|
37
|
+
# Original tensor content survives (no zero placeholder).
|
|
38
|
+
assert torch.equal(g.node_features, x)
|
|
39
|
+
# Topology is non-trivial (path 0-1-2, undirected => 4 directed edges).
|
|
40
|
+
assert g.num_edges == 4
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_make_graph_networkx_preserves_labels() -> None:
|
|
44
|
+
nx = _require_nx()
|
|
45
|
+
G = nx.path_graph(3)
|
|
46
|
+
y = torch.tensor([1, 0, 2], dtype=torch.long)
|
|
47
|
+
g = tgraphx.make_graph(x=torch.zeros(3, 4), networkx_graph=G, labels=y)
|
|
48
|
+
assert g.node_labels is not None
|
|
49
|
+
assert torch.equal(g.node_labels, y)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_make_graph_networkx_rejects_shape_mismatch() -> None:
|
|
53
|
+
nx = _require_nx()
|
|
54
|
+
G = nx.path_graph(3)
|
|
55
|
+
with pytest.raises(ValueError, match="rows but NetworkX graph"):
|
|
56
|
+
tgraphx.make_graph(x=torch.zeros(4, 2), networkx_graph=G)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# ── Codex TGX-AUDIT-001 / Composer TGX-AUDIT-005: public_api registry ──────
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_public_api_registry_includes_v141_helpers() -> None:
|
|
63
|
+
expected = {
|
|
64
|
+
"classify_nodes",
|
|
65
|
+
"kg_completion",
|
|
66
|
+
"make_graph",
|
|
67
|
+
"generate_graph",
|
|
68
|
+
"optimize_graph",
|
|
69
|
+
"train_graph_rl",
|
|
70
|
+
"audit_package_readiness",
|
|
71
|
+
}
|
|
72
|
+
for name in expected:
|
|
73
|
+
# Should not raise; must report a non-empty stability level.
|
|
74
|
+
level = tgraphx.api_status(name)
|
|
75
|
+
assert level, f"api_status({name!r}) returned empty level"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def test_public_api_registry_recognizes_v141_aliases() -> None:
|
|
79
|
+
# `build_graph` is an alias of `make_graph`; api_status must resolve it.
|
|
80
|
+
level = tgraphx.api_status("build_graph")
|
|
81
|
+
assert level, "api_status('build_graph') returned empty level"
|
|
82
|
+
aliases = tgraphx.list_aliases("make_graph")
|
|
83
|
+
assert "build_graph" in aliases, aliases
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# ── Codex TGX-AUDIT-003 / Composer TGX-AUDIT-004 / 010: top-level __all__ ──
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_v141_aliases_in_top_level_all() -> None:
|
|
90
|
+
expected = {
|
|
91
|
+
"generate", "graph_generation_report", "compare_generated_graphs",
|
|
92
|
+
"generation_metrics", "graph_evolution", "run_evolution", "run_rl",
|
|
93
|
+
# Composer TGX-AUDIT-010 additions
|
|
94
|
+
"KnowledgeGraph", "KGTrainer", "KGTrainingConfig",
|
|
95
|
+
"run_graph_generation", "run_evolutionary_optimization", "run_graph_rl",
|
|
96
|
+
}
|
|
97
|
+
missing = expected.difference(tgraphx.__all__)
|
|
98
|
+
assert not missing, f"Missing from tgraphx.__all__: {sorted(missing)}"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# ── Codex TGX-AUDIT-005: no fake `tgraphx[vision]` extra ───────────────────
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_optional_dependency_messages_reference_existing_extras() -> None:
|
|
105
|
+
msg = tgraphx.explain_error("missing optional torchvision")
|
|
106
|
+
assert "tgraphx[vision]" not in msg, (
|
|
107
|
+
"explain_error must not suggest a non-existing tgraphx[vision] extra "
|
|
108
|
+
"(torchvision is a mandatory dependency)."
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# ── Codex TGX-AUDIT-009: serialization preserves edge_labels & graph_features
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_graph_save_load_preserves_edge_labels_and_graph_features(tmp_path) -> None:
|
|
116
|
+
ei = torch.tensor([[0, 1], [1, 2]], dtype=torch.long)
|
|
117
|
+
g = Graph(
|
|
118
|
+
node_features=torch.randn(3, 4),
|
|
119
|
+
edge_index=ei,
|
|
120
|
+
edge_labels=torch.tensor([7, 9]),
|
|
121
|
+
graph_features=torch.tensor([1.0, 2.0, 3.0]),
|
|
122
|
+
)
|
|
123
|
+
p = tmp_path / "g.tgx"
|
|
124
|
+
g.save(p)
|
|
125
|
+
loaded = Graph.load(p)
|
|
126
|
+
assert torch.equal(loaded.edge_labels, g.edge_labels)
|
|
127
|
+
assert torch.equal(loaded.graph_features, g.graph_features)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_graph_save_load_backward_compat_missing_new_fields(tmp_path) -> None:
|
|
131
|
+
"""An old-format payload without the new keys must still load."""
|
|
132
|
+
from tgraphx.ux.serialization import _payload_to_graph
|
|
133
|
+
|
|
134
|
+
payload = {
|
|
135
|
+
"node_features": torch.zeros(2, 3),
|
|
136
|
+
"edge_index": torch.tensor([[0], [1]], dtype=torch.long),
|
|
137
|
+
}
|
|
138
|
+
g = _payload_to_graph(payload)
|
|
139
|
+
assert g.num_nodes == 2 and g.num_edges == 1
|
|
140
|
+
assert g.edge_labels is None
|
|
141
|
+
assert g.graph_features is None
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# ── Codex TGX-AUDIT-010: training _unpack_batch with edge_index=None ───────
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def test_unpack_batch_raises_clear_error_for_none_edge_index() -> None:
|
|
148
|
+
from tgraphx.training import _unpack_batch
|
|
149
|
+
from tgraphx import Graph, GraphBatch
|
|
150
|
+
|
|
151
|
+
# Build a batch whose edge_index is None (manually patched after creation).
|
|
152
|
+
g = Graph(node_features=torch.zeros(3, 4),
|
|
153
|
+
edge_index=torch.tensor([[0, 1], [1, 2]], dtype=torch.long),
|
|
154
|
+
y=torch.tensor([0, 1, 0]))
|
|
155
|
+
batch = GraphBatch([g])
|
|
156
|
+
batch.edge_index = None
|
|
157
|
+
with pytest.raises(ValueError, match="edge_index is None"):
|
|
158
|
+
_unpack_batch(batch, torch.device("cpu"))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# ── Codex TGX-AUDIT-011: Graph.num_classes on empty labels ─────────────────
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_num_classes_empty_labels_returns_zero() -> None:
|
|
165
|
+
g = Graph(node_features=torch.zeros(0, 4),
|
|
166
|
+
edge_index=torch.zeros(2, 0, dtype=torch.long),
|
|
167
|
+
y=torch.zeros(0, dtype=torch.long))
|
|
168
|
+
assert g.num_classes == 0
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# ── Codex TGX-AUDIT-012: from_adjacency rejects non-square sparse adjacency
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def test_from_adjacency_rejects_nonsquare_sparse() -> None:
|
|
175
|
+
try:
|
|
176
|
+
import scipy.sparse as sp
|
|
177
|
+
except ImportError:
|
|
178
|
+
pytest.skip("scipy not installed")
|
|
179
|
+
adj = sp.csr_matrix([[1, 0, 0], [0, 1, 0]]) # 2x3, not square
|
|
180
|
+
with pytest.raises(ValueError, match="square"):
|
|
181
|
+
Graph.from_adjacency(adj)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# ── Codex TGX-AUDIT-013: Graph.to() also moves masks in metadata ───────────
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def test_graph_to_moves_masks_in_metadata() -> None:
|
|
188
|
+
g = Graph(
|
|
189
|
+
node_features=torch.zeros(3, 4),
|
|
190
|
+
edge_index=torch.tensor([[0, 1], [1, 2]], dtype=torch.long),
|
|
191
|
+
metadata={"masks": {"train": torch.tensor([True, False, True])}},
|
|
192
|
+
)
|
|
193
|
+
# CPU->CPU is the only universally-available transition; we assert that
|
|
194
|
+
# Graph.to() touches the mask without raising and the dtype/values stay.
|
|
195
|
+
g.to(torch.device("cpu"))
|
|
196
|
+
m = g.train_mask
|
|
197
|
+
assert m is not None
|
|
198
|
+
assert m.device.type == "cpu"
|
|
199
|
+
assert m.tolist() == [True, False, True]
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
# ── Codex TGX-AUDIT-016: train_graph_rl forwards max_steps ─────────────────
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def test_train_graph_rl_max_steps_is_recorded() -> None:
|
|
206
|
+
result = tgraphx.train_graph_rl(
|
|
207
|
+
env="max_cut",
|
|
208
|
+
algorithm="random",
|
|
209
|
+
episodes=2,
|
|
210
|
+
max_steps=7,
|
|
211
|
+
num_nodes=6,
|
|
212
|
+
seed=0,
|
|
213
|
+
fast_mode=False,
|
|
214
|
+
)
|
|
215
|
+
config = getattr(result, "config", None)
|
|
216
|
+
assert isinstance(config, dict)
|
|
217
|
+
assert config.get("max_steps") == 7
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# ── Composer TGX-AUDIT-003: lazy torchvision import ────────────────────────
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def test_torchvision_not_imported_eagerly() -> None:
|
|
224
|
+
code = (
|
|
225
|
+
"import sys, tgraphx;"
|
|
226
|
+
"import json; print(json.dumps({"
|
|
227
|
+
"'torchvision': 'torchvision' in sys.modules,"
|
|
228
|
+
"'torchvision_models': 'torchvision.models' in sys.modules}))"
|
|
229
|
+
)
|
|
230
|
+
out = subprocess.check_output([sys.executable, "-c", code]).decode()
|
|
231
|
+
last = out.strip().splitlines()[-1]
|
|
232
|
+
import json
|
|
233
|
+
info = json.loads(last)
|
|
234
|
+
assert info["torchvision"] is False, (
|
|
235
|
+
"`import tgraphx` should not eagerly import torchvision."
|
|
236
|
+
)
|
|
237
|
+
assert info["torchvision_models"] is False
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
# ── Composer TGX-AUDIT-007: CLI list-methods regression ────────────────────
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def test_cli_list_methods() -> None:
|
|
244
|
+
res = subprocess.run(
|
|
245
|
+
[sys.executable, "-m", "tgraphx", "list-methods"],
|
|
246
|
+
capture_output=True, text=True, timeout=60,
|
|
247
|
+
)
|
|
248
|
+
assert res.returncode == 0, f"stderr={res.stderr}"
|
|
249
|
+
# `list-methods` enumerates graph-generation methods registered by the
|
|
250
|
+
# generation subsystem. Two stable methods we ship since v0.7 are ER and BA.
|
|
251
|
+
assert "erdos_renyi" in res.stdout, res.stdout
|
|
252
|
+
assert "barabasi_albert" in res.stdout, res.stdout
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# ── Composer TGX-AUDIT-015: readiness dependency classification ────────────
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def test_readiness_dependency_classification() -> None:
|
|
259
|
+
report = tgraphx.audit_package_readiness()
|
|
260
|
+
assert "required_dependencies" in report
|
|
261
|
+
# torchvision must be in required, not optional, per pyproject.toml.
|
|
262
|
+
assert "torchvision" in report["required_dependencies"]
|
|
263
|
+
assert "torchvision" not in report.get("optional_dependencies", {})
|