featrixsphere 0.2.6708__tar.gz → 0.2.6710__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 (328) hide show
  1. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/PKG-INFO +1 -1
  2. featrixsphere-0.2.6710/VERSION +1 -0
  3. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/__init__.py +1 -1
  4. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/client.py +28 -0
  5. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/foundational_model.py +110 -24
  6. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/PKG-INFO +1 -1
  7. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/embedded_space.py +120 -2
  8. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/sphere_config.py +28 -0
  9. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_history_db.py +49 -26
  10. featrixsphere-0.2.6708/VERSION +0 -1
  11. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/MANIFEST.in +0 -0
  12. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/README.md +0 -0
  13. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrix-update.py +0 -0
  14. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/__init__.py +0 -0
  15. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/api_endpoint.py +0 -0
  16. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/http_client.py +0 -0
  17. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/notebook_helper.py +0 -0
  18. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/prediction_result.py +0 -0
  19. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/predictor.py +0 -0
  20. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/reference_record.py +0 -0
  21. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/api/vector_database.py +0 -0
  22. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere/client.py +0 -0
  23. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/SOURCES.txt +0 -0
  24. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/dependency_links.txt +0 -0
  25. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/entry_points.txt +0 -0
  26. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/not-zip-safe +0 -0
  27. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/requires.txt +0 -0
  28. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/featrixsphere.egg-info/top_level.txt +0 -0
  29. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/nv-install.sh +0 -0
  30. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/requirements.txt +0 -0
  31. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/setup.cfg +0 -0
  32. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/setup.py +0 -0
  33. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/api.py +0 -0
  34. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/auto_upgrade_monitor.py +0 -0
  35. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/build_version.py +0 -0
  36. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/celery_app.py +0 -0
  37. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/cluster_movie_renderer.py +0 -0
  38. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/config.py +0 -0
  39. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/demo_existing_model.py +0 -0
  40. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/demo_label_updates.py +0 -0
  41. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/deploy.py +0 -0
  42. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/deploy_cache_debug.sh +0 -0
  43. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/ensure_watchdog_running.sh +0 -0
  44. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/error_tracker.py +0 -0
  45. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/event_log.py +0 -0
  46. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/example_api_usage.py +0 -0
  47. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/example_prediction_feedback.py +0 -0
  48. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/example_train_predictor.py +0 -0
  49. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/featrix_watchdog.py +0 -0
  50. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/gc_cleanup.py +0 -0
  51. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/api_event_retry.py +0 -0
  52. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/backing_db.py +0 -0
  53. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/celery_job_recovery.py +0 -0
  54. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/convergence_monitor.py +0 -0
  55. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/crash_tracker.py +0 -0
  56. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/distribution_shift_detector.py +0 -0
  57. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/embedding_space_io.py +0 -0
  58. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/epoch_projections.py +0 -0
  59. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/es_projections.py +0 -0
  60. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/es_training.py +0 -0
  61. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/es_training_wrapper.py +0 -0
  62. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/__init__.py +0 -0
  63. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/auto_calibrate.py +0 -0
  64. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/download-data/build_geo_weather_db.py +0 -0
  65. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/download-data/download_geographic_data.py +0 -0
  66. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/download-data/download_road_data.py +0 -0
  67. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/download-data/download_weather_data.py +0 -0
  68. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/download-data/install-data.sh +0 -0
  69. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/__init__.py +0 -0
  70. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/adaptive_event_log.py +0 -0
  71. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/auc_animation.py +0 -0
  72. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/calibration_utils.py +0 -0
  73. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/causal_relationship_scorer.py +0 -0
  74. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/charting.py +0 -0
  75. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/checkpoint_validation.py +0 -0
  76. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/classification_metrics.py +0 -0
  77. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/cluster_cohesion_tracker.py +0 -0
  78. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/config.py +0 -0
  79. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/constants.py +0 -0
  80. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/curve_plots_example.py +0 -0
  81. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/customer_quality_tracker.py +0 -0
  82. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/data_fips.py +0 -0
  83. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/data_frame_data_set.py +0 -0
  84. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/data_free_email_domains.py +0 -0
  85. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/dataloader_utils.py +0 -0
  86. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/default_training_rules.py +0 -0
  87. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/detect.py +0 -0
  88. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/dimension_validator.py +0 -0
  89. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/domain_codec.py +0 -0
  90. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/dropout_scheduler.py +0 -0
  91. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/duration_ops.py +0 -0
  92. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/dynamic_relationship_extractor.py +0 -0
  93. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/email_codec.py +0 -0
  94. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/email_domain_ops.py +0 -0
  95. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/embedding_lr_scheduler.py +0 -0
  96. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/embedding_quality.py +0 -0
  97. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/embedding_space_utils.py +0 -0
  98. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/embedding_utils.py +0 -0
  99. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/encoders.py +0 -0
  100. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/enrich.py +0 -0
  101. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/es_projection.py +0 -0
  102. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/es_training_callbacks.py +0 -0
  103. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/exceptions.py +0 -0
  104. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/featrix_csv.py +0 -0
  105. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/featrix_json.py +0 -0
  106. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/featrix_module_dict.py +0 -0
  107. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/featrix_token.py +0 -0
  108. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/feature_effectiveness_tracker.py +0 -0
  109. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/feature_engineer.py +0 -0
  110. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/feature_suggestion_tracker.py +0 -0
  111. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/fips_codec.py +0 -0
  112. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/foundation_input_data.py +0 -0
  113. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geo_foundation.py +0 -0
  114. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geo_json_codec.py +0 -0
  115. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geo_json_ops.py +0 -0
  116. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geo_ops.py +0 -0
  117. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geo_spread.py +0 -0
  118. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/geocode.py +0 -0
  119. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/gpu_utils.py +0 -0
  120. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/gradient_flow.py +0 -0
  121. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/graph_encoder.py +0 -0
  122. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/graph_encoder_training.py +0 -0
  123. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/guardrails.py +0 -0
  124. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/host_memory_tracker.py +0 -0
  125. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/hubspot_free_domains_list_may_2025.py +0 -0
  126. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/hybrid_column_detector.py +0 -0
  127. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/hybrid_encoders.py +0 -0
  128. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/hybrid_scalar_set_codec.py +0 -0
  129. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/hyperparam_search.py +0 -0
  130. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/input_data_file.py +0 -0
  131. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/input_data_set.py +0 -0
  132. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/integrity.py +0 -0
  133. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/io_utils.py +0 -0
  134. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/ip_address_ops.py +0 -0
  135. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/json_cache.py +0 -0
  136. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/json_codec.py +0 -0
  137. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/junction_adapter.py +0 -0
  138. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/llm/__init__.py +0 -0
  139. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/llm/schema_analyzer.py +0 -0
  140. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/local_string_cache.py +0 -0
  141. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/logging_config.py +0 -0
  142. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_framework.py +0 -0
  143. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_functions/__init__.py +0 -0
  144. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_functions/list_versions.py +0 -0
  145. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_functions/loss_functions_01Jan2026.py +0 -0
  146. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_functions/loss_functions_01Jul2025.py +0 -0
  147. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_functions/loss_functions_21Jan2026.py +0 -0
  148. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/loss_short_embedding.py +0 -0
  149. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/lr_timeline.py +0 -0
  150. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/mask_bias_tracker.py +0 -0
  151. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/mask_tracker.py +0 -0
  152. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/model_config.py +0 -0
  153. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/model_hash.py +0 -0
  154. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/movie_frame_task.py +0 -0
  155. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/multi_table_dataset.py +0 -0
  156. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/multi_table_embedding_space.py +0 -0
  157. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/network_viz.py +0 -0
  158. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/pair_scorer.py +0 -0
  159. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/per_epoch_quality.py +0 -0
  160. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/phone_codec.py +0 -0
  161. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/platform_utils.py +0 -0
  162. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/prng_control.py +0 -0
  163. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/demo_advisor_decisions.py +0 -0
  164. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/example_complete_workflow.py +0 -0
  165. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/generate_focal_report.py +0 -0
  166. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/model_advisor.py +0 -0
  167. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/show_results.py +0 -0
  168. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_adaptive_loss_benchmark.py +0 -0
  169. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_adaptive_training.py +0 -0
  170. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_all_codecs.py +0 -0
  171. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_checkpoint_dict_reconstruction.py +0 -0
  172. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_cls_vs_mean_pooling.py +0 -0
  173. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py +0 -0
  174. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_data_timestamps.py +0 -0
  175. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_embedding_quality.py +0 -0
  176. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_embedding_space.py +0 -0
  177. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_epoch_class_separation.py +0 -0
  178. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_extend_embedding_space.py +0 -0
  179. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_feature_engineering_prediction.py +0 -0
  180. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_focal_comparison.py +0 -0
  181. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_focal_comparison_enhanced.py +0 -0
  182. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_focal_loss_single_predictor.py +0 -0
  183. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_hybrid_columns.py +0 -0
  184. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_label_smoothing.py +0 -0
  185. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_lift_measurement_validation.py +0 -0
  186. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_lr_timeline_smoothness.py +0 -0
  187. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_min_support_rank_scaling.py +0 -0
  188. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_monitor_integration.py +0 -0
  189. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_multi_dataset.py +0 -0
  190. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_phone_zip_geo.py +0 -0
  191. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_piecewise_epochs.py +0 -0
  192. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_predict_during_training.py +0 -0
  193. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_relationship_extractor_integration.py +0 -0
  194. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_relationship_extractor_mixed_types.py +0 -0
  195. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_set_encoder_strategies.py +0 -0
  196. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_temporal_relationships.py +0 -0
  197. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_timeline_quick.py +0 -0
  198. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_training_data_timeline.py +0 -0
  199. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_training_monitor.py +0 -0
  200. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/test_warning_tracking.py +0 -0
  201. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/qa/visualize_training_timeline.py +0 -0
  202. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_complexity.py +0 -0
  203. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_estimator.py +0 -0
  204. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_extractor.py +0 -0
  205. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_importance_validator.py +0 -0
  206. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_ops_base.py +0 -0
  207. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_performance.py +0 -0
  208. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_preanalysis.py +0 -0
  209. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/relationship_search.py +0 -0
  210. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/scalar_codec.py +0 -0
  211. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/scalar_scalar_ops.py +0 -0
  212. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/scalar_timestamp_ops.py +0 -0
  213. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/schema_history.py +0 -0
  214. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/set_codec.py +0 -0
  215. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/set_scalar_ops.py +0 -0
  216. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/set_set_ops.py +0 -0
  217. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/set_timestamp_ops.py +0 -0
  218. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/setlist_codec.py +0 -0
  219. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/simple_mlp.py +0 -0
  220. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/simple_string_cache.py +0 -0
  221. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/single_predictor.py +0 -0
  222. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/single_predictor_mlp.py +0 -0
  223. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/sphere_init.py +0 -0
  224. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/sqlite_utils.py +0 -0
  225. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/stopwatch.py +0 -0
  226. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/strategy_ops_base.py +0 -0
  227. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/strategy_scalar_scalar_ops.py +0 -0
  228. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/strategy_set_scalar_ops.py +0 -0
  229. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/strategy_string_scalar_ops.py +0 -0
  230. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_analysis.py +0 -0
  231. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_cache.py +0 -0
  232. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_codec.py +0 -0
  233. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_list_codec.py +0 -0
  234. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_scalar_ops.py +0 -0
  235. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/string_set_ops.py +0 -0
  236. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/temporal_relationship_ops.py +0 -0
  237. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/tensor_utils.py +0 -0
  238. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/timeline_events.py +0 -0
  239. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/timestamp_codec.py +0 -0
  240. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/tools/__init__.py +0 -0
  241. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/tools/compare_clusters.py +0 -0
  242. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_banner.py +0 -0
  243. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_context_manager.py +0 -0
  244. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_data_timeline.py +0 -0
  245. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_event.py +0 -0
  246. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_exceptions.py +0 -0
  247. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_logger.py +0 -0
  248. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_movie_writer.py +0 -0
  249. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_rules.py +0 -0
  250. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/training_timeline.py +0 -0
  251. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/transformer_encoder.py +0 -0
  252. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/type_aware_ops_config.py +0 -0
  253. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/url_codec.py +0 -0
  254. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/url_ops.py +0 -0
  255. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/url_parser.py +0 -0
  256. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/us_holidays.py +0 -0
  257. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/utils.py +0 -0
  258. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/vector_codec.py +0 -0
  259. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/webhooks.py +0 -0
  260. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/weight_timeline.py +0 -0
  261. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/world_data.py +0 -0
  262. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/xgboost_classifier.py +0 -0
  263. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/year_json_codec.py +0 -0
  264. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/year_json_ops.py +0 -0
  265. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix/neural/zip_codec.py +0 -0
  266. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/featrix_debug.py +0 -0
  267. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/job_manager.py +0 -0
  268. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/json_encoder_cache.py +0 -0
  269. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/knn_training.py +0 -0
  270. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/meta_learning_client.py +0 -0
  271. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/model_card_repair.py +0 -0
  272. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/model_repair.py +0 -0
  273. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/pre_analysis_wrapper.py +0 -0
  274. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/queue_manager.py +0 -0
  275. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/quick_architecture_search.py +0 -0
  276. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/runtime_version_manager.py +0 -0
  277. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/session_chains.py +0 -0
  278. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/session_manager.py +0 -0
  279. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/single_predictor_cv.py +0 -0
  280. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/single_predictor_training.py +0 -0
  281. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/sp_training_wrapper.py +0 -0
  282. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/sphere_config.py +0 -0
  283. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/structureddata.py +0 -0
  284. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/system_health_monitor.py +0 -0
  285. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/training_monitor.py +0 -0
  286. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/utils.py +0 -0
  287. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/vector_db.py +0 -0
  288. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/webhook_helpers.py +0 -0
  289. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/lib/weightwatcher_tracking.py +0 -0
  290. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/llm_client.py +0 -0
  291. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/load_and_test_model.py +0 -0
  292. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/manage_churro.sh +0 -0
  293. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/migrate_string_cache_naming.py +0 -0
  294. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/neural.py +0 -0
  295. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/node-install.sh +0 -0
  296. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/prediction_client.py +0 -0
  297. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/prediction_drift_monitor.py +0 -0
  298. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/prediction_persistence_worker.py +0 -0
  299. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/prediction_server.py +0 -0
  300. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/query_schema_worker.py +0 -0
  301. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/quick_test_deployment.sh +0 -0
  302. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/recreate_session.py +0 -0
  303. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/redis_job_progress.py +0 -0
  304. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/redis_prediction_cli.py +0 -0
  305. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/redis_prediction_store.py +0 -0
  306. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/regenerate_training_movie.py +0 -0
  307. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/render_sphere.py +0 -0
  308. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/repair_checkpoint.py +0 -0
  309. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/repair_model.py +0 -0
  310. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/resubmit_es_completion.py +0 -0
  311. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/run_api_server.sh +0 -0
  312. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/send_email.py +0 -0
  313. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/slack.py +0 -0
  314. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/standalone_prediction.py +0 -0
  315. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/start_celery_cpu_worker.sh +0 -0
  316. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/start_celery_gpu_worker.sh +0 -0
  317. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/start_celery_movie_worker.sh +0 -0
  318. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/tail-watch.py +0 -0
  319. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/test_api_client.py +0 -0
  320. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/tree.py +0 -0
  321. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/upgrade-taco-python312.sh +0 -0
  322. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/utils.py +0 -0
  323. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/src/version.py +0 -0
  324. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/system_monitor.py +0 -0
  325. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/tests/test_checkpoint_on_taco.py +0 -0
  326. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/tests/test_foundation_mode_local.py +0 -0
  327. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/tests/test_local_checkpoint.py +0 -0
  328. {featrixsphere-0.2.6708 → featrixsphere-0.2.6710}/tests/test_runtime_version_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: featrixsphere
