snowflake-ml-python 1.46.0__tar.gz → 1.47.0__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 (545) hide show
  1. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/CHANGELOG.md +34 -1
  2. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/PKG-INFO +36 -3
  3. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/pyproject.toml +1 -1
  4. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/experiment_tracking.py +45 -5
  5. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/aggregation.py +10 -0
  6. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature_group.py +21 -0
  7. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature_store.py +199 -13
  8. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature_view.py +54 -0
  9. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/realtime_registration.py +6 -4
  10. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/spec/builder.py +53 -35
  11. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/tile_sql_generator.py +26 -23
  12. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/lineage/lineage_node.py +1 -1
  13. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/batch_inference_specs.py +10 -3
  14. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/model_version_impl.py +3 -1
  15. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/service_ops.py +3 -1
  16. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/catboost.py +1 -2
  17. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_handler.py +2 -0
  18. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_task_handler.py +2 -0
  19. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/document_question_answering.py +2 -0
  20. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_classification.py +2 -0
  21. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_feature_extraction.py +2 -0
  22. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_text_to_text.py +2 -0
  23. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_to_text.py +2 -0
  24. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/object_detection.py +2 -0
  25. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/video_classification.py +2 -0
  26. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/visual_question_answering.py +2 -0
  27. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_image_classification.py +2 -0
  28. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_object_detection.py +2 -0
  29. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/lightgbm.py +1 -2
  30. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/sklearn.py +1 -18
  31. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +17 -22
  32. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/xgboost.py +1 -1
  33. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_runtime/_snowml_inference_alternative_requirements.py +1 -1
  34. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/snowpark_handler.py +5 -1
  35. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/openai_signatures.py +44 -0
  36. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/type_hints.py +1 -1
  37. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +18 -5
  38. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/affinity_propagation.py +18 -5
  39. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/agglomerative_clustering.py +18 -5
  40. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/birch.py +18 -5
  41. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/bisecting_k_means.py +18 -5
  42. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/dbscan.py +18 -5
  43. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/feature_agglomeration.py +18 -5
  44. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/k_means.py +18 -5
  45. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/mean_shift.py +18 -5
  46. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/mini_batch_k_means.py +18 -5
  47. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/optics.py +18 -5
  48. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/spectral_biclustering.py +18 -5
  49. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/spectral_clustering.py +18 -5
  50. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/spectral_coclustering.py +18 -5
  51. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/compose/column_transformer.py +18 -5
  52. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/compose/transformed_target_regressor.py +18 -5
  53. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/elliptic_envelope.py +18 -5
  54. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/empirical_covariance.py +18 -5
  55. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/graphical_lasso.py +18 -5
  56. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/graphical_lasso_cv.py +18 -5
  57. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/ledoit_wolf.py +18 -5
  58. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/min_cov_det.py +18 -5
  59. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/oas.py +18 -5
  60. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/shrunk_covariance.py +18 -5
  61. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/dictionary_learning.py +18 -5
  62. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/factor_analysis.py +18 -5
  63. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/fast_ica.py +18 -5
  64. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/incremental_pca.py +18 -5
  65. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/kernel_pca.py +18 -5
  66. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +18 -5
  67. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +18 -5
  68. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/pca.py +18 -5
  69. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/sparse_pca.py +18 -5
  70. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/truncated_svd.py +18 -5
  71. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +18 -5
  72. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +18 -5
  73. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/ada_boost_classifier.py +18 -5
  74. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/ada_boost_regressor.py +18 -5
  75. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/bagging_classifier.py +18 -5
  76. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/bagging_regressor.py +18 -5
  77. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/extra_trees_classifier.py +18 -5
  78. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/extra_trees_regressor.py +18 -5
  79. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +18 -5
  80. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +18 -5
  81. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +18 -5
  82. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +18 -5
  83. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/isolation_forest.py +18 -5
  84. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/random_forest_classifier.py +18 -5
  85. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/random_forest_regressor.py +18 -5
  86. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/stacking_regressor.py +18 -5
  87. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/voting_classifier.py +18 -5
  88. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/voting_regressor.py +18 -5
  89. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/generic_univariate_select.py +18 -5
  90. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/select_fdr.py +18 -5
  91. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/select_fpr.py +18 -5
  92. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/select_fwe.py +18 -5
  93. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/select_k_best.py +18 -5
  94. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/select_percentile.py +18 -5
  95. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +18 -5
  96. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/variance_threshold.py +18 -5
  97. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/framework/base.py +30 -5
  98. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +18 -5
  99. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +18 -5
  100. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/impute/iterative_imputer.py +18 -5
  101. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/impute/knn_imputer.py +18 -5
  102. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/impute/missing_indicator.py +18 -5
  103. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/impute/simple_imputer.py +6 -0
  104. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +18 -5
  105. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/nystroem.py +18 -5
  106. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +18 -5
  107. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +18 -5
  108. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +18 -5
  109. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +18 -5
  110. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/lightgbm/lgbm_classifier.py +18 -5
  111. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/lightgbm/lgbm_regressor.py +18 -5
  112. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ard_regression.py +18 -5
  113. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/bayesian_ridge.py +18 -5
  114. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/elastic_net.py +18 -5
  115. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/elastic_net_cv.py +18 -5
  116. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/gamma_regressor.py +18 -5
  117. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/huber_regressor.py +18 -5
  118. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lars.py +18 -5
  119. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lars_cv.py +18 -5
  120. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lasso.py +18 -5
  121. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lasso_cv.py +18 -5
  122. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lasso_lars.py +18 -5
  123. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lasso_lars_cv.py +18 -5
  124. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/lasso_lars_ic.py +18 -5
  125. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/linear_regression.py +18 -5
  126. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/logistic_regression.py +18 -5
  127. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/logistic_regression_cv.py +18 -5
  128. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +18 -5
  129. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +18 -5
  130. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/multi_task_lasso.py +18 -5
  131. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +18 -5
  132. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +18 -5
  133. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +18 -5
  134. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +18 -5
  135. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/perceptron.py +18 -5
  136. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/poisson_regressor.py +18 -5
  137. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ransac_regressor.py +18 -5
  138. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ridge.py +18 -5
  139. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ridge_classifier.py +18 -5
  140. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +18 -5
  141. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/ridge_cv.py +18 -5
  142. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/sgd_classifier.py +18 -5
  143. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +18 -5
  144. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/sgd_regressor.py +18 -5
  145. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/theil_sen_regressor.py +18 -5
  146. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/tweedie_regressor.py +18 -5
  147. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/manifold/isomap.py +18 -5
  148. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/manifold/mds.py +18 -5
  149. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/manifold/spectral_embedding.py +18 -5
  150. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/manifold/tsne.py +18 -5
  151. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +18 -5
  152. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/mixture/gaussian_mixture.py +18 -5
  153. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/model_selection/grid_search_cv.py +5 -4
  154. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/model_selection/randomized_search_cv.py +5 -4
  155. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +18 -5
  156. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +18 -5
  157. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/multiclass/output_code_classifier.py +18 -5
  158. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +18 -5
  159. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/categorical_nb.py +18 -5
  160. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/complement_nb.py +18 -5
  161. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/gaussian_nb.py +18 -5
  162. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/multinomial_nb.py +18 -5
  163. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +18 -5
  164. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +18 -5
  165. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/kernel_density.py +18 -5
  166. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/local_outlier_factor.py +18 -5
  167. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/nearest_centroid.py +18 -5
  168. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/nearest_neighbors.py +18 -5
  169. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +18 -5
  170. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +18 -5
  171. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +18 -5
  172. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neural_network/bernoulli_rbm.py +18 -5
  173. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neural_network/mlp_classifier.py +18 -5
  174. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neural_network/mlp_regressor.py +18 -5
  175. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/polynomial_features.py +18 -5
  176. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/semi_supervised/label_propagation.py +18 -5
  177. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/semi_supervised/label_spreading.py +18 -5
  178. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/linear_svc.py +18 -5
  179. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/linear_svr.py +18 -5
  180. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/nu_svc.py +18 -5
  181. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/nu_svr.py +18 -5
  182. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/svc.py +18 -5
  183. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/svr.py +18 -5
  184. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/tree/decision_tree_classifier.py +18 -5
  185. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/tree/decision_tree_regressor.py +18 -5
  186. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/tree/extra_tree_classifier.py +18 -5
  187. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/tree/extra_tree_regressor.py +18 -5
  188. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/xgboost/xgb_classifier.py +18 -5
  189. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/xgboost/xgb_regressor.py +18 -5
  190. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/xgboost/xgbrf_classifier.py +18 -5
  191. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/xgboost/xgbrf_regressor.py +18 -5
  192. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/registry/_manager/model_parameter_reconciler.py +3 -61
  193. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/registry/registry.py +6 -6
  194. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/version.py +1 -1
  195. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake_ml_python.egg-info/PKG-INFO +36 -3
  196. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake_ml_python.egg-info/requires.txt +1 -1
  197. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/LICENSE.txt +0 -0
  198. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/README.md +0 -0
  199. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/setup.cfg +0 -0
  200. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/__init__.py +0 -0
  201. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_classify_text.py +0 -0
  202. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_complete.py +0 -0
  203. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_embed_text_1024.py +0 -0
  204. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_embed_text_768.py +0 -0
  205. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_extract_answer.py +0 -0
  206. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_finetune.py +0 -0
  207. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_sentiment.py +0 -0
  208. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_sse_client.py +0 -0
  209. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_summarize.py +0 -0
  210. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_translate.py +0 -0
  211. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/cortex/_util.py +0 -0
  212. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/env.py +0 -0
  213. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/env_utils.py +0 -0
  214. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/dataset_error_messages.py +0 -0
  215. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/dataset_errors.py +0 -0
  216. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/error_codes.py +0 -0
  217. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/error_messages.py +0 -0
  218. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/exceptions.py +0 -0
  219. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/fileset_error_messages.py +0 -0
  220. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/fileset_errors.py +0 -0
  221. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/modeling_error_messages.py +0 -0
  222. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/exceptions/sql_error_codes.py +0 -0
  223. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/file_utils.py +0 -0
  224. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/human_readable_id/adjectives.txt +0 -0
  225. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/human_readable_id/animals.txt +0 -0
  226. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/human_readable_id/hrid_generator.py +0 -0
  227. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/human_readable_id/hrid_generator_base.py +0 -0
  228. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/init_utils.py +0 -0
  229. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/lineage/lineage_utils.py +0 -0
  230. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/migrator_utils.py +0 -0
  231. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/platform_capabilities.py +0 -0
  232. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/relax_version_strategy.py +0 -0
  233. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/telemetry.py +0 -0
  234. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/type_utils.py +0 -0
  235. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/connection_params.py +0 -0
  236. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/db_utils.py +0 -0
  237. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/formatting.py +0 -0
  238. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/identifier.py +0 -0
  239. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/import_utils.py +0 -0
  240. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/jwt_generator.py +0 -0
  241. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/mixins.py +0 -0
  242. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/parallelize.py +0 -0
  243. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/pkg_version_utils.py +0 -0
  244. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/query_result_checker.py +0 -0
  245. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/result.py +0 -0
  246. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/service_logger.py +0 -0
  247. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/snowflake_env.py +0 -0
  248. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/snowpark_dataframe_utils.py +0 -0
  249. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/sql_identifier.py +0 -0
  250. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/table_manager.py +0 -0
  251. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/tee.py +0 -0
  252. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/temp_file_utils.py +0 -0
  253. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/_internal/utils/url.py +0 -0
  254. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/__init__.py +0 -0
  255. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/_internal/arrow_ingestor.py +0 -0
  256. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/data_connector.py +0 -0
  257. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/data_ingestor.py +0 -0
  258. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/data_source.py +0 -0
  259. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/ingestor_utils.py +0 -0
  260. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/data/torch_utils.py +0 -0
  261. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/dataset/__init__.py +0 -0
  262. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/dataset/dataset.py +0 -0
  263. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/dataset/dataset_factory.py +0 -0
  264. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/dataset/dataset_metadata.py +0 -0
  265. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/dataset/dataset_reader.py +0 -0
  266. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/__init__.py +0 -0
  267. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_client/artifact.py +0 -0
  268. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_client/experiment_tracking_sql_client.py +0 -0
  269. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_entities/__init__.py +0 -0
  270. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_entities/experiment.py +0 -0
  271. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_entities/run.py +0 -0
  272. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_entities/run_metadata.py +0 -0
  273. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_experiment_info.py +0 -0
  274. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_logging/__init__.py +0 -0
  275. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_logging/experiment_logger.py +0 -0
  276. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/_logging/experiment_logging_context.py +0 -0
  277. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/callback/keras.py +0 -0
  278. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/callback/lightgbm.py +0 -0
  279. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/callback/xgboost.py +0 -0
  280. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/experiment/utils.py +0 -0
  281. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/__init__.py +0 -0
  282. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/_compute_fn_validation.py +0 -0
  283. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/access_manager.py +0 -0
  284. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/entity.py +0 -0
  285. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/airline_features/entities.py +0 -0
  286. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/airline_features/features/plane_features.py +0 -0
  287. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/airline_features/features/weather_features.py +0 -0
  288. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/airline_features/source.yaml +0 -0
  289. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/citibike_trip_features/entities.py +0 -0
  290. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/citibike_trip_features/features/station_feature.py +0 -0
  291. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/citibike_trip_features/features/trip_feature.py +0 -0
  292. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/citibike_trip_features/source.yaml +0 -0
  293. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/example_helper.py +0 -0
  294. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/entities.py +0 -0
  295. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/features/location_features.py +0 -0
  296. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/features/trip_features.py +0 -0
  297. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/source.yaml +0 -0
  298. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/source_data/airline.yaml +0 -0
  299. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/source_data/citibike_trips.yaml +0 -0
  300. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/source_data/fraud_transactions.yaml +0 -0
  301. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/source_data/nyc_yellow_trips.yaml +0 -0
  302. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/source_data/winequality_red.yaml +0 -0
  303. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/wine_quality_features/entities.py +0 -0
  304. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/wine_quality_features/features/managed_wine_features.py +0 -0
  305. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/wine_quality_features/features/static_wine_features.py +0 -0
  306. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/examples/wine_quality_features/source.yaml +0 -0
  307. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature.py +0 -0
  308. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature_view_append_only_validation.py +0 -0
  309. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/feature_view_refresh_freq.py +0 -0
  310. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/interval_utils.py +0 -0
  311. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/metadata_manager.py +0 -0
  312. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/online_service.py +0 -0
  313. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/online_service_http_client.py +0 -0
  314. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/realtime_config.py +0 -0
  315. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/realtime_dataset.py +0 -0
  316. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/realtime_dataset_udf.py +0 -0
  317. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/request_source.py +0 -0
  318. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/spec/__init__.py +0 -0
  319. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/spec/enums.py +0 -0
  320. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/spec/models.py +0 -0
  321. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/spec/table_schema_evolution.py +0 -0
  322. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/stream_config.py +0 -0
  323. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/stream_source.py +0 -0
  324. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/feature_store/streaming_registration.py +0 -0
  325. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/fileset/embedded_stage_fs.py +0 -0
  326. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/fileset/fileset.py +0 -0
  327. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/fileset/sfcfs.py +0 -0
  328. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/fileset/snowfs.py +0 -0
  329. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/fileset/stage_fs.py +0 -0
  330. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/__init__.py +0 -0
  331. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/__init__.py +0 -0
  332. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/data_utils.py +0 -0
  333. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/dto_schema.py +0 -0
  334. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/exception_utils.py +0 -0
  335. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/legacy.py +0 -0
  336. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/protocols.py +0 -0
  337. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/results.py +0 -0
  338. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_interop/utils.py +0 -0
  339. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/__init__.py +0 -0
  340. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/arg_protocol.py +0 -0
  341. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/constants.py +0 -0
  342. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/feature_flags.py +0 -0
  343. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/payload_utils.py +0 -0
  344. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/query_helper.py +0 -0
  345. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/runtime_env_utils.py +0 -0
  346. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/__init__.py +0 -0
  347. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/constants.py +0 -0
  348. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/get_instance_ip.py +0 -0
  349. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/mljob_launcher.py +0 -0
  350. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/signal_workers.py +0 -0
  351. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/start_mlruntime.sh +0 -0
  352. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/startup.sh +0 -0
  353. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/scripts/worker_shutdown_listener.py +0 -0
  354. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/stage_utils.py +0 -0
  355. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/_utils/type_utils.py +0 -0
  356. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/decorators.py +0 -0
  357. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/job.py +0 -0
  358. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/job_definition.py +0 -0
  359. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/jobs/manager.py +0 -0
  360. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/lineage/__init__.py +0 -0
  361. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/__init__.py +0 -0
  362. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/batch_inference_serialization.py +0 -0
  363. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/batch_inference_task.py +0 -0
  364. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/inference_engine_utils.py +0 -0
  365. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/model/model_impl.py +0 -0
  366. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/deployment_step.py +0 -0
  367. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/metadata_ops.py +0 -0
  368. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/model_ops.py +0 -0
  369. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/param_ops.py +0 -0
  370. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/ops/param_utils.py +0 -0
  371. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/service/import_model_spec_schema.py +0 -0
  372. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/service/inference_job_service_spec.py +0 -0
  373. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/service/model_deployment_spec.py +0 -0
  374. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/service/model_deployment_spec_schema.py +0 -0
  375. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/_base.py +0 -0
  376. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/model.py +0 -0
  377. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/model_version.py +0 -0
  378. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/service.py +0 -0
  379. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/stage.py +0 -0
  380. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_client/sql/tag.py +0 -0
  381. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/huggingface_lazy_uploader.py +0 -0
  382. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_composer.py +0 -0
  383. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +0 -0
  384. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +0 -0
  385. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/constants.py +0 -0
  386. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/function_generator.py +0 -0
  387. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_function.py_template +0 -0
  388. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_function_init_once.py_template +0 -0
  389. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_partitioned.py_template +0 -0
  390. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_partitioned_init_once.py_template +0 -0
  391. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_table_function.py_template +0 -0
  392. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/infer_table_function_init_once.py_template +0 -0
  393. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/model_method.py +0 -0
  394. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_method/utils.py +0 -0
  395. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_model_composer/model_user_file/model_user_file.py +0 -0
  396. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_env/model_env.py +0 -0
  397. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handler.py +0 -0
  398. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/_base.py +0 -0
  399. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/_utils.py +0 -0
  400. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/custom.py +0 -0
  401. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/__init__.py +0 -0
  402. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_default.py +0 -0
  403. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_openai_chat_wrapper.py +0 -0
  404. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_utils.py +0 -0
  405. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/audio_classification.py +0 -0
  406. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/audio_text_to_text.py +0 -0
  407. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/automatic_speech_recognition.py +0 -0
  408. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/conversational.py +0 -0
  409. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/fill_mask.py +0 -0
  410. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/question_answering.py +0 -0
  411. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/summarization.py +0 -0
  412. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/table_question_answering.py +0 -0
  413. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text2text_generation.py +0 -0
  414. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text_classification.py +0 -0
  415. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text_generation.py +0 -0
  416. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/token_classification.py +0 -0
  417. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/translation.py +0 -0
  418. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/video_text_to_text.py +0 -0
  419. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_audio_classification.py +0 -0
  420. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_text_classification.py +0 -0
  421. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/keras.py +0 -0
  422. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/mlflow.py +0 -0
  423. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/prophet.py +0 -0
  424. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/pytorch.py +0 -0
  425. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/sentence_transformers.py +0 -0
  426. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/tensorflow.py +0 -0
  427. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers/torchscript.py +0 -0
  428. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers_migrator/base_migrator.py +0 -0
  429. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers_migrator/pytorch_migrator_2023_12_01.py +0 -0
  430. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2023_12_01.py +0 -0
  431. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2025_01_01.py +0 -0
  432. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_handlers_migrator/torchscript_migrator_2023_12_01.py +0 -0
  433. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta/model_blob_meta.py +0 -0
  434. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta/model_meta.py +0 -0
  435. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta/model_meta_schema.py +0 -0
  436. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta/model_sample_input_data.py +0 -0
  437. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta_migrator/base_migrator.py +0 -0
  438. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta_migrator/migrator_plans.py +0 -0
  439. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_meta_migrator/migrator_v1.py +0 -0
  440. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_packager.py +0 -0
  441. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_runtime/model_runtime.py +0 -0
  442. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_save_options.py +0 -0
  443. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_packager/model_task/model_task_utils.py +0 -0
  444. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/base_handler.py +0 -0
  445. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/builtins_handler.py +0 -0
  446. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/core.py +0 -0
  447. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/dmatrix_handler.py +0 -0
  448. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/numpy_handler.py +0 -0
  449. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/pandas_handler.py +0 -0
  450. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/pytorch_handler.py +0 -0
  451. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/tensorflow_handler.py +0 -0
  452. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/_signatures/utils.py +0 -0
  453. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/batch/__init__.py +0 -0
  454. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/code_path.py +0 -0
  455. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/compute_pool.py +0 -0
  456. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/custom_model.py +0 -0
  457. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/event_handler.py +0 -0
  458. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/inference_engine.py +0 -0
  459. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/model_signature.py +0 -0
  460. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/models/huggingface.py +0 -0
  461. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/models/huggingface_pipeline.py +0 -0
  462. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/target_platform.py +0 -0
  463. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/task.py +0 -0
  464. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/model/volatility.py +0 -0
  465. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/estimator_utils.py +0 -0
  466. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/local_implementations/pandas_handlers.py +0 -0
  467. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/local_implementations/pandas_trainer.py +0 -0
  468. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/model_specifications.py +0 -0
  469. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/model_trainer.py +0 -0
  470. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/model_trainer_builder.py +0 -0
  471. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/model_transformer_builder.py +0 -0
  472. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +0 -0
  473. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/snowpark_implementations/distributed_search_udf_file.py +0 -0
  474. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_handlers.py +0 -0
  475. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_trainer.py +0 -0
  476. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/snowpark_implementations/xgboost_external_memory_trainer.py +0 -0
  477. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/_internal/transformer_protocols.py +0 -0
  478. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/calibration/__init__.py +0 -0
  479. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/cluster/__init__.py +0 -0
  480. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/compose/__init__.py +0 -0
  481. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/covariance/__init__.py +0 -0
  482. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/decomposition/__init__.py +0 -0
  483. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/discriminant_analysis/__init__.py +0 -0
  484. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/ensemble/__init__.py +0 -0
  485. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/feature_selection/__init__.py +0 -0
  486. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/framework/_utils.py +0 -0
  487. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/gaussian_process/__init__.py +0 -0
  488. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/impute/__init__.py +0 -0
  489. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_approximation/__init__.py +0 -0
  490. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/kernel_ridge/__init__.py +0 -0
  491. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/lightgbm/__init__.py +0 -0
  492. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/linear_model/__init__.py +0 -0
  493. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/manifold/__init__.py +0 -0
  494. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/__init__.py +0 -0
  495. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/classification.py +0 -0
  496. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/correlation.py +0 -0
  497. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/covariance.py +0 -0
  498. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/metrics_utils.py +0 -0
  499. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/ranking.py +0 -0
  500. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/metrics/regression.py +0 -0
  501. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/mixture/__init__.py +0 -0
  502. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/model_selection/__init__.py +0 -0
  503. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/multiclass/__init__.py +0 -0
  504. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/naive_bayes/__init__.py +0 -0
  505. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neighbors/__init__.py +0 -0
  506. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/neural_network/__init__.py +0 -0
  507. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/parameters/disable_distributed_hpo.py +0 -0
  508. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/parameters/disable_model_tracer.py +0 -0
  509. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/parameters/enable_anonymous_sproc.py +0 -0
  510. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/pipeline/__init__.py +0 -0
  511. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/pipeline/pipeline.py +0 -0
  512. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/__init__.py +0 -0
  513. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/binarizer.py +0 -0
  514. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +0 -0
  515. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/label_encoder.py +0 -0
  516. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/max_abs_scaler.py +0 -0
  517. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/min_max_scaler.py +0 -0
  518. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/normalizer.py +0 -0
  519. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/one_hot_encoder.py +0 -0
  520. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/ordinal_encoder.py +0 -0
  521. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/robust_scaler.py +0 -0
  522. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/preprocessing/standard_scaler.py +0 -0
  523. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/semi_supervised/__init__.py +0 -0
  524. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/svm/__init__.py +0 -0
  525. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/tree/__init__.py +0 -0
  526. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/modeling/xgboost/__init__.py +0 -0
  527. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/_client/model_monitor_sql_client.py +0 -0
  528. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/_client/queries/record_count.ssql +0 -0
  529. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/_client/queries/rmse.ssql +0 -0
  530. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/_manager/model_monitor_manager.py +0 -0
  531. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/entities/model_monitor_config.py +0 -0
  532. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/explain_visualize.py +0 -0
  533. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/model_monitor.py +0 -0
  534. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/monitoring/shap.py +0 -0
  535. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/registry/__init__.py +0 -0
  536. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/registry/_manager/model_manager.py +0 -0
  537. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/authentication.py +0 -0
  538. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/connection_params.py +0 -0
  539. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/html_utils.py +0 -0
  540. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/sparse.py +0 -0
  541. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/sql_client.py +0 -0
  542. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake/ml/utils/stage_file.py +0 -0
  543. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake_ml_python.egg-info/SOURCES.txt +0 -0
  544. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake_ml_python.egg-info/dependency_links.txt +0 -0
  545. {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.47.0}/snowflake_ml_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,39 @@
