tgraphx 1.3.0__tar.gz → 1.3.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.
Files changed (382) hide show
  1. {tgraphx-1.3.0/tgraphx.egg-info → tgraphx-1.3.2}/PKG-INFO +3 -1
  2. {tgraphx-1.3.0 → tgraphx-1.3.2}/README.md +2 -0
  3. {tgraphx-1.3.0 → tgraphx-1.3.2}/pyproject.toml +1 -1
  4. tgraphx-1.3.2/tests/test_evolutionary_history_v132.py +125 -0
  5. tgraphx-1.3.2/tests/test_kg_feature_aware_v131.py +109 -0
  6. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/__init__.py +1 -1
  7. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/algorithms.py +104 -7
  8. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/models.py +2 -2
  9. {tgraphx-1.3.0 → tgraphx-1.3.2/tgraphx.egg-info}/PKG-INFO +3 -1
  10. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx.egg-info/SOURCES.txt +2 -0
  11. {tgraphx-1.3.0 → tgraphx-1.3.2}/LICENSE +0 -0
  12. {tgraphx-1.3.0 → tgraphx-1.3.2}/setup.cfg +0 -0
  13. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_3d_support.py +0 -0
  14. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_algorithms.py +0 -0
  15. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_amp_compile.py +0 -0
  16. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_api_stability_labels.py +0 -0
  17. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_backward_compatibility.py +0 -0
  18. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_benchmark_smoke.py +0 -0
  19. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_calibration.py +0 -0
  20. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_chunking.py +0 -0
  21. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_cluster_gcn.py +0 -0
  22. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_continuous_rl_algorithms.py +0 -0
  23. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dashboard.py +0 -0
  24. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dashboard_metadata.py +0 -0
  25. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dataset_cache.py +0 -0
  26. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dataset_docs_claims.py +0 -0
  27. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dataset_download_mocked.py +0 -0
  28. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_dataset_registry.py +0 -0
  29. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_datasets_base.py +0 -0
  30. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_devices.py +0 -0
  31. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_distributed_compat.py +0 -0
  32. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_distributed_helpers.py +0 -0
  33. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_distributed_smoke.py +0 -0
  34. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_documentation_claims.py +0 -0
  35. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_edge_features.py +0 -0
  36. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_edge_weight.py +0 -0
  37. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_estimators_v05.py +0 -0
  38. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_evolutionary_graph_optimization.py +0 -0
  39. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_experiments.py +0 -0
  40. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_explainability.py +0 -0
  41. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_factories.py +0 -0
  42. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_folder_datasets.py +0 -0
  43. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_gat_chunking.py +0 -0
  44. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_generation_rl_benchmarks_smoke.py +0 -0
  45. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_gnn_families.py +0 -0
  46. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_gradients.py +0 -0
  47. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph.py +0 -0
  48. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_action_spaces.py +0 -0
  49. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_api.py +0 -0
  50. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_builders.py +0 -0
  51. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_generation_data_model.py +0 -0
  52. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_generation_metrics.py +0 -0
  53. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_rl_algorithms.py +0 -0
  54. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_rl_environments.py +0 -0
  55. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_transformer_v027.py +0 -0
  56. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graph_utils.py +0 -0
  57. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_graphsaint.py +0 -0
  58. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_han_hgt_overfit.py +0 -0
  59. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_hard_negative_sampling.py +0 -0
  60. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_hetero_batch.py +0 -0
  61. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_hetero_layers.py +0 -0
  62. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_hetero_layers_v05.py +0 -0
  63. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_hetero_sampling.py +0 -0
  64. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_imports.py +0 -0
  65. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_io_graphml_v120.py +0 -0
  66. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_benchmarks_smoke.py +0 -0
  67. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_data_model.py +0 -0
  68. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_datasets.py +0 -0
  69. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_evaluation.py +0 -0
  70. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_gnn_integration.py +0 -0
  71. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_hpo_v130.py +0 -0
  72. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_models.py +0 -0
  73. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_multimodal.py +0 -0
  74. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_negative_sampling.py +0 -0
  75. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_reasoning.py +0 -0
  76. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_rescal_v120.py +0 -0
  77. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_simple_v130.py +0 -0
  78. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_temporal.py +0 -0
  79. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_kg_training.py +0 -0
  80. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_layers.py +0 -0
  81. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_loader_feature_store_integration.py +0 -0
  82. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_loader_robustness_v110.py +0 -0
  83. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_loaders_feature_store.py +0 -0
  84. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_matching_coloring_flow.py +0 -0
  85. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_math.py +0 -0
  86. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_math_correctness_v110.py +0 -0
  87. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_math_invariants_v030.py +0 -0
  88. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_metrics.py +0 -0
  89. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_centrality.py +0 -0
  90. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_core.py +0 -0
  91. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_generators_spectral.py +0 -0
  92. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_graph_learning.py +0 -0
  93. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_paths_algorithms.py +0 -0
  94. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_mining_structural.py +0 -0
  95. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_model_zoo.py +0 -0
  96. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_models.py +0 -0
  97. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_negative_sampling.py +0 -0
  98. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_neural_mining.py +0 -0
  99. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_neural_mining_batched.py +0 -0
  100. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_node2vec_kg_hypergraph.py +0 -0
  101. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_notebooks_v130.py +0 -0
  102. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_ogb_tgb_wrappers.py +0 -0
  103. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_packaging.py +0 -0
  104. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_performance_smoke.py +0 -0
  105. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_plotting.py +0 -0
  106. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_public_benchmarks.py +0 -0
  107. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_pyg_dgl_ogb_wrappers.py +0 -0
  108. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_random_walk_sample.py +0 -0
  109. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_readme_links.py +0 -0
  110. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_release_validation_v030.py +0 -0
  111. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_reproducibility.py +0 -0
  112. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_rl_baselines.py +0 -0
  113. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_rl_callbacks_v120.py +0 -0
  114. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_rl_high_level_api.py +0 -0
  115. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_rollout_buffer.py +0 -0
  116. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_sampling.py +0 -0
  117. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_sampling_loaders.py +0 -0
  118. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_sparse_backend_select.py +0 -0
  119. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_sparse_vgae_rgcn.py +0 -0
  120. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_synthetic_datasets.py +0 -0
  121. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_temporal_sampling.py +0 -0
  122. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_temporal_v025.py +0 -0
  123. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_temporal_v05.py +0 -0
  124. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_tgn_tgat_overfit.py +0 -0
  125. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_time_encoding.py +0 -0
  126. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_tiny_overfit_v030.py +0 -0
  127. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_torchvision_wrappers.py +0 -0
  128. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_tracking.py +0 -0
  129. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_training.py +0 -0
  130. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_transforms.py +0 -0
  131. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_user_friendly_llm_snippets.py +0 -0
  132. {tgraphx-1.3.0 → tgraphx-1.3.2}/tests/test_v024_features.py +0 -0
  133. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/__main__.py +0 -0
  134. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/algorithms/__init__.py +0 -0
  135. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/algorithms/connectivity.py +0 -0
  136. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/algorithms/structural.py +0 -0
  137. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/algorithms/traversal.py +0 -0
  138. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/benchmarks/__init__.py +0 -0
  139. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/benchmarks/public.py +0 -0
  140. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/calibration.py +0 -0
  141. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/cluster_gcn.py +0 -0
  142. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/__init__.py +0 -0
  143. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/dataloader.py +0 -0
  144. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/graph.py +0 -0
  145. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/graph_utils.py +0 -0
  146. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/hetero_batch.py +0 -0
  147. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/hetero_graph.py +0 -0
  148. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/temporal.py +0 -0
  149. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/temporal_batch.py +0 -0
  150. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/core/utils.py +0 -0
  151. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/dashboard/__init__.py +0 -0
  152. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/dashboard/__main__.py +0 -0
  153. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/dashboard/app.py +0 -0
  154. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/dashboard/static/dashboard.css +0 -0
  155. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/dashboard/static/dashboard.js +0 -0
  156. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/__init__.py +0 -0
  157. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/base.py +0 -0
  158. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/cache.py +0 -0
  159. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/converters.py +0 -0
  160. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/dgl_wrappers.py +0 -0
  161. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/download.py +0 -0
  162. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/errors.py +0 -0
  163. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/folder.py +0 -0
  164. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/metadata.py +0 -0
  165. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/ogb_wrappers.py +0 -0
  166. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/pyg_wrappers.py +0 -0
  167. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/registry.py +0 -0
  168. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/synthetic.py +0 -0
  169. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/datasets/torchvision_wrappers.py +0 -0
  170. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/distributed.py +0 -0
  171. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/doctor.py +0 -0
  172. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/__init__.py +0 -0
  173. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_data.py +0 -0
  174. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_diagnostics.py +0 -0
  175. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_discovery.py +0 -0
  176. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_exceptions.py +0 -0
  177. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_models.py +0 -0
  178. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_results.py +0 -0
  179. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/easy/_workflows.py +0 -0
  180. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/__init__.py +0 -0
  181. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/base.py +0 -0
  182. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/early_stopping.py +0 -0
  183. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/label_propagation.py +0 -0
  184. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/node2vec.py +0 -0
  185. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/splits.py +0 -0
  186. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/estimators/vgae.py +0 -0
  187. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/__init__.py +0 -0
  188. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/config.py +0 -0
  189. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/fitness.py +0 -0
  190. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/genome.py +0 -0
  191. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/high_level_api.py +0 -0
  192. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/metrics.py +0 -0
  193. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/multi_objective.py +0 -0
  194. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/operators.py +0 -0
  195. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/reports.py +0 -0
  196. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/evolutionary/selection.py +0 -0
  197. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/__init__.py +0 -0
  198. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/callbacks.py +0 -0
  199. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/checkpoints.py +0 -0
  200. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/cli.py +0 -0
  201. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/config.py +0 -0
  202. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/grid.py +0 -0
  203. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/runner.py +0 -0
  204. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/experiments/summarize.py +0 -0
  205. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/__init__.py +0 -0
  206. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/attention.py +0 -0
  207. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/edge_attribution.py +0 -0
  208. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/export.py +0 -0
  209. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/integrated_gradients.py +0 -0
  210. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/patch_heatmap.py +0 -0
  211. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/saliency.py +0 -0
  212. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/explain/utils.py +0 -0
  213. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/feature_store.py +0 -0
  214. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/__init__.py +0 -0
  215. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/actions.py +0 -0
  216. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/classical.py +0 -0
  217. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/config.py +0 -0
  218. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/data_model.py +0 -0
  219. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/high_level_api.py +0 -0
  220. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/metrics.py +0 -0
  221. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/neural.py +0 -0
  222. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/projectors.py +0 -0
  223. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/generation/reports.py +0 -0
  224. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/graph_builders.py +0 -0
  225. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/graphsaint.py +0 -0
  226. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/hetero_sampling.py +0 -0
  227. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/interop.py +0 -0
  228. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/io/__init__.py +0 -0
  229. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/io/graphml.py +0 -0
  230. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/__init__.py +0 -0
  231. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/data.py +0 -0
  232. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/datasets.py +0 -0
  233. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/evaluation.py +0 -0
  234. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/gnn.py +0 -0
  235. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/hpo.py +0 -0
  236. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/losses.py +0 -0
  237. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/multimodal.py +0 -0
  238. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/projectors.py +0 -0
  239. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/reasoning.py +0 -0
  240. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/reports.py +0 -0
  241. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/sampling.py +0 -0
  242. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/temporal.py +0 -0
  243. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/kg/trainer.py +0 -0
  244. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/__init__.py +0 -0
  245. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/_dim.py +0 -0
  246. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/_scatter.py +0 -0
  247. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/aggregator.py +0 -0
  248. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/appnp.py +0 -0
  249. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/attention_message.py +0 -0
  250. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/base.py +0 -0
  251. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/conv_message.py +0 -0
  252. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/factory.py +0 -0
  253. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/gat.py +0 -0
  254. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/gatv2.py +0 -0
  255. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/gin.py +0 -0
  256. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/graph_transformer.py +0 -0
  257. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/han.py +0 -0
  258. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/hetero.py +0 -0
  259. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/hetero_readout.py +0 -0
  260. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/hgt.py +0 -0
  261. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/pooling.py +0 -0
  262. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/rgcn.py +0 -0
  263. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/safe_pool.py +0 -0
  264. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/sage.py +0 -0
  265. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/temporal_readout.py +0 -0
  266. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/transformer_encodings.py +0 -0
  267. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/layers/vector_gcn.py +0 -0
  268. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/learned_graph.py +0 -0
  269. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/loaders.py +0 -0
  270. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/__init__.py +0 -0
  271. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/classification.py +0 -0
  272. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/link_prediction.py +0 -0
  273. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/ogb.py +0 -0
  274. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/ranking.py +0 -0
  275. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/regression.py +0 -0
  276. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/metrics/reports.py +0 -0
  277. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/__init__.py +0 -0
  278. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/anomaly.py +0 -0
  279. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/api.py +0 -0
  280. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/centrality.py +0 -0
  281. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/communities.py +0 -0
  282. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/embeddings.py +0 -0
  283. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/frequent.py +0 -0
  284. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/generators.py +0 -0
  285. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/graph_io.py +0 -0
  286. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/graph_learning.py +0 -0
  287. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/hetero.py +0 -0
  288. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/hypergraph.py +0 -0
  289. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/kernels.py +0 -0
  290. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/knowledge_graph.py +0 -0
  291. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/label_prop.py +0 -0
  292. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/link_prediction.py +0 -0
  293. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/matching_coloring.py +0 -0
  294. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/motifs.py +0 -0
  295. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/neural.py +0 -0
  296. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/node2vec.py +0 -0
  297. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/paths.py +0 -0
  298. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/patterns.py +0 -0
  299. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/prototype.py +0 -0
  300. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/random_walk.py +0 -0
  301. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/reports.py +0 -0
  302. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/sequence_models.py +0 -0
  303. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/similarity.py +0 -0
  304. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/spectral.py +0 -0
  305. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/structural.py +0 -0
  306. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/structural_encodings.py +0 -0
  307. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/temporal.py +0 -0
  308. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/mining/vgae.py +0 -0
  309. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/__init__.py +0 -0
  310. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/cnn_encoder.py +0 -0
  311. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/cnn_gnn_model.py +0 -0
  312. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/edge_predictor.py +0 -0
  313. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/factory.py +0 -0
  314. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/graph_classifier.py +0 -0
  315. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/hetero_models.py +0 -0
  316. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/model_zoo.py +0 -0
  317. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/node_classifier.py +0 -0
  318. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/pre_encoder.py +0 -0
  319. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/regressors.py +0 -0
  320. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/models/temporal_models.py +0 -0
  321. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/performance.py +0 -0
  322. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/plotting/__init__.py +0 -0
  323. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/plotting/graph.py +0 -0
  324. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/plotting/layouts.py +0 -0
  325. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/plotting/mining.py +0 -0
  326. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/plotting/utils.py +0 -0
  327. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/reproducibility.py +0 -0
  328. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/__init__.py +0 -0
  329. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/__init__.py +0 -0
  330. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/actor_critic.py +0 -0
  331. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/base.py +0 -0
  332. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/baselines.py +0 -0
  333. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/continuous.py +0 -0
  334. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/dqn.py +0 -0
  335. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/ppo.py +0 -0
  336. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/reinforce.py +0 -0
  337. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/algorithms/replay_buffer.py +0 -0
  338. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/callbacks.py +0 -0
  339. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/config.py +0 -0
  340. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/__init__.py +0 -0
  341. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/base.py +0 -0
  342. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/coloring.py +0 -0
  343. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/continuous.py +0 -0
  344. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/generation.py +0 -0
  345. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/kg_reasoning.py +0 -0
  346. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/max_cut.py +0 -0
  347. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/navigation.py +0 -0
  348. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/shortest_path.py +0 -0
  349. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/environments/vertex_cover.py +0 -0
  350. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/exploration/__init__.py +0 -0
  351. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/exploration/strategies.py +0 -0
  352. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/high_level_api.py +0 -0
  353. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/metrics.py +0 -0
  354. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/__init__.py +0 -0
  355. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/actor_critic.py +0 -0
  356. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/policy.py +0 -0
  357. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/projectors.py +0 -0
  358. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/qnetwork.py +0 -0
  359. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/networks/value.py +0 -0
  360. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/rl/reports.py +0 -0
  361. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/sampling.py +0 -0
  362. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/sampling_loaders.py +0 -0
  363. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/sampling_negative.py +0 -0
  364. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/sparse.py +0 -0
  365. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/temporal/__init__.py +0 -0
  366. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/temporal/tgat.py +0 -0
  367. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/temporal/tgn.py +0 -0
  368. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/temporal/time_encoding.py +0 -0
  369. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/temporal_sampling.py +0 -0
  370. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/tracking.py +0 -0
  371. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/training.py +0 -0
  372. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/__init__.py +0 -0
  373. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/compose.py +0 -0
  374. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/features.py +0 -0
  375. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/graph.py +0 -0
  376. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/patch.py +0 -0
  377. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/positional.py +0 -0
  378. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx/transforms/splits.py +0 -0
  379. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx.egg-info/dependency_links.txt +0 -0
  380. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx.egg-info/entry_points.txt +0 -0
  381. {tgraphx-1.3.0 → tgraphx-1.3.2}/tgraphx.egg-info/requires.txt +0 -0
  382. {tgraphx-1.3.0 → tgraphx-1.3.2}/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.0
