featrixsphere 0.2.6127__tar.gz → 0.2.6379__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.
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/PKG-INFO +1 -1
- featrixsphere-0.2.6379/VERSION +1 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/__init__.py +1 -1
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/client.py +54 -42
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/PKG-INFO +1 -1
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/SOURCES.txt +17 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/api.py +3 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/celery_app.py +3 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/celery_job_recovery.py +113 -4
- featrixsphere-0.2.6379/src/lib/featrix/auto_calibrate.py +924 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/auc_animation.py +423 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/calibration_utils.py +218 -146
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/charting.py +139 -37
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/cluster_cohesion_tracker.py +307 -4
- featrixsphere-0.2.6379/src/lib/featrix/neural/default_training_rules.py +127 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/detect.py +65 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/domain_codec.py +504 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/dropout_scheduler.py +4 -4
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/dynamic_relationship_extractor.py +1528 -47
- featrixsphere-0.2.6379/src/lib/featrix/neural/email_codec.py +455 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/email_domain_ops.py +227 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/embedded_space.py +1674 -495
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/embedding_utils.py +5 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/encoders.py +909 -142
- featrixsphere-0.2.6379/src/lib/featrix/neural/es_training_callbacks.py +353 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/foundation_input_data.py +150 -54
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/gpu_utils.py +22 -3
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/hybrid_encoders.py +3 -3
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/input_data_set.py +53 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/io_utils.py +13 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/junction_adapter.py +108 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_framework.py +1294 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_functions/__init__.py +12 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_functions/list_versions.py +95 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_functions/loss_functions_01Jan2026.py +585 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_functions/loss_functions_01Jul2025.py +633 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/loss_functions/loss_functions_21Jan2026.py +592 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/loss_short_embedding.py +241 -10
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/lr_timeline.py +6 -3
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/mask_bias_tracker.py +93 -25
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/model_config.py +4 -1
- featrixsphere-0.2.6379/src/lib/featrix/neural/qa/test_all_codecs.py +663 -0
- featrixsphere-0.2.6379/src/lib/featrix/neural/qa/test_cls_vs_mean_pooling.py +259 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/scalar_codec.py +71 -19
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/set_codec.py +45 -20
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/setlist_codec.py +3 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/simple_mlp.py +98 -22
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/single_predictor.py +1174 -256
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/sphere_config.py +82 -19
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/sqlite_utils.py +64 -3
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_codec.py +46 -19
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/timestamp_codec.py +8 -6
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_banner.py +19 -21
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_context_manager.py +33 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_data_timeline.py +39 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_history_db.py +10 -5
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_logger.py +3 -3
- featrixsphere-0.2.6379/src/lib/featrix/neural/training_rules.py +672 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/transformer_encoder.py +350 -31
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/vector_codec.py +3 -2
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/weight_timeline.py +210 -13
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/world_data.py +108 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/xgboost_classifier.py +88 -15
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/structureddata.py +26 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/weightwatcher_tracking.py +18 -1
- featrixsphere-0.2.6379/tests/test_foundation_mode_local.py +374 -0
- featrixsphere-0.2.6127/VERSION +0 -1
- featrixsphere-0.2.6127/src/lib/featrix/neural/domain_codec.py +0 -471
- featrixsphere-0.2.6127/src/lib/featrix/neural/random_utils.py +0 -412
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/MANIFEST.in +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/README.md +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrix-update.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/__init__.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/api_endpoint.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/foundational_model.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/http_client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/notebook_helper.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/prediction_result.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/predictor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/reference_record.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere/api/vector_database.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/dependency_links.txt +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/entry_points.txt +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/not-zip-safe +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/requires.txt +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/featrixsphere.egg-info/top_level.txt +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/nv-install.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/requirements.txt +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/setup.cfg +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/setup.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/auto_upgrade_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/build_version.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/cluster_movie_renderer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/config.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/demo_existing_model.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/demo_label_updates.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/deploy.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/deploy_cache_debug.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/ensure_watchdog_running.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/error_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/event_log.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/example_api_usage.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/example_prediction_feedback.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/example_train_predictor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/featrix_watchdog.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/gc_cleanup.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/api_event_retry.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/backing_db.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/convergence_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/crash_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/distribution_shift_detector.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/embedding_space_io.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/epoch_projections.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/es_projections.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/es_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/es_training_wrapper.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/__init__.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/download-data/build_geo_weather_db.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/download-data/download_geographic_data.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/download-data/download_road_data.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/download-data/download_weather_data.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/download-data/install-data.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/__init__.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/adaptive_event_log.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/causal_relationship_scorer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/classification_metrics.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/config.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/curve_plots_example.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/customer_quality_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/data_frame_data_set.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/dataloader_utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/dimension_validator.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/duration_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/embedding_lr_scheduler.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/embedding_quality.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/embedding_space_utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/enrich.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/es_projection.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/exceptions.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/featrix_csv.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/featrix_json.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/featrix_module_dict.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/featrix_token.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/feature_effectiveness_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/feature_engineer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/feature_suggestion_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/geo_foundation.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/geo_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/gradient_flow.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/graph_encoder.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/graph_encoder_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/guardrails.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/host_memory_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/hubspot_free_domains_list_may_2025.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/hybrid_column_detector.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/hyperparam_search.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/input_data_file.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/integrity.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/ip_address_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/json_cache.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/json_codec.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/llm/__init__.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/llm/schema_analyzer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/local_string_cache.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/logging_config.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/mask_tracker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/model_hash.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/movie_frame_task.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/multi_table_dataset.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/multi_table_embedding_space.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/network_viz.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/pair_scorer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/per_epoch_quality.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/platform_utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/prng_control.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/demo_advisor_decisions.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/example_complete_workflow.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/generate_focal_report.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/model_advisor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/show_results.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_adaptive_loss_benchmark.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_adaptive_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_checkpoint_dict_reconstruction.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_data_timestamps.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_embedding_quality.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_embedding_space.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_epoch_class_separation.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_extend_embedding_space.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_feature_engineering_prediction.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_focal_comparison.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_focal_comparison_enhanced.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_focal_loss_single_predictor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_hybrid_columns.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_label_smoothing.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_lift_measurement_validation.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_lr_timeline_smoothness.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_min_support_rank_scaling.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_monitor_integration.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_multi_dataset.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_piecewise_epochs.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_predict_during_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_relationship_extractor_integration.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_relationship_extractor_mixed_types.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_set_encoder_strategies.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_temporal_relationships.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_timeline_quick.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_training_data_timeline.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_training_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/test_warning_tracking.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/qa/visualize_training_timeline.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_complexity.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_estimator.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_extractor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_importance_validator.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_performance.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_preanalysis.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/relationship_search.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/scalar_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/scalar_timestamp_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/schema_history.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/set_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/set_set_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/set_timestamp_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/simple_string_cache.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/single_predictor_mlp.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/stopwatch.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/strategy_scalar_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/strategy_set_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/strategy_string_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_analysis.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_cache.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_list_codec.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_scalar_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/string_set_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/temporal_relationship_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/timeline_events.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/tools/__init__.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/tools/compare_clusters.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_event.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_exceptions.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_movie_writer.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/training_timeline.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/type_aware_ops_config.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/url_codec.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/url_ops.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/url_parser.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/us_holidays.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix/neural/webhooks.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/featrix_debug.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/job_manager.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/json_encoder_cache.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/knn_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/meta_learning_client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/model_card_repair.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/model_repair.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/pre_analysis_wrapper.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/queue_manager.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/quick_architecture_search.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/session_chains.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/session_manager.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/single_predictor_cv.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/single_predictor_training.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/sp_training_wrapper.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/sphere_config.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/system_health_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/training_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/vector_db.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/lib/webhook_helpers.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/llm_client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/load_and_test_model.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/manage_churro.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/migrate_string_cache_naming.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/neural.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/node-install.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/prediction_client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/prediction_drift_monitor.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/prediction_persistence_worker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/prediction_server.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/query_schema_worker.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/quick_test_deployment.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/recreate_session.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/redis_job_progress.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/redis_prediction_cli.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/redis_prediction_store.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/regenerate_training_movie.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/render_sphere.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/repair_checkpoint.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/repair_model.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/resubmit_es_completion.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/run_api_server.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/send_email.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/slack.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/standalone_prediction.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/start_celery_cpu_worker.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/start_celery_gpu_worker.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/start_celery_movie_worker.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/tail-watch.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/test_api_client.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/tree.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/upgrade-taco-python312.sh +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/utils.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/src/version.py +0 -0
- {featrixsphere-0.2.6127 → featrixsphere-0.2.6379}/system_monitor.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.6379
|
|
@@ -137,22 +137,24 @@ class SessionInfo:
|
|
|
137
137
|
class PredictionBatch:
|
|
138
138
|
"""
|
|
139
139
|
Cached prediction batch that allows instant lookups after initial batch processing.
|
|
140
|
-
|
|
140
|
+
|
|
141
141
|
Usage:
|
|
142
142
|
# First run - populate cache
|
|
143
143
|
batch = client.predict_batch(session_id, records)
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
# Second run - instant cache lookups
|
|
146
146
|
for i in values1:
|
|
147
147
|
for j in values2:
|
|
148
148
|
record = {"param1": i, "param2": j}
|
|
149
149
|
result = batch.predict(record) # Instant!
|
|
150
150
|
"""
|
|
151
|
-
|
|
152
|
-
def __init__(self, session_id: str, client: 'FeatrixSphereClient', target_column: str = None
|
|
151
|
+
|
|
152
|
+
def __init__(self, session_id: str, client: 'FeatrixSphereClient', target_column: str = None,
|
|
153
|
+
best_metric_preference: str = None):
|
|
153
154
|
self.session_id = session_id
|
|
154
155
|
self.client = client
|
|
155
156
|
self.target_column = target_column
|
|
157
|
+
self.best_metric_preference = best_metric_preference
|
|
156
158
|
self._cache = {} # record_hash -> prediction_result
|
|
157
159
|
self._stats = {'hits': 0, 'misses': 0, 'populated': 0}
|
|
158
160
|
|
|
@@ -203,14 +205,15 @@ class PredictionBatch:
|
|
|
203
205
|
"""Populate the cache with batch predictions."""
|
|
204
206
|
if not records:
|
|
205
207
|
return {'summary': {'total_records': 0, 'successful': 0, 'failed': 0}}
|
|
206
|
-
|
|
208
|
+
|
|
207
209
|
print(f"🚀 Creating prediction batch for {len(records)} records...")
|
|
208
|
-
|
|
210
|
+
|
|
209
211
|
# Use existing batch prediction system
|
|
210
212
|
batch_results = self.client.predict_records(
|
|
211
213
|
session_id=self.session_id,
|
|
212
214
|
records=records,
|
|
213
215
|
target_column=self.target_column,
|
|
216
|
+
best_metric_preference=self.best_metric_preference,
|
|
214
217
|
show_progress_bar=True
|
|
215
218
|
)
|
|
216
219
|
|
|
@@ -7744,23 +7747,25 @@ class FeatrixSphereClient:
|
|
|
7744
7747
|
else:
|
|
7745
7748
|
return data
|
|
7746
7749
|
|
|
7747
|
-
def predict_csv_file(self, session_id: str, file_path: Path
|
|
7750
|
+
def predict_csv_file(self, session_id: str, file_path: Path,
|
|
7751
|
+
best_metric_preference: str = None) -> Dict[str, Any]:
|
|
7748
7752
|
"""
|
|
7749
7753
|
Make batch predictions on a CSV file.
|
|
7750
|
-
|
|
7754
|
+
|
|
7751
7755
|
Args:
|
|
7752
7756
|
session_id: ID of session with trained predictor
|
|
7753
7757
|
file_path: Path to CSV file
|
|
7754
|
-
|
|
7758
|
+
best_metric_preference: Which metric checkpoint to use: "roc_auc", "pr_auc", or None (default)
|
|
7759
|
+
|
|
7755
7760
|
Returns:
|
|
7756
7761
|
Batch prediction results
|
|
7757
7762
|
"""
|
|
7758
7763
|
import pandas as pd
|
|
7759
7764
|
from jsontables import JSONTablesEncoder
|
|
7760
|
-
|
|
7765
|
+
|
|
7761
7766
|
if not file_path.exists():
|
|
7762
7767
|
raise FileNotFoundError(f"File not found: {file_path}")
|
|
7763
|
-
|
|
7768
|
+
|
|
7764
7769
|
# Support CSV, Parquet, JSON, and JSONL files
|
|
7765
7770
|
file_path_str = str(file_path).lower()
|
|
7766
7771
|
if file_path_str.endswith('.parquet'):
|
|
@@ -7779,29 +7784,31 @@ class FeatrixSphereClient:
|
|
|
7779
7784
|
df = pd.read_json(file_path)
|
|
7780
7785
|
else:
|
|
7781
7786
|
df = pd.read_csv(file_path)
|
|
7782
|
-
|
|
7787
|
+
|
|
7783
7788
|
# Convert to JSON Tables format and clean NaNs
|
|
7784
7789
|
table_data = JSONTablesEncoder.from_dataframe(df)
|
|
7785
7790
|
cleaned_table_data = self.replace_nans_with_nulls(table_data)
|
|
7786
|
-
|
|
7787
|
-
return self.predict_table(session_id, cleaned_table_data)
|
|
7788
7791
|
|
|
7789
|
-
|
|
7792
|
+
return self.predict_table(session_id, cleaned_table_data, best_metric_preference=best_metric_preference)
|
|
7793
|
+
|
|
7794
|
+
def run_predictions(self, session_id: str, records: List[Dict[str, Any]],
|
|
7795
|
+
best_metric_preference: str = None) -> Dict[str, Any]:
|
|
7790
7796
|
"""
|
|
7791
7797
|
Run predictions on provided records. Clean and fast for production use.
|
|
7792
|
-
|
|
7798
|
+
|
|
7793
7799
|
Args:
|
|
7794
7800
|
session_id: ID of session with trained predictor
|
|
7795
7801
|
records: List of record dictionaries
|
|
7796
|
-
|
|
7802
|
+
best_metric_preference: Which metric checkpoint to use: "roc_auc", "pr_auc", or None (default)
|
|
7803
|
+
|
|
7797
7804
|
Returns:
|
|
7798
7805
|
Dictionary with prediction results
|
|
7799
7806
|
"""
|
|
7800
7807
|
# Clean NaNs for JSON encoding
|
|
7801
7808
|
cleaned_records = self.replace_nans_with_nulls(records)
|
|
7802
|
-
|
|
7809
|
+
|
|
7803
7810
|
# Make batch predictions
|
|
7804
|
-
batch_results = self.predict_records(session_id, cleaned_records)
|
|
7811
|
+
batch_results = self.predict_records(session_id, cleaned_records, best_metric_preference=best_metric_preference)
|
|
7805
7812
|
predictions = batch_results['predictions']
|
|
7806
7813
|
|
|
7807
7814
|
# Process predictions into clean format
|
|
@@ -8517,32 +8524,33 @@ class FeatrixSphereClient:
|
|
|
8517
8524
|
|
|
8518
8525
|
return cleared_counts
|
|
8519
8526
|
|
|
8520
|
-
def predict_batch(self, session_id: str, records: List[Dict[str, Any]],
|
|
8521
|
-
|
|
8527
|
+
def predict_batch(self, session_id: str, records: List[Dict[str, Any]],
|
|
8528
|
+
target_column: str = None, best_metric_preference: str = None) -> PredictionBatch:
|
|
8522
8529
|
"""
|
|
8523
8530
|
Create a prediction batch for instant cached lookups.
|
|
8524
|
-
|
|
8531
|
+
|
|
8525
8532
|
Perfect for parameter sweeps, grid searches, and exploring prediction surfaces.
|
|
8526
8533
|
Run your loops twice with identical code - first populates cache, second gets instant results.
|
|
8527
|
-
|
|
8534
|
+
|
|
8528
8535
|
Args:
|
|
8529
8536
|
session_id: ID of session with trained predictor
|
|
8530
8537
|
records: List of all records you'll want to predict on
|
|
8531
8538
|
target_column: Specific target column predictor to use
|
|
8532
|
-
|
|
8539
|
+
best_metric_preference: Which metric checkpoint to use: "roc_auc", "pr_auc", or None (default)
|
|
8540
|
+
|
|
8533
8541
|
Returns:
|
|
8534
8542
|
PredictionBatch object with instant predict() method
|
|
8535
|
-
|
|
8543
|
+
|
|
8536
8544
|
Example:
|
|
8537
8545
|
# Generate all combinations you'll need
|
|
8538
8546
|
records = []
|
|
8539
8547
|
for i in range(10):
|
|
8540
8548
|
for j in range(10):
|
|
8541
8549
|
records.append({"param1": i, "param2": j})
|
|
8542
|
-
|
|
8550
|
+
|
|
8543
8551
|
# First run - populate cache with batch processing
|
|
8544
8552
|
batch = client.predict_batch(session_id, records)
|
|
8545
|
-
|
|
8553
|
+
|
|
8546
8554
|
# Second run - same loops but instant cache lookups
|
|
8547
8555
|
results = []
|
|
8548
8556
|
for i in range(10):
|
|
@@ -8552,50 +8560,52 @@ class FeatrixSphereClient:
|
|
|
8552
8560
|
results.append(result)
|
|
8553
8561
|
"""
|
|
8554
8562
|
# Create batch object
|
|
8555
|
-
batch = PredictionBatch(session_id, self, target_column)
|
|
8556
|
-
|
|
8563
|
+
batch = PredictionBatch(session_id, self, target_column, best_metric_preference)
|
|
8564
|
+
|
|
8557
8565
|
# Populate cache with batch predictions
|
|
8558
8566
|
batch._populate_cache(records)
|
|
8559
|
-
|
|
8567
|
+
|
|
8560
8568
|
return batch
|
|
8561
8569
|
|
|
8562
|
-
def predict_grid(self, session_id: str, degrees_of_freedom: int,
|
|
8563
|
-
|
|
8570
|
+
def predict_grid(self, session_id: str, degrees_of_freedom: int,
|
|
8571
|
+
grid_shape: tuple = None, target_column: str = None,
|
|
8572
|
+
best_metric_preference: str = None) -> 'PredictionGrid':
|
|
8564
8573
|
"""
|
|
8565
8574
|
Create a prediction grid for exploring parameter surfaces with automatic visualization.
|
|
8566
|
-
|
|
8575
|
+
|
|
8567
8576
|
Perfect for 1D curves, 2D heatmaps, and 3D surfaces with built-in plotting functions.
|
|
8568
|
-
|
|
8577
|
+
|
|
8569
8578
|
Args:
|
|
8570
8579
|
session_id: ID of session with trained predictor
|
|
8571
8580
|
degrees_of_freedom: Number of dimensions (1, 2, or 3)
|
|
8572
8581
|
grid_shape: Custom grid shape tuple (default: auto-sized)
|
|
8573
8582
|
target_column: Specific target column predictor to use
|
|
8574
|
-
|
|
8583
|
+
best_metric_preference: Which metric checkpoint to use: "roc_auc", "pr_auc", or None (default)
|
|
8584
|
+
|
|
8575
8585
|
Returns:
|
|
8576
8586
|
PredictionGrid object with predict() and plotting methods
|
|
8577
|
-
|
|
8587
|
+
|
|
8578
8588
|
Example:
|
|
8579
8589
|
# 2D parameter sweep with automatic plotting
|
|
8580
8590
|
grid = client.predict_grid(session_id, degrees_of_freedom=2)
|
|
8581
8591
|
grid.set_axis_labels(["Spend", "Campaign Type"])
|
|
8582
8592
|
grid.set_axis_values(0, [100, 250, 500])
|
|
8583
8593
|
grid.set_axis_values(1, ["search", "display", "social"])
|
|
8584
|
-
|
|
8594
|
+
|
|
8585
8595
|
for i, spend in enumerate([100, 250, 500]):
|
|
8586
8596
|
for j, campaign in enumerate(["search", "display", "social"]):
|
|
8587
8597
|
record = {"spend": spend, "campaign_type": campaign}
|
|
8588
8598
|
grid.predict(record, grid_position=(i, j))
|
|
8589
|
-
|
|
8599
|
+
|
|
8590
8600
|
# Automatic visualization
|
|
8591
8601
|
grid.plot_heatmap() # 2D heatmap
|
|
8592
8602
|
grid.plot_3d() # 3D surface
|
|
8593
|
-
|
|
8603
|
+
|
|
8594
8604
|
# Find optimal parameters
|
|
8595
8605
|
optimal_pos = grid.get_optimal_position()
|
|
8596
8606
|
print(f"Optimal parameters at grid position: {optimal_pos}")
|
|
8597
8607
|
"""
|
|
8598
|
-
return PredictionGrid(session_id, self, degrees_of_freedom, grid_shape, target_column)
|
|
8608
|
+
return PredictionGrid(session_id, self, degrees_of_freedom, grid_shape, target_column, best_metric_preference)
|
|
8599
8609
|
|
|
8600
8610
|
def get_embedding_space_columns(self, session_id: str) -> Dict[str, Any]:
|
|
8601
8611
|
"""
|
|
@@ -8672,12 +8682,13 @@ class PredictionGrid:
|
|
|
8672
8682
|
grid.plot_3d() # 3D surface plot
|
|
8673
8683
|
"""
|
|
8674
8684
|
|
|
8675
|
-
def __init__(self, session_id: str, client: 'FeatrixSphereClient', degrees_of_freedom: int,
|
|
8676
|
-
grid_shape: tuple = None, target_column: str = None):
|
|
8685
|
+
def __init__(self, session_id: str, client: 'FeatrixSphereClient', degrees_of_freedom: int,
|
|
8686
|
+
grid_shape: tuple = None, target_column: str = None, best_metric_preference: str = None):
|
|
8677
8687
|
self.session_id = session_id
|
|
8678
8688
|
self.client = client
|
|
8679
8689
|
self.degrees_of_freedom = degrees_of_freedom
|
|
8680
8690
|
self.target_column = target_column
|
|
8691
|
+
self.best_metric_preference = best_metric_preference
|
|
8681
8692
|
|
|
8682
8693
|
# Initialize grid matrix based on degrees of freedom
|
|
8683
8694
|
if grid_shape:
|
|
@@ -8769,6 +8780,7 @@ class PredictionGrid:
|
|
|
8769
8780
|
session_id=self.session_id,
|
|
8770
8781
|
records=records_list,
|
|
8771
8782
|
target_column=self.target_column,
|
|
8783
|
+
best_metric_preference=self.best_metric_preference,
|
|
8772
8784
|
show_progress_bar=show_progress
|
|
8773
8785
|
)
|
|
8774
8786
|
|
|
@@ -112,6 +112,7 @@ src/lib/vector_db.py
|
|
|
112
112
|
src/lib/webhook_helpers.py
|
|
113
113
|
src/lib/weightwatcher_tracking.py
|
|
114
114
|
src/lib/featrix/__init__.py
|
|
115
|
+
src/lib/featrix/auto_calibrate.py
|
|
115
116
|
src/lib/featrix/download-data/build_geo_weather_db.py
|
|
116
117
|
src/lib/featrix/download-data/download_geographic_data.py
|
|
117
118
|
src/lib/featrix/download-data/download_road_data.py
|
|
@@ -119,6 +120,7 @@ src/lib/featrix/download-data/download_weather_data.py
|
|
|
119
120
|
src/lib/featrix/download-data/install-data.sh
|
|
120
121
|
src/lib/featrix/neural/__init__.py
|
|
121
122
|
src/lib/featrix/neural/adaptive_event_log.py
|
|
123
|
+
src/lib/featrix/neural/auc_animation.py
|
|
122
124
|
src/lib/featrix/neural/calibration_utils.py
|
|
123
125
|
src/lib/featrix/neural/causal_relationship_scorer.py
|
|
124
126
|
src/lib/featrix/neural/charting.py
|
|
@@ -129,12 +131,14 @@ src/lib/featrix/neural/curve_plots_example.py
|
|
|
129
131
|
src/lib/featrix/neural/customer_quality_tracker.py
|
|
130
132
|
src/lib/featrix/neural/data_frame_data_set.py
|
|
131
133
|
src/lib/featrix/neural/dataloader_utils.py
|
|
134
|
+
src/lib/featrix/neural/default_training_rules.py
|
|
132
135
|
src/lib/featrix/neural/detect.py
|
|
133
136
|
src/lib/featrix/neural/dimension_validator.py
|
|
134
137
|
src/lib/featrix/neural/domain_codec.py
|
|
135
138
|
src/lib/featrix/neural/dropout_scheduler.py
|
|
136
139
|
src/lib/featrix/neural/duration_ops.py
|
|
137
140
|
src/lib/featrix/neural/dynamic_relationship_extractor.py
|
|
141
|
+
src/lib/featrix/neural/email_codec.py
|
|
138
142
|
src/lib/featrix/neural/email_domain_ops.py
|
|
139
143
|
src/lib/featrix/neural/embedded_space.py
|
|
140
144
|
src/lib/featrix/neural/embedding_lr_scheduler.py
|
|
@@ -144,6 +148,7 @@ src/lib/featrix/neural/embedding_utils.py
|
|
|
144
148
|
src/lib/featrix/neural/encoders.py
|
|
145
149
|
src/lib/featrix/neural/enrich.py
|
|
146
150
|
src/lib/featrix/neural/es_projection.py
|
|
151
|
+
src/lib/featrix/neural/es_training_callbacks.py
|
|
147
152
|
src/lib/featrix/neural/exceptions.py
|
|
148
153
|
src/lib/featrix/neural/featrix_csv.py
|
|
149
154
|
src/lib/featrix/neural/featrix_json.py
|
|
@@ -172,8 +177,10 @@ src/lib/featrix/neural/io_utils.py
|
|
|
172
177
|
src/lib/featrix/neural/ip_address_ops.py
|
|
173
178
|
src/lib/featrix/neural/json_cache.py
|
|
174
179
|
src/lib/featrix/neural/json_codec.py
|
|
180
|
+
src/lib/featrix/neural/junction_adapter.py
|
|
175
181
|
src/lib/featrix/neural/local_string_cache.py
|
|
176
182
|
src/lib/featrix/neural/logging_config.py
|
|
183
|
+
src/lib/featrix/neural/loss_framework.py
|
|
177
184
|
src/lib/featrix/neural/loss_short_embedding.py
|
|
178
185
|
src/lib/featrix/neural/lr_timeline.py
|
|
179
186
|
src/lib/featrix/neural/mask_bias_tracker.py
|
|
@@ -188,7 +195,6 @@ src/lib/featrix/neural/pair_scorer.py
|
|
|
188
195
|
src/lib/featrix/neural/per_epoch_quality.py
|
|
189
196
|
src/lib/featrix/neural/platform_utils.py
|
|
190
197
|
src/lib/featrix/neural/prng_control.py
|
|
191
|
-
src/lib/featrix/neural/random_utils.py
|
|
192
198
|
src/lib/featrix/neural/relationship_complexity.py
|
|
193
199
|
src/lib/featrix/neural/relationship_estimator.py
|
|
194
200
|
src/lib/featrix/neural/relationship_extractor.py
|
|
@@ -232,6 +238,7 @@ src/lib/featrix/neural/training_exceptions.py
|
|
|
232
238
|
src/lib/featrix/neural/training_history_db.py
|
|
233
239
|
src/lib/featrix/neural/training_logger.py
|
|
234
240
|
src/lib/featrix/neural/training_movie_writer.py
|
|
241
|
+
src/lib/featrix/neural/training_rules.py
|
|
235
242
|
src/lib/featrix/neural/training_timeline.py
|
|
236
243
|
src/lib/featrix/neural/transformer_encoder.py
|
|
237
244
|
src/lib/featrix/neural/type_aware_ops_config.py
|
|
@@ -247,6 +254,11 @@ src/lib/featrix/neural/world_data.py
|
|
|
247
254
|
src/lib/featrix/neural/xgboost_classifier.py
|
|
248
255
|
src/lib/featrix/neural/llm/__init__.py
|
|
249
256
|
src/lib/featrix/neural/llm/schema_analyzer.py
|
|
257
|
+
src/lib/featrix/neural/loss_functions/__init__.py
|
|
258
|
+
src/lib/featrix/neural/loss_functions/list_versions.py
|
|
259
|
+
src/lib/featrix/neural/loss_functions/loss_functions_01Jan2026.py
|
|
260
|
+
src/lib/featrix/neural/loss_functions/loss_functions_01Jul2025.py
|
|
261
|
+
src/lib/featrix/neural/loss_functions/loss_functions_21Jan2026.py
|
|
250
262
|
src/lib/featrix/neural/qa/demo_advisor_decisions.py
|
|
251
263
|
src/lib/featrix/neural/qa/example_complete_workflow.py
|
|
252
264
|
src/lib/featrix/neural/qa/generate_focal_report.py
|
|
@@ -254,7 +266,9 @@ src/lib/featrix/neural/qa/model_advisor.py
|
|
|
254
266
|
src/lib/featrix/neural/qa/show_results.py
|
|
255
267
|
src/lib/featrix/neural/qa/test_adaptive_loss_benchmark.py
|
|
256
268
|
src/lib/featrix/neural/qa/test_adaptive_training.py
|
|
269
|
+
src/lib/featrix/neural/qa/test_all_codecs.py
|
|
257
270
|
src/lib/featrix/neural/qa/test_checkpoint_dict_reconstruction.py
|
|
271
|
+
src/lib/featrix/neural/qa/test_cls_vs_mean_pooling.py
|
|
258
272
|
src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py
|
|
259
273
|
src/lib/featrix/neural/qa/test_data_timestamps.py
|
|
260
274
|
src/lib/featrix/neural/qa/test_embedding_quality.py
|
|
@@ -284,4 +298,5 @@ src/lib/featrix/neural/qa/test_training_monitor.py
|
|
|
284
298
|
src/lib/featrix/neural/qa/test_warning_tracking.py
|
|
285
299
|
src/lib/featrix/neural/qa/visualize_training_timeline.py
|
|
286
300
|
src/lib/featrix/neural/tools/__init__.py
|
|
287
|
-
src/lib/featrix/neural/tools/compare_clusters.py
|
|
301
|
+
src/lib/featrix/neural/tools/compare_clusters.py
|
|
302
|
+
tests/test_foundation_mode_local.py
|
|
@@ -3031,10 +3031,11 @@ def create_app() -> FastAPI:
|
|
|
3031
3031
|
predictor_dir = Path(predictor_path).parent
|
|
3032
3032
|
if predictor_dir.exists():
|
|
3033
3033
|
# Look for best checkpoint files
|
|
3034
|
+
# Filename format: {timestamp}_best_single_predictor_auc_roc_{value}_epoch_{N}.pickle
|
|
3034
3035
|
if best_metric_preference.lower() in ['roc_auc', 'roc-auc', 'auc']:
|
|
3035
3036
|
# Look for ROC-AUC best checkpoint
|
|
3036
3037
|
roc_auc_checkpoints = sorted(
|
|
3037
|
-
predictor_dir.glob("
|
|
3038
|
+
predictor_dir.glob("*best_single_predictor_auc_roc*.pickle"),
|
|
3038
3039
|
key=lambda p: p.stat().st_mtime,
|
|
3039
3040
|
reverse=True
|
|
3040
3041
|
)
|
|
@@ -3046,7 +3047,7 @@ def create_app() -> FastAPI:
|
|
|
3046
3047
|
elif best_metric_preference.lower() in ['pr_auc', 'pr-auc', 'precision_recall']:
|
|
3047
3048
|
# Look for PR-AUC best checkpoint
|
|
3048
3049
|
pr_auc_checkpoints = sorted(
|
|
3049
|
-
predictor_dir.glob("
|
|
3050
|
+
predictor_dir.glob("*best_single_predictor_auc_pr*.pickle"),
|
|
3050
3051
|
key=lambda p: p.stat().st_mtime,
|
|
3051
3052
|
reverse=True
|
|
3052
3053
|
)
|
|
@@ -2123,9 +2123,10 @@ def create_structured_data(self, job_spec: dict, job_id: str, data_file: str = N
|
|
|
2123
2123
|
logger.info(f"📊 Processing data file (reading, parsing, cleaning, expanding JSON columns, writing to SQLite)...")
|
|
2124
2124
|
logger.info(f" This may take a while for large files - watch for progress updates below...")
|
|
2125
2125
|
|
|
2126
|
-
# Check if we should use foundation mode (large datasets >=
|
|
2126
|
+
# Check if we should use foundation mode (large datasets >= 50k rows)
|
|
2127
2127
|
# Foundation mode creates train/validation/test/warmup splits directly in SQLite
|
|
2128
|
-
|
|
2128
|
+
# This enables chunked iteration, SQLite-backed splits, and better memory efficiency
|
|
2129
|
+
FOUNDATION_THRESHOLD = 50_000
|
|
2129
2130
|
foundation_mode_setting = job_spec.get("foundation_mode") # None = auto-detect, True = force, False = disable
|
|
2130
2131
|
use_foundation_mode = foundation_mode_setting is True # Explicitly True means force it
|
|
2131
2132
|
|
|
@@ -6,11 +6,12 @@ This replaces the old file-based worker recovery mechanism.
|
|
|
6
6
|
"""
|
|
7
7
|
import json
|
|
8
8
|
import logging
|
|
9
|
+
import os
|
|
9
10
|
import time
|
|
10
11
|
import traceback
|
|
11
12
|
from datetime import datetime, timedelta
|
|
12
13
|
from pathlib import Path
|
|
13
|
-
from typing import List, Dict, Any, Optional
|
|
14
|
+
from typing import List, Dict, Any, Optional, Tuple
|
|
14
15
|
from zoneinfo import ZoneInfo
|
|
15
16
|
|
|
16
17
|
import redis
|
|
@@ -30,6 +31,92 @@ logger = logging.getLogger(__name__)
|
|
|
30
31
|
CANCELLED_JOBS_DIR = Path("/tmp/featrix_cancelled_jobs")
|
|
31
32
|
|
|
32
33
|
|
|
34
|
+
def _check_running_job_state(job: dict) -> Tuple[str, bool, Optional[str]]:
|
|
35
|
+
"""
|
|
36
|
+
Check the actual state of a RUNNING job by examining:
|
|
37
|
+
1. Control files (ABORT, PAUSE, CRASH, FAILURE)
|
|
38
|
+
2. PID from .job.lock file (is process still alive?)
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
(state, should_recover, reason)
|
|
42
|
+
|
|
43
|
+
States and actions:
|
|
44
|
+
- "running_will_abort" - ABORT file exists, process running → don't recover, will finish soon
|
|
45
|
+
- "running_paused" - PAUSE file exists, process running → don't recover, paused
|
|
46
|
+
- "running_healthy" - process running, no control files → don't recover
|
|
47
|
+
- "dead_aborted" - ABORT file exists, process dead → mark FAILED, don't recover
|
|
48
|
+
- "dead_crashed" - CRASH/FAILURE file exists, process dead → mark FAILED, don't recover
|
|
49
|
+
- "dead_needs_recovery" - process dead, no markers → needs recovery
|
|
50
|
+
- "unknown" - can't determine (no job dir, etc.) → recover to be safe
|
|
51
|
+
"""
|
|
52
|
+
job_id = job.get('job_id')
|
|
53
|
+
job_type = job.get('job_type')
|
|
54
|
+
session_id = job.get('session_id')
|
|
55
|
+
|
|
56
|
+
# Get job output directory
|
|
57
|
+
try:
|
|
58
|
+
job_output_dir = get_job_output_path(job_id, session_id=session_id, job_type=job_type)
|
|
59
|
+
if not job_output_dir or not job_output_dir.exists():
|
|
60
|
+
return ("unknown", True, "job output directory not found")
|
|
61
|
+
except Exception as e:
|
|
62
|
+
logger.debug(f"Could not get job output path for {job_id}: {e}")
|
|
63
|
+
return ("unknown", True, f"could not get job output path: {e}")
|
|
64
|
+
|
|
65
|
+
# Check for control files
|
|
66
|
+
abort_file = job_output_dir / "ABORT"
|
|
67
|
+
pause_file = job_output_dir / "PAUSE"
|
|
68
|
+
crash_file = job_output_dir / "CRASH.log"
|
|
69
|
+
failure_file = job_output_dir / "FAILURE"
|
|
70
|
+
|
|
71
|
+
has_abort = abort_file.exists()
|
|
72
|
+
has_pause = pause_file.exists()
|
|
73
|
+
has_crash = crash_file.exists()
|
|
74
|
+
has_failure = failure_file.exists()
|
|
75
|
+
|
|
76
|
+
# Check if process is still running via .job.lock file
|
|
77
|
+
lock_file = job_output_dir / ".job.lock"
|
|
78
|
+
pid = None
|
|
79
|
+
process_running = False
|
|
80
|
+
|
|
81
|
+
if lock_file.exists():
|
|
82
|
+
try:
|
|
83
|
+
lock_content = lock_file.read_text()
|
|
84
|
+
for line in lock_content.split('\n'):
|
|
85
|
+
if line.startswith('pid:'):
|
|
86
|
+
pid = int(line.split(':', 1)[1].strip())
|
|
87
|
+
break
|
|
88
|
+
|
|
89
|
+
if pid:
|
|
90
|
+
# Check if process is still running
|
|
91
|
+
try:
|
|
92
|
+
os.kill(pid, 0) # Signal 0 just checks if process exists
|
|
93
|
+
process_running = True
|
|
94
|
+
except OSError:
|
|
95
|
+
process_running = False
|
|
96
|
+
except Exception as e:
|
|
97
|
+
logger.debug(f"Could not read lock file for job {job_id}: {e}")
|
|
98
|
+
|
|
99
|
+
# Determine state based on control files and process status
|
|
100
|
+
if process_running:
|
|
101
|
+
if has_abort:
|
|
102
|
+
return ("running_will_abort", False, f"ABORT file exists, PID {pid} still running - will finish cleanly soon")
|
|
103
|
+
elif has_pause:
|
|
104
|
+
return ("running_paused", False, f"PAUSE file exists, PID {pid} still running - paused")
|
|
105
|
+
else:
|
|
106
|
+
return ("running_healthy", False, f"PID {pid} still running - healthy")
|
|
107
|
+
else:
|
|
108
|
+
# Process is dead
|
|
109
|
+
if has_abort:
|
|
110
|
+
return ("dead_aborted", False, f"ABORT file exists, process dead - mark as FAILED")
|
|
111
|
+
elif has_crash:
|
|
112
|
+
return ("dead_crashed", False, f"CRASH.log exists, process dead - mark as FAILED")
|
|
113
|
+
elif has_failure:
|
|
114
|
+
return ("dead_failed", False, f"FAILURE file exists, process dead - mark as FAILED")
|
|
115
|
+
else:
|
|
116
|
+
pid_info = f" (was PID {pid})" if pid else ""
|
|
117
|
+
return ("dead_needs_recovery", True, f"process dead{pid_info}, no failure markers - needs recovery")
|
|
118
|
+
|
|
119
|
+
|
|
33
120
|
def _mark_job_cancelled(job_id: str, replaced_by: str, reason: str) -> bool:
|
|
34
121
|
"""
|
|
35
122
|
Mark a job as CANCELLED so it won't be picked up by recovery again.
|
|
@@ -1598,10 +1685,32 @@ def recover_interrupted_jobs() -> Dict[str, Any]:
|
|
|
1598
1685
|
logger.debug(f"⏭️ Skipping movie frame job {job_id} - movie generation disabled")
|
|
1599
1686
|
continue
|
|
1600
1687
|
|
|
1601
|
-
# Include RUNNING jobs
|
|
1688
|
+
# Include RUNNING jobs - but check actual state first
|
|
1602
1689
|
if status == JobStatus.RUNNING.value:
|
|
1603
|
-
|
|
1604
|
-
|
|
1690
|
+
state, should_recover, reason = _check_running_job_state(job)
|
|
1691
|
+
job_type = job.get('job_type')
|
|
1692
|
+
|
|
1693
|
+
if state == "running_healthy":
|
|
1694
|
+
logger.info(f"✅ RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1695
|
+
elif state == "running_will_abort":
|
|
1696
|
+
logger.info(f"⏳ RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1697
|
+
elif state == "running_paused":
|
|
1698
|
+
logger.info(f"⏸️ RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1699
|
+
elif state in ("dead_aborted", "dead_crashed", "dead_failed"):
|
|
1700
|
+
# Process is dead with failure markers - mark as FAILED in Redis
|
|
1701
|
+
logger.warning(f"💀 RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1702
|
+
try:
|
|
1703
|
+
update_job_status(job_id, JobStatus.FAILED, metadata={'error': reason})
|
|
1704
|
+
logger.info(f" ✅ Updated job status to FAILED in Redis")
|
|
1705
|
+
except Exception as e:
|
|
1706
|
+
logger.warning(f" ⚠️ Failed to update job status: {e}")
|
|
1707
|
+
elif state == "dead_needs_recovery":
|
|
1708
|
+
logger.info(f"🔄 RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1709
|
+
jobs_to_recover.append(job)
|
|
1710
|
+
else: # unknown state
|
|
1711
|
+
logger.info(f"🔄 RUNNING job {job_id} (type: {job_type}) - {reason}")
|
|
1712
|
+
if should_recover:
|
|
1713
|
+
jobs_to_recover.append(job)
|
|
1605
1714
|
|
|
1606
1715
|
# Include recently FAILED jobs
|
|
1607
1716
|
elif status == JobStatus.FAILED.value:
|