1
1
  # Release History
2
2
 
3
- ## 1.46.0
3
+ ## 1.47.0
4
+
5
+ ### New Features
6
+
7
+ * Experiment Tracking: Added `ExperimentTracking.list_model_versions` to retrieve the model versions that were
8
+ logged under a run. Models logged via `log_model` inside a run are linked to that run through Snowflake lineage,
9
+ and this method traverses that lineage to return the corresponding `ModelVersion` objects.
10
+
11
+ ```python
12
+ from snowflake.ml.experiment import ExperimentTracking
13
+
14
+ exp = ExperimentTracking(session)
15
+ exp.set_experiment("MY_EXPERIMENT")
16
+ with exp.start_run(run_name="MY_RUN"):
17
+ exp.log_model(model, model_name="MY_MODEL", sample_input_data=X)
18
+
19
+ model_versions = exp.list_model_versions(run_name="MY_RUN")
20
+ ```
21
+
22
+ ### Bug Fixes
23
+
24
+ * Experiment Tracking: Fix a bug where `.set_experiment` does not recreate an experiment deleted in Snowsight
25
+
26
+ ### Behavior Changes
27
+
28
+ * Registry: `enable_explainability` now defaults to `False` for all model types when logging a model. Previously it
29
+ defaulted to `True` for XGBoost, LightGBM, and CatBoost models and was auto-enabled for supported scikit-learn and
30
+ Snowpark ML modeling models when running in the Warehouse. To generate an `explain` method, explicitly pass
31
+ `options={"enable_explainability": True}` to `log_model` (this requires `sample_input_data` for supported model
32
+ types).
33
+
34
+ ### Deprecations
35
+
36
+ ## 1.46.0 (2026-07-07)
4
37
 