3
- Version: 0.2.6708
3
+ Version: 0.2.6710
4
4
  Summary: Transform any CSV into a production-ready ML model in minutes, not months.
5
5
  Home-page: https://github.com/Featrix/sphere
6
6
  Author: Featrix
@@ -0,0 +1 @@
1
+ 0.2.6710
@@ -57,7 +57,7 @@ TWO API OPTIONS:
57
57
  >>> print(result['prediction'])
58
58
  """
59
59
 
60
- __version__ = "0.2.6708"
60
+ __version__ = "0.2.6710"
61
61
  __author__ = "Featrix"
62
62
  __email__ = "support@featrix.com"
63
63
  __license__ = "MIT"
@@ -342,6 +342,34 @@ class FeatrixSphere(HTTPClientMixin):
342
342
  ground_truth=ground_truth
343
343
  )
344
344
 
345
+ def list_sessions(
346
+ self,
347
+ name_prefix: str = "",
348
+ ) -> List[str]:
349
+ """
350
+ List sessions matching a name prefix/search term.
351
+
352
+ Searches session directory names on the compute cluster for
353
+ partial matches (not just prefix).
354
+
355
+ Args:
356
+ name_prefix: Term to match in session names
357
+
358
+ Returns:
359
+ List of matching session ID strings
360
+
361
+ Example:
362
+ sessions = featrix.list_sessions(name_prefix="customer")
363
+ for sid in sessions:
364
+ fm = featrix.foundational_model(sid)
365
+ print(f"{sid}: {fm.status}")
366
+ """
367
+ params = {}
368
+ if name_prefix:
369
+ params['name_prefix'] = name_prefix
370
+ response = self._get_json("/compute/sessions-for-org", params=params)
371
+ return response.get('sessions', [])
372
+
345
373
  def health_check(self) -> Dict[str, Any]:
346
374
  """