3
+ Version: 1.3.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>
@@ -198,6 +198,8 @@ out.sum().backward()
198
198
  A Colab tutorial walks through every workflow:
199
199
  [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1agls1xtqE5WxbWthcG0HEa3Gbk3fvoCD?usp=sharing)
200
200
 
201
+ **Notebook gallery:** 13 scenario-driven notebooks covering Easy Mode, tensor-native image-patch graphs, sampling, knowledge graphs (including KG HPO and multimodal entity features), and graph generation are available in [docs/colab_gallery.md](docs/colab_gallery.md).
202
+
201
203
  ---
202
204
 
203
205
  ## Capability map
@@ -143,6 +143,8 @@ out.sum().backward()
143
143
  A Colab tutorial walks through every workflow:
144
144
  [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1agls1xtqE5WxbWthcG0HEa3Gbk3fvoCD?usp=sharing)
145
145
 
146
+ **Notebook gallery:** 13 scenario-driven notebooks covering Easy Mode, tensor-native image-patch graphs, sampling, knowledge graphs (including KG HPO and multimodal entity features), and graph generation are available in [docs/colab_gallery.md](docs/colab_gallery.md).
147
+
146
148
  ---
147
149
 
148
150
  ## Capability map
@@ -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.0"
8
+ version = "1.3.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"
@@ -0,0 +1,125 @@
1
+ """Regression tests for EvolutionResult.history (v1.3.2 bugfix).
2
+
3
+ Bug fixed: EvolutionResult had no `history` attribute, causing AttributeError
4
+ when users accessed `result.history` after optimization.
5
+ """
6
+ from __future__ import annotations
7
+ import json
8
+ import pytest
9
+ import torch
10
+
11
+ from tgraphx.evolutionary import (
12
+ GraphGenome, GeneticAlgorithmOptimizer, GeneticAlgorithmConfig,
13
+ NSGAIIOptimizer, EvolutionConfig, connectivity_fitness,
14
+ )
15
+
16
+
17
+ def _genome(seed=0):
18
+ torch.manual_seed(seed)
19
+ return GraphGenome(edge_index=torch.randint(0, 8, (2, 10)), num_nodes=8)
20
+
21
+
22
+ def _ga_result(n_gen=5):
23
+ cfg = GeneticAlgorithmConfig(population_size=6, n_generations=n_gen, seed=0)
24
+ return GeneticAlgorithmOptimizer(cfg, connectivity_fitness).optimize([_genome(i) for i in range(6)])
25
+
26
+
27
+ class TestGAHistory:
28
+ def test_history_attribute_exists(self):
29
+ r = _ga_result()
30
+ assert hasattr(r, "history")
31
+
32
+ def test_history_length_equals_n_generations(self):
33
+ n = 7
34
+ r = _ga_result(n)
35
+ assert len(r.history) == n
36
+
37
+ def test_history_entries_are_dicts(self):
38
+ r = _ga_result()
39
+ for entry in r.history:
40
+ assert isinstance(entry, dict)
41
+
42
+ def test_history_has_required_keys(self):
43
+ r = _ga_result()
44
+ for entry in r.history:
45
+ assert "generation" in entry
46
+ assert "best_fitness" in entry
47
+
48
+ def test_history_generation_index_correct(self):
49
+ r = _ga_result(4)
50
+ assert r.history[0]["generation"] == 0
51
+ assert r.history[3]["generation"] == 3
52
+
53
+ def test_best_fitness_unchanged(self):
54
+ r = _ga_result()
55
+ assert isinstance(r.best_fitness, float)
56
+ assert r.best_fitness > 0
57
+
58
+ def test_colab_exact_repro(self):
59
+ """Exact snippet from the Colab bug report."""
60
+ config = GeneticAlgorithmConfig(population_size=10, n_generations=15, seed=42)
61
+ pop = [_genome(i) for i in range(10)]
62
+ result = GeneticAlgorithmOptimizer(config, connectivity_fitness).optimize(pop)
63
+ # These were the two print statements that triggered the bug:
64
+ _ = result.best_fitness # must not raise
65
+ _ = len(result.history) # must not raise (was AttributeError)
66
+ assert len(result.history) > 0
67
+
68
+
69
+ class TestGASummaryToDict:
70
+ def test_summary_returns_string(self):
71
+ r = _ga_result()
72
+ s = r.summary()
73
+ assert isinstance(s, str)
74
+ assert "Best fitness" in s
75
+
76
+ def test_to_dict_json_serializable(self):
77
+ r = _ga_result()
78
+ d = r.to_dict()
79
+ json.dumps(d)
80
+
81
+ def test_to_dict_has_expected_keys(self):
82
+ r = _ga_result()
83
+ d = r.to_dict()
84
+ assert "best_fitness" in d
85
+ assert "n_generations" in d
86
+ assert "fitness_history" in d
87
+
88
+
89
+ class TestNSGAIIHistory:
90
+ def _nsga_result(self, n_gen=6, single_fn=True):
91
+ cfg = EvolutionConfig(population_size=6, n_generations=n_gen, seed=0)
92
+ fn = connectivity_fitness if single_fn else [connectivity_fitness, connectivity_fitness]
93
+ return NSGAIIOptimizer(cfg, fn).optimize([_genome(i) for i in range(6)])
94
+
95
+ def test_history_attribute_exists(self):
96
+ r = self._nsga_result()
97
+ assert hasattr(r, "history")
98
+
99
+ def test_history_length_equals_n_generations(self):
100
+ n = 8
101
+ r = self._nsga_result(n)
102
+ assert len(r.history) == n
103
+
104
+ def test_history_has_generation_key(self):
105
+ r = self._nsga_result()
106
+ for entry in r.history:
107
+ assert "generation" in entry
108
+
109
+ def test_pareto_front_still_present(self):
110
+ r = self._nsga_result()
111
+ assert r.pareto_front is not None
112
+
113
+ def test_single_callable_accepted(self):
114
+ """NSGAIIOptimizer must accept a single callable (not just a list)."""
115
+ cfg = EvolutionConfig(population_size=4, n_generations=3, seed=0)
116
+ r = NSGAIIOptimizer(cfg, connectivity_fitness).optimize([_genome(i) for i in range(4)])
117
+ assert len(r.history) == 3
118
+
119
+ def test_list_of_fns_still_works(self):
120
+ """Passing a list of functions must still work."""
121
+ cfg = EvolutionConfig(population_size=4, n_generations=3, seed=0)
122
+ r = NSGAIIOptimizer(cfg, [connectivity_fitness, connectivity_fitness]).optimize(
123
+ [_genome(i) for i in range(4)]
124
+ )
125
+ assert len(r.history) == 3
@@ -0,0 +1,109 @@
1
+ """Regression tests for feature-aware KG scoring (v1.3.1 bugfix).
2
+
3
+ Bug fixed: TransEModel._embed_entities called self.entity_proj(feat) instead of
4
+ self.entity_proj(emb, feat), causing:
5
+ TypeError: _FeatureProjector.forward() missing 1 required positional argument: 'feat'
6
+
7
+ These tests pin the correct behaviour and prevent regression.
8
+ """
9
+ from __future__ import annotations
10
+ import pytest
11
+ import torch
12
+ import torch.nn as nn
13
+
14
+
15
+ class TestFeatureAwareTransE:
16
+ """TransEModel with entity_feature_dim and relation_feature_dim."""
17
+
18
+ def test_entity_features_score_shape(self):
19
+ from tgraphx.kg import TransEModel
20
+ N_e, N_r, D, F_e = 10, 3, 16, 32
21
+ model = TransEModel(N_e, N_r, embedding_dim=D, entity_feature_dim=F_e)
22
+ triples = torch.tensor([[0,0,1],[2,1,3]], dtype=torch.long)
23
+ feats = torch.randn(N_e, F_e)
24
+ scores = model.score_triples(triples, entity_features=feats)
25
+ assert scores.shape == (2,)
26
+
27
+ def test_entity_features_gradient_flows_into_projector(self):
28
+ from tgraphx.kg import TransEModel
29
+ N_e, N_r, D, F_e = 10, 3, 16, 32
30
+ model = TransEModel(N_e, N_r, embedding_dim=D, entity_feature_dim=F_e)
31
+ triples = torch.tensor([[0,0,1],[2,1,3]], dtype=torch.long)
32
+ feats = torch.randn(N_e, F_e)
33
+ scores = model.score_triples(triples, entity_features=feats)
34
+ scores.mean().backward()
35
+ assert model.entity_proj.proj.weight.grad is not None
36
+ assert torch.isfinite(model.entity_proj.proj.weight.grad).all()
37
+ assert model.entity_proj.proj.weight.grad.abs().sum() > 0
38
+
39
+ def test_relation_features_score_shape(self):
40
+ from tgraphx.kg import TransEModel
41
+ N_e, N_r, D, F_r = 10, 3, 16, 8
42
+ model = TransEModel(N_e, N_r, embedding_dim=D, relation_feature_dim=F_r)
43
+ triples = torch.tensor([[0,0,1],[2,1,3]], dtype=torch.long)
44
+ r_feats = torch.randn(N_r, F_r)
45
+ scores = model.score_triples(triples, relation_features=r_feats)
46
+ assert scores.shape == (2,)
47
+
48
+ def test_both_entity_and_relation_features(self):
49
+ from tgraphx.kg import TransEModel
50
+ N_e, N_r, D = 8, 2, 12
51
+ model = TransEModel(N_e, N_r, embedding_dim=D,
52
+ entity_feature_dim=16, relation_feature_dim=8)
53
+ triples = torch.tensor([[0,0,1],[2,1,3]], dtype=torch.long)
54
+ scores = model.score_triples(
55
+ triples,
56
+ entity_features=torch.randn(N_e, 16),
57
+ relation_features=torch.randn(N_r, 8),
58
+ )
59
+ assert scores.shape == (2,)
60
+ scores.mean().backward()
61
+ assert model.entity_proj.proj.weight.grad is not None
62
+ assert model.relation_proj.proj.weight.grad is not None
63
+
64
+ def test_no_features_unchanged(self):
65
+ """Without entity_features, behaviour is unchanged (no regression)."""
66
+ from tgraphx.kg import TransEModel
67
+ model = TransEModel(5, 2, embedding_dim=8)
68
+ triples = torch.tensor([[0,0,1]], dtype=torch.long)
69
+ scores = model.score_triples(triples)
70
+ assert scores.shape == (1,)
71
+
72
+ def test_colab_exact_user_repro(self):
73
+ """Exact code from the Colab bug report."""
74
+ from tgraphx.kg import KnowledgeGraph, TransEModel
75
+ torch.manual_seed(0)
76
+ N_e, N_r, N_t = 10, 3, 30
77
+ heads = torch.randint(0, N_e, (N_t,))
78
+ rels = torch.randint(0, N_r, (N_t,))
79
+ tails = torch.randint(0, N_e, (N_t,))
80
+ entity_features = {"visual": torch.randn(N_e, 32)}
81
+ kg = KnowledgeGraph.from_hrt(
82
+ heads, rels, tails,
83
+ num_entities=N_e, num_relations=N_r,
84
+ entity_features=entity_features,
85
+ )
86
+ model = TransEModel(N_e, N_r, embedding_dim=16, entity_feature_dim=32)
87
+ triples = torch.stack([heads, rels, tails], dim=1)
88
+ scores = model.score_triples(triples, entity_features=kg.entity_features["visual"])
89
+ assert scores.shape == (N_t,)
90
+ scores.mean().backward()
91
+ assert model.entity_proj.proj.weight.grad is not None
92
+
93
+
94
+ class TestFeatureAwareDistMult:
95
+ """DistMult has entity/relation projector support via _emb_e/_emb_r helpers.
96
+ Its public score_triples() does not expose entity_features= kwarg, but the
97
+ projectors must be callable with (emb, feat) — pin this against regression.
98
+ """
99
+
100
+ def test_projector_callable_correctly(self):
101
+ """The _FeatureProjector must accept (emb, feat) — not just (feat,)."""
102
+ from tgraphx.kg import DistMultModel
103
+ N_e, N_r, D, F_e = 8, 2, 16, 24
104
+ model = DistMultModel(N_e, N_r, embedding_dim=D, entity_feature_dim=F_e)
105
+ idx = torch.tensor([0, 1], dtype=torch.long)
106
+ feat = torch.randn(2, F_e)
107
+ # Call the internal _emb_e with a feature slice — must not raise.
108
+ out = model._emb_e(idx, feat)
109
+ assert out.shape == (2, D)
@@ -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.0"
13
+ __version__ = "1.3.2"
14
14
 
