code: def test_augmentation_pipeline(augmentation, expected):
      """Tests that augmentation pipeline is correctly deserialized and serialized between config."""
      config = {
          "input_features": [
              {
                  "name": "input1",
                  "type": "image",
                  "augmentation": augmentation,
              },
          ],
          "output_features": [
              {
                  "name": "output1",
                  "type": "number",
              },
          ],
      }
  
      if augmentation is None:
          del config["input_features"][0]["augmentation"]
  
      config_obj = ModelConfig.from_dict(config)
      assert config_obj.input_features[0].augmentation == expected
  
      # Test serialized dict form is fully rendered
      config_dict = config_obj.to_dict()
      assert len(
          config_dict["input_features"][0]["augmentation"]
      ) == len(expected)
      for aug in config_dict["input_features"][0]["augmentation"]:
          assert isinstance(aug, dict)
  
      # Test the serializing and reloading yields the same results
      config_obj2 = ModelConfig.from_dict(config_dict)
      assert (
          config_obj2.input_features[0].augmentation
          == config_obj.input_features[0].augmentation
      )
  
imports: import os
  from tempfile import TemporaryDirectory
  from typing import Any, Dict, Optional, Union
  import pytest
  import yaml
  from ludwig.constants import ACTIVE, BASE_MODEL, CLIP, COLUMN, COMBINER, DECODER, DEFAULT_VALIDATION_METRIC, DEFAULTS, DEPENDENCIES, ENCODER, HYPEROPT, INPUT_FEATURES, INPUT_SIZE, LOSS, MODEL_ECD, MODEL_GBM, MODEL_LLM, MODEL_TYPE, NAME, NUM_CLASSES, OPTIMIZER, OUTPUT_FEATURES, PREPROCESSING, PROC_COLUMN, REDUCE_DEPENDENCIES, REDUCE_INPUT, TIED, TRAINER, TYPE
  from ludwig.error import ConfigValidationError
  from ludwig.schema.decoders.base import ClassifierConfig
  from ludwig.schema.encoders.text_encoders import BERTConfig
  from ludwig.schema.features.augmentation.image import RandomBlurConfig, RandomRotateConfig
  from ludwig.schema.features.image_feature import AUGMENTATION_DEFAULT_OPERATIONS
  from ludwig.schema.features.number_feature import NumberOutputFeatureConfig
  from ludwig.schema.features.text_feature import TextOutputFeatureConfig
  from ludwig.schema.llms.quantization import QuantizationConfig
  from ludwig.schema.model_config import ModelConfig
  from ludwig.schema.utils import BaseMarshmallowConfig, convert_submodules
label_desc: Use image node_id 20 for calling a global function with example usage: test_augmentation_pipeline(augmentation, expected) without return types