347
375
  Check if the API server is healthy.
@@ -22,6 +22,21 @@ from .reference_record import ReferenceRecord
22
22
  logger = logging.getLogger(__name__)
23
23
 
24
24
 
25
+ def _parse_datetime(value) -> Optional[datetime]:
26
+ """Parse a datetime from ISO string or return as-is if already datetime."""
27
+ if value is None:
28
+ return None
29
+ if isinstance(value, datetime):
30
+ return value
31
+ if isinstance(value, str):
32
+ try:
33
+ # Handle ISO format with or without timezone
34
+ return datetime.fromisoformat(value.replace('Z', '+00:00'))
35
+ except (ValueError, AttributeError):
36
+ return None
37
+ return None
38
+
39
+
25
40
  @dataclass
26
41
  class FoundationalModel:
27
42
  """
@@ -68,6 +83,11 @@ class FoundationalModel:
68
83
  epochs: Optional[int] = None
69
84
  final_loss: Optional[float] = None
70
85
  created_at: Optional[datetime] = None
86
+ updated_at: Optional[datetime] = None
87
+ session_type: Optional[str] = None
88
+ compute_cluster: Optional[str] = None
89
+ error_message: Optional[str] = None
90
+ training_progress: Optional[Dict[str, Any]] = None
71
91
 
72
92
  # Internal
73
93
  _ctx: Optional['ClientContext'] = field(default=None, repr=False)
@@ -88,7 +108,9 @@ class FoundationalModel:
88
108
  dimensions=response.get('d_model') or response.get('dimensions'),
89
109
  epochs=response.get('epochs') or response.get('final_epoch'),
90
110
  final_loss=response.get('final_loss'),
91
- created_at=datetime.now(),
111
+ created_at=_parse_datetime(response.get('created_at')),
112
+ session_type=response.get('session_type'),
113
+ compute_cluster=response.get('compute_cluster'),
92
114
  _ctx=ctx,
93
115
  )
94
116
 
@@ -99,19 +121,22 @@ class FoundationalModel:
99
121
  ctx: 'ClientContext'
100
122
  ) -> 'FoundationalModel':
101
123
  """Load FoundationalModel from session ID."""
102
- # Get session info
103
- session_data = ctx.get_json(f"/compute/session/{session_id}")
124
+ # Get session info - response has {"session": {...}, "jobs": {...}}
125
+ response_data = ctx.get_json(f"/compute/session/{session_id}")
126
+ session = response_data.get('session', response_data)
104
127
 
105
128
  fm = cls(
106
129
  id=session_id,
107
- name=session_data.get('name'),
108
- status=session_data.get('status'),
109
- created_at=datetime.now(),
130
+ name=session.get('name'),
131
+ status=session.get('status'),
132
+ created_at=_parse_datetime(session.get('created_at')),
133
+ session_type=session.get('session_type'),
134
+ compute_cluster=session.get('compute_cluster'),
110
135
  _ctx=ctx,
111
136
  )
112
137
 
113
- # Try to get model info
114
- fm._update_from_session(session_data)
138
+ # Extract model info, training stats, jobs, error_message
139
+ fm._update_from_session(response_data)
115
140
 
116
141
  return fm
117
142
 
@@ -439,10 +464,11 @@ class FoundationalModel:
439
464
  last_status = None
440
465
 
441
466
  while time.time() - start_time < max_wait_time:
442
- # Get session status
443
- session_data = self._ctx.get_json(f"/compute/session/{self.id}")
467
+ # Get session status - response has {"session": {...}, "jobs": {...}}
468
+ response_data = self._ctx.get_json(f"/compute/session/{self.id}")
469
+ session_data = response_data.get('session', response_data)
444
470
  status = session_data.get('status', 'unknown')
445
- jobs = session_data.get('jobs', {})
471
+ jobs = response_data.get('jobs', {})
446
472
 
447
473
  # Look for ES training job
448
474
  es_job = None
@@ -475,7 +501,7 @@ class FoundationalModel:
475
501
  # Check completion
476
502
  if job_status == 'done' or status == 'done':
477
503
  self.status = 'done'
478
- self._update_from_session(session_data)
504
+ self._update_from_session(response_data)
479
505
  if show_progress:
480
506
  print(f"Training complete!")
481
507
  if self.dimensions:
@@ -627,27 +653,73 @@ class FoundationalModel:
627
653
 
628
654
  return predictors
629
655
 
630
- def _update_from_session(self, session_data: Dict[str, Any]) -> None:
631
- """Update fields from session data."""
632
- # Try to get model info from various places
633
- model_info = session_data.get('model_info', {})
634
- training_stats = session_data.get('training_stats', {})
656
+ def _update_from_session(self, response_data: Dict[str, Any]) -> None:
657
+ """Update fields from session API response.
658
+
659
+ The response from GET /session/{id} has structure:
660
+ {"session": {...}, "jobs": {...}, ...}
661
+ """
662
+ # Handle both nested and flat response formats
663
+ session = response_data.get('session', response_data)
664
+ jobs = response_data.get('jobs', {})
665
+
666
+ # Core session fields
667
+ if session.get('name') and not self.name:
668
+ self.name = session['name']
669
+ if session.get('status'):
670
+ self.status = session['status']
671
+ if session.get('session_type'):
672
+ self.session_type = session['session_type']
673
+ if session.get('compute_cluster'):
674
+ self.compute_cluster = session['compute_cluster']
675
+ if session.get('created_at') and not self.created_at:
676
+ self.created_at = _parse_datetime(session['created_at'])
677
+ if session.get('finished_at'):
678
+ self.updated_at = _parse_datetime(session['finished_at'])
679
+ elif session.get('started_at'):
680
+ self.updated_at = _parse_datetime(session['started_at'])
681
+
682
+ # Model info from session
683
+ model_info = session.get('model_info', {})
684
+ training_stats = session.get('training_stats', {})
635
685
 
636
686
  self.dimensions = (
637
687
  model_info.get('d_model') or
638
688
  model_info.get('embedding_dim') or
639
- session_data.get('d_model')
689
+ session.get('d_model')
640
690
  )
641
691
  self.epochs = (
642
692
  training_stats.get('final_epoch') or
643
693
  training_stats.get('epochs_trained') or
644
- session_data.get('epochs')
694
+ session.get('epochs')
645
695
  )
646
696
  self.final_loss = (
647
697
  training_stats.get('final_loss') or
648
- session_data.get('final_loss')
698
+ session.get('final_loss')
649
699
  )
650
700
 
701
+ # Extract error_message and training_progress from jobs
702
+ for job_id, job in jobs.items():
703
+ job_type = job.get('job_type', '')
704
+ job_status = job.get('status', '')
705
+
706
+ # Training progress from ES training job
707
+ if job_type in ('train_embedding_space', 'train_es', 'training'):
708
+ current_epoch = job.get('current_epoch') or job.get('epoch')
709
+ total_epochs = job.get('total_epochs') or job.get('epochs')
710
+ if current_epoch or total_epochs:
711
+ self.training_progress = {
712
+ 'current_epoch': current_epoch,
713
+ 'total_epochs': total_epochs,
714
+ 'job_status': job_status,
715
+ }
716
+
717
+ # Error message from any failed job
718
+ if job_status in ('failed', 'error'):
719
+ err = job.get('error') or job.get('error_message')
720
+ if err:
721
+ self.error_message = err
722
+
651
723
  def _clean_record(self, record: Dict[str, Any]) -> Dict[str, Any]:
652
724
  """Clean a record for API submission."""
653
725
  import math
@@ -684,6 +756,17 @@ class FoundationalModel:
684
756
  """Column names in this foundational model's embedding space."""
