sagemaker-core 1.0.62__py3-none-any.whl → 2.1.1__py3-none-any.whl
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.
- sagemaker/core/__init__.py +16 -0
- sagemaker/core/_studio.py +116 -0
- sagemaker/core/_version.py +11 -0
- sagemaker/core/accept_types.py +131 -0
- sagemaker/core/analytics.py +744 -0
- sagemaker/core/apiutils/__init__.py +13 -0
- sagemaker/core/apiutils/_base_types.py +228 -0
- sagemaker/core/apiutils/_boto_functions.py +130 -0
- sagemaker/core/apiutils/_utils.py +34 -0
- sagemaker/core/base_deserializers.py +35 -0
- sagemaker/core/base_serializers.py +35 -0
- sagemaker/core/clarify/__init__.py +2898 -0
- sagemaker/core/collection.py +467 -0
- sagemaker/core/common_utils.py +2281 -0
- sagemaker/core/compute_resource_requirements/__init__.py +18 -0
- sagemaker/core/compute_resource_requirements/resource_requirements.py +94 -0
- sagemaker/core/config/__init__.py +181 -0
- sagemaker/core/config/config.py +238 -0
- sagemaker/core/config/config_manager.py +595 -0
- sagemaker/core/config/config_schema.py +1220 -0
- sagemaker/core/config/config_utils.py +297 -0
- {sagemaker_core/main → sagemaker/core}/config_schema.py +408 -3
- sagemaker/core/constants.py +73 -0
- sagemaker/core/content_types.py +137 -0
- sagemaker/core/debugger/__init__.py +39 -0
- sagemaker/core/debugger/debugger.py +945 -0
- sagemaker/core/debugger/framework_profile.py +292 -0
- sagemaker/core/debugger/metrics_config.py +468 -0
- sagemaker/core/debugger/profiler.py +42 -0
- sagemaker/core/debugger/profiler_config.py +190 -0
- sagemaker/core/debugger/profiler_constants.py +40 -0
- sagemaker/core/debugger/utils.py +148 -0
- sagemaker/core/deprecations.py +254 -0
- sagemaker/core/deserializers/__init__.py +10 -0
- sagemaker/core/deserializers/base.py +424 -0
- sagemaker/core/deserializers/implementations.py +157 -0
- sagemaker/core/drift_check_baselines.py +106 -0
- sagemaker/core/enums.py +51 -0
- sagemaker/core/environment_variables.py +101 -0
- sagemaker/core/exceptions.py +108 -0
- sagemaker/core/experiments/__init__.py +53 -0
- sagemaker/core/experiments/_api_types.py +251 -0
- sagemaker/core/experiments/_environment.py +124 -0
- sagemaker/core/experiments/_helper.py +294 -0
- sagemaker/core/experiments/_metrics.py +333 -0
- sagemaker/core/experiments/_run_context.py +58 -0
- sagemaker/core/experiments/_utils.py +216 -0
- sagemaker/core/experiments/experiment.py +244 -0
- sagemaker/core/experiments/run.py +970 -0
- sagemaker/core/experiments/trial.py +296 -0
- sagemaker/core/experiments/trial_component.py +387 -0
- sagemaker/core/explainer/__init__.py +24 -0
- sagemaker/core/explainer/clarify_explainer_config.py +298 -0
- sagemaker/core/explainer/explainer_config.py +44 -0
- sagemaker/core/fw_utils.py +1176 -0
- sagemaker/core/git_utils.py +349 -0
- sagemaker/core/helper/pipeline_variable.py +82 -0
- sagemaker/core/helper/session_helper.py +2965 -0
- sagemaker/core/huggingface/__init__.py +29 -0
- sagemaker/core/huggingface/llm_utils.py +150 -0
- sagemaker/core/huggingface/processing.py +139 -0
- sagemaker/core/huggingface/training_compiler/config.py +167 -0
- sagemaker/core/hyperparameters.py +172 -0
- sagemaker/core/image_retriever/__init__.py +3 -0
- sagemaker/core/image_retriever/image_retriever.py +640 -0
- sagemaker/core/image_retriever/image_retriever_utils.py +511 -0
- sagemaker/core/image_retriever/test.py +7 -0
- sagemaker/core/image_uri_config/__init__.py +13 -0
- sagemaker/core/image_uri_config/autogluon.json +1335 -0
- sagemaker/core/image_uri_config/blazingtext.json +50 -0
- sagemaker/core/image_uri_config/chainer.json +104 -0
- sagemaker/core/image_uri_config/clarify.json +39 -0
- sagemaker/core/image_uri_config/coach-mxnet.json +70 -0
- sagemaker/core/image_uri_config/coach-tensorflow.json +186 -0
- sagemaker/core/image_uri_config/data-wrangler.json +91 -0
- sagemaker/core/image_uri_config/debugger.json +34 -0
- sagemaker/core/image_uri_config/detailed-profiler.json +18 -0
- sagemaker/core/image_uri_config/djl-deepspeed.json +385 -0
- sagemaker/core/image_uri_config/djl-fastertransformer.json +167 -0
- sagemaker/core/image_uri_config/djl-lmi.json +136 -0
- sagemaker/core/image_uri_config/djl-neuronx.json +258 -0
- sagemaker/core/image_uri_config/djl-tensorrtllm.json +262 -0
- sagemaker/core/image_uri_config/factorization-machines.json +50 -0
- sagemaker/core/image_uri_config/forecasting-deepar.json +50 -0
- sagemaker/core/image_uri_config/huggingface-llm-neuronx.json +660 -0
- sagemaker/core/image_uri_config/huggingface-llm.json +1158 -0
- sagemaker/core/image_uri_config/huggingface-neuron.json +52 -0
- sagemaker/core/image_uri_config/huggingface-neuronx.json +510 -0
- sagemaker/core/image_uri_config/huggingface-tei-cpu.json +298 -0
- sagemaker/core/image_uri_config/huggingface-tei.json +298 -0
- sagemaker/core/image_uri_config/huggingface-training-compiler.json +195 -0
- sagemaker/core/image_uri_config/huggingface.json +2138 -0
- sagemaker/core/image_uri_config/hyperpod-recipes-neuron.json +52 -0
- sagemaker/core/image_uri_config/image-classification-neo.json +43 -0
- sagemaker/core/image_uri_config/image-classification.json +50 -0
- sagemaker/core/image_uri_config/inferentia-mxnet.json +88 -0
- sagemaker/core/image_uri_config/inferentia-pytorch.json +127 -0
- sagemaker/core/image_uri_config/inferentia-tensorflow.json +88 -0
- sagemaker/core/image_uri_config/instance_gpu_info.json +782 -0
- sagemaker/core/image_uri_config/ipinsights.json +50 -0
- sagemaker/core/image_uri_config/kmeans.json +50 -0
- sagemaker/core/image_uri_config/knn.json +50 -0
- sagemaker/core/image_uri_config/lda.json +26 -0
- sagemaker/core/image_uri_config/linear-learner.json +50 -0
- sagemaker/core/image_uri_config/model-monitor.json +42 -0
- sagemaker/core/image_uri_config/mxnet.json +1154 -0
- sagemaker/core/image_uri_config/neo-mxnet.json +64 -0
- sagemaker/core/image_uri_config/neo-pytorch.json +341 -0
- sagemaker/core/image_uri_config/neo-tensorflow.json +109 -0
- sagemaker/core/image_uri_config/ntm.json +50 -0
- sagemaker/core/image_uri_config/object-detection.json +50 -0
- sagemaker/core/image_uri_config/object2vec.json +50 -0
- sagemaker/core/image_uri_config/pca.json +50 -0
- sagemaker/core/image_uri_config/pytorch-neuron.json +43 -0
- sagemaker/core/image_uri_config/pytorch-smp.json +218 -0
- sagemaker/core/image_uri_config/pytorch-training-compiler.json +80 -0
- sagemaker/core/image_uri_config/pytorch.json +3101 -0
- sagemaker/core/image_uri_config/randomcutforest.json +50 -0
- sagemaker/core/image_uri_config/ray-pytorch.json +46 -0
- sagemaker/core/image_uri_config/ray-tensorflow.json +194 -0
- sagemaker/core/image_uri_config/sagemaker-base-python.json +46 -0
- sagemaker/core/image_uri_config/sagemaker-distribution.json +37 -0
- sagemaker/core/image_uri_config/sagemaker-geospatial.json +13 -0
- sagemaker/core/image_uri_config/sagemaker-tritonserver.json +212 -0
- sagemaker/core/image_uri_config/semantic-segmentation.json +50 -0
- sagemaker/core/image_uri_config/seq2seq.json +50 -0
- sagemaker/core/image_uri_config/sklearn.json +446 -0
- sagemaker/core/image_uri_config/spark.json +280 -0
- sagemaker/core/image_uri_config/sparkml-serving.json +97 -0
- sagemaker/core/image_uri_config/stabilityai.json +53 -0
- sagemaker/core/image_uri_config/tensorflow.json +5086 -0
- sagemaker/core/image_uri_config/vw.json +25 -0
- sagemaker/core/image_uri_config/xgboost-neo.json +43 -0
- sagemaker/core/image_uri_config/xgboost.json +888 -0
- sagemaker/core/image_uris.py +810 -0
- sagemaker/core/inference_config.py +144 -0
- sagemaker/core/inference_recommender/__init__.py +18 -0
- sagemaker/core/inference_recommender/inference_recommender_mixin.py +622 -0
- sagemaker/core/inputs.py +366 -0
- sagemaker/core/instance_group.py +61 -0
- sagemaker/core/instance_types.py +164 -0
- sagemaker/core/instance_types_gpu_info.py +43 -0
- sagemaker/core/interactive_apps/__init__.py +41 -0
- sagemaker/core/interactive_apps/base_interactive_app.py +204 -0
- sagemaker/core/interactive_apps/detail_profiler_app.py +139 -0
- sagemaker/core/interactive_apps/tensorboard.py +149 -0
- sagemaker/core/iterators.py +186 -0
- sagemaker/core/job.py +380 -0
- sagemaker/core/jumpstart/__init__.py +156 -0
- sagemaker/core/jumpstart/accessors.py +390 -0
- sagemaker/core/jumpstart/artifacts/__init__.py +69 -0
- sagemaker/core/jumpstart/artifacts/environment_variables.py +252 -0
- sagemaker/core/jumpstart/artifacts/hyperparameters.py +120 -0
- sagemaker/core/jumpstart/artifacts/image_uris.py +139 -0
- sagemaker/core/jumpstart/artifacts/incremental_training.py +87 -0
- sagemaker/core/jumpstart/artifacts/instance_types.py +223 -0
- sagemaker/core/jumpstart/artifacts/kwargs.py +289 -0
- sagemaker/core/jumpstart/artifacts/metric_definitions.py +117 -0
- sagemaker/core/jumpstart/artifacts/model_packages.py +202 -0
- sagemaker/core/jumpstart/artifacts/model_uris.py +252 -0
- sagemaker/core/jumpstart/artifacts/payloads.py +96 -0
- sagemaker/core/jumpstart/artifacts/predictors.py +540 -0
- sagemaker/core/jumpstart/artifacts/resource_names.py +86 -0
- sagemaker/core/jumpstart/artifacts/resource_requirements.py +162 -0
- sagemaker/core/jumpstart/artifacts/script_uris.py +172 -0
- sagemaker/core/jumpstart/cache.py +663 -0
- sagemaker/core/jumpstart/configs.py +50 -0
- sagemaker/core/jumpstart/constants.py +198 -0
- sagemaker/core/jumpstart/deserializers.py +81 -0
- sagemaker/core/jumpstart/document.py +76 -0
- sagemaker/core/jumpstart/enums.py +168 -0
- sagemaker/core/jumpstart/exceptions.py +236 -0
- sagemaker/core/jumpstart/factory/utils.py +833 -0
- sagemaker/core/jumpstart/filters.py +597 -0
- sagemaker/core/jumpstart/hub/constants.py +16 -0
- sagemaker/core/jumpstart/hub/hub.py +291 -0
- sagemaker/core/jumpstart/hub/interfaces.py +936 -0
- sagemaker/core/jumpstart/hub/parser_utils.py +70 -0
- sagemaker/core/jumpstart/hub/parsers.py +288 -0
- sagemaker/core/jumpstart/hub/types.py +35 -0
- sagemaker/core/jumpstart/hub/utils.py +260 -0
- sagemaker/core/jumpstart/models.py +499 -0
- sagemaker/core/jumpstart/notebook_utils.py +575 -0
- sagemaker/core/jumpstart/parameters.py +20 -0
- sagemaker/core/jumpstart/payload_utils.py +239 -0
- sagemaker/core/jumpstart/region_config.json +163 -0
- sagemaker/core/jumpstart/search.py +171 -0
- sagemaker/core/jumpstart/serializers.py +81 -0
- sagemaker/core/jumpstart/session_utils.py +234 -0
- sagemaker/core/jumpstart/types.py +3044 -0
- sagemaker/core/jumpstart/utils.py +1731 -0
- sagemaker/core/jumpstart/validators.py +257 -0
- sagemaker/core/lambda_helper.py +312 -0
- sagemaker/core/lineage/__init__.py +42 -0
- sagemaker/core/lineage/_api_types.py +239 -0
- sagemaker/core/lineage/_utils.py +49 -0
- sagemaker/core/lineage/action.py +345 -0
- sagemaker/core/lineage/artifact.py +646 -0
- sagemaker/core/lineage/association.py +190 -0
- sagemaker/core/lineage/context.py +505 -0
- sagemaker/core/lineage/lineage_trial_component.py +191 -0
- sagemaker/core/lineage/query.py +732 -0
- sagemaker/core/lineage/visualizer.py +346 -0
- sagemaker/core/local/__init__.py +18 -0
- sagemaker/core/local/data.py +413 -0
- sagemaker/core/local/entities.py +678 -0
- sagemaker/core/local/exceptions.py +17 -0
- sagemaker/core/local/image.py +1243 -0
- sagemaker/core/local/local_session.py +739 -0
- sagemaker/core/local/utils.py +245 -0
- sagemaker/core/logs.py +181 -0
- sagemaker/core/metadata_properties.py +56 -0
- sagemaker/core/metric_definitions.py +91 -0
- sagemaker/core/mlflow/__init__.py +38 -0
- sagemaker/core/mlflow/forward_sagemaker_metrics.py +44 -0
- sagemaker/core/model_card/__init__.py +26 -0
- sagemaker/core/model_life_cycle.py +51 -0
- sagemaker/core/model_metrics.py +160 -0
- sagemaker/core/model_monitor/__init__.py +66 -0
- sagemaker/core/model_monitor/clarify_model_monitoring.py +1495 -0
- sagemaker/core/model_monitor/cron_expression_generator.py +82 -0
- sagemaker/core/model_monitor/data_capture_config.py +115 -0
- sagemaker/core/model_monitor/data_quality_monitoring_config.py +66 -0
- sagemaker/core/model_monitor/dataset_format.py +102 -0
- sagemaker/core/model_monitor/model_monitoring.py +4266 -0
- sagemaker/core/model_monitor/monitoring_alert.py +76 -0
- sagemaker/core/model_monitor/monitoring_files.py +506 -0
- sagemaker/core/model_monitor/utils.py +793 -0
- sagemaker/core/model_registry.py +480 -0
- sagemaker/core/model_uris.py +97 -0
- sagemaker/core/modules/__init__.py +19 -0
- sagemaker/core/modules/configs.py +226 -0
- sagemaker/core/modules/constants.py +37 -0
- sagemaker/core/modules/distributed.py +182 -0
- sagemaker/core/modules/local_core/__init__.py +0 -0
- sagemaker/core/modules/local_core/local_container.py +605 -0
- sagemaker/core/modules/templates.py +83 -0
- sagemaker/core/modules/train/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/common/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/common/utils.py +213 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/basic_script_driver.py +81 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/mpi_driver.py +123 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/mpi_utils.py +302 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/torchrun_driver.py +129 -0
- sagemaker/core/modules/train/container_drivers/scripts/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/scripts/environment.py +305 -0
- sagemaker/core/modules/train/sm_recipes/__init__.py +0 -0
- sagemaker/core/modules/train/sm_recipes/utils.py +330 -0
- sagemaker/core/modules/types.py +19 -0
- sagemaker/core/modules/utils.py +194 -0
- sagemaker/core/network.py +185 -0
- sagemaker/core/parameter.py +173 -0
- sagemaker/core/payloads.py +185 -0
- sagemaker/core/processing.py +1597 -0
- sagemaker/core/remote_function/__init__.py +19 -0
- sagemaker/core/remote_function/checkpoint_location.py +47 -0
- sagemaker/core/remote_function/client.py +1285 -0
- sagemaker/core/remote_function/core/__init__.py +0 -0
- sagemaker/core/remote_function/core/_custom_dispatch_table.py +72 -0
- sagemaker/core/remote_function/core/pipeline_variables.py +353 -0
- sagemaker/core/remote_function/core/serialization.py +422 -0
- sagemaker/core/remote_function/core/stored_function.py +226 -0
- sagemaker/core/remote_function/custom_file_filter.py +128 -0
- sagemaker/core/remote_function/errors.py +104 -0
- sagemaker/core/remote_function/invoke_function.py +172 -0
- sagemaker/core/remote_function/job.py +2140 -0
- sagemaker/core/remote_function/logging_config.py +38 -0
- sagemaker/core/remote_function/runtime_environment/__init__.py +14 -0
- sagemaker/core/remote_function/runtime_environment/bootstrap_runtime_environment.py +605 -0
- sagemaker/core/remote_function/runtime_environment/mpi_utils_remote.py +252 -0
- sagemaker/core/remote_function/runtime_environment/runtime_environment_manager.py +554 -0
- sagemaker/core/remote_function/runtime_environment/spark_app.py +18 -0
- sagemaker/core/remote_function/spark_config.py +149 -0
- sagemaker/core/resource_requirements.py +168 -0
- {sagemaker_core/main → sagemaker/core}/resources.py +19098 -10895
- sagemaker/core/s3/__init__.py +41 -0
- sagemaker/core/s3/client.py +367 -0
- sagemaker/core/s3/utils.py +175 -0
- sagemaker/core/script_uris.py +93 -0
- sagemaker/core/serializers/__init__.py +11 -0
- sagemaker/core/serializers/base.py +510 -0
- sagemaker/core/serializers/implementations.py +159 -0
- sagemaker/core/serializers/utils.py +223 -0
- sagemaker/core/serverless_inference_config.py +63 -0
- sagemaker/core/session_settings.py +55 -0
- sagemaker/core/shapes/__init__.py +3 -0
- sagemaker/core/shapes/model_card_shapes.py +159 -0
- {sagemaker_core/main → sagemaker/core/shapes}/shapes.py +5810 -1806
- sagemaker/core/spark/__init__.py +16 -0
- sagemaker/core/spark/defaults.py +16 -0
- sagemaker/core/spark/processing.py +1380 -0
- sagemaker/core/telemetry/__init__.py +23 -0
- sagemaker/core/telemetry/constants.py +84 -0
- sagemaker/core/telemetry/telemetry_logging.py +284 -0
- sagemaker/core/tools/__init__.py +1 -0
- {sagemaker_core → sagemaker/core}/tools/codegen.py +4 -4
- {sagemaker_core → sagemaker/core}/tools/constants.py +23 -15
- {sagemaker_core → sagemaker/core}/tools/data_extractor.py +1 -1
- {sagemaker_core → sagemaker/core}/tools/method.py +1 -1
- sagemaker/core/tools/model_card/generate_model_card_from_schema.py +562 -0
- {sagemaker_core → sagemaker/core}/tools/resources_codegen.py +165 -98
- {sagemaker_core → sagemaker/core}/tools/resources_extractor.py +5 -13
- {sagemaker_core → sagemaker/core}/tools/shapes_codegen.py +16 -17
- {sagemaker_core → sagemaker/core}/tools/shapes_extractor.py +29 -67
- {sagemaker_core → sagemaker/core}/tools/templates.py +39 -17
- sagemaker/core/training/__init__.py +14 -0
- sagemaker/core/training/configs.py +333 -0
- sagemaker/core/training/constants.py +37 -0
- sagemaker/core/training/utils.py +77 -0
- sagemaker/core/training_compiler/__init__.py +16 -0
- sagemaker/core/training_compiler/config.py +197 -0
- sagemaker/core/training_compiler_config.py +197 -0
- sagemaker/core/transformer.py +793 -0
- sagemaker/core/user_agent.py +76 -0
- sagemaker/core/utilities/__init__.py +24 -0
- sagemaker/core/utilities/cache.py +169 -0
- sagemaker/core/utilities/search_expression.py +133 -0
- sagemaker/core/utils/__init__.py +48 -0
- sagemaker/core/utils/code_injection/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/codec.py +2 -2
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/shape_dag.py +5979 -176
- {sagemaker_core/main → sagemaker/core/utils}/exceptions.py +8 -8
- sagemaker_core/main/default_configs_helper.py → sagemaker/core/utils/intelligent_defaults_helper.py +5 -6
- {sagemaker_core/main → sagemaker/core/utils}/logs.py +1 -2
- {sagemaker_core/main → sagemaker/core/utils}/utils.py +27 -22
- sagemaker/core/workflow/__init__.py +152 -0
- sagemaker/core/workflow/conditions.py +313 -0
- sagemaker/core/workflow/entities.py +58 -0
- sagemaker/core/workflow/execution_variables.py +89 -0
- sagemaker/core/workflow/functions.py +193 -0
- sagemaker/core/workflow/parameters.py +222 -0
- sagemaker/core/workflow/pipeline_context.py +394 -0
- sagemaker/core/workflow/pipeline_definition_config.py +31 -0
- sagemaker/core/workflow/properties.py +285 -0
- sagemaker/core/workflow/step_outputs.py +65 -0
- sagemaker/core/workflow/utilities.py +507 -0
- sagemaker/lineage/__init__.py +33 -0
- sagemaker/lineage/action.py +28 -0
- sagemaker/lineage/artifact.py +28 -0
- sagemaker/lineage/context.py +28 -0
- sagemaker/lineage/lineage_trial_component.py +28 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.1.1.dist-info}/METADATA +28 -9
- sagemaker_core-2.1.1.dist-info/RECORD +355 -0
- sagemaker_core-2.1.1.dist-info/top_level.txt +1 -0
- sagemaker_core/_version.py +0 -3
- sagemaker_core/helper/session_helper.py +0 -769
- sagemaker_core/resources/__init__.py +0 -1
- sagemaker_core/shapes/__init__.py +0 -1
- sagemaker_core/tools/__init__.py +0 -1
- sagemaker_core-1.0.62.dist-info/RECORD +0 -35
- sagemaker_core-1.0.62.dist-info/top_level.txt +0 -1
- {sagemaker_core → sagemaker/core/helper}/__init__.py +0 -0
- {sagemaker_core/helper → sagemaker/core/huggingface/training_compiler}/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/jumpstart/factory}/__init__.py +0 -0
- {sagemaker_core/main/code_injection → sagemaker/core/jumpstart/hub}/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/base.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/constants.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/user_agent.py +0 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.1.1.dist-info}/WHEEL +0 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.1.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
"""This module stores filters related to SageMaker JumpStart."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
from ast import literal_eval
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from typing import Dict, List, Optional, Union, Any
|
|
18
|
+
|
|
19
|
+
from sagemaker.core.jumpstart.types import JumpStartDataHolderType
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class BooleanValues(str, Enum):
|
|
23
|
+
"""Enum class for boolean values.
|
|
24
|
+
|
|
25
|
+
This is a status value that an ``Operand`` can resolve to.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
TRUE = "true"
|
|
29
|
+
FALSE = "false"
|
|
30
|
+
UNKNOWN = "unknown"
|
|
31
|
+
UNEVALUATED = "unevaluated"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FilterOperators(str, Enum):
|
|
35
|
+
"""Enum class for filter operators for JumpStart models."""
|
|
36
|
+
|
|
37
|
+
EQUALS = "equals"
|
|
38
|
+
NOT_EQUALS = "not_equals"
|
|
39
|
+
IN = "in"
|
|
40
|
+
NOT_IN = "not_in"
|
|
41
|
+
INCLUDES = "includes"
|
|
42
|
+
NOT_INCLUDES = "not_includes"
|
|
43
|
+
BEGINS_WITH = "begins_with"
|
|
44
|
+
ENDS_WITH = "ends_with"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SpecialSupportedFilterKeys(str, Enum):
|
|
48
|
+
"""Enum class for special supported filter keys."""
|
|
49
|
+
|
|
50
|
+
TASK = "task"
|
|
51
|
+
FRAMEWORK = "framework"
|
|
52
|
+
MODEL_TYPE = "model_type"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ProprietaryModelFilterIdentifiers(str, Enum):
|
|
56
|
+
"""Enum class for proprietary model filter keys."""
|
|
57
|
+
|
|
58
|
+
PROPRIETARY = "proprietary"
|
|
59
|
+
MARKETPLACE = "marketplace"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
FILTER_OPERATOR_STRING_MAPPINGS = {
|
|
63
|
+
FilterOperators.EQUALS: ["===", "==", "equals", "is"],
|
|
64
|
+
FilterOperators.NOT_EQUALS: ["!==", "!=", "not equals", "is not"],
|
|
65
|
+
FilterOperators.IN: ["in"],
|
|
66
|
+
FilterOperators.NOT_IN: ["not in"],
|
|
67
|
+
FilterOperators.INCLUDES: ["includes", "contains"],
|
|
68
|
+
FilterOperators.NOT_INCLUDES: ["not includes", "not contains"],
|
|
69
|
+
FilterOperators.BEGINS_WITH: ["begins with", "starts with"],
|
|
70
|
+
FilterOperators.ENDS_WITH: ["ends with"],
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
_PAD_ALPHABETIC_OPERATOR = lambda operator: ( # noqa E731
|
|
75
|
+
f" {operator} " if any(character.isalpha() for character in operator) else operator
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
ACCEPTABLE_OPERATORS_IN_PARSE_ORDER = (
|
|
79
|
+
list(
|
|
80
|
+
map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.BEGINS_WITH])
|
|
81
|
+
)
|
|
82
|
+
+ list(
|
|
83
|
+
map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.ENDS_WITH])
|
|
84
|
+
)
|
|
85
|
+
+ list(
|
|
86
|
+
map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_INCLUDES])
|
|
87
|
+
)
|
|
88
|
+
+ list(map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.INCLUDES]))
|
|
89
|
+
+ list(
|
|
90
|
+
map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_EQUALS])
|
|
91
|
+
)
|
|
92
|
+
+ list(map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_IN]))
|
|
93
|
+
+ list(map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.EQUALS]))
|
|
94
|
+
+ list(map(_PAD_ALPHABETIC_OPERATOR, FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.IN]))
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
SPECIAL_SUPPORTED_FILTER_KEYS = set(
|
|
99
|
+
[
|
|
100
|
+
SpecialSupportedFilterKeys.TASK,
|
|
101
|
+
SpecialSupportedFilterKeys.FRAMEWORK,
|
|
102
|
+
]
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class Operand:
|
|
107
|
+
"""Operand class for filtering JumpStart content."""
|
|
108
|
+
|
|
109
|
+
def __init__(
|
|
110
|
+
self, unresolved_value: Any, resolved_value: BooleanValues = BooleanValues.UNEVALUATED
|
|
111
|
+
):
|
|
112
|
+
self.unresolved_value: Any = unresolved_value
|
|
113
|
+
self._resolved_value: BooleanValues = resolved_value
|
|
114
|
+
|
|
115
|
+
def __iter__(self) -> Any:
|
|
116
|
+
"""Returns an iterator."""
|
|
117
|
+
yield self
|
|
118
|
+
|
|
119
|
+
def eval(self) -> None:
|
|
120
|
+
"""Evaluates operand."""
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def resolved_value(self) -> BooleanValues:
|
|
125
|
+
"""Getter method for resolved_value."""
|
|
126
|
+
return self._resolved_value
|
|
127
|
+
|
|
128
|
+
@resolved_value.setter
|
|
129
|
+
def resolved_value(self, new_resolved_value: Any) -> None:
|
|
130
|
+
"""Setter method for resolved_value. Resolved_value must be of type ``BooleanValues``."""
|
|
131
|
+
if isinstance(new_resolved_value, BooleanValues):
|
|
132
|
+
self._resolved_value = new_resolved_value
|
|
133
|
+
return
|
|
134
|
+
raise RuntimeError(
|
|
135
|
+
"Resolved value must be of type BooleanValues, "
|
|
136
|
+
f"but got type {type(new_resolved_value)}."
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
@staticmethod
|
|
140
|
+
def validate_operand(operand: Any) -> Any:
|
|
141
|
+
"""Validate operand and return ``Operand`` object.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
operand (Any): The operand to validate.
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
RuntimeError: If the operand is not of ``Operand`` or ``str`` type.
|
|
148
|
+
"""
|
|
149
|
+
if isinstance(operand, str):
|
|
150
|
+
if operand.lower() == BooleanValues.TRUE.lower():
|
|
151
|
+
operand = Operand(operand, resolved_value=BooleanValues.TRUE)
|
|
152
|
+
elif operand.lower() == BooleanValues.FALSE.lower():
|
|
153
|
+
operand = Operand(operand, resolved_value=BooleanValues.FALSE)
|
|
154
|
+
elif operand.lower() == BooleanValues.UNKNOWN.lower():
|
|
155
|
+
operand = Operand(operand, resolved_value=BooleanValues.UNKNOWN)
|
|
156
|
+
else:
|
|
157
|
+
operand = Operand(parse_filter_string(operand))
|
|
158
|
+
elif not issubclass(type(operand), Operand):
|
|
159
|
+
raise RuntimeError(f"Operand '{operand}' is not supported.")
|
|
160
|
+
return operand
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class Operator(Operand):
|
|
164
|
+
"""Operator class for filtering JumpStart content.
|
|
165
|
+
|
|
166
|
+
An operator in this case corresponds to an operand that is also an operation.
|
|
167
|
+
For example, given the expression ``(True or True) and True``,
|
|
168
|
+
``(True or True)`` is an operand to an ``And`` expression, but is also itself an
|
|
169
|
+
operator. ``(True or True) and True`` would also be considered an operator.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
def __init__(
|
|
173
|
+
self,
|
|
174
|
+
resolved_value: BooleanValues = BooleanValues.UNEVALUATED,
|
|
175
|
+
unresolved_value: Any = None,
|
|
176
|
+
):
|
|
177
|
+
"""Initializes ``Operator`` instance.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
resolved_value (BooleanValues): Optional. The resolved value of the operator.
|
|
181
|
+
(Default: BooleanValues.UNEVALUATED).
|
|
182
|
+
unresolved_value (Any): Optional. The unresolved value of the operator.
|
|
183
|
+
(Default: None).
|
|
184
|
+
"""
|
|
185
|
+
super().__init__(unresolved_value=unresolved_value, resolved_value=resolved_value)
|
|
186
|
+
|
|
187
|
+
def eval(self) -> None:
|
|
188
|
+
"""Evaluates operator."""
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
def __iter__(self) -> Any:
|
|
192
|
+
"""Returns an iterator."""
|
|
193
|
+
yield self
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class And(Operator):
|
|
197
|
+
"""And operator class for filtering JumpStart content."""
|
|
198
|
+
|
|
199
|
+
def __init__(
|
|
200
|
+
self,
|
|
201
|
+
*operands: Union[Operand, str],
|
|
202
|
+
) -> None:
|
|
203
|
+
"""Instantiates And object.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
operand (Operand): Operand for And-ing.
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
RuntimeError: If the operands cannot be validated.
|
|
210
|
+
"""
|
|
211
|
+
self.operands: List[Operand] = list(operands) # type: ignore
|
|
212
|
+
for i in range(len(self.operands)):
|
|
213
|
+
self.operands[i] = Operand.validate_operand(self.operands[i])
|
|
214
|
+
super().__init__()
|
|
215
|
+
|
|
216
|
+
def eval(self) -> None:
|
|
217
|
+
"""Evaluates operator.
|
|
218
|
+
|
|
219
|
+
Raises:
|
|
220
|
+
RuntimeError: If the operands remain unevaluated after calling ``eval``,
|
|
221
|
+
or if the resolved value isn't a ``BooleanValues`` type.
|
|
222
|
+
"""
|
|
223
|
+
incomplete_expression = False
|
|
224
|
+
for operand in self.operands:
|
|
225
|
+
if not issubclass(type(operand), Operand):
|
|
226
|
+
raise RuntimeError(
|
|
227
|
+
f"Operand must be subclass of ``Operand``, but got {type(operand)}"
|
|
228
|
+
)
|
|
229
|
+
if operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
230
|
+
operand.eval()
|
|
231
|
+
if operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
232
|
+
raise RuntimeError(
|
|
233
|
+
"Operand remains unevaluated after calling ``eval`` function."
|
|
234
|
+
)
|
|
235
|
+
if operand.resolved_value == BooleanValues.FALSE:
|
|
236
|
+
self.resolved_value = BooleanValues.FALSE
|
|
237
|
+
return
|
|
238
|
+
if operand.resolved_value == BooleanValues.UNKNOWN:
|
|
239
|
+
incomplete_expression = True
|
|
240
|
+
if not incomplete_expression:
|
|
241
|
+
self.resolved_value = BooleanValues.TRUE
|
|
242
|
+
else:
|
|
243
|
+
self.resolved_value = BooleanValues.UNKNOWN
|
|
244
|
+
|
|
245
|
+
def __iter__(self) -> Any:
|
|
246
|
+
"""Returns an iterator."""
|
|
247
|
+
for operand in self.operands:
|
|
248
|
+
yield from operand
|
|
249
|
+
yield self
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class Constant(Operator):
|
|
253
|
+
"""Constant operator class for filtering JumpStart content."""
|
|
254
|
+
|
|
255
|
+
def __init__(
|
|
256
|
+
self,
|
|
257
|
+
constant: BooleanValues,
|
|
258
|
+
):
|
|
259
|
+
"""Instantiates Constant operator object.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
constant (BooleanValues): Value of constant.
|
|
263
|
+
"""
|
|
264
|
+
super().__init__(constant)
|
|
265
|
+
|
|
266
|
+
def eval(self) -> None:
|
|
267
|
+
"""Evaluates constant"""
|
|
268
|
+
return
|
|
269
|
+
|
|
270
|
+
def __iter__(self) -> Any:
|
|
271
|
+
"""Returns an iterator."""
|
|
272
|
+
yield self
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class Identity(Operator):
|
|
276
|
+
"""Identity operator class for filtering JumpStart content."""
|
|
277
|
+
|
|
278
|
+
def __init__(
|
|
279
|
+
self,
|
|
280
|
+
operand: Union[Operand, str],
|
|
281
|
+
):
|
|
282
|
+
"""Instantiates Identity object.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
operand (Union[Operand, str]): Operand for identity operation.
|
|
286
|
+
"""
|
|
287
|
+
super().__init__()
|
|
288
|
+
self.operand = Operand.validate_operand(operand)
|
|
289
|
+
|
|
290
|
+
def __iter__(self) -> Any:
|
|
291
|
+
"""Returns an iterator."""
|
|
292
|
+
yield self
|
|
293
|
+
yield from self.operand
|
|
294
|
+
|
|
295
|
+
def eval(self) -> None:
|
|
296
|
+
"""Evaluates operator.
|
|
297
|
+
|
|
298
|
+
Raises:
|
|
299
|
+
RuntimeError: If the operand remains unevaluated after calling ``eval``,
|
|
300
|
+
or if the resolved value isn't a ``BooleanValues`` type.
|
|
301
|
+
"""
|
|
302
|
+
if not issubclass(type(self.operand), Operand):
|
|
303
|
+
raise RuntimeError(
|
|
304
|
+
f"Operand must be subclass of ``Operand``, but got {type(self.operand)}"
|
|
305
|
+
)
|
|
306
|
+
if self.operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
307
|
+
self.operand.eval()
|
|
308
|
+
if self.operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
309
|
+
raise RuntimeError("Operand remains unevaluated after calling ``eval`` function.")
|
|
310
|
+
if not isinstance(self.operand.resolved_value, BooleanValues):
|
|
311
|
+
raise RuntimeError(self.operand.resolved_value)
|
|
312
|
+
self.resolved_value = self.operand.resolved_value
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class Or(Operator):
|
|
316
|
+
"""Or operator class for filtering JumpStart content."""
|
|
317
|
+
|
|
318
|
+
def __init__(
|
|
319
|
+
self,
|
|
320
|
+
*operands: Union[Operand, str],
|
|
321
|
+
) -> None:
|
|
322
|
+
"""Instantiates Or object.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
operands (Operand): Operand for Or-ing.
|
|
326
|
+
|
|
327
|
+
Raises:
|
|
328
|
+
RuntimeError: If the operands cannot be validated.
|
|
329
|
+
"""
|
|
330
|
+
self.operands: List[Operand] = list(operands) # type: ignore
|
|
331
|
+
for i in range(len(self.operands)):
|
|
332
|
+
self.operands[i] = Operand.validate_operand(self.operands[i])
|
|
333
|
+
super().__init__()
|
|
334
|
+
|
|
335
|
+
def eval(self) -> None:
|
|
336
|
+
"""Evaluates operator.
|
|
337
|
+
|
|
338
|
+
Raises:
|
|
339
|
+
RuntimeError: If the operands remain unevaluated after calling ``eval``,
|
|
340
|
+
or if the resolved value isn't a ``BooleanValues`` type.
|
|
341
|
+
"""
|
|
342
|
+
incomplete_expression = False
|
|
343
|
+
for operand in self.operands:
|
|
344
|
+
if not issubclass(type(operand), Operand):
|
|
345
|
+
raise RuntimeError(
|
|
346
|
+
f"Operand must be subclass of ``Operand``, but got {type(operand)}"
|
|
347
|
+
)
|
|
348
|
+
if operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
349
|
+
operand.eval()
|
|
350
|
+
if operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
351
|
+
raise RuntimeError(
|
|
352
|
+
"Operand remains unevaluated after calling ``eval`` function."
|
|
353
|
+
)
|
|
354
|
+
if operand.resolved_value == BooleanValues.TRUE:
|
|
355
|
+
self.resolved_value = BooleanValues.TRUE
|
|
356
|
+
return
|
|
357
|
+
if operand.resolved_value == BooleanValues.UNKNOWN:
|
|
358
|
+
incomplete_expression = True
|
|
359
|
+
if not incomplete_expression:
|
|
360
|
+
self.resolved_value = BooleanValues.FALSE
|
|
361
|
+
else:
|
|
362
|
+
self.resolved_value = BooleanValues.UNKNOWN
|
|
363
|
+
|
|
364
|
+
def __iter__(self) -> Any:
|
|
365
|
+
"""Returns an iterator."""
|
|
366
|
+
for operand in self.operands:
|
|
367
|
+
yield from operand
|
|
368
|
+
yield self
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
class Not(Operator):
|
|
372
|
+
"""Not operator class for filtering JumpStart content."""
|
|
373
|
+
|
|
374
|
+
def __init__(
|
|
375
|
+
self,
|
|
376
|
+
operand: Union[Operand, str],
|
|
377
|
+
) -> None:
|
|
378
|
+
"""Instantiates Not object.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
operand (Operand): Operand for Not-ing.
|
|
382
|
+
"""
|
|
383
|
+
self.operand: Operand = Operand.validate_operand(operand)
|
|
384
|
+
super().__init__()
|
|
385
|
+
|
|
386
|
+
def eval(self) -> None:
|
|
387
|
+
"""Evaluates operator.
|
|
388
|
+
|
|
389
|
+
Raises:
|
|
390
|
+
RuntimeError: If the operand remains unevaluated after calling ``eval``,
|
|
391
|
+
or if the resolved value isn't a ``BooleanValues`` type.
|
|
392
|
+
"""
|
|
393
|
+
|
|
394
|
+
if not issubclass(type(self.operand), Operand):
|
|
395
|
+
raise RuntimeError(
|
|
396
|
+
f"Operand must be subclass of ``Operand``, but got {type(self.operand)}"
|
|
397
|
+
)
|
|
398
|
+
if self.operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
399
|
+
self.operand.eval()
|
|
400
|
+
if self.operand.resolved_value == BooleanValues.UNEVALUATED:
|
|
401
|
+
raise RuntimeError("Operand remains unevaluated after calling ``eval`` function.")
|
|
402
|
+
if self.operand.resolved_value == BooleanValues.TRUE:
|
|
403
|
+
self.resolved_value = BooleanValues.FALSE
|
|
404
|
+
return
|
|
405
|
+
if self.operand.resolved_value == BooleanValues.FALSE:
|
|
406
|
+
self.resolved_value = BooleanValues.TRUE
|
|
407
|
+
return
|
|
408
|
+
self.resolved_value = BooleanValues.UNKNOWN
|
|
409
|
+
|
|
410
|
+
def __iter__(self) -> Any:
|
|
411
|
+
"""Returns an iterator."""
|
|
412
|
+
yield from self.operand
|
|
413
|
+
yield self
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
class ModelFilter(JumpStartDataHolderType):
|
|
417
|
+
"""Data holder class to store model filters.
|
|
418
|
+
|
|
419
|
+
For a given filter string "task == ic", the key corresponds to
|
|
420
|
+
"task" and the value corresponds to "ic", with the operation being
|
|
421
|
+
"==".
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
__slots__ = ["key", "value", "operator"]
|
|
425
|
+
|
|
426
|
+
def __init__(self, key: str, value: str, operator: str):
|
|
427
|
+
"""Instantiates ``ModelFilter`` object.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
key (str): The key in metadata for the model filter.
|
|
431
|
+
value (str): The value of the metadata for the model filter.
|
|
432
|
+
operator (str): The operator used in the model filter.
|
|
433
|
+
"""
|
|
434
|
+
self.key = key
|
|
435
|
+
self.value = value
|
|
436
|
+
self.operator = operator
|
|
437
|
+
|
|
438
|
+
def set_key(self, key: str) -> None:
|
|
439
|
+
"""Sets the key for the model filter.
|
|
440
|
+
|
|
441
|
+
Args:
|
|
442
|
+
key (str): The key to be set.
|
|
443
|
+
"""
|
|
444
|
+
self.key = key
|
|
445
|
+
|
|
446
|
+
def set_value(self, value: str) -> None:
|
|
447
|
+
"""Sets the value for the model filter.
|
|
448
|
+
|
|
449
|
+
Args:
|
|
450
|
+
value (str): The value to be set.
|
|
451
|
+
"""
|
|
452
|
+
self.value = value
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def parse_filter_string(filter_string: str) -> ModelFilter:
|
|
456
|
+
"""Parse filter string and return a serialized ``ModelFilter`` object.
|
|
457
|
+
|
|
458
|
+
Args:
|
|
459
|
+
filter_string (str): The filter string to be serialized to an object.
|
|
460
|
+
"""
|
|
461
|
+
|
|
462
|
+
for operator in ACCEPTABLE_OPERATORS_IN_PARSE_ORDER:
|
|
463
|
+
split_filter_string = filter_string.split(operator)
|
|
464
|
+
if len(split_filter_string) == 2:
|
|
465
|
+
return ModelFilter(
|
|
466
|
+
key=split_filter_string[0].strip(),
|
|
467
|
+
value=split_filter_string[1].strip(),
|
|
468
|
+
operator=operator.strip(),
|
|
469
|
+
)
|
|
470
|
+
raise ValueError(f"Cannot parse filter string: {filter_string}")
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def _negate_boolean(boolean: BooleanValues) -> BooleanValues:
|
|
474
|
+
"""Negates boolean expression (False -> True, True -> False)."""
|
|
475
|
+
if boolean == BooleanValues.TRUE:
|
|
476
|
+
return BooleanValues.FALSE
|
|
477
|
+
if boolean == BooleanValues.FALSE:
|
|
478
|
+
return BooleanValues.TRUE
|
|
479
|
+
return boolean
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
def _evaluate_filter_expression_equals(
|
|
483
|
+
model_filter: ModelFilter,
|
|
484
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
485
|
+
) -> BooleanValues:
|
|
486
|
+
"""Evaluates filter expressions for equals."""
|
|
487
|
+
if cached_model_value is None:
|
|
488
|
+
return BooleanValues.FALSE
|
|
489
|
+
model_filter_value = model_filter.value
|
|
490
|
+
if isinstance(cached_model_value, bool):
|
|
491
|
+
cached_model_value = str(cached_model_value).lower()
|
|
492
|
+
model_filter_value = model_filter.value.lower()
|
|
493
|
+
if str(model_filter_value) == str(cached_model_value):
|
|
494
|
+
return BooleanValues.TRUE
|
|
495
|
+
return BooleanValues.FALSE
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def _evaluate_filter_expression_in(
|
|
499
|
+
model_filter: ModelFilter,
|
|
500
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
501
|
+
) -> BooleanValues:
|
|
502
|
+
"""Evaluates filter expressions for string/list in."""
|
|
503
|
+
if cached_model_value is None:
|
|
504
|
+
return BooleanValues.FALSE
|
|
505
|
+
py_obj = model_filter.value
|
|
506
|
+
try:
|
|
507
|
+
py_obj = literal_eval(py_obj)
|
|
508
|
+
try:
|
|
509
|
+
iter(py_obj)
|
|
510
|
+
except TypeError:
|
|
511
|
+
return BooleanValues.FALSE
|
|
512
|
+
except Exception: # pylint: disable=W0703
|
|
513
|
+
pass
|
|
514
|
+
if isinstance(cached_model_value, list):
|
|
515
|
+
return BooleanValues.FALSE
|
|
516
|
+
if cached_model_value in py_obj:
|
|
517
|
+
return BooleanValues.TRUE
|
|
518
|
+
return BooleanValues.FALSE
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def _evaluate_filter_expression_includes(
|
|
522
|
+
model_filter: ModelFilter,
|
|
523
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
524
|
+
) -> BooleanValues:
|
|
525
|
+
"""Evaluates filter expressions for string includes."""
|
|
526
|
+
if cached_model_value is None:
|
|
527
|
+
return BooleanValues.FALSE
|
|
528
|
+
filter_value = str(model_filter.value)
|
|
529
|
+
if filter_value in cached_model_value:
|
|
530
|
+
return BooleanValues.TRUE
|
|
531
|
+
return BooleanValues.FALSE
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def _evaluate_filter_expression_begins_with(
|
|
535
|
+
model_filter: ModelFilter,
|
|
536
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
537
|
+
) -> BooleanValues:
|
|
538
|
+
"""Evaluates filter expressions for string begins with."""
|
|
539
|
+
if cached_model_value is None:
|
|
540
|
+
return BooleanValues.FALSE
|
|
541
|
+
filter_value = str(model_filter.value)
|
|
542
|
+
if cached_model_value.startswith(filter_value):
|
|
543
|
+
return BooleanValues.TRUE
|
|
544
|
+
return BooleanValues.FALSE
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def _evaluate_filter_expression_ends_with(
|
|
548
|
+
model_filter: ModelFilter,
|
|
549
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
550
|
+
) -> BooleanValues:
|
|
551
|
+
"""Evaluates filter expressions for string ends with."""
|
|
552
|
+
if cached_model_value is None:
|
|
553
|
+
return BooleanValues.FALSE
|
|
554
|
+
filter_value = str(model_filter.value)
|
|
555
|
+
if cached_model_value.endswith(filter_value):
|
|
556
|
+
return BooleanValues.TRUE
|
|
557
|
+
return BooleanValues.FALSE
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
def evaluate_filter_expression( # pylint: disable=too-many-return-statements
|
|
561
|
+
model_filter: ModelFilter,
|
|
562
|
+
cached_model_value: Optional[Union[str, bool, int, float, Dict[str, Any], List[Any]]],
|
|
563
|
+
) -> BooleanValues:
|
|
564
|
+
"""Evaluates model filter with cached model spec value, returns boolean.
|
|
565
|
+
|
|
566
|
+
Args:
|
|
567
|
+
model_filter (ModelFilter): The model filter for evaluation.
|
|
568
|
+
cached_model_value (Any): The value in the model manifest/spec that should be used to
|
|
569
|
+
evaluate the filter.
|
|
570
|
+
"""
|
|
571
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.EQUALS]:
|
|
572
|
+
return _evaluate_filter_expression_equals(model_filter, cached_model_value)
|
|
573
|
+
|
|
574
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_EQUALS]:
|
|
575
|
+
return _negate_boolean(_evaluate_filter_expression_equals(model_filter, cached_model_value))
|
|
576
|
+
|
|
577
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.IN]:
|
|
578
|
+
return _evaluate_filter_expression_in(model_filter, cached_model_value)
|
|
579
|
+
|
|
580
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_IN]:
|
|
581
|
+
return _negate_boolean(_evaluate_filter_expression_in(model_filter, cached_model_value))
|
|
582
|
+
|
|
583
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.INCLUDES]:
|
|
584
|
+
return _evaluate_filter_expression_includes(model_filter, cached_model_value)
|
|
585
|
+
|
|
586
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.NOT_INCLUDES]:
|
|
587
|
+
return _negate_boolean(
|
|
588
|
+
_evaluate_filter_expression_includes(model_filter, cached_model_value)
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.BEGINS_WITH]:
|
|
592
|
+
return _evaluate_filter_expression_begins_with(model_filter, cached_model_value)
|
|
593
|
+
|
|
594
|
+
if model_filter.operator in FILTER_OPERATOR_STRING_MAPPINGS[FilterOperators.ENDS_WITH]:
|
|
595
|
+
return _evaluate_filter_expression_ends_with(model_filter, cached_model_value)
|
|
596
|
+
|
|
597
|
+
raise RuntimeError(f"Bad operator: {model_filter.operator}")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
"""This module stores constants related to SageMaker JumpStart Hub."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
LATEST_VERSION_WILDCARD = "*"
|