def _update_components(self):
        """Update the components in the data config with default_components if user do not provide."""
        default_components = self._get_default_components()

        # update components from default_components
        components = self.components
        for k, v in default_components.items():
            # do deepcopy here since we don't want to update the default_components
            if components[k]:
                # type is string, so we don't need to deepcopy
                components[k].type = components[k].type or v.type
                # v.params is a dict, so we deepcopy it
                components[k].params = components[k].params or deepcopy(v.params)
            else:
                # v is a DataComponentConfig object, so we deepcopy it
                components[k] = deepcopy(v)

        self.load_dataset_config = components[DataComponentType.LOAD_DATASET.value]
        self.pre_process_data_config = components[DataComponentType.PRE_PROCESS_DATA.value]
        self.post_process_data_config = components[DataComponentType.POST_PROCESS_DATA.value]
        self.dataloader_config = components[DataComponentType.DATALOADER.value]
Update the components in the data config with default_components if user do not provide.
olive/data/config.py