685
757
  return self.get_columns()
686
758
 
759
+ @property
760
+ def schema_metadata(self) -> Dict[str, Any]:
761
+ """Get schema metadata including column names and types.
762
+
763
+ Returns:
764
+ Dict with 'column_names', 'column_types', and 'num_columns'
765
+ """
766
+ if not self._ctx:
767
+ raise ValueError("FoundationalModel not connected to client")
768
+ return self._ctx.get_json(f"/compute/session/{self.id}/columns")
769
+
687
770
  def clone(
688
771
  self,
689
772
  target_compute_cluster: Optional[str] = None,
@@ -749,7 +832,6 @@ class FoundationalModel:
749
832
 
750
833
  data = self._ctx.get_json(f"/compute/session/{self.id}")
751
834
  self._update_from_session(data)
752
- self.status = data.get('status', self.status)
753
835
  return data
754
836
 
755
837
  def is_ready(self) -> bool:
@@ -767,9 +849,8 @@ class FoundationalModel:
767
849
  raise ValueError("FoundationalModel not connected to client")
768
850
 
769
851
  data = self._ctx.get_json(f"/compute/session/{self.id}")
770
- status = data.get('status', 'unknown')
771
- self.status = status
772
- return status == 'done'
852
+ self._update_from_session(data)
853
+ return self.status == 'done'
773
854
 
774
855
  def publish(
775
856
  self,
@@ -938,6 +1019,11 @@ class FoundationalModel:
938
1019
  'epochs': self.epochs,
939
1020
  'final_loss': self.final_loss,
940
1021
  'created_at': self.created_at.isoformat() if self.created_at else None,
1022
+ 'updated_at': self.updated_at.isoformat() if self.updated_at else None,
1023
+ 'session_type': self.session_type,
1024
+ 'compute_cluster': self.compute_cluster,
1025
+ 'error_message': self.error_message,
1026
+ 'training_progress': self.training_progress,
941
1027
  }
942
1028
 
943
1029
  def __repr__(self) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: featrixsphere
3
- Version: 0.2.6708
3
+ Version: 0.2.6710
4
4
  Summary: Transform any CSV into a production-ready ML model in minutes, not months.
5
5
  Home-page: https://github.com/Featrix/sphere
6
6
  Author: Featrix
@@ -6615,6 +6615,25 @@ class EmbeddingSpace(object):
6615
6615
  'pct_rank_top10': float((ranks_arr <= 10).sum() / len(ranks_arr) * 100),
6616
6616
  }