15
15
  # ── Core data structures ──────────────────────────────────────────────────────
16
16
  from .core.graph import Graph, GraphBatch
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  import math
8
8
  from dataclasses import dataclass, field
9
- from typing import Any, Callable, Dict, List, Optional
9
+ from typing import Any, Callable, Dict, List, Optional, Union
10
10
 
11
11
  import torch
12
12
 
@@ -49,14 +49,24 @@ class GeneticAlgorithmConfig:
49
49
  class EvolutionResult:
50
50
  """Result of an evolutionary optimization run.
51
51
 
52
- Args:
52
+ Attributes:
53
53
  best_genome: Best genome found.
54
- best_fitness: Best fitness value.
55
- fitness_history: Best fitness per generation.
54
+ best_fitness: Best fitness value (scalar).
55
+ fitness_history: Best fitness value per generation ``[float, ...]``.
56
56
  diversity_history: WL uniqueness fraction per generation.
57
- pareto_front: Pareto front (for multi-objective only).
57
+ pareto_front: Pareto front (multi-objective only; ``None`` otherwise).
58
58
  config: Configuration used.
59
59
  extra: Additional metadata.
60
+
61
+ Derived properties:
62
+ history: Per-generation list of dicts::
63
+
64
+ [{"generation": 0, "best_fitness": ..., "diversity": ...,
65
+ "pareto_front_size": ..., "population_size": ...}, ...]
66
+
67
+ Methods:
68
+ summary(): Return a human-readable string.
69
+ to_dict(): Return a JSON-serialisable dict.
60
70
  """