5
38
  ### New Features
6
39
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-ml-python
3
- Version: 1.46.0
3
+ Version: 1.47.0
4
4
  Summary: The machine learning client library that is used for interacting with Snowflake to build machine learning solutions.
5
5
  Author-email: "Snowflake, Inc" <support@snowflake.com>
6
6
  License:
@@ -250,7 +250,7 @@ Requires-Dist: pyjwt<3,>=2.0.0
250
250
  Requires-Dist: pytimeparse<2,>=1.1.8
251
251
  Requires-Dist: pyyaml<7,>=6.0
252
252
  Requires-Dist: retrying<2,>=1.3.3
253
- Requires-Dist: scikit-learn<1.8
253
+ Requires-Dist: scikit-learn<1.9
254
254
  Requires-Dist: scipy<2,>=1.9
255
255
  Requires-Dist: shap<1,>=0.46.0
256
256
  Requires-Dist: snowflake-connector-python[pandas]<5,>=3.17.3
@@ -416,7 +416,40 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
416
416
 
417
417
  # Release History
418
418
 
419
- ## 1.46.0
419
+ ## 1.47.0
420
+
421
+ ### New Features
422
+
423
+ * Experiment Tracking: Added `ExperimentTracking.list_model_versions` to retrieve the model versions that were
424
+ logged under a run. Models logged via `log_model` inside a run are linked to that run through Snowflake lineage,
425
+ and this method traverses that lineage to return the corresponding `ModelVersion` objects.
426
+
427
+ ```python
428
+ from snowflake.ml.experiment import ExperimentTracking
429
+
430
+ exp = ExperimentTracking(session)
431
+ exp.set_experiment("MY_EXPERIMENT")
432
+ with exp.start_run(run_name="MY_RUN"):
433
+ exp.log_model(model, model_name="MY_MODEL", sample_input_data=X)
434
+
435
+ model_versions = exp.list_model_versions(run_name="MY_RUN")
436
+ ```
437
+
438
+ ### Bug Fixes
439
+
440
+ * Experiment Tracking: Fix a bug where `.set_experiment` does not recreate an experiment deleted in Snowsight
441
+
442
+ ### Behavior Changes
443
+
444
+ * Registry: `enable_explainability` now defaults to `False` for all model types when logging a model. Previously it
445
+ defaulted to `True` for XGBoost, LightGBM, and CatBoost models and was auto-enabled for supported scikit-learn and
446
+ Snowpark ML modeling models when running in the Warehouse. To generate an `explain` method, explicitly pass
447
+ `options={"enable_explainability": True}` to `log_model` (this requires `sample_input_data` for supported model
448
+ types).
449
+
450
+ ### Deprecations
451
+
452
+ ## 1.46.0 (2026-07-07)
420
453
 