6617
6617
 
6618
+ # Aggregate ranking metrics (AUC, Recall@1, etc.) from batch collapse_diagnostics
6619
+ if batch_loss_dicts:
6620
+ ranking_accum = {}
6621
+ ranking_count = 0
6622
+ for loss_dict in batch_loss_dicts:
6623
+ cd = loss_dict.get('collapse_diagnostics', {})
6624
+ rm = cd.get('ranking_metrics') if isinstance(cd, dict) else None
6625
+ if rm and isinstance(rm, dict):
6626
+ ranking_count += 1
6627
+ for key in ('auc', 'recall_at_1', 'recall_at_5', 'recall_at_10',
6628
+ 'positive_rank_mean', 'diagonal_cosine_mean', 'margin_mean'):
6629
+ if rm.get(key) is not None:
6630
+ ranking_accum.setdefault(key, 0.0)
6631
+ ranking_accum[key] += float(rm[key])
6632
+ if ranking_count > 0:
6633
+ components['ranking_metrics'] = {
6634
+ k: v / ranking_count for k, v in ranking_accum.items()
6635
+ }
6636
+
6618
6637
  # Return both total loss and components
6619
6638
  return combined_loss / n_batches, components
6620
6639
 
@@ -7600,6 +7619,7 @@ class EmbeddingSpace(object):
7600
7619
  "epoch": best_epoch_idx,