61
71
 
62
72
  best_genome: Optional[GraphGenome]
@@ -67,6 +77,75 @@ class EvolutionResult:
67
77
  config: Optional[Any] = None
68
78
  extra: Dict[str, Any] = field(default_factory=dict)
69
79
 
80
+ @property
81
+ def history(self) -> List[Dict[str, Any]]:
82
+ """Per-generation evolution history.
83
+
84
+ Returns a list of dicts, one entry per completed generation::
85
+
86
+ [
87
+ {"generation": 0, "best_fitness": 0.82, "diversity": 0.9,
88
+ "pareto_front_size": None, "population_size": None},
89
+ ...
90
+ ]
91
+
92
+ Fields present in every entry:
93
+ generation (int): 0-based generation index.
94
+ best_fitness (float or None): Best fitness seen at that generation.
95
+ diversity (float or None): Population diversity (WL uniqueness).
96
+ pareto_front_size (int or None): Pareto-front size for
97
+ multi-objective runs; ``None`` for single-objective.
98
+ population_size (int or None): Population size if stored in
99
+ ``extra["population_sizes"]``; else ``None``.
100
+ """
101
+ n = max(len(self.fitness_history), len(self.diversity_history))
102
+ # Pareto-front sizes per generation if available.
103
+ pf_sizes: List[Optional[int]] = self.extra.get("pareto_front_sizes", [])
104
+ pop_sizes: List[Optional[int]] = self.extra.get("population_sizes", [])
105
+ result = []
106
+ for i in range(n):
107
+ entry: Dict[str, Any] = {
108
+ "generation": i,
109
+ "best_fitness": self.fitness_history[i] if i < len(self.fitness_history) else None,
110
+ "diversity": self.diversity_history[i] if i < len(self.diversity_history) else None,
111
+ "pareto_front_size": pf_sizes[i] if i < len(pf_sizes) else None,
112
+ "population_size": pop_sizes[i] if i < len(pop_sizes) else None,
113
+ }
114
+ result.append(entry)
115
+ return result
116
+
117
+ def summary(self) -> str:
118
+ """Return a human-readable summary string (also prints it)."""
119
+ lines = [
120
+ "=" * 50,
121
+ "TGraphX Evolutionary Optimization Result",
122
+ "=" * 50,
123
+ f"Best fitness: {self.best_fitness:.6f}",
124
+ f"Generations: {len(self.fitness_history)}",
125
+ ]
126
+ if self.pareto_front:
127
+ lines.append(f"Pareto front: {len(self.pareto_front)} solutions")
128
+ if self.fitness_history:
129
+ lines.append(f"Initial best: {self.fitness_history[0]:.6f}")
130
+ lines.append(f"Final best: {self.fitness_history[-1]:.6f}")
131
+ text = "\n".join(lines)
132
+ print(text)
133
+ return text
134
+
135
+ def to_dict(self) -> Dict[str, Any]:
136
+ """Return a JSON-serialisable dict (excludes non-serialisable genome)."""
137
+ return {
138
+ "best_fitness": float(self.best_fitness),
139
+ "n_generations": len(self.fitness_history),
140
+ "fitness_history": [float(f) for f in self.fitness_history],
141
+ "diversity_history": [float(d) for d in self.diversity_history],
142
+ "pareto_front_size": len(self.pareto_front) if self.pareto_front else None,
143
+ "extra": {
144
+ k: v for k, v in self.extra.items()
145
+ if isinstance(v, (str, int, float, bool, list, dict, type(None)))
146
+ },
147
+ }
148
+
70
149
 