421
454
  ### New Features
422
455
 
@@ -8,7 +8,7 @@ description = "The machine learning client library that is used for interacting
8
8
  classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Other Environment", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Database", "Topic :: Software Development", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Scientific/Engineering :: Information Analysis",]
9
9
  requires-python = ">=3.9, <3.14"
10
10
  dynamic = [ "version", "readme",]
11
- dependencies = [ "anyio>=3.5.0,<5", "cachetools>=3.1.1,<6", "cloudpickle>=2.0.0", "cryptography", "fsspec[http]>=2024.6.1,<2026", "h2>=4.3.0,<5", "importlib_resources>=6.1.1, <7", "numpy>=1.23,<3", "packaging>=20.9,<26", "pandas>=2.1.4,<3", "platformdirs<5", "pyarrow", "pydantic>=2.8.2, <3", "pyjwt>=2.0.0, <3", "pytimeparse>=1.1.8,<2", "pyyaml>=6.0,<7", "retrying>=1.3.3,<2", "scikit-learn<1.8", "scipy>=1.9,<2", "shap>=0.46.0,<1", "snowflake-connector-python[pandas]>=3.17.3,<5", "snowflake-snowpark-python>=1.17.0,<2,!=1.26.0", "sqlparse>=0.4,<1", "tqdm<5", "typing-extensions>=4.1.0,<5", "xgboost<4",]
11
+ dependencies = [ "anyio>=3.5.0,<5", "cachetools>=3.1.1,<6", "cloudpickle>=2.0.0", "cryptography", "fsspec[http]>=2024.6.1,<2026", "h2>=4.3.0,<5", "importlib_resources>=6.1.1, <7", "numpy>=1.23,<3", "packaging>=20.9,<26", "pandas>=2.1.4,<3", "platformdirs<5", "pyarrow", "pydantic>=2.8.2, <3", "pyjwt>=2.0.0, <3", "pytimeparse>=1.1.8,<2", "pyyaml>=6.0,<7", "retrying>=1.3.3,<2", "scikit-learn<1.9", "scipy>=1.9,<2", "shap>=0.46.0,<1", "snowflake-connector-python[pandas]>=3.17.3,<5", "snowflake-snowpark-python>=1.17.0,<2,!=1.26.0", "sqlparse>=0.4,<1", "tqdm<5", "typing-extensions>=4.1.0,<5", "xgboost<4",]
12
12
  [[project.authors]]
