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.
Files changed (383) hide show
  1. {tgraphx-1.3.2/tgraphx.egg-info → tgraphx-1.3.3}/PKG-INFO +1 -1
  2. {tgraphx-1.3.2 → tgraphx-1.3.3}/pyproject.toml +1 -1
  3. tgraphx-1.3.3/tests/test_reproducibility_easy_v133.py +137 -0
  4. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/__init__.py +1 -1
  5. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_workflows.py +6 -2
  6. {tgraphx-1.3.2 → tgraphx-1.3.3/tgraphx.egg-info}/PKG-INFO +1 -1
  7. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/SOURCES.txt +1 -0
  8. {tgraphx-1.3.2 → tgraphx-1.3.3}/LICENSE +0 -0
  9. {tgraphx-1.3.2 → tgraphx-1.3.3}/README.md +0 -0
  10. {tgraphx-1.3.2 → tgraphx-1.3.3}/setup.cfg +0 -0
  11. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_3d_support.py +0 -0
  12. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_algorithms.py +0 -0
  13. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_amp_compile.py +0 -0
  14. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_api_stability_labels.py +0 -0
  15. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_backward_compatibility.py +0 -0
  16. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_benchmark_smoke.py +0 -0
  17. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_calibration.py +0 -0
  18. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_chunking.py +0 -0
  19. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_cluster_gcn.py +0 -0
  20. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_continuous_rl_algorithms.py +0 -0
  21. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dashboard.py +0 -0
  22. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dashboard_metadata.py +0 -0
  23. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_cache.py +0 -0
  24. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_docs_claims.py +0 -0
  25. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_download_mocked.py +0 -0
  26. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_dataset_registry.py +0 -0
  27. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_datasets_base.py +0 -0
  28. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_devices.py +0 -0
  29. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_compat.py +0 -0
  30. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_helpers.py +0 -0
  31. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_distributed_smoke.py +0 -0
  32. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_documentation_claims.py +0 -0
  33. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_edge_features.py +0 -0
  34. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_edge_weight.py +0 -0
  35. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_estimators_v05.py +0 -0
  36. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_evolutionary_graph_optimization.py +0 -0
  37. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_evolutionary_history_v132.py +0 -0
  38. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_experiments.py +0 -0
  39. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_explainability.py +0 -0
  40. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_factories.py +0 -0
  41. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_folder_datasets.py +0 -0
  42. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gat_chunking.py +0 -0
  43. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_generation_rl_benchmarks_smoke.py +0 -0
  44. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gnn_families.py +0 -0
  45. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_gradients.py +0 -0
  46. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph.py +0 -0
  47. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_action_spaces.py +0 -0
  48. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_api.py +0 -0
  49. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_builders.py +0 -0
  50. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_generation_data_model.py +0 -0
  51. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_generation_metrics.py +0 -0
  52. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_rl_algorithms.py +0 -0
  53. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_rl_environments.py +0 -0
  54. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_transformer_v027.py +0 -0
  55. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graph_utils.py +0 -0
  56. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_graphsaint.py +0 -0
  57. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_han_hgt_overfit.py +0 -0
  58. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hard_negative_sampling.py +0 -0
  59. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_batch.py +0 -0
  60. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_layers.py +0 -0
  61. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_layers_v05.py +0 -0
  62. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_hetero_sampling.py +0 -0
  63. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_imports.py +0 -0
  64. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_io_graphml_v120.py +0 -0
  65. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_benchmarks_smoke.py +0 -0
  66. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_data_model.py +0 -0
  67. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_datasets.py +0 -0
  68. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_evaluation.py +0 -0
  69. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_feature_aware_v131.py +0 -0
  70. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_gnn_integration.py +0 -0
  71. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_hpo_v130.py +0 -0
  72. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_models.py +0 -0
  73. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_multimodal.py +0 -0
  74. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_negative_sampling.py +0 -0
  75. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_reasoning.py +0 -0
  76. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_rescal_v120.py +0 -0
  77. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_simple_v130.py +0 -0
  78. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_temporal.py +0 -0
  79. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_kg_training.py +0 -0
  80. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_layers.py +0 -0
  81. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loader_feature_store_integration.py +0 -0
  82. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loader_robustness_v110.py +0 -0
  83. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_loaders_feature_store.py +0 -0
  84. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_matching_coloring_flow.py +0 -0
  85. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math.py +0 -0
  86. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math_correctness_v110.py +0 -0
  87. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_math_invariants_v030.py +0 -0
  88. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_metrics.py +0 -0
  89. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_centrality.py +0 -0
  90. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_core.py +0 -0
  91. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_generators_spectral.py +0 -0
  92. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_graph_learning.py +0 -0
  93. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_paths_algorithms.py +0 -0
  94. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_mining_structural.py +0 -0
  95. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_model_zoo.py +0 -0
  96. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_models.py +0 -0
  97. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_negative_sampling.py +0 -0
  98. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_neural_mining.py +0 -0
  99. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_neural_mining_batched.py +0 -0
  100. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_node2vec_kg_hypergraph.py +0 -0
  101. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_notebooks_v130.py +0 -0
  102. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_ogb_tgb_wrappers.py +0 -0
  103. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_packaging.py +0 -0
  104. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_performance_smoke.py +0 -0
  105. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_plotting.py +0 -0
  106. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_public_benchmarks.py +0 -0
  107. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_pyg_dgl_ogb_wrappers.py +0 -0
  108. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_random_walk_sample.py +0 -0
  109. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_readme_links.py +0 -0
  110. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_release_validation_v030.py +0 -0
  111. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_reproducibility.py +0 -0
  112. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_baselines.py +0 -0
  113. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_callbacks_v120.py +0 -0
  114. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rl_high_level_api.py +0 -0
  115. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_rollout_buffer.py +0 -0
  116. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sampling.py +0 -0
  117. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sampling_loaders.py +0 -0
  118. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sparse_backend_select.py +0 -0
  119. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_sparse_vgae_rgcn.py +0 -0
  120. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_synthetic_datasets.py +0 -0
  121. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_sampling.py +0 -0
  122. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_v025.py +0 -0
  123. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_temporal_v05.py +0 -0
  124. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tgn_tgat_overfit.py +0 -0
  125. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_time_encoding.py +0 -0
  126. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tiny_overfit_v030.py +0 -0
  127. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_torchvision_wrappers.py +0 -0
  128. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_tracking.py +0 -0
  129. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_training.py +0 -0
  130. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_transforms.py +0 -0
  131. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_user_friendly_llm_snippets.py +0 -0
  132. {tgraphx-1.3.2 → tgraphx-1.3.3}/tests/test_v024_features.py +0 -0
  133. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/__main__.py +0 -0
  134. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/__init__.py +0 -0
  135. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/connectivity.py +0 -0
  136. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/structural.py +0 -0
  137. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/algorithms/traversal.py +0 -0
  138. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/benchmarks/__init__.py +0 -0
  139. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/benchmarks/public.py +0 -0
  140. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/calibration.py +0 -0
  141. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/cluster_gcn.py +0 -0
  142. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/__init__.py +0 -0
  143. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/dataloader.py +0 -0
  144. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/graph.py +0 -0
  145. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/graph_utils.py +0 -0
  146. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/hetero_batch.py +0 -0
  147. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/hetero_graph.py +0 -0
  148. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/temporal.py +0 -0
  149. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/temporal_batch.py +0 -0
  150. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/core/utils.py +0 -0
  151. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/__init__.py +0 -0
  152. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/__main__.py +0 -0
  153. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/app.py +0 -0
  154. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/static/dashboard.css +0 -0
  155. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/dashboard/static/dashboard.js +0 -0
  156. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/__init__.py +0 -0
  157. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/base.py +0 -0
  158. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/cache.py +0 -0
  159. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/converters.py +0 -0
  160. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/dgl_wrappers.py +0 -0
  161. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/download.py +0 -0
  162. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/errors.py +0 -0
  163. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/folder.py +0 -0
  164. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/metadata.py +0 -0
  165. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/ogb_wrappers.py +0 -0
  166. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/pyg_wrappers.py +0 -0
  167. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/registry.py +0 -0
  168. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/synthetic.py +0 -0
  169. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/datasets/torchvision_wrappers.py +0 -0
  170. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/distributed.py +0 -0
  171. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/doctor.py +0 -0
  172. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/__init__.py +0 -0
  173. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_data.py +0 -0
  174. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_diagnostics.py +0 -0
  175. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_discovery.py +0 -0
  176. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_exceptions.py +0 -0
  177. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_models.py +0 -0
  178. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/easy/_results.py +0 -0
  179. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/__init__.py +0 -0
  180. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/base.py +0 -0
  181. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/early_stopping.py +0 -0
  182. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/label_propagation.py +0 -0
  183. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/node2vec.py +0 -0
  184. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/splits.py +0 -0
  185. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/estimators/vgae.py +0 -0
  186. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/__init__.py +0 -0
  187. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/algorithms.py +0 -0
  188. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/config.py +0 -0
  189. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/fitness.py +0 -0
  190. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/genome.py +0 -0
  191. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/high_level_api.py +0 -0
  192. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/metrics.py +0 -0
  193. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/multi_objective.py +0 -0
  194. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/operators.py +0 -0
  195. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/reports.py +0 -0
  196. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/evolutionary/selection.py +0 -0
  197. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/__init__.py +0 -0
  198. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/callbacks.py +0 -0
  199. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/checkpoints.py +0 -0
  200. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/cli.py +0 -0
  201. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/config.py +0 -0
  202. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/grid.py +0 -0
  203. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/runner.py +0 -0
  204. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/experiments/summarize.py +0 -0
  205. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/__init__.py +0 -0
  206. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/attention.py +0 -0
  207. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/edge_attribution.py +0 -0
  208. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/export.py +0 -0
  209. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/integrated_gradients.py +0 -0
  210. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/patch_heatmap.py +0 -0
  211. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/saliency.py +0 -0
  212. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/explain/utils.py +0 -0
  213. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/feature_store.py +0 -0
  214. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/__init__.py +0 -0
  215. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/actions.py +0 -0
  216. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/classical.py +0 -0
  217. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/config.py +0 -0
  218. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/data_model.py +0 -0
  219. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/high_level_api.py +0 -0
  220. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/metrics.py +0 -0
  221. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/neural.py +0 -0
  222. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/projectors.py +0 -0
  223. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/generation/reports.py +0 -0
  224. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/graph_builders.py +0 -0
  225. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/graphsaint.py +0 -0
  226. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/hetero_sampling.py +0 -0
  227. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/interop.py +0 -0
  228. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/io/__init__.py +0 -0
  229. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/io/graphml.py +0 -0
  230. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/__init__.py +0 -0
  231. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/data.py +0 -0
  232. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/datasets.py +0 -0
  233. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/evaluation.py +0 -0
  234. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/gnn.py +0 -0
  235. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/hpo.py +0 -0
  236. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/losses.py +0 -0
  237. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/models.py +0 -0
  238. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/multimodal.py +0 -0
  239. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/projectors.py +0 -0
  240. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/reasoning.py +0 -0
  241. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/reports.py +0 -0
  242. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/sampling.py +0 -0
  243. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/temporal.py +0 -0
  244. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/kg/trainer.py +0 -0
  245. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/__init__.py +0 -0
  246. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/_dim.py +0 -0
  247. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/_scatter.py +0 -0
  248. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/aggregator.py +0 -0
  249. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/appnp.py +0 -0
  250. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/attention_message.py +0 -0
  251. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/base.py +0 -0
  252. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/conv_message.py +0 -0
  253. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/factory.py +0 -0
  254. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gat.py +0 -0
  255. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gatv2.py +0 -0
  256. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/gin.py +0 -0
  257. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/graph_transformer.py +0 -0
  258. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/han.py +0 -0
  259. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hetero.py +0 -0
  260. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hetero_readout.py +0 -0
  261. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/hgt.py +0 -0
  262. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/pooling.py +0 -0
  263. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/rgcn.py +0 -0
  264. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/safe_pool.py +0 -0
  265. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/sage.py +0 -0
  266. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/temporal_readout.py +0 -0
  267. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/transformer_encodings.py +0 -0
  268. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/layers/vector_gcn.py +0 -0
  269. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/learned_graph.py +0 -0
  270. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/loaders.py +0 -0
  271. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/__init__.py +0 -0
  272. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/classification.py +0 -0
  273. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/link_prediction.py +0 -0
  274. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/ogb.py +0 -0
  275. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/ranking.py +0 -0
  276. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/regression.py +0 -0
  277. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/metrics/reports.py +0 -0
  278. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/__init__.py +0 -0
  279. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/anomaly.py +0 -0
  280. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/api.py +0 -0
  281. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/centrality.py +0 -0
  282. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/communities.py +0 -0
  283. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/embeddings.py +0 -0
  284. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/frequent.py +0 -0
  285. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/generators.py +0 -0
  286. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/graph_io.py +0 -0
  287. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/graph_learning.py +0 -0
  288. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/hetero.py +0 -0
  289. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/hypergraph.py +0 -0
  290. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/kernels.py +0 -0
  291. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/knowledge_graph.py +0 -0
  292. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/label_prop.py +0 -0
  293. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/link_prediction.py +0 -0
  294. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/matching_coloring.py +0 -0
  295. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/motifs.py +0 -0
  296. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/neural.py +0 -0
  297. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/node2vec.py +0 -0
  298. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/paths.py +0 -0
  299. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/patterns.py +0 -0
  300. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/prototype.py +0 -0
  301. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/random_walk.py +0 -0
  302. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/reports.py +0 -0
  303. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/sequence_models.py +0 -0
  304. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/similarity.py +0 -0
  305. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/spectral.py +0 -0
  306. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/structural.py +0 -0
  307. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/structural_encodings.py +0 -0
  308. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/temporal.py +0 -0
  309. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/mining/vgae.py +0 -0
  310. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/__init__.py +0 -0
  311. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/cnn_encoder.py +0 -0
  312. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/cnn_gnn_model.py +0 -0
  313. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/edge_predictor.py +0 -0
  314. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/factory.py +0 -0
  315. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/graph_classifier.py +0 -0
  316. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/hetero_models.py +0 -0
  317. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/model_zoo.py +0 -0
  318. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/node_classifier.py +0 -0
  319. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/pre_encoder.py +0 -0
  320. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/regressors.py +0 -0
  321. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/models/temporal_models.py +0 -0
  322. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/performance.py +0 -0
  323. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/__init__.py +0 -0
  324. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/graph.py +0 -0
  325. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/layouts.py +0 -0
  326. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/mining.py +0 -0
  327. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/plotting/utils.py +0 -0
  328. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/reproducibility.py +0 -0
  329. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/__init__.py +0 -0
  330. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/__init__.py +0 -0
  331. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/actor_critic.py +0 -0
  332. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/base.py +0 -0
  333. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/baselines.py +0 -0
  334. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/continuous.py +0 -0
  335. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/dqn.py +0 -0
  336. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/ppo.py +0 -0
  337. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/reinforce.py +0 -0
  338. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/algorithms/replay_buffer.py +0 -0
  339. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/callbacks.py +0 -0
  340. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/config.py +0 -0
  341. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/__init__.py +0 -0
  342. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/base.py +0 -0
  343. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/coloring.py +0 -0
  344. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/continuous.py +0 -0
  345. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/generation.py +0 -0
  346. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/kg_reasoning.py +0 -0
  347. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/max_cut.py +0 -0
  348. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/navigation.py +0 -0
  349. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/shortest_path.py +0 -0
  350. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/environments/vertex_cover.py +0 -0
  351. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/exploration/__init__.py +0 -0
  352. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/exploration/strategies.py +0 -0
  353. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/high_level_api.py +0 -0
  354. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/metrics.py +0 -0
  355. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/__init__.py +0 -0
  356. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/actor_critic.py +0 -0
  357. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/policy.py +0 -0
  358. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/projectors.py +0 -0
  359. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/qnetwork.py +0 -0
  360. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/networks/value.py +0 -0
  361. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/rl/reports.py +0 -0
  362. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling.py +0 -0
  363. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling_loaders.py +0 -0
  364. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sampling_negative.py +0 -0
  365. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/sparse.py +0 -0
  366. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/__init__.py +0 -0
  367. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/tgat.py +0 -0
  368. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/tgn.py +0 -0
  369. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal/time_encoding.py +0 -0
  370. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/temporal_sampling.py +0 -0
  371. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/tracking.py +0 -0
  372. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/training.py +0 -0
  373. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/__init__.py +0 -0
  374. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/compose.py +0 -0
  375. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/features.py +0 -0
  376. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/graph.py +0 -0
  377. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/patch.py +0 -0
  378. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/positional.py +0 -0
  379. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx/transforms/splits.py +0 -0
  380. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/dependency_links.txt +0 -0
  381. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/entry_points.txt +0 -0
  382. {tgraphx-1.3.2 → tgraphx-1.3.3}/tgraphx.egg-info/requires.txt +0 -0
  383. {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.2
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.2"
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.2"
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.2
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