code: def test_counterfactual_permitted_range(self, feature_importance):
      (
          X_train,
          X_test,
          y_train,
          y_test,
          feature_names,
          _,
      ) = create_iris_data()
  
      model = create_lightgbm_classifier(X_train, y_train)
      X_train["target"] = y_train
      X_test["target"] = y_test
  
      rai_insights = RAIInsights(
          model=model,
          train=X_train,
          test=X_test.iloc[0:10],
          target_column="target",
          task_type="classification",
      )
  
      rai_insights.counterfactual.add(
          total_CFs=10,
          desired_class=2,
          features_to_vary=[feature_names[0]],
          permitted_range={feature_names[0]: [2.0, 5.0]},
          feature_importance=feature_importance,
      )
      rai_insights.counterfactual.compute()
  
      cf_obj = rai_insights.counterfactual.get()[0]
      assert cf_obj is not None
  
file_path: responsible-ai-toolbox/responsibleai/tests/counterfactual/test_counterfactual_advanced_features.py
imports: import os
  import pytest
  from rai_test_utils.models.lightgbm import create_lightgbm_classifier
  from raiutils.exceptions import UserConfigValidationException
  from responsibleai import RAIInsights
  from responsibleai._interfaces import CounterfactualData
  from responsibleai._internal.constants import FileFormats
  from responsibleai._tools.shared.state_directory_management import DirectoryManager
  from ..common_utils import create_iris_data
label_desc: Use image node_id 2 for calling the TestCounterfactualAdvancedFeatures obj's underlying member method code with example usage: obj.test_counterfactual_permitted_range(feature_importance) without return types