71
150
  def _compute_diversity(population: List[GraphGenome]) -> float:
72
151
  """Compute population diversity as WL uniqueness fraction."""
@@ -333,10 +412,14 @@ class NSGAIIOptimizer:
333
412
  def __init__(
334
413
  self,
335
414
  config: EvolutionConfig,
336
- fitness_fn_list: List[Callable[[GraphGenome], float]],
415
+ fitness_fn_list: Union[Callable[[GraphGenome], float], List[Callable[[GraphGenome], float]]],
337
416
  ) -> None:
338
417
  self.config = config
339
- self.fitness_fn_list = fitness_fn_list
418
+ # Accept a single callable for convenience (wraps it in a one-element list).
419
+ if callable(fitness_fn_list) and not isinstance(fitness_fn_list, list):
420
+ self.fitness_fn_list = [fitness_fn_list]
421
+ else:
422
+ self.fitness_fn_list = fitness_fn_list
340
423
  self._generator: Optional[torch.Generator] = None
341
424
  if config.seed is not None:
342
425
  self._generator = torch.Generator()
@@ -358,6 +441,10 @@ class NSGAIIOptimizer:
358
441
  """
359
442
  population = [g.clone() for g in initial_population]
360
443
 
444
+ fitness_history: List[float] = []
445
+ diversity_history: List[float] = []
446
+ pareto_front_sizes: List[int] = []
447
+
361
448
  for gen in range(self.config.n_generations):
362
449
  # Generate offspring
363
450
  offspring = []
@@ -381,6 +468,13 @@ class NSGAIIOptimizer:
381
468
  n_select=self.config.population_size,
382
469
  )
383
470
 
471
+ # Track per-generation history.
472
+ gen_fitness = [fn(g) for fn in self.fitness_fn_list for g in population]
473
+ best_f1 = max(self.fitness_fn_list[0](g) for g in population)
474
+ fitness_history.append(best_f1)
475
+ diversity_history.append(_compute_diversity(population))
476
+ pareto_front_sizes.append(len(population))
477
+
384
478
  if progress_callback:
385
479
  progress_callback(gen, len(population))
386
480
 
@@ -411,8 +505,11 @@ class NSGAIIOptimizer:
411
505
  return EvolutionResult(
412
506
  best_genome=best_genome,
413
507
  best_fitness=best_fitness,
508
+ fitness_history=fitness_history,
509
+ diversity_history=diversity_history,
414
510
  pareto_front=pareto_front,
415
511
  config=self.config,
512
+ extra={"pareto_front_sizes": pareto_front_sizes},
416
513
  )
417
514
 
418
515
 
@@ -151,7 +151,7 @@ class TransEModel(KGScoringModel):
151
151
  ) -> torch.Tensor:
152
152
  emb = F.normalize(self.entity_emb(idx), p=2, dim=-1)
153
153
  if feat is not None and self.entity_proj is not None:
154
- emb = emb + self.entity_proj(feat.float())
154
+ emb = self.entity_proj(emb, feat.float())
155
155
  return emb
156
156
 
157
157
  def _embed_relations(
@@ -159,7 +159,7 @@ class TransEModel(KGScoringModel):
159
159
  ) -> torch.Tensor:
160
160
  emb = self.relation_emb(idx)
161
161
  if feat is not None and self.relation_proj is not None:
162
- emb = emb + self.relation_proj(feat.float())
162
+ emb = self.relation_proj(emb, feat.float())
163
163
  return emb
164
164
 
165
165
  def score_triples(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tgraphx
3
- Version: 1.3.0
3
+ Version: 1.3.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>
@@ -198,6 +198,8 @@ out.sum().backward()
198
198
  A Colab tutorial walks through every workflow:
199
199
  [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1agls1xtqE5WxbWthcG0HEa3Gbk3fvoCD?usp=sharing)
200
200
 
201
+ **Notebook gallery:** 13 scenario-driven notebooks covering Easy Mode, tensor-native image-patch graphs, sampling, knowledge graphs (including KG HPO and multimodal entity features), and graph generation are available in [docs/colab_gallery.md](docs/colab_gallery.md).
202
+
201
203
  ---
202
204
 
203
205
  ## Capability map
@@ -27,6 +27,7 @@ tests/test_edge_features.py
27
27
  tests/test_edge_weight.py
28
28
  tests/test_estimators_v05.py
29
29
  tests/test_evolutionary_graph_optimization.py
30
+ tests/test_evolutionary_history_v132.py
30
31
  tests/test_experiments.py
31
32
  tests/test_explainability.py
32
33
  tests/test_factories.py
@@ -58,6 +59,7 @@ tests/test_kg_benchmarks_smoke.py
58
59
  tests/test_kg_data_model.py
59
60
  tests/test_kg_datasets.py
60
61
  tests/test_kg_evaluation.py
62
+ tests/test_kg_feature_aware_v131.py
61
63
  tests/test_kg_gnn_integration.py
62
64
  tests/test_kg_hpo_v130.py
63
65
  tests/test_kg_models.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