class_docstr: Defines the configuration for generating counterfactuals.
class_docstr_tok: ["Defines","the","configuration","for","generating","counterfactuals","."]
code: def save_result(self, data_directory_path):
      cf_result = self.get_result()
      if cf_result[CounterfactualConfig.COUNTERFACTUAL_OBJ] is not None:
          counterfactuals_dict = json.loads(
              cf_result[CounterfactualConfig.COUNTERFACTUAL_OBJ]
          )
  
          schema_version = _get_schema_version(counterfactuals_dict)
          if schema_version == _SchemaVersions.V1:
              cf_schema_keys = _V1SchemaConstants.ALL
          else:
              cf_schema_keys = _V2SchemaConstants.ALL
  
          for counterfactual_examples_key in cf_schema_keys:
              file_path = data_directory_path / (
                  counterfactual_examples_key + FileFormats.JSON
              )
              with open(file_path, "w") as file_path:
                  json.dump(
                      counterfactuals_dict[counterfactual_examples_key],
                      file_path,
                  )
  
      file_path = data_directory_path / (
          CounterfactualConfig.HAS_COMPUTATION_FAILED + FileFormats.JSON
      )
      with open(file_path, "w") as file_path:
          json.dump(
              cf_result[CounterfactualConfig.HAS_COMPUTATION_FAILED],
              file_path,
          )
  
      file_path = data_directory_path / (
          CounterfactualConfig.FAILURE_REASON + FileFormats.JSON
      )
      with open(file_path, "w") as file_path:
          json.dump(
              cf_result[CounterfactualConfig.FAILURE_REASON], file_path
          )
  
      file_path = data_directory_path / (
          CounterfactualConfig.IS_COMPUTED + FileFormats.JSON
      )
      with open(file_path, "w") as file_path:
          json.dump(
              cf_result[CounterfactualConfig.IS_COMPUTED], file_path
          )
  
imports: import json
  import uuid
  import warnings
  from pathlib import Path
  from typing import Any, List, Optional, Union
  import dice_ml
  import jsonschema
  import numpy
  import pandas
  from dice_ml import Dice
  from dice_ml.counterfactual_explanations import CounterfactualExplanations
  from dice_ml.explainer_interfaces.explainer_base import ExplainerBase
  from raiutils.exceptions import UserConfigValidationException
  from raiutils.models import ModelTask
  from responsibleai._config.base_config import BaseConfig
  from responsibleai._data_validations import validate_train_test_categories
  from responsibleai._interfaces import CounterfactualData
  from responsibleai._internal.constants import CounterfactualManagerKeys, FileFormats, ListProperties, ManagerNames
  from responsibleai._tools.shared.state_directory_management import DirectoryManager
  from responsibleai.exceptions import DuplicateManagerConfigException, SchemaErrorException
  from responsibleai.managers.base_manager import BaseManager
  from responsibleai.utils import _find_features_having_missing_values, _measure_time
label_desc: Use image node_id 7 for calling the CounterfactualConfig obj's underlying member method code with example usage: obj.save_result(data_directory_path) without return types