13
13
  name = "Snowflake, Inc"
14
14
  email = "support@snowflake.com"
@@ -24,6 +24,7 @@ from snowflake.ml.experiment._client import (
24
24
  experiment_tracking_sql_client as sql_client,
25
25
  )
26
26
  from snowflake.ml.experiment._entities import run_metadata
27
+ from snowflake.ml.lineage import lineage_node
27
28
  from snowflake.ml.model import type_hints
28
29
  from snowflake.ml.utils import sql_client as sql_client_utils
29
30
 
@@ -196,21 +197,22 @@ class ExperimentTracking:
196
197
  schema_name = sql_identifier.SqlIdentifier(schema_name) if schema_name is not None else self._schema_name
197
198
 
198
199
  experiment_name = sql_identifier.SqlIdentifier(experiment_name)
199
- if (
200
+ if not (
200
201
  self._experiment
201
202
  and self._experiment.name == experiment_name
202
203
  and self._database_name == database_name
203
204
  and self._schema_name == schema_name
204
205
  ):
205
- return self._experiment
206
+ # If the requested experiment differs from the current one, switch context (and drop any active run)
207
+ self._update_database_and_schema(database_name, schema_name)
208
+ self._experiment = entities.Experiment(experiment_name=experiment_name)
209
+ self._unset_run()
206
210
 
207
- self._update_database_and_schema(database_name, schema_name)
211
+ # Always attempt to create idempotently so an experiment that was deleted (e.g. via the UI) is restored.
208
212
  self._sql_client.create_experiment(
209
213
  experiment_name=experiment_name,
210
214
  creation_mode=sql_client_utils.CreationMode(if_not_exists=True),
211
215
  )
212
- self._experiment = entities.Experiment(experiment_name=experiment_name)
213
- self._unset_run()
214
216
  return self._experiment
215
217
 
216
218
  def delete_experiment(
@@ -267,6 +269,44 @@ class ExperimentTracking:
267
269
  with experiment_info.ExperimentInfoPatcher(experiment_info=run._get_experiment_info()):
268
270
  return self._registry.log_model(model, model_name=model_name, **kwargs)
269
271
 
272
+ def list_model_versions(self, run_name: Optional[str] = None) -> list[ml_model.ModelVersion]:
273
+ """
274
+ List the model versions that were logged under a run.
275
+
276
+ Models logged via ``log_model`` inside a run are linked to that run through Snowflake lineage. This method
277
+ traverses that lineage to return the corresponding model versions.
278
+
279
+ Args:
280
+ run_name: The name of the run to list model versions from. If None, uses the currently active run.
281
+
282
+ Returns:
283
+ A list of ModelVersion objects that were logged under the run.
284
+
285
+ Raises:
286
+ RuntimeError: If no experiment is set, or if no run_name is provided and no run is active.
287
+ """
288
+ if not self._experiment:
289
+ raise RuntimeError("No experiment set. Please set an experiment before listing model versions.")
290
+
291
+ if run_name:
292
+ resolved_run_name = sql_identifier.SqlIdentifier(run_name)
293
+ elif self._run:
294
+ resolved_run_name = self._run.name
295
+ else:
296
+ raise RuntimeError("No run is active. Please provide a run_name or start a run.")
297
+
298
+ experiment_fqn = self._sql_client.fully_qualified_object_name(
299
+ self._database_name, self._schema_name, self._experiment.name
300
+ )
301
+ run_node = lineage_node.LineageNode(
302
+ session=self._session,
303
+ name=experiment_fqn,
304
+ domain="experiment",
305
+ version=resolved_run_name.identifier(),
306
+ )
307
+ logged_models = run_node.lineage(direction="downstream", domain_filter={"model"})
308
+ return [model for model in logged_models if isinstance(model, ml_model.ModelVersion)]
309
+
270
310
  def start_run(
271
311
  self,
272
312
  run_name: Optional[str] = None,
@@ -19,6 +19,11 @@ from snowflake.ml.feature_store.interval_utils import ( # noqa: F401 - re-expor
19
19
  parse_interval as parse_interval,
20
20
  )
21
21
 
22
+ # Product-wide upper bound on ``n`` for the ordered-N list aggregations
23
+ # (last_n / first_n / last_distinct_n / first_distinct_n). Enforced at authoring
24
+ # time so users get a clear error, and matched by the engine's own bound.
25
+ _MAX_ORDERED_N = 100
26
+
22
27
 
23
28
  class AggregationType(Enum):
24
29
  """Supported aggregation functions for tiled feature views.
@@ -161,6 +166,11 @@ class AggregationSpec:
161
166
  raise ValueError(
162
167
  f"Parameter 'n' must be a positive integer for aggregation " f"'{self.output_column}', got: {n}"
163
168
  )
169
+ if n > _MAX_ORDERED_N:
170
+ raise ValueError(
171
+ f"Parameter 'n' must be between 1 and {_MAX_ORDERED_N} for "
172
+ f"{self.function.value} aggregation '{self.output_column}', got: {n}"
173
+ )
164
174
 
165
175
  # Validate params for approx_percentile
166
176
  if self.function == AggregationType.APPROX_PERCENTILE:
@@ -730,6 +730,26 @@ def _resolve_fg_output_columns(fg: FeatureGroup) -> list[str]:
730
730
  return cols
731
731
 
732
732
 
733
+ def _normalize_join_key_datatype(datatype: Any) -> Any:
734
+ """Collapse ``StringType`` VARCHAR length so join keys compare by logical type.
735
+
736
+ A shared string join key can surface with different VARCHAR lengths across
737
+ sources -- e.g. a tiled FeatureView exposes the unbounded ``StringType()``
738
+ default while a batch FeatureView read back through its materialized dynamic
739
+ table reports a length narrowed to its stored data. The length is irrelevant
740
+ to join semantics and to the response schema, so all ``StringType`` variants
741
+ normalize to the unbounded ``StringType()``. Other datatypes pass through
742
+ unchanged.
743
+
744
+ Args:
745
+ datatype: A Snowpark datatype from a source's join-key column.
746
+
747
+ Returns:
748
+ ``StringType()`` for any ``StringType`` input; ``datatype`` otherwise.
749
+ """
750
+ return StringType() if isinstance(datatype, StringType) else datatype
751
+
752
+
733
753
  def _fg_join_key_field_types(fg: FeatureGroup, *, strict: bool = False) -> dict[str, Any]:
734
754
  """Resolve ``{join_key -> Snowpark datatype}`` across every source FV.
735
755
 
@@ -787,6 +807,7 @@ def _fg_join_key_field_types(fg: FeatureGroup, *, strict: bool = False) -> dict[
787
807
  else:
788
808
  iterator = ((f.name, f.datatype) for f in fv.output_schema.fields if f.name in pk)
789
809
  for name, datatype in iterator:
810
+ datatype = _normalize_join_key_datatype(datatype)
790
811
  previous = type_by_name.get(name)
791
812
  if previous is None:
792
813
  type_by_name[name] = datatype
@@ -1028,6 +1028,14 @@ class FeatureStore:
1028
1028
  original_exception=ValueError(f"Entity {e.name} has not been registered."),
1029
1029
  )
1030
1030
 
1031
+ # Fail fast if name+version or a column would overflow the Postgres online store identifiers.
1032
+ try:
1033
+ feature_view._validate_online_store_identifier_budget(version)
1034
+ except ValueError as e:
1035
+ raise snowml_exceptions.SnowflakeMLException(
1036
+ error_code=error_codes.INVALID_ARGUMENT, original_exception=e
1037
+ ) from e
1038
+
1031
1039
  # RTFVs are OFT-only (no DT/View, no preamble/postamble).
1032
1040
  if feature_view.is_realtime_feature_view:
1033
1041
  logger.warning("RealtimeFeatureView is in Public Preview since 1.43.0.")
@@ -1463,6 +1471,9 @@ class FeatureStore:
1463
1471
  probe_fv._online_config = online_config
1464
1472
  try:
1465
1473
  probe_fv._validate_online_store_supported()
1474
+ probe_version = feature_view.version
1475
+ if probe_version is not None:
1476
+ probe_fv._validate_online_store_identifier_budget(probe_version)
1466
1477
  except ValueError as e:
1467
1478
  raise snowml_exceptions.SnowflakeMLException(
1468
1479
  error_code=error_codes.INVALID_ARGUMENT, original_exception=e
@@ -1523,6 +1534,12 @@ class FeatureStore:
1523
1534
  new_feature_view._online_config = online_config # no public setter; mirrors __init__
1524
1535
 
1525
1536
  new_feature_view._validate()
1537
+ try:
1538
+ new_feature_view._validate_online_store_identifier_budget(feature_view._version)
1539
+ except ValueError as e:
1540
+ raise snowml_exceptions.SnowflakeMLException(
1541
+ error_code=error_codes.INVALID_ARGUMENT, original_exception=e
1542
+ ) from e
1526
1543
  # update_feature_view cannot mutate the structural invariants that
1527
1544
  # validate_snapshot_config_for_register checks (entities, timestamp_col,
1528
1545
  # refresh_mode, etc.); they were enforced once at registration. Only the
@@ -1932,10 +1949,6 @@ class FeatureStore:
1932
1949
  Returns:
1933
1950
  FeatureView object.
1934
1951
 
1935
- Raises:
1936
- SnowflakeMLException: [ValueError] FeatureView with name and version is not found,
1937
- or incurred exception when reconstructing the FeatureView object.
1938
-
1939
1952
  Example::
1940
1953
 
1941
1954
  >>> fs = FeatureStore(...)
@@ -1958,10 +1971,58 @@ class FeatureStore:
1958
1971
  desc:this is description
1959
1972
 
1960
1973
  """
1961
- name = SqlIdentifier(name)
1962
- version = FeatureViewVersion(version)
1974
+ return self._get_feature_view_impl(name, version)
1963
1975
 
1964
- fv_name = FeatureView._get_physical_name(name, version)
1976
+ @overload
1977
+ def _get_feature_view_impl(
1978
+ self,
1979
+ name: str,
1980
+ version: str,
1981
+ *,
1982
+ raise_if_not_found: Literal[True] = True,
1983
+ ) -> FeatureView:
1984
+ ...
1985
+
1986
+ @overload
1987
+ def _get_feature_view_impl(
1988
+ self,
1989
+ name: str,
1990
+ version: str,
1991
+ *,
1992
+ raise_if_not_found: Literal[False],
1993
+ ) -> Optional[FeatureView]:
1994
+ ...
1995
+
1996
+ def _get_feature_view_impl(
1997
+ self,
1998
+ name: str,
1999
+ version: str,
2000
+ *,
2001
+ raise_if_not_found: bool = True,
2002
+ ) -> Optional[FeatureView]:
2003
+ """Retrieve a registered FeatureView, optionally returning None instead of raising.
2004
+
2005
+ Private helper shared by :meth:`get_feature_view` and :meth:`delete_feature_view`.
2006
+ The public ``get_feature_view`` always raises on NOT_FOUND (``raise_if_not_found=True``).
2007
+ ``delete_feature_view`` passes ``raise_if_not_found=False`` so it can detect an orphaned
2008
+ state (backing DT already dropped) and attempt cleanup without a separate backend probe.
2009
+
2010
+ Args:
2011
+ name: FeatureView name.
2012
+ version: FeatureView version.
2013
+ raise_if_not_found: When True (default) raises SnowflakeMLException on NOT_FOUND.
2014
+ When False, returns None instead.
2015
+
2016
+ Returns:
2017
+ FeatureView if found; None when not found and ``raise_if_not_found`` is False.
2018
+
2019
+ Raises:
2020
+ SnowflakeMLException: [ValueError] FeatureView not found and raise_if_not_found is True.
2021
+ """
2022
+ name_id = SqlIdentifier(name)
2023
+ version_id = FeatureViewVersion(version)
2024
+
2025
+ fv_name = FeatureView._get_physical_name(name_id, version_id)
1965
2026
  results = self._get_fv_backend_representations(fv_name)
1966
2027
  if len(results) == 1:
1967
2028
  return self._compose_feature_view(
@@ -1971,7 +2032,7 @@ class FeatureStore:
1971
2032
  )
1972
2033
  if len(results) == 0:
1973
2034
  # RTFVs are OFT-only; the metadata table is the source of truth.
1974
- rtfv_meta = self._metadata_manager.get_realtime_config(name.resolved(), str(version))
2035
+ rtfv_meta = self._metadata_manager.get_realtime_config(name_id.resolved(), str(version_id))
1975
2036
  if rtfv_meta is not None:
1976
2037
  from snowflake.ml.feature_store.realtime_registration import (
1977
2038
  compose_rtfv_from_metadata,
@@ -1979,9 +2040,11 @@ class FeatureStore:
1979
2040
 
1980
2041
  return compose_rtfv_from_metadata(self, rtfv_meta)
1981
2042
 
2043
+ if not raise_if_not_found:
2044
+ return None
1982
2045
  raise snowml_exceptions.SnowflakeMLException(
1983
2046
  error_code=error_codes.NOT_FOUND,
1984
- original_exception=ValueError(f"Failed to find FeatureView {name}/{version}: {results}"),
2047
+ original_exception=ValueError(f"Failed to find FeatureView {name_id}/{version_id}: {results}"),
1985
2048
  )
1986
2049
 
1987
2050
  @dispatch_decorator()
@@ -2603,6 +2666,24 @@ class FeatureStore:
2603
2666
  ----------------------
2604
2667
 
2605
2668
  """
2669
+ # For str+version input: look up the FV without raising on NOT_FOUND.
2670
+ # If the backing DT was dropped in a previous partial deletion, resolved will be None;
2671
+ # attempt streaming orphan cleanup. RTFVs are reconstructed from their OFT metadata
2672
+ # so they naturally return non-None here and continue on the normal deletion path.
2673
+ if isinstance(feature_view, str) and version is not None:
2674
+ resolved = self._get_feature_view_impl(feature_view, version, raise_if_not_found=False)
2675
+ if resolved is None:
2676
+ if self._cleanup_orphaned_feature_view_resources(feature_view, version):
2677
+ logger.warning(
2678
+ "feature store: FeatureView %s/%s backing object was already dropped; "
2679
+ "cleaned up orphaned artifacts.",
2680
+ feature_view,
2681
+ version,
2682
+ )
2683
+ return
2684
+ else:
2685
+ feature_view = resolved
2686
+
2606
2687
  feature_view = self._validate_feature_view_name_and_version_input(feature_view, version)
2607
2688
 
2608
2689
  # TODO: we should leverage lineage graph to check downstream deps, and block the deletion
@@ -2634,7 +2715,7 @@ class FeatureStore:
2634
2715
  )
2635
2716
 
2636
2717
  # Drop companion task first (if any), then snapshot artifacts for this FV.
2637
- # This mirrors the overwrite cleanup ordering and guarantees we dont
2718
+ # This mirrors the overwrite cleanup ordering and guarantees we don't
2638
2719
  # leave a running CRON task targeting a deleted snapshot table.
2639
2720
  fv_physical_name = FeatureView._get_physical_name(feature_view.name, feature_view.version)
2640
2721
  self._cleanup_stale_feature_view_resources(
@@ -5557,6 +5638,100 @@ class FeatureStore:
5557
5638
  e,
5558
5639
  )
5559
5640
 
5641
+ def _cleanup_orphaned_feature_view_resources(self, fv_name: str, version: str) -> bool:
5642
+ """Clean up orphaned companion artifacts for a partially deleted FeatureView.
5643
+
5644
+ Called when the backing DT/View no longer exists but companion artifacts
5645
+ may still be present. Handles:
5646
+
5647
+ - Streaming ref_count decrement and ``$UDF_TRANSFORMED`` / ``$UDF_TRANSFORMED$BACKFILL``
5648
+ table drops (streaming FVs).
5649
+ - The companion refresh Task (append-only / CRON-scheduled FVs) and, probed
5650
+ independently, the snapshot table and its status row (append-only FVs).
5651
+ - The ``$ONLINE`` companion Online Feature Table (any online-enabled FV), which is
5652
+ named after the FV and outlives a dropped offline DT.
5653
+ - FV metadata row deletion from the metadata table.
5654
+
5655
+ Args:
5656
+ fv_name: Feature view name string (as supplied by the caller).
5657
+ version: Feature view version string.
5658
+
5659
+ Returns:
5660
+ True if any orphaned artifacts were found and cleaned up; False if nothing
5661
+ existed (the caller should re-raise NOT_FOUND in that case).
5662
+ """
5663
+ from snowflake.ml.feature_store.streaming_registration import (
5664
+ cleanup_streaming_feature_view,
5665
+ )
5666
+
5667
+ fv_name_id = SqlIdentifier(fv_name)
5668
+ fv_version = FeatureViewVersion(version)
5669
+ feature_view_name = FeatureView._get_physical_name(fv_name_id, fv_version)
5670
+ fully_qualified_name = self._get_fully_qualified_name(feature_view_name)
5671
+ online_table_name = FeatureView._get_online_table_name(feature_view_name)
5672
+
5673
+ streaming_meta = self._metadata_manager.get_streaming_metadata(fv_name, version)
5674
+
5675
+ # Append-only and CRON-scheduled FVs own a companion refresh Task named after the FV's
5676
+ # physical name; append-only FVs additionally accumulate a $SNAPSHOT table. When the
5677
+ # backing DT was dropped either can be left behind, and a partial deletion may have
5678
+ # removed one but not the other, so probe for each independently rather than inferring
5679
+ # the snapshot table's existence from the Task.
5680
+ has_refresh_task = bool(
5681
+ self._session.sql(
5682
+ f"SHOW TASKS LIKE '{feature_view_name.resolved()}' IN SCHEMA {self._config.full_schema_path}"
5683
+ ).collect(statement_params=self._telemetry_stmp)
5684
+ )
5685
+ snapshot_table_name = FeatureView._get_snapshot_table_name(feature_view_name)
5686
+ has_snapshot_table = bool(
5687
+ self._session.sql(
5688
+ f"SHOW TABLES LIKE '{snapshot_table_name.resolved()}' IN SCHEMA {self._config.full_schema_path}"
5689
+ ).collect(statement_params=self._telemetry_stmp)
5690
+ )
5691
+
5692
+ # Any online-enabled FV owns a $ONLINE Online Feature Table that is independent of the
5693
+ # offline DT, so it can outlive a dropped DT even for plain (non-streaming,
5694
+ # non-append-only) FVs. _find_object returns [] when the OFT preview is disabled.
5695
+ has_online_table = bool(self._find_object("ONLINE FEATURE TABLES", online_table_name))
5696
+
5697
+ # Nothing recoverable from metadata or the backend: let the caller re-raise NOT_FOUND.
5698
+ if streaming_meta is None and not has_refresh_task and not has_snapshot_table and not has_online_table:
5699
+ return False
5700
+
5701
+ if streaming_meta is not None:
5702
+ cleanup_streaming_feature_view(
5703
+ session=self._session,
5704
+ feature_view_name=feature_view_name,
5705
+ version=version,
5706
+ fv_name=fv_name,
5707
+ fv_metadata=_FeatureViewMetadata(entities=[], timestamp_col="", is_streaming=True),
5708
+ metadata_manager=self._metadata_manager,
5709
+ get_fully_qualified_name_fn=self._get_fully_qualified_name,
5710
+ telemetry_stmp=self._telemetry_stmp,
5711
+ )
5712
+
5713
+ # Drop the companion refresh Task and any append-only snapshot table independently:
5714
+ # both names are deterministic and the underlying drops use IF EXISTS, and a partial
5715
+ # deletion may have left only one of the two behind.
5716
+ if has_refresh_task:
5717
+ self._drop_companion_refresh_task(fully_qualified_name)
5718
+ if has_snapshot_table:
5719
+ self._drop_orphaned_snapshot_table(feature_view_name)
5720
+
5721
+ # Best-effort drop of the $ONLINE companion table, which is not covered by
5722
+ # cleanup_streaming_feature_view and is not returned by get_feature_view.
5723
+ if has_online_table:
5724
+ fq_online_name = self._get_fully_qualified_name(online_table_name)
5725
+ try:
5726
+ self._session.sql(f"DROP ONLINE FEATURE TABLE IF EXISTS {fq_online_name}").collect(
5727
+ statement_params=self._telemetry_stmp
5728
+ )
5729
+ except Exception as e:
5730
+ logger.warning("feature store: failed to drop online feature table %s: %s", fq_online_name, e)
5731
+
5732
+ self._metadata_manager.delete_feature_view_metadata(fv_name, version)
5733
+ return True
5734
+
5560
5735
  def _cleanup_stale_feature_view_resources(
5561
5736
  self,
5562
5737
  feature_view: FeatureView,
@@ -5602,14 +5777,25 @@ class FeatureStore:
5602
5777
  delete flows pass ``True`` explicitly.
5603
5778
  """
5604
5779
  if not new_has_task:
5605
- self._session.sql(f"DROP TASK IF EXISTS {fully_qualified_name}").collect(
5606
- statement_params=self._telemetry_stmp
5607
- )
5780
+ self._drop_companion_refresh_task(fully_qualified_name)
5608
5781
  if drop_snapshot_table is None:
5609
5782
  drop_snapshot_table = not feature_view.append_only
5610
5783
  if drop_snapshot_table:
5611
5784
  self._drop_orphaned_snapshot_table(feature_view_name)
5612
5785
 
5786
+ def _drop_companion_refresh_task(self, fully_qualified_name: str) -> None:
5787
+ """Drop a feature view's companion refresh Task.
5788
+
5789
+ Append-only and CRON-scheduled FVs own a Task named identically to the offline
5790
+ object's fully qualified name. ``IF EXISTS`` makes this a safe no-op for FVs that
5791
+ never had a Task (Views and duration-based Dynamic Tables).
5792
+
5793
+ Args:
5794
+ fully_qualified_name: Fully qualified name of the offline object, which is also
5795
+ the companion Task name when one exists.
5796
+ """
5797
+ self._session.sql(f"DROP TASK IF EXISTS {fully_qualified_name}").collect(statement_params=self._telemetry_stmp)
5798
+
5613
5799
  def _create_snapshot_table(
5614
5800
  self,
5615
5801
  feature_view: FeatureView,
@@ -58,6 +58,14 @@ _UDF_TRANSFORMED_TABLE_SUFFIX = "$UDF_TRANSFORMED"
58
58
  _FEATURE_VIEW_VERSION_RE = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_.\-]*$")
59
59
  _FEATURE_VIEW_VERSION_MAX_LENGTH = 128
60
60
 
61
+ # Postgres online store identifiers must fit PostgreSQL's 63-byte limit (NAMEDATALEN - 1); longer names
62
+ # are silently truncated and can collide. name+version maps to "{name}${version}$UDF_TRANSFORMED"
63
+ # (17 bytes of affixes) and columns to a distinct-N tile column "_PARTIAL_FIRST_DISTINCT_1000_TS_<col>"
64
+ # (32 bytes), so each budget below leaves a 1-byte margin. The padding-guard test rechecks the affixes.
65
+ _PG_IDENTIFIER_BYTE_LIMIT = 63
66
+ _POSTGRES_ONLINE_MAX_NAME_VERSION_LEN = 45
67
+ _POSTGRES_ONLINE_MAX_COLUMN_LEN = 30
68
+
61
69
  _RESULT_SCAN_QUERY_PATTERN = re.compile(
62
70
  r".*FROM\s*TABLE\s*\(\s*RESULT_SCAN\s*\(.*",
63
71
  flags=re.DOTALL | re.IGNORECASE | re.X,
@@ -2151,6 +2159,52 @@ Got {len(self._feature_df.queries['queries'])}: {self._feature_df.queries['queri
2151
2159
  f"OnlineConfig(store_type=OnlineStoreType.POSTGRES) to enable online storage."
2152
2160
  )
2153
2161
 
2162
+ def _validate_online_store_identifier_budget(self, version: FeatureViewVersion) -> None:
2163
+ """Reject name+version or column names that would overflow the Postgres online store's identifiers.
2164
+
2165
+ Only the Postgres online store is affected; columns get a tighter budget than name+version.
2166
+ Enforced at registration and update, where the version is known.
2167
+
2168
+ Args:
2169
+ version: The feature view version being registered or updated.
2170
+
2171
+ Raises:
2172
+ ValueError: If the combined name+version or any column name exceeds its online store budget.
2173
+ """
2174
+ if (
2175
+ self._online_config is None
2176
+ or not self._online_config.enable
2177
+ or self._online_config.store_type != OnlineStoreType.POSTGRES
2178
+ ):
2179
+ return
2180
+
2181
+ name_version_len = len(self._name.resolved()) + len(str(version))
2182
+ if name_version_len > _POSTGRES_ONLINE_MAX_NAME_VERSION_LEN:
2183
+ raise ValueError(
2184
+ f"feature view name and version are too long for the Postgres online store: "
2185
+ f"'{self._name}' with version '{version}' uses {name_version_len} characters, but the "
2186
+ f"combined limit is {_POSTGRES_ONLINE_MAX_NAME_VERSION_LEN}. Shorten the name or version."
2187
+ )
2188
+
2189
+ resolved_columns: set[str] = set()
2190
+ try:
2191
+ inferred_columns = self._get_column_names()
2192
+ except Exception:
2193
+ inferred_columns = None
2194
+ for column in inferred_columns or []:
2195
+ resolved_columns.add(column.resolved())
2196
+ for entity in self._entities:
2197
+ for join_key in entity.join_keys:
2198
+ key = join_key if isinstance(join_key, SqlIdentifier) else SqlIdentifier(join_key)
2199
+ resolved_columns.add(key.resolved())
2200
+
2201
+ for resolved in sorted(resolved_columns):
2202
+ if len(resolved) > _POSTGRES_ONLINE_MAX_COLUMN_LEN:
2203
+ raise ValueError(
2204
+ f"column '{resolved}' is too long for the Postgres online store: {len(resolved)} "
2205
+ f"characters exceeds the limit of {_POSTGRES_ONLINE_MAX_COLUMN_LEN}. Rename the column."
2206
+ )
2207
+
2154
2208
  def _validate_window_offset_alignment(self) -> None:
2155
2209
  """Validate that window and offset are multiples of feature_granularity.
2156
2210
 
@@ -30,6 +30,7 @@ from snowflake.ml._internal.utils.sql_identifier import SqlIdentifier
30
30
  from snowflake.ml.feature_store import feature_view as fv_mod, online_service
31
31
  from snowflake.ml.feature_store.entity import Entity
32
32
  from snowflake.ml.feature_store.feature_group import (
33
+ _normalize_join_key_datatype,
33
34
  build_source_refs,
34
35
  hydrate_source_refs,
35
36
  reject_name_collision,
@@ -248,7 +249,7 @@ def validate_rtfv_entity_contract(
248
249
  # The upstream declares the entity but the column isn't in its
249
250
  # output_schema; nothing to type-check here.
250
251
  continue
251
- datatype = field.datatype
252
+ datatype = _normalize_join_key_datatype(field.datatype)
252
253
  prev = seen_types.get(jk)
253
254
  if prev is None:
254
255
  seen_types[jk] = (datatype, upstream_label)
@@ -358,11 +359,12 @@ def resolve_realtime_join_key_fields(feature_view: FeatureView) -> list[Any]:
358
359
  field = field_by_name.get(key)
359
360
  if field is None:
360
361
  continue
362
+ datatype = _normalize_join_key_datatype(field.datatype)
361
363
  previous = type_by_name.get(key)
362
364
  if previous is None:
363
- type_by_name[key] = field.datatype
365
+ type_by_name[key] = datatype
364
366
  source_by_name[key] = label
365
- elif previous != field.datatype:
367
+ elif previous != datatype:
366
368
  # Registry-corruption path: register-time validator should have
367
369
  # rejected this. Defense-in-depth so we don't synthesize a
368
370
  # schema that depends on source order.
@@ -371,7 +373,7 @@ def resolve_realtime_join_key_fields(feature_view: FeatureView) -> list[Any]:
371
373
  original_exception=RuntimeError(
372
374
  f"realtime feature view: join key {key!r} has inconsistent "
373
375
  f"datatypes across upstream sources ({source_by_name[key]} "
374
- f"declares {previous}; {label} declares {field.datatype}). "
376
+ f"declares {previous}; {label} declares {datatype}). "
375
377
  "Registry corruption -- the register-time validator should "
376
378
  "have rejected this."
377
379
  ),