class_docstr: Class that contains methods for storing an Ax experiment to SQLAlchemy.
  
  Instantiate with an instance of Config to customize the functionality.
  For even more flexibility, create a subclass.
  
  Attributes:
      config: Metadata needed to save and load an experiment to SQLAlchemy.
class_docstr_tok: ["Class","that","contains","methods","for","storing","an","Ax","experiment","to","SQLAlchemy",".","Instantiate","with","an","instance","of","Config","to","customize","the","functionality",".","For","even","more","flexibility",",","create","a","subclass",".","Attributes",":","config",":","Metadata","needed","to","save","and","load","an","experiment","to","SQLAlchemy","."]
docstr: Convert Ax OutcomeConstraint to SQLAlchemy.
code: def outcome_constraint_to_sqa(
      self, outcome_constraint: OutcomeConstraint
  ) -> SQAMetric:
      """Convert Ax OutcomeConstraint to SQLAlchemy."""
      if isinstance(outcome_constraint, ScalarizedOutcomeConstraint):
          return self.scalarized_outcome_constraint_to_sqa(
              outcome_constraint
          )
  
      metric = outcome_constraint.metric
      metric_type, properties = self.get_metric_type_and_properties(
          metric=metric
      )
  
      # pyre-fixme: Expected `Base` for 1st...t `typing.Type[Metric]`.
      metric_class: SQAMetric = self.config.class_to_sqa_class[Metric]
      # pyre-fixme[29]: `SQAMetric` is not a function.
      constraint_sqa = metric_class(
          id=metric.db_id,
          name=metric.name,
          metric_type=metric_type,
          intent=MetricIntent.OUTCOME_CONSTRAINT,
          bound=outcome_constraint.bound,
          op=outcome_constraint.op,
          relative=outcome_constraint.relative,
          properties=properties,
          lower_is_better=metric.lower_is_better,
      )
      return constraint_sqa
  
imports: from enum import Enum
  from logging import Logger
  from typing import Any, cast, Dict, List, Optional, Tuple, Type
  from ax.core.arm import Arm
  from ax.core.base_trial import BaseTrial
  from ax.core.batch_trial import AbandonedArm, BatchTrial
  from ax.core.data import Data
  from ax.core.experiment import Experiment
  from ax.core.generator_run import GeneratorRun, GeneratorRunType
  from ax.core.metric import Metric
  from ax.core.multi_type_experiment import MultiTypeExperiment
  from ax.core.objective import MultiObjective, Objective, ScalarizedObjective
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint, ScalarizedOutcomeConstraint
  from ax.core.parameter import ChoiceParameter, FixedParameter, Parameter, RangeParameter
  from ax.core.parameter_constraint import OrderConstraint, ParameterConstraint, SumConstraint
  from ax.core.parameter_distribution import ParameterDistribution
  from ax.core.risk_measures import RiskMeasure
  from ax.core.runner import Runner
  from ax.core.search_space import RobustSearchSpace, SearchSpace
  from ax.core.trial import Trial
  from ax.exceptions.storage import SQAEncodeError
  from ax.modelbridge.generation_strategy import GenerationStrategy
  from ax.storage.json_store.encoder import object_to_json
  from ax.storage.sqa_store.sqa_classes import SQAAbandonedArm, SQAArm, SQAData, SQAExperiment, SQAGenerationStrategy, SQAGeneratorRun, SQAMetric, SQAParameter, SQAParameterConstraint, SQARunner, SQATrial
  from ax.storage.sqa_store.sqa_config import SQAConfig
  from ax.storage.utils import DomainType, MetricIntent, ParameterConstraintType
  from ax.utils.common.base import Base
  from ax.utils.common.constants import Keys
  from ax.utils.common.logger import get_logger
  from ax.utils.common.serialization import serialize_init_args
  from ax.utils.common.typeutils import checked_cast, not_none
label_desc: Use image node_id 17 for calling the Encoder obj's underlying member method code with example usage: obj.outcome_constraint_to_sqa(outcome_constraint) and returns: constraint_sqa, self