tgraphx 1.3.2__tar.gz → 1.3.3__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.3.2/tgraphx.egg-info → tgraphx-1.3.3}/PKG-INFO +1 -1
- {tgraphx-1.3.2 → tgraphx-1.3.3}/pyproject.toml +1 -1
- tgraphx-1.3.3/tests/test_reproducibility_easy_v133.py +137 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/__init__.py +1 -1
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_workflows.py +6 -2
- {tgraphx-1.3.2 → tgraphx-1.3.3/tgraphx.egg-info}/PKG-INFO +1 -1
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/SOURCES.txt +1 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/LICENSE +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/README.md +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/setup.cfg +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_3d_support.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_algorithms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_amp_compile.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_api_stability_labels.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_backward_compatibility.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_benchmark_smoke.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_calibration.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_chunking.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_cluster_gcn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_continuous_rl_algorithms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dashboard.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dashboard_metadata.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_cache.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_docs_claims.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_download_mocked.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_registry.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_datasets_base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_devices.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_compat.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_helpers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_smoke.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_documentation_claims.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_edge_features.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_edge_weight.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_estimators_v05.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_evolutionary_graph_optimization.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_evolutionary_history_v132.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_experiments.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_explainability.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_factories.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_folder_datasets.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gat_chunking.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_generation_rl_benchmarks_smoke.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gnn_families.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gradients.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_action_spaces.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_builders.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_generation_data_model.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_generation_metrics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_rl_algorithms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_rl_environments.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_transformer_v027.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_utils.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graphsaint.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_han_hgt_overfit.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hard_negative_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_batch.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_layers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_layers_v05.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_imports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_io_graphml_v120.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_benchmarks_smoke.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_data_model.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_datasets.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_evaluation.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_feature_aware_v131.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_gnn_integration.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_hpo_v130.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_multimodal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_negative_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_reasoning.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_rescal_v120.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_simple_v130.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_temporal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_training.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_layers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loader_feature_store_integration.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loader_robustness_v110.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loaders_feature_store.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_matching_coloring_flow.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math_correctness_v110.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math_invariants_v030.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_metrics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_centrality.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_core.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_generators_spectral.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_graph_learning.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_paths_algorithms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_structural.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_model_zoo.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_negative_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_neural_mining.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_neural_mining_batched.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_node2vec_kg_hypergraph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_notebooks_v130.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_ogb_tgb_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_packaging.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_performance_smoke.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_plotting.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_public_benchmarks.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_pyg_dgl_ogb_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_random_walk_sample.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_readme_links.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_release_validation_v030.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_reproducibility.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_baselines.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_callbacks_v120.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_high_level_api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rollout_buffer.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sampling_loaders.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sparse_backend_select.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sparse_vgae_rgcn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_synthetic_datasets.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_v025.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_v05.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tgn_tgat_overfit.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_time_encoding.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tiny_overfit_v030.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_torchvision_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tracking.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_training.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_transforms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_user_friendly_llm_snippets.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_v024_features.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/__main__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/connectivity.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/structural.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/traversal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/benchmarks/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/benchmarks/public.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/calibration.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/cluster_gcn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/dataloader.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/graph_utils.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/hetero_batch.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/hetero_graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/temporal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/temporal_batch.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/utils.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/__main__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/app.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/static/dashboard.css +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/static/dashboard.js +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/cache.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/converters.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/dgl_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/download.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/errors.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/folder.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/metadata.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/ogb_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/pyg_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/registry.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/synthetic.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/torchvision_wrappers.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/distributed.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/doctor.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_data.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_diagnostics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_discovery.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_exceptions.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_results.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/early_stopping.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/label_propagation.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/node2vec.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/splits.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/vgae.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/algorithms.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/config.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/fitness.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/genome.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/high_level_api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/metrics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/multi_objective.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/operators.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/selection.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/callbacks.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/checkpoints.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/cli.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/config.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/grid.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/runner.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/summarize.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/attention.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/edge_attribution.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/export.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/integrated_gradients.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/patch_heatmap.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/saliency.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/utils.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/feature_store.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/actions.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/classical.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/config.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/data_model.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/high_level_api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/metrics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/neural.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/projectors.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/graph_builders.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/graphsaint.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/hetero_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/interop.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/io/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/io/graphml.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/data.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/datasets.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/evaluation.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/gnn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/hpo.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/losses.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/multimodal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/projectors.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/reasoning.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/temporal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/trainer.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/_dim.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/_scatter.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/aggregator.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/appnp.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/attention_message.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/conv_message.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/factory.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gat.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gatv2.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gin.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/graph_transformer.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/han.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hetero.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hetero_readout.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hgt.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/pooling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/rgcn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/safe_pool.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/sage.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/temporal_readout.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/transformer_encodings.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/vector_gcn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/learned_graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/loaders.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/classification.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/link_prediction.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/ogb.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/ranking.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/regression.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/anomaly.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/centrality.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/communities.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/embeddings.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/frequent.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/generators.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/graph_io.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/graph_learning.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/hetero.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/hypergraph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/kernels.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/knowledge_graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/label_prop.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/link_prediction.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/matching_coloring.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/motifs.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/neural.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/node2vec.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/paths.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/patterns.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/prototype.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/random_walk.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/sequence_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/similarity.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/spectral.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/structural.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/structural_encodings.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/temporal.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/vgae.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/cnn_encoder.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/cnn_gnn_model.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/edge_predictor.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/factory.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/graph_classifier.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/hetero_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/model_zoo.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/node_classifier.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/pre_encoder.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/regressors.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/temporal_models.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/performance.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/layouts.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/mining.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/utils.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/reproducibility.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/actor_critic.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/baselines.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/continuous.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/dqn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/ppo.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/reinforce.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/replay_buffer.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/callbacks.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/config.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/base.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/coloring.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/continuous.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/generation.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/kg_reasoning.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/max_cut.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/navigation.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/shortest_path.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/vertex_cover.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/exploration/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/exploration/strategies.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/high_level_api.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/metrics.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/actor_critic.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/policy.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/projectors.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/qnetwork.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/value.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/reports.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling_loaders.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling_negative.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sparse.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/tgat.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/tgn.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/time_encoding.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal_sampling.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/tracking.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/training.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/__init__.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/compose.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/features.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/graph.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/patch.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/positional.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/splits.py +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/dependency_links.txt +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/entry_points.txt +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/requires.txt +0 -0
- {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tgraphx
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
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>
|
|
@@ -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.3.
|
|
8
|
+
version = "1.3.3"
|
|
9
9
|
description = "Tensor-aware graph neural networks preserving spatial node feature layouts"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Reproducibility tests for Easy Mode (v1.3.3).
|
|
2
|
+
|
|
3
|
+
Tests that:
|
|
4
|
+
1. Synthetic data creation is seeded deterministically.
|
|
5
|
+
2. NeighborLoader with same seed produces identical batches.
|
|
6
|
+
3. CPU + deterministic=True gives exact same loss across two runs.
|
|
7
|
+
4. Reproducibility state is recorded in result.config.
|
|
8
|
+
5. CUDA (if available) at least produces finite results in deterministic mode.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
import torch
|
|
14
|
+
import tgraphx as tgx
|
|
15
|
+
from tgraphx.reproducibility import set_seed
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ── 1. Synthetic data reproducibility ────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TestSyntheticDataReproducibility:
|
|
22
|
+
def test_same_seed_same_features(self):
|
|
23
|
+
d1 = tgx.easy.synthetic_tensor_node_classification(
|
|
24
|
+
num_nodes=32, node_shape=(4, 4, 4), num_classes=3, num_edges=100, seed=42,
|
|
25
|
+
)
|
|
26
|
+
d2 = tgx.easy.synthetic_tensor_node_classification(
|
|
27
|
+
num_nodes=32, node_shape=(4, 4, 4), num_classes=3, num_edges=100, seed=42,
|
|
28
|
+
)
|
|
29
|
+
assert torch.equal(d1.node_features, d2.node_features)
|
|
30
|
+
assert torch.equal(d1.edge_index, d2.edge_index)
|
|
31
|
+
assert torch.equal(d1.node_labels, d2.node_labels)
|
|
32
|
+
|
|
33
|
+
def test_different_seed_different_output(self):
|
|
34
|
+
d1 = tgx.easy.synthetic_tensor_node_classification(num_nodes=50, seed=0)
|
|
35
|
+
d2 = tgx.easy.synthetic_tensor_node_classification(num_nodes=50, seed=99)
|
|
36
|
+
# With different seeds the features should differ (with overwhelmingly high probability).
|
|
37
|
+
assert not torch.equal(d1.node_features, d2.node_features)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ── 2. NeighborLoader batch order reproducibility ────────────────────────────
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TestNeighborLoaderReproducibility:
|
|
44
|
+
def test_same_seed_same_first_batch_seed_nodes(self):
|
|
45
|
+
from tgraphx import Graph, NeighborLoader
|
|
46
|
+
x = torch.randn(100, 8)
|
|
47
|
+
ei = torch.randint(0, 100, (2, 400))
|
|
48
|
+
y = torch.randint(0, 3, (100,))
|
|
49
|
+
g = Graph(node_features=x, edge_index=ei, y=y)
|
|
50
|
+
|
|
51
|
+
loader_a = NeighborLoader(g, fanouts=[5, 3], batch_size=8, shuffle=True, seed=7)
|
|
52
|
+
loader_b = NeighborLoader(g, fanouts=[5, 3], batch_size=8, shuffle=True, seed=7)
|
|
53
|
+
|
|
54
|
+
seeds_a = [b.seed_node_ids.clone() for b in loader_a]
|
|
55
|
+
seeds_b = [b.seed_node_ids.clone() for b in loader_b]
|
|
56
|
+
assert len(seeds_a) == len(seeds_b)
|
|
57
|
+
for a, b in zip(seeds_a, seeds_b):
|
|
58
|
+
assert torch.equal(a, b)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ── 3. Easy Mode CPU deterministic reproducibility ───────────────────────────
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TestEasyModeDeterministicCPU:
|
|
65
|
+
def _run(self):
|
|
66
|
+
set_seed(42, deterministic=True)
|
|
67
|
+
data = tgx.easy.synthetic_tensor_node_classification(
|
|
68
|
+
num_nodes=32, node_shape=(4, 4, 4), num_classes=3, num_edges=100, seed=42,
|
|
69
|
+
)
|
|
70
|
+
return tgx.easy.train_node_classifier(
|
|
71
|
+
data, epochs=2, batch_size=8, fanouts=[4, 2],
|
|
72
|
+
verbose=False, seed=42, deterministic=True, device="cpu",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
def test_deterministic_cpu_exact_match(self):
|
|
76
|
+
r1 = self._run()
|
|
77
|
+
r2 = self._run()
|
|
78
|
+
diff = abs(r1.metrics["loss"] - r2.metrics["loss"])
|
|
79
|
+
assert diff < 1e-7, f"CPU deterministic diff too large: {diff:.2e}"
|
|
80
|
+
|
|
81
|
+
def test_deterministic_flag_in_config(self):
|
|
82
|
+
r = self._run()
|
|
83
|
+
assert r.config.get("deterministic") is True
|
|
84
|
+
|
|
85
|
+
def test_reproducibility_state_recorded(self):
|
|
86
|
+
r = self._run()
|
|
87
|
+
state = r.config.get("reproducibility_state", {})
|
|
88
|
+
assert state.get("seed") == 42
|
|
89
|
+
assert state.get("deterministic") is True
|
|
90
|
+
assert "torch_version" in state
|
|
91
|
+
assert "cuda_available" in state
|
|
92
|
+
|
|
93
|
+
def test_default_non_deterministic_still_runs(self):
|
|
94
|
+
"""Default deterministic=False must not crash."""
|
|
95
|
+
data = tgx.easy.synthetic_tensor_node_classification(
|
|
96
|
+
num_nodes=32, node_shape=(4, 4, 4), num_classes=2, num_edges=100, seed=0,
|
|
97
|
+
)
|
|
98
|
+
r = tgx.easy.train_node_classifier(
|
|
99
|
+
data, epochs=1, batch_size=8, fanouts=[3, 2],
|
|
100
|
+
verbose=False, seed=0, device="cpu",
|
|
101
|
+
)
|
|
102
|
+
assert "loss" in r.metrics
|
|
103
|
+
assert r.config.get("deterministic") is False
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# ── 4. set_seed return value ──────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class TestSetSeedReturnValue:
|
|
110
|
+
def test_returns_dict_with_required_keys(self):
|
|
111
|
+
state = set_seed(42, deterministic=True)
|
|
112
|
+
assert isinstance(state, dict)
|
|
113
|
+
assert state["seed"] == 42
|
|
114
|
+
assert state["deterministic"] is True
|
|
115
|
+
assert "torch_version" in state
|
|
116
|
+
assert "cuda_available" in state
|
|
117
|
+
|
|
118
|
+
def test_non_deterministic_mode(self):
|
|
119
|
+
state = set_seed(7, deterministic=False)
|
|
120
|
+
assert state["deterministic"] is False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ── 5. CUDA smoke (if available) ──────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class TestEasyModeDeviceCUDA:
|
|
127
|
+
@pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA unavailable")
|
|
128
|
+
def test_deterministic_cuda_finite_loss(self):
|
|
129
|
+
set_seed(42, deterministic=True)
|
|
130
|
+
data = tgx.easy.synthetic_tensor_node_classification(
|
|
131
|
+
num_nodes=32, node_shape=(4, 4, 4), num_classes=3, num_edges=100, seed=42,
|
|
132
|
+
)
|
|
133
|
+
r = tgx.easy.train_node_classifier(
|
|
134
|
+
data, epochs=1, batch_size=8, fanouts=[4, 2],
|
|
135
|
+
verbose=False, seed=42, deterministic=True, device="cuda",
|
|
136
|
+
)
|
|
137
|
+
assert torch.isfinite(torch.tensor(r.metrics["loss"]))
|
|
@@ -10,7 +10,7 @@ Common one-liner imports::
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
# Keep this in sync with [project].version in pyproject.toml.
|
|
13
|
-
__version__ = "1.3.
|
|
13
|
+
__version__ = "1.3.3"
|
|
14
14
|
|
|
15
15
|
# ── Core data structures ──────────────────────────────────────────────────────
|
|
16
16
|
from .core.graph import Graph, GraphBatch
|
|
@@ -31,6 +31,7 @@ def train_node_classifier(
|
|
|
31
31
|
verbose: bool = True,
|
|
32
32
|
config: Optional[EasyConfig] = None,
|
|
33
33
|
dashboard_dir: Optional[str] = None,
|
|
34
|
+
deterministic: bool = False,
|
|
34
35
|
) -> EasyResult:
|
|
35
36
|
"""Train a node classifier on a graph.
|
|
36
37
|
|
|
@@ -97,9 +98,10 @@ def train_node_classifier(
|
|
|
97
98
|
)
|
|
98
99
|
|
|
99
100
|
if seed is not None:
|
|
100
|
-
torch.manual_seed(seed)
|
|
101
101
|
from tgraphx.reproducibility import set_seed
|
|
102
|
-
set_seed(seed)
|
|
102
|
+
reproducibility_state = set_seed(seed, deterministic=deterministic)
|
|
103
|
+
else:
|
|
104
|
+
reproducibility_state = {"seed": None, "deterministic": deterministic}
|
|
103
105
|
|
|
104
106
|
dev = _resolve_device(device)
|
|
105
107
|
if fanouts is None:
|
|
@@ -133,10 +135,12 @@ def train_node_classifier(
|
|
|
133
135
|
"batch_size": batch_size,
|
|
134
136
|
"device": str(dev),
|
|
135
137
|
"seed": seed,
|
|
138
|
+
"deterministic": deterministic,
|
|
136
139
|
"fanouts": fanouts,
|
|
137
140
|
"hidden_channels": hidden_channels,
|
|
138
141
|
"num_classes": num_classes,
|
|
139
142
|
"node_shape": list(node_shape),
|
|
143
|
+
"reproducibility_state": reproducibility_state,
|
|
140
144
|
}
|
|
141
145
|
|
|
142
146
|
history: List[Dict[str, float]] = []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tgraphx
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
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>
|
|
@@ -102,6 +102,7 @@ tests/test_random_walk_sample.py
|
|
|
102
102
|
tests/test_readme_links.py
|
|
103
103
|
tests/test_release_validation_v030.py
|
|
104
104
|
tests/test_reproducibility.py
|
|
105
|
+
tests/test_reproducibility_easy_v133.py
|
|
105
106
|
tests/test_rl_baselines.py
|
|
106
107
|
tests/test_rl_callbacks_v120.py
|
|
107
108
|
tests/test_rl_high_level_api.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|