7601
7620
  "train_loss": best_entry.get('train_loss'),
7602
7621
  "val_loss": best_entry.get('val_loss'),
7622
+ "test_loss": best_entry.get('test_loss'),
7603
7623
  "spread": best_entry.get('spread'),
7604
7624
  "joint": best_entry.get('joint'),
7605
7625
  "marginal": best_entry.get('marginal'),
@@ -7786,9 +7806,36 @@ class EmbeddingSpace(object):
7786
7806
  "created_at": datetime.now().isoformat(),
7787
7807
  "training_duration_minutes": self.training_info.get('duration_minutes', 0),
7788
7808
  "version_info": self.version_info or {},
7809
+ },
7810
+
7811
+ "test_set_monitoring": {
7812
+ "description": "Held-out test loss recorded periodically during training (observation only, never used for training decisions)",
7813
+ "entries": [
7814
+ {
7815
+ "epoch": entry["epoch"],
7816
+ "test_loss": entry.get("test_loss"),
7817
+ "test_auc": entry.get("test_auc"),
7818
+ "test_recall_at_1": entry.get("test_recall_at_1"),
7819
+ }
7820
+ for entry in loss_history
7821
+ if entry.get("test_loss") is not None
7822
+ ],
7823
+ },
7824
+
7825
+ "ranking_metrics_history": {
7826
+ "description": "Validation AUC and Recall@1 per epoch",
7827
+ "entries": [
7828
+ {
7829
+ "epoch": entry["epoch"],
7830
+ "val_auc": entry.get("val_auc"),
7831
+ "val_recall_at_1": entry.get("val_recall_at_1"),
7832
+ }
7833
+ for entry in loss_history
7834
+ if entry.get("val_auc") is not None
7835
+ ],
7789
7836
  }
7790
7837
  }
7791
-
7838
+
7792
7839
  return model_card
7793
7840
 
7794
7841
  def _get_feature_inventory(self):
@@ -18715,6 +18762,39 @@ class EmbeddingSpace(object):
18715
18762
  self._current_val_dataloader = val_dataloader
18716
18763
  logger.info(f"✅ Validation DataLoader created with num_workers={val_dl_kwargs.get('num_workers', 0)}, persistent_workers={val_dl_kwargs.get('persistent_workers', False)}")
18717
18764
 
18765
+ # --- Test set monitoring (observability only, never used for training decisions) ---
18766
+ test_dataloader = None
18767
+ _test_monitor_epochs = set()
18768
+ if get_config().get_enable_test_set_monitoring() and hasattr(self, '_timeline') and self._timeline is not None:
18769
+ test_input_data = self._timeline.get_test_set()
18770
+ if test_input_data is not None:
18771
+ test_dataset = SuperSimpleSelfSupervisedDataset(
18772
+ test_input_data.df,
18773
+ codecs=self.col_codecs,
18774
+ row_meta_data=test_input_data.project_row_meta_data_list,
18775
+ casted_df=test_input_data.casted_df,
18776
+ )
18777
+ test_dl_kwargs = create_dataloader_kwargs(
18778
+ batch_size=batch_size,
18779
+ shuffle=False,
18780
+ drop_last=True,
18781
+ num_workers=0,
18782
+ dataset_size=len(test_input_data.df),
18783
+ num_columns=len(test_input_data.df.columns),
18784
+ )
18785
+ test_dataloader = DataLoader(
18786
+ test_dataset,
18787
+ collate_fn=collate_tokens,
18788
+ **test_dl_kwargs
18789
+ )
18790
+ interval_pct = get_config().get_test_set_monitoring_interval_pct()
18791
+ for pct in range(interval_pct, 101, interval_pct):
18792
+ ep = max(0, int(round(n_epochs * pct / 100.0)) - 1)
18793
+ _test_monitor_epochs.add(ep)
18794
+ # Always include final epoch
18795
+ _test_monitor_epochs.add(n_epochs - 1)
18796
+ logger.info(f"🧪 Test set monitoring enabled: {len(test_input_data.df)} rows, eval at epochs {sorted(_test_monitor_epochs)}")
18797
+
18718
18798
  batches_per_epoch = len(data_loader)
18719
18799
  else:
18720
18800
  logger.info("Using batch sampler data loader for multi-dataset training with multiprocess support")
@@ -21360,10 +21440,48 @@ class EmbeddingSpace(object):
21360
21440
  loss_entry_with_components["marginal"] = val_components.get('marginal')
21361
21441
  loss_entry_with_components["marginal_weighted"] = val_components.get('marginal_weighted')
21362
21442
 
21443
+ # Record validation ranking metrics (AUC, R@1)
21444
+ if val_components:
21445
+ val_rm = val_components.get('ranking_metrics', {})
21446
+ if val_rm:
21447
+ loss_entry_with_components["val_auc"] = val_rm.get('auc')
21448
+ loss_entry_with_components["val_recall_at_1"] = val_rm.get('recall_at_1')
21449
+
21450
+ # --- Test set monitoring (observation only, never affects training) ---
21451
+ if test_dataloader is not None and epoch_idx in _test_monitor_epochs:
21452
+ logger.info(f" 🧪 Computing test loss for epoch {epoch_idx + 1}/{n_epochs} (observation only)...")
21453
+ test_loss, test_components = self.compute_val_loss(test_dataloader)
21454
+ loss_entry_with_components["test_loss"] = test_loss
21455
+ test_rm = test_components.get('ranking_metrics', {}) if test_components else {}
21456
+ test_auc = test_rm.get('auc')
21457
+ test_r1 = test_rm.get('recall_at_1')
21458
+ loss_entry_with_components["test_auc"] = test_auc
21459
+ loss_entry_with_components["test_recall_at_1"] = test_r1
21460
+ parts = [f" 🧪 Test set epoch {epoch_idx + 1}: loss={test_loss:.6f}"]
21461
+ if test_auc is not None:
21462
+ parts.append(f"AUC={test_auc:.4f}")
21463
+ if test_r1 is not None:
21464
+ parts.append(f"R@1={test_r1:.4f}")
21465
+ parts.append("(observation only)")
21466
+ logger.info(", ".join(parts))
21467
+ # Post to training timeline
21468
+ from featrix.neural.timeline_events import post_timeline_event
21469
+ post_timeline_event({
21470
+ 'epoch': epoch_idx,
21471
+ 'event_type': 'test_set_monitor',
21472
+ 'test_loss': test_loss,
21473
+ 'test_auc': test_auc,
21474
+ 'test_recall_at_1': test_r1,
21475
+ 'test_recall_at_5': test_rm.get('recall_at_5'),
21476
+ 'test_recall_at_10': test_rm.get('recall_at_10'),
21477
+ 'test_diagonal_cosine_mean': test_rm.get('diagonal_cosine_mean'),
21478
+ 'test_positive_rank_mean': test_rm.get('positive_rank_mean'),
21479
+ })
21480
+
21363
21481
  # Update the loss_history entry (INSERT OR REPLACE) with components
21364
21482
  if hasattr(self, 'history_db') and self.history_db:
21365
21483
  self.history_db.push_loss_history(loss_entry_with_components)
21366
-
21484
+
21367
21485
  # Check for OOM events after validation
21368
21486
  self._check_oom_after_validation()
21369
21487
 
@@ -149,6 +149,9 @@ DEFAULT_CONFIG = {
149
149
  "runtime_cleanup_age_days": 30, # Delete cached versions not used in this many days
150
150
  # === XGBOOST RAW FEATURES ===
151
151
  "xgb_include_raw_features": False, # When True, XGBoost classifier concatenates raw DataFrame columns with embeddings
152
+ # === TEST SET MONITORING (observability only — never used for training decisions) ===
153
+ "enable_test_set_monitoring": True, # Record test loss periodically during foundation training for post-hoc analysis
154
+ "test_set_monitoring_interval_pct": 10, # Evaluate test set every N% of total epochs (10 = every 10%)
152
155
  }
153
156
 
154
157
 
@@ -1604,6 +1607,31 @@ class SphereConfig:
1604
1607
  return False
1605
1608
  return self._config.get("xgb_include_raw_features", DEFAULT_CONFIG.get("xgb_include_raw_features", False))
1606
1609
 
1610
+ # === TEST SET MONITORING GETTERS ===
1611
+
1612
+ def get_enable_test_set_monitoring(self) -> bool:
1613
+ """
1614
+ Get whether to periodically evaluate the held-out test set during foundation training.
1615
+
1616
+ Test loss is recorded for post-hoc analysis only. It is NEVER used for early stopping,
1617
+ learning rate scheduling, or any other training decision.
1618
+
1619
+ Only effective during foundation training (simple mode has no separate test set).
1620
+
1621
+ Default: True
1622
+ """
1623
+ return self._config.get("enable_test_set_monitoring", DEFAULT_CONFIG.get("enable_test_set_monitoring", True))
1624
+
1625
+ def get_test_set_monitoring_interval_pct(self) -> int:
1626
+ """
1627
+ Get the interval (as percentage of total epochs) at which test set loss is evaluated.
1628
+
1629
+ For example, 10 means evaluate at 10%, 20%, ..., 100% of training.
1630
+
1631
+ Default: 10
1632
+ """
1633
+ return self._config.get("test_set_monitoring_interval_pct", DEFAULT_CONFIG.get("test_set_monitoring_interval_pct", 10))
1634
+
1607
1635
  def log_config(self, prefix: str = ""):
1608
1636
  """
1609
1637
  Log all configuration parameters.
@@ -51,6 +51,7 @@ class TrainingHistoryDB:
51
51
  current_learning_rate REAL,
52
52
  loss REAL,
53
53
  validation_loss REAL,
54
+ test_loss REAL,
54
55
  time_now REAL,
55
56
  duration REAL,
56
57
  spread REAL,
@@ -60,13 +61,18 @@ class TrainingHistoryDB:
60
61
  diversity REAL,
61
62
  reconstruction REAL,
62
63
  separation REAL,
63
- metric REAL
64
+ metric REAL,
65
+ val_auc REAL,
66
+ val_recall_at_1 REAL,
67
+ test_auc REAL,
68
+ test_recall_at_1 REAL
64
69
  )
65
70
  """)
66
71
  cursor.execute("CREATE INDEX IF NOT EXISTS idx_loss_history_epoch ON loss_history(epoch)")
67
72
 
68
73
  # Add new columns for existing databases (backward compatibility)
69
- for col_name in ['diversity', 'reconstruction', 'separation', 'metric']:
74
+ for col_name in ['diversity', 'reconstruction', 'separation', 'metric', 'test_loss',
75
+ 'val_auc', 'val_recall_at_1', 'test_auc', 'test_recall_at_1']:
70
76
  try:
71
77
  cursor.execute(f"ALTER TABLE loss_history ADD COLUMN {col_name} REAL")
72
78
  except sqlite3.OperationalError:
@@ -138,15 +144,16 @@ class TrainingHistoryDB:
138
144
  cursor = self.conn.cursor()
139
145
  cursor.execute("""
140
146
  INSERT OR REPLACE INTO loss_history
141
- (epoch, current_learning_rate, loss, validation_loss, time_now, duration,
147
+ (epoch, current_learning_rate, loss, validation_loss, test_loss, time_now, duration,
142
148
  spread, joint, marginal, marginal_weighted, diversity, reconstruction,
143
- separation, metric)
144
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
149
+ separation, metric, val_auc, val_recall_at_1, test_auc, test_recall_at_1)
150
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
145
151
  """, (
146
152
  loss_entry.get("epoch"),
147
153
  loss_entry.get("current_learning_rate"),
148
154
  loss_entry.get("loss"),
149
155
  loss_entry.get("validation_loss"),
156
+ loss_entry.get("test_loss"),
150
157
  loss_entry.get("time_now"),
151
158
  loss_entry.get("duration"),
152
159
  loss_entry.get("spread"),
@@ -156,7 +163,11 @@ class TrainingHistoryDB:
156
163
  loss_entry.get("diversity"),
157
164
  loss_entry.get("reconstruction"),
158
165
  loss_entry.get("separation"),
159
- loss_entry.get("metric")
166
+ loss_entry.get("metric"),
167
+ loss_entry.get("val_auc"),
168
+ loss_entry.get("val_recall_at_1"),
169
+ loss_entry.get("test_auc"),
170
+ loss_entry.get("test_recall_at_1"),
160
171
  ))
161
172
  self.conn.commit()
162
173
 
@@ -226,8 +237,9 @@ class TrainingHistoryDB:
226
237
  num_epochs = self.memory_cache_size
227
238
  cursor = self.conn.cursor()
228
239
  cursor.execute("""
229
- SELECT epoch, current_learning_rate, loss, validation_loss, time_now, duration,
230
- spread, joint, marginal, marginal_weighted, diversity, reconstruction
240
+ SELECT epoch, current_learning_rate, loss, validation_loss, test_loss, time_now, duration,
241
+ spread, joint, marginal, marginal_weighted, diversity, reconstruction,
242
+ val_auc, val_recall_at_1, test_auc, test_recall_at_1
231
243
  FROM loss_history
232
244
  ORDER BY epoch DESC
233
245
  LIMIT ?
@@ -241,14 +253,19 @@ class TrainingHistoryDB:
241
253
  "current_learning_rate": row[1],
242
254
  "loss": row[2],
243
255
  "validation_loss": row[3],
244
- "time_now": row[4],
245
- "duration": row[5],
246
- "spread": row[6],
247
- "joint": row[7],
248
- "marginal": row[8],
249
- "marginal_weighted": row[9],
250
- "diversity": row[10] if len(row) > 10 else None,
251
- "reconstruction": row[11] if len(row) > 11 else None
256
+ "test_loss": row[4],
257
+ "time_now": row[5],
258
+ "duration": row[6],
259
+ "spread": row[7],
260
+ "joint": row[8],
261
+ "marginal": row[9],
262
+ "marginal_weighted": row[10],
263
+ "diversity": row[11] if len(row) > 11 else None,
264
+ "reconstruction": row[12] if len(row) > 12 else None,
265
+ "val_auc": row[13] if len(row) > 13 else None,
266
+ "val_recall_at_1": row[14] if len(row) > 14 else None,
267
+ "test_auc": row[15] if len(row) > 15 else None,
268
+ "test_recall_at_1": row[16] if len(row) > 16 else None,
252
269
  })
253
270
  return result
254
271
 
@@ -261,8 +278,9 @@ class TrainingHistoryDB:
261
278
 
262
279
  cursor = self.conn.cursor()
263
280
  cursor.execute("""
264
- SELECT epoch, current_learning_rate, loss, validation_loss, time_now, duration,
265
- spread, joint, marginal, marginal_weighted, diversity, reconstruction
281
+ SELECT epoch, current_learning_rate, loss, validation_loss, test_loss, time_now, duration,
282
+ spread, joint, marginal, marginal_weighted, diversity, reconstruction,
283
+ val_auc, val_recall_at_1, test_auc, test_recall_at_1
266
284
  FROM loss_history
267
285
  ORDER BY epoch ASC
268
286
  """)
@@ -274,14 +292,19 @@ class TrainingHistoryDB:
274
292
  "current_learning_rate": row[1],
275
293
  "loss": row[2],
276
294
  "validation_loss": row[3],
277
- "time_now": row[4],
278
- "duration": row[5],
279
- "spread": row[6],
280
- "joint": row[7],
281
- "marginal": row[8],
282
- "marginal_weighted": row[9],
283
- "diversity": row[10] if len(row) > 10 else None,
284
- "reconstruction": row[11] if len(row) > 11 else None
295
+ "test_loss": row[4],
296
+ "time_now": row[5],
297
+ "duration": row[6],
298
+ "spread": row[7],
299
+ "joint": row[8],
300
+ "marginal": row[9],
301
+ "marginal_weighted": row[10],
302
+ "diversity": row[11] if len(row) > 11 else None,
303
+ "reconstruction": row[12] if len(row) > 12 else None,
304
+ "val_auc": row[13] if len(row) > 13 else None,
305
+ "val_recall_at_1": row[14] if len(row) > 14 else None,
306
+ "test_auc": row[15] if len(row) > 15 else None,
307
+ "test_recall_at_1": row[16] if len(row) > 16 else None,
285
308
  })
286
309
  return result
287
310
 
@@ -1 +0,0 @@
1
- 